Finished save file options for now. Still missing markdown and PDF

This commit is contained in:
Veronica K. B. Olsen
2020-05-10 21:27:28 +02:00
parent 26b8379ada
commit 771e44055d
3 changed files with 168 additions and 29 deletions
+10 -5
View File
@@ -529,11 +529,7 @@ class NWProject():
), nwAlert.WARN)
return False
cleanName = ""
for c in self.projName.strip():
if c.isalpha() or c.isdigit() or c == " ":
cleanName += c
cleanName = self.getFileSafeProjectName()
baseDir = path.join(self.mainConf.backupPath, cleanName)
if not path.isdir(baseDir):
try:
@@ -740,6 +736,15 @@ class NWProject():
# 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):
"""Returns the number of words added or removed this session.
"""
+157 -23
View File
@@ -30,12 +30,14 @@ import nw
from os import path
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QTextOption, QPalette, QColor
from PyQt5.QtCore import Qt, QByteArray
from PyQt5.QtGui import (
QTextOption, QPalette, QColor, QTextDocumentWriter
)
from PyQt5.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QTextBrowser, QPushButton,
QLabel, QLineEdit, QGroupBox, QGridLayout, QComboBox, QProgressBar,
QMenu, QAction
QMenu, QAction, QFileDialog
)
from nw.gui.additions import QSwitch
@@ -46,10 +48,12 @@ logger = logging.getLogger(__name__)
class GuiBuildNovel(QDialog):
FMT_ODT = 1
FMT_PDF = 2
FMT_HTM = 3
FMT_MD = 4
FMT_ODT = 1
FMT_PDF = 2
FMT_HTM1 = 3
FMT_HTM2 = 4
FMT_MD = 4
FMT_TXT = 5
def __init__(self, theParent, theProject):
QDialog.__init__(self, theParent)
@@ -62,6 +66,8 @@ class GuiBuildNovel(QDialog):
self.theTheme = theParent.theTheme
self.optState = self.theProject.optState
self.htmlText = ""
self.setWindowTitle("Build Project")
self.setMinimumWidth(800)
self.setMinimumHeight(700)
@@ -202,20 +208,32 @@ class GuiBuildNovel(QDialog):
self.btnSave = QPushButton("Save As")
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.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.clicked.connect(self._doClose)
@@ -263,7 +281,7 @@ class GuiBuildNovel(QDialog):
"""
makeHtml = ToHtml(self.theProject, self.theParent)
theText = ""
self.htmlText = ""
for tItem in self.theProject.projTree:
if tItem is not None and tItem.itemType == nwItemType.FILE:
@@ -273,14 +291,130 @@ class GuiBuildNovel(QDialog):
makeHtml.doHeaders()
makeHtml.doConvert()
makeHtml.doPostProcessing()
theText += makeHtml.getResult()
self.htmlText += makeHtml.getResult()
self.docView.setHtml(theText)
self.docView.setHtml(self.htmlText)
return
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):
return
+1 -1
View File
@@ -1,5 +1,5 @@
<?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>
<name>Sample Project</name>
<title>Sample Project</title>