Finished save file options for now. Still missing markdown and PDF
This commit is contained in:
+10
-5
@@ -529,11 +529,7 @@ class NWProject():
|
|||||||
), nwAlert.WARN)
|
), nwAlert.WARN)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
cleanName = ""
|
cleanName = self.getFileSafeProjectName()
|
||||||
for c in self.projName.strip():
|
|
||||||
if c.isalpha() or c.isdigit() or c == " ":
|
|
||||||
cleanName += c
|
|
||||||
|
|
||||||
baseDir = path.join(self.mainConf.backupPath, cleanName)
|
baseDir = path.join(self.mainConf.backupPath, cleanName)
|
||||||
if not path.isdir(baseDir):
|
if not path.isdir(baseDir):
|
||||||
try:
|
try:
|
||||||
@@ -740,6 +736,15 @@ class NWProject():
|
|||||||
# Getters
|
# Getters
|
||||||
##
|
##
|
||||||
|
|
||||||
|
def getFileSafeProjectName(self):
|
||||||
|
"""Returns a filename safe version of the project name.
|
||||||
|
"""
|
||||||
|
cleanName = ""
|
||||||
|
for c in self.projName.strip():
|
||||||
|
if c.isalpha() or c.isdigit() or c == " ":
|
||||||
|
cleanName += c
|
||||||
|
return cleanName
|
||||||
|
|
||||||
def getSessionWordCount(self):
|
def getSessionWordCount(self):
|
||||||
"""Returns the number of words added or removed this session.
|
"""Returns the number of words added or removed this session.
|
||||||
"""
|
"""
|
||||||
|
|||||||
+157
-23
@@ -30,12 +30,14 @@ import nw
|
|||||||
|
|
||||||
from os import path
|
from os import path
|
||||||
|
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt, QByteArray
|
||||||
from PyQt5.QtGui import QTextOption, QPalette, QColor
|
from PyQt5.QtGui import (
|
||||||
|
QTextOption, QPalette, QColor, QTextDocumentWriter
|
||||||
|
)
|
||||||
from PyQt5.QtWidgets import (
|
from PyQt5.QtWidgets import (
|
||||||
QDialog, QVBoxLayout, QHBoxLayout, QTextBrowser, QPushButton,
|
QDialog, QVBoxLayout, QHBoxLayout, QTextBrowser, QPushButton,
|
||||||
QLabel, QLineEdit, QGroupBox, QGridLayout, QComboBox, QProgressBar,
|
QLabel, QLineEdit, QGroupBox, QGridLayout, QComboBox, QProgressBar,
|
||||||
QMenu, QAction
|
QMenu, QAction, QFileDialog
|
||||||
)
|
)
|
||||||
|
|
||||||
from nw.gui.additions import QSwitch
|
from nw.gui.additions import QSwitch
|
||||||
@@ -46,10 +48,12 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
class GuiBuildNovel(QDialog):
|
class GuiBuildNovel(QDialog):
|
||||||
|
|
||||||
FMT_ODT = 1
|
FMT_ODT = 1
|
||||||
FMT_PDF = 2
|
FMT_PDF = 2
|
||||||
FMT_HTM = 3
|
FMT_HTM1 = 3
|
||||||
FMT_MD = 4
|
FMT_HTM2 = 4
|
||||||
|
FMT_MD = 4
|
||||||
|
FMT_TXT = 5
|
||||||
|
|
||||||
def __init__(self, theParent, theProject):
|
def __init__(self, theParent, theProject):
|
||||||
QDialog.__init__(self, theParent)
|
QDialog.__init__(self, theParent)
|
||||||
@@ -62,6 +66,8 @@ class GuiBuildNovel(QDialog):
|
|||||||
self.theTheme = theParent.theTheme
|
self.theTheme = theParent.theTheme
|
||||||
self.optState = self.theProject.optState
|
self.optState = self.theProject.optState
|
||||||
|
|
||||||
|
self.htmlText = ""
|
||||||
|
|
||||||
self.setWindowTitle("Build Project")
|
self.setWindowTitle("Build Project")
|
||||||
self.setMinimumWidth(800)
|
self.setMinimumWidth(800)
|
||||||
self.setMinimumHeight(700)
|
self.setMinimumHeight(700)
|
||||||
@@ -202,20 +208,32 @@ class GuiBuildNovel(QDialog):
|
|||||||
|
|
||||||
self.btnSave = QPushButton("Save As")
|
self.btnSave = QPushButton("Save As")
|
||||||
self.saveMenu = QMenu(self)
|
self.saveMenu = QMenu(self)
|
||||||
self.saveODT = QAction("Open Document (.odt)")
|
|
||||||
self.savePDF = QAction("Portable Document (.pdf)")
|
|
||||||
self.saveHTM = QAction("HTML5 (.htm)")
|
|
||||||
self.saveMD = QAction("Markdown (.md)")
|
|
||||||
self.saveODT.triggered.connect(lambda: self._saveDocument(self.FMT_ODT))
|
|
||||||
self.savePDF.triggered.connect(lambda: self._saveDocument(self.FMT_PDF))
|
|
||||||
self.saveHTM.triggered.connect(lambda: self._saveDocument(self.FMT_HTM))
|
|
||||||
self.saveMD.triggered.connect(lambda: self._saveDocument(self.FMT_MD))
|
|
||||||
self.saveMenu.addAction(self.saveODT)
|
|
||||||
self.saveMenu.addAction(self.savePDF)
|
|
||||||
self.saveMenu.addAction(self.saveHTM)
|
|
||||||
self.saveMenu.addAction(self.saveMD)
|
|
||||||
self.btnSave.setMenu(self.saveMenu)
|
self.btnSave.setMenu(self.saveMenu)
|
||||||
|
|
||||||
|
self.saveODT = QAction("Open Document (.odt)")
|
||||||
|
self.saveODT.triggered.connect(lambda: self._saveDocument(self.FMT_ODT))
|
||||||
|
self.saveMenu.addAction(self.saveODT)
|
||||||
|
|
||||||
|
# self.savePDF = QAction("Portable Document (.pdf)")
|
||||||
|
# self.savePDF.triggered.connect(lambda: self._saveDocument(self.FMT_PDF))
|
||||||
|
# self.saveMenu.addAction(self.savePDF)
|
||||||
|
|
||||||
|
self.saveHTM1 = QAction("Qt Style HTML (.htm)")
|
||||||
|
self.saveHTM1.triggered.connect(lambda: self._saveDocument(self.FMT_HTM1))
|
||||||
|
self.saveMenu.addAction(self.saveHTM1)
|
||||||
|
|
||||||
|
self.saveHTM2 = QAction("Plain HTML (.htm)")
|
||||||
|
self.saveHTM2.triggered.connect(lambda: self._saveDocument(self.FMT_HTM2))
|
||||||
|
self.saveMenu.addAction(self.saveHTM2)
|
||||||
|
|
||||||
|
# self.saveMD = QAction("Markdown (.md)")
|
||||||
|
# self.saveMD.triggered.connect(lambda: self._saveDocument(self.FMT_MD))
|
||||||
|
# self.saveMenu.addAction(self.saveMD)
|
||||||
|
|
||||||
|
self.saveTXT = QAction("Plain Text (.txt)")
|
||||||
|
self.saveTXT.triggered.connect(lambda: self._saveDocument(self.FMT_TXT))
|
||||||
|
self.saveMenu.addAction(self.saveTXT)
|
||||||
|
|
||||||
self.btnClose = QPushButton("Close")
|
self.btnClose = QPushButton("Close")
|
||||||
self.btnClose.clicked.connect(self._doClose)
|
self.btnClose.clicked.connect(self._doClose)
|
||||||
|
|
||||||
@@ -263,7 +281,7 @@ class GuiBuildNovel(QDialog):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
makeHtml = ToHtml(self.theProject, self.theParent)
|
makeHtml = ToHtml(self.theProject, self.theParent)
|
||||||
theText = ""
|
self.htmlText = ""
|
||||||
|
|
||||||
for tItem in self.theProject.projTree:
|
for tItem in self.theProject.projTree:
|
||||||
if tItem is not None and tItem.itemType == nwItemType.FILE:
|
if tItem is not None and tItem.itemType == nwItemType.FILE:
|
||||||
@@ -273,14 +291,130 @@ class GuiBuildNovel(QDialog):
|
|||||||
makeHtml.doHeaders()
|
makeHtml.doHeaders()
|
||||||
makeHtml.doConvert()
|
makeHtml.doConvert()
|
||||||
makeHtml.doPostProcessing()
|
makeHtml.doPostProcessing()
|
||||||
theText += makeHtml.getResult()
|
self.htmlText += makeHtml.getResult()
|
||||||
|
|
||||||
self.docView.setHtml(theText)
|
self.docView.setHtml(self.htmlText)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def _saveDocument(self, theFormat):
|
def _saveDocument(self, theFormat):
|
||||||
return
|
"""Save the document to various formats.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# FMT_PDF
|
||||||
|
|
||||||
|
byteFmt = QByteArray()
|
||||||
|
fileExt = ""
|
||||||
|
textFmt = ""
|
||||||
|
outTool = ""
|
||||||
|
|
||||||
|
# Create the settings
|
||||||
|
if theFormat == self.FMT_ODT:
|
||||||
|
byteFmt.append("odf")
|
||||||
|
fileExt = "odf"
|
||||||
|
textFmt = "Open Document"
|
||||||
|
outTool = "Qt"
|
||||||
|
|
||||||
|
elif theFormat == self.FMT_HTM1:
|
||||||
|
byteFmt.append("html")
|
||||||
|
fileExt = "htm"
|
||||||
|
textFmt = "Qt Style HTML"
|
||||||
|
outTool = "Qt"
|
||||||
|
|
||||||
|
elif theFormat == self.FMT_HTM2:
|
||||||
|
fileExt = "htm"
|
||||||
|
textFmt = "Plain HTML"
|
||||||
|
outTool = "NW"
|
||||||
|
|
||||||
|
elif theFormat == self.FMT_MD:
|
||||||
|
byteFmt.append("markdown")
|
||||||
|
fileExt = "md"
|
||||||
|
textFmt = "Markdown"
|
||||||
|
outTool = "Qt"
|
||||||
|
|
||||||
|
elif theFormat == self.FMT_TXT:
|
||||||
|
byteFmt.append("plaintext")
|
||||||
|
fileExt = "txt"
|
||||||
|
textFmt = "Plain Text"
|
||||||
|
outTool = "Qt"
|
||||||
|
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Generate the file name
|
||||||
|
if fileExt:
|
||||||
|
|
||||||
|
cleanName = self.theProject.getFileSafeProjectName()
|
||||||
|
fileName = "%s.%s" % (cleanName, fileExt)
|
||||||
|
saveDir = self.mainConf.lastPath
|
||||||
|
savePath = path.join(saveDir, fileName)
|
||||||
|
if not path.isdir(saveDir):
|
||||||
|
saveDir = self.mainConf.homePath
|
||||||
|
|
||||||
|
dlgOpt = QFileDialog.Options()
|
||||||
|
dlgOpt |= QFileDialog.DontUseNativeDialog
|
||||||
|
saveTo = QFileDialog.getSaveFileName(
|
||||||
|
self, "Save Document As", savePath, options=dlgOpt
|
||||||
|
)
|
||||||
|
if saveTo[0]:
|
||||||
|
savePath = saveTo[0]
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
self.mainConf.setLastPath(savePath)
|
||||||
|
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Do the actual writing
|
||||||
|
if outTool == "Qt":
|
||||||
|
docWriter = QTextDocumentWriter()
|
||||||
|
docWriter.setFileName(savePath)
|
||||||
|
docWriter.setFormat(byteFmt)
|
||||||
|
if docWriter.write(self.docView.qDocument):
|
||||||
|
self.theParent.makeAlert(
|
||||||
|
"Document successfully written in %s format to file: %s" % (
|
||||||
|
textFmt, savePath
|
||||||
|
), nwAlert.INFO
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.theParent.makeAlert(
|
||||||
|
"Failed to write document in %s format to file: %s" % (
|
||||||
|
textFmt, savePath
|
||||||
|
), nwAlert.ERROR
|
||||||
|
)
|
||||||
|
|
||||||
|
elif outTool == "NW":
|
||||||
|
if theFormat == self.FMT_HTM2:
|
||||||
|
try:
|
||||||
|
with open(savePath, mode="w", encoding="utf8") as outFile:
|
||||||
|
outFile.write("<!DOCTYPE html>\n")
|
||||||
|
outFile.write("<html>\n")
|
||||||
|
outFile.write("<head>\n")
|
||||||
|
outFile.write("<meta charset='utf-8'>\n")
|
||||||
|
outFile.write("</head>\n")
|
||||||
|
outFile.write("<body>\n")
|
||||||
|
outFile.write(self.htmlText)
|
||||||
|
outFile.write("</body>\n")
|
||||||
|
outFile.write("</html>\n")
|
||||||
|
|
||||||
|
self.theParent.makeAlert(
|
||||||
|
"Document successfully written in %s format to file: %s" % (
|
||||||
|
textFmt, savePath
|
||||||
|
), nwAlert.INFO
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.theParent.makeAlert(
|
||||||
|
"Failed to write document in %s format to file: %s" % (
|
||||||
|
textFmt, str(e)
|
||||||
|
), nwAlert.ERROR
|
||||||
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def _printDocument(self):
|
def _printDocument(self):
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="0.5" fileVersion="1.0" saveCount="229" autoCount="28" timeStamp="2020-05-10 19:30:40">
|
<novelWriterXML appVersion="0.5" fileVersion="1.0" saveCount="240" autoCount="28" timeStamp="2020-05-10 21:26:54">
|
||||||
<project>
|
<project>
|
||||||
<name>Sample Project</name>
|
<name>Sample Project</name>
|
||||||
<title>Sample Project</title>
|
<title>Sample Project</title>
|
||||||
|
|||||||
Reference in New Issue
Block a user