Dropped Qt html export, and added nw markdown export

This commit is contained in:
Veronica K. B. Olsen
2020-05-12 19:44:30 +02:00
parent aa4778d4cd
commit aa342a7f19
3 changed files with 83 additions and 58 deletions
+28 -16
View File
@@ -43,6 +43,18 @@ class ToHtml(Tokenizer):
def __init__(self, theProject, theParent): def __init__(self, theProject, theParent):
Tokenizer.__init__(self, theProject, theParent) Tokenizer.__init__(self, theProject, theParent)
self.genMode = self.M_EXPORT self.genMode = self.M_EXPORT
self.repDict = {
"<" : "&lt;",
">" : "&gt;",
"&" : "&amp;",
"\t" : "&emsp;",
nwUnicode.U_ENDASH : nwUnicode.H_ENDASH,
nwUnicode.U_EMDASH : nwUnicode.H_EMDASH,
nwUnicode.U_HELLIP : nwUnicode.H_HELLIP,
nwUnicode.U_NBSP : nwUnicode.H_NBSP,
}
return return
## ##
@@ -58,6 +70,7 @@ class ToHtml(Tokenizer):
self.genMode = self.M_PREVIEW self.genMode = self.M_PREVIEW
self.doKeywords = True self.doKeywords = True
self.doComments = doComments self.doComments = doComments
self.repDict["\t"] = "&nbsp;"*8
return return
## ##
@@ -70,23 +83,22 @@ class ToHtml(Tokenizer):
""" """
Tokenizer.doAutoReplace(self) Tokenizer.doAutoReplace(self)
if self.genMode == self.M_PREVIEW: xRep = re.compile("|".join([re.escape(k) for k in self.repDict.keys()]), flags=re.DOTALL)
tabFmt = "&nbsp;"*8 self.theText = xRep.sub(lambda x: self.repDict[x.group(0)], self.theText)
else:
tabFmt = "&emsp;"
repDict = { return
"<" : "&lt;",
">" : "&gt;", def doPostProcessing(self):
"&" : "&amp;", """Reverse the html entities replacement on the markdown text.
"\t" : tabFmt, Otherwise, all the &something; bits will also be in there.
nwUnicode.U_ENDASH : nwUnicode.H_ENDASH, """
nwUnicode.U_EMDASH : nwUnicode.H_EMDASH, if self.genMode == self.M_PREVIEW:
nwUnicode.U_HELLIP : nwUnicode.H_HELLIP, # Doesn't matter for preview as we don't use the markdown
nwUnicode.U_NBSP : nwUnicode.H_NBSP, return
}
xRep = re.compile("|".join([re.escape(k) for k in repDict.keys()]), flags=re.DOTALL) revDict = dict(map(reversed, self.repDict.items()))
self.theText = xRep.sub(lambda x: repDict[x.group(0)], self.theText) xRep = re.compile("|".join([re.escape(k) for k in revDict.keys()]), flags=re.DOTALL)
self.theMarkdown = xRep.sub(lambda x: revDict[x.group(0)], self.theMarkdown)
return return
+2
View File
@@ -251,6 +251,8 @@ class Tokenizer():
return return
def doPostProcessing(self): def doPostProcessing(self):
"""Do some postprocessing. Overloaded by subclasses.
"""
return return
def tokenizeText(self): def tokenizeText(self):
+53 -42
View File
@@ -51,12 +51,12 @@ logger = logging.getLogger(__name__)
class GuiBuildNovel(QDialog): class GuiBuildNovel(QDialog):
FMT_ODT = 1 FMT_ODT = 1
FMT_PDF = 2 FMT_PDF = 2
FMT_HTM1 = 3 FMT_HTM = 3
FMT_HTM2 = 4 FMT_MD = 4
FMT_MD = 4 FMT_NWD = 5
FMT_TXT = 5 FMT_TXT = 6
def __init__(self, theParent, theProject): def __init__(self, theParent, theProject):
QDialog.__init__(self, theParent) QDialog.__init__(self, theParent)
@@ -69,8 +69,9 @@ class GuiBuildNovel(QDialog):
self.theTheme = theParent.theTheme self.theTheme = theParent.theTheme
self.optState = self.theProject.optState self.optState = self.theProject.optState
self.htmlText = "" self.htmlText = [] # List of html document
self.nwdText = "" self.nwdText = [] # List of markdown documents
self.textLayout = [] # List of nwItemLayout entries
self.setWindowTitle("Build Novel Project") self.setWindowTitle("Build Novel Project")
self.setMinimumWidth(800) self.setMinimumWidth(800)
@@ -226,19 +227,19 @@ class GuiBuildNovel(QDialog):
self.savePDF.triggered.connect(lambda: self._saveDocument(self.FMT_PDF)) self.savePDF.triggered.connect(lambda: self._saveDocument(self.FMT_PDF))
self.saveMenu.addAction(self.savePDF) self.saveMenu.addAction(self.savePDF)
self.saveHTM1 = QAction("Qt Style HTML (.htm)") self.saveHTM = QAction("%s HTML (.htm)" % nw.__package__)
self.saveHTM1.triggered.connect(lambda: self._saveDocument(self.FMT_HTM1)) self.saveHTM.triggered.connect(lambda: self._saveDocument(self.FMT_HTM))
self.saveMenu.addAction(self.saveHTM1) self.saveMenu.addAction(self.saveHTM)
self.saveHTM2 = QAction("%s HTML (.htm)" % nw.__package__)
self.saveHTM2.triggered.connect(lambda: self._saveDocument(self.FMT_HTM2))
self.saveMenu.addAction(self.saveHTM2)
if self.mainConf.verQtValue >= 51400: if self.mainConf.verQtValue >= 51400:
self.saveMD = QAction("Markdown (.md)") self.saveMD = QAction("Markdown (.md)")
self.saveMD.triggered.connect(lambda: self._saveDocument(self.FMT_MD)) self.saveMD.triggered.connect(lambda: self._saveDocument(self.FMT_MD))
self.saveMenu.addAction(self.saveMD) self.saveMenu.addAction(self.saveMD)
self.saveNWD = QAction("novelWriter Markdown (.nwd)")
self.saveNWD.triggered.connect(lambda: self._saveDocument(self.FMT_NWD))
self.saveMenu.addAction(self.saveNWD)
self.saveTXT = QAction("Plain Text (.txt)") self.saveTXT = QAction("Plain Text (.txt)")
self.saveTXT.triggered.connect(lambda: self._saveDocument(self.FMT_TXT)) self.saveTXT.triggered.connect(lambda: self._saveDocument(self.FMT_TXT))
self.saveMenu.addAction(self.saveTXT) self.saveMenu.addAction(self.saveTXT)
@@ -318,8 +319,10 @@ class GuiBuildNovel(QDialog):
tStart = time() tStart = time()
tmpHtml = [] self.htmlText = []
tmpNwd = [] self.nwdText = []
self.textLayout = []
for nItt, tItem in enumerate(self.theProject.projTree): for nItt, tItem in enumerate(self.theProject.projTree):
if self._checkInclude(tItem, noteFiles, novelFiles, ignoreFlag): if self._checkInclude(tItem, noteFiles, novelFiles, ignoreFlag):
makeHtml.setText(tItem.itemHandle) makeHtml.setText(tItem.itemHandle)
@@ -328,17 +331,18 @@ class GuiBuildNovel(QDialog):
makeHtml.doHeaders() makeHtml.doHeaders()
makeHtml.doConvert() makeHtml.doConvert()
makeHtml.doPostProcessing() makeHtml.doPostProcessing()
tmpHtml.append(makeHtml.getResult()) self.htmlText.append(makeHtml.getResult())
tmpNwd.append(makeHtml.getFilteredMarkdown()) self.nwdText.append(makeHtml.getFilteredMarkdown())
self.buildProgress.setValue(nItt+1) self.textLayout.append(tItem.itemLayout)
self.htmlText = "".join(tmpHtml) # Update progress bar, also for skipped items
self.nwdText = "".join(tmpNwd) self.buildProgress.setValue(nItt+1)
tEnd = time() tEnd = time()
logger.debug("Built project in %.3f ms" % (1000*(tEnd-tStart))) logger.debug("Built project in %.3f ms" % (1000*(tEnd-tStart)))
self.docView.setHtml(self.htmlText) # Load the preview document with the html data
self.docView.setHtml("".join(self.htmlText))
return return
@@ -402,13 +406,7 @@ class GuiBuildNovel(QDialog):
textFmt = "PDF" textFmt = "PDF"
outTool = "QtPrint" outTool = "QtPrint"
elif theFormat == self.FMT_HTM1: elif theFormat == self.FMT_HTM:
byteFmt.append("html")
fileExt = "htm"
textFmt = "Qt Style HTML"
outTool = "Qt"
elif theFormat == self.FMT_HTM2:
fileExt = "htm" fileExt = "htm"
textFmt = "Plain HTML" textFmt = "Plain HTML"
outTool = "NW" outTool = "NW"
@@ -419,6 +417,11 @@ class GuiBuildNovel(QDialog):
textFmt = "Markdown" textFmt = "Markdown"
outTool = "Qt" outTool = "Qt"
elif theFormat == self.FMT_NWD:
fileExt = "nwd"
textFmt = "%s markdown" % nw.__package__
outTool = "NW"
elif theFormat == self.FMT_TXT: elif theFormat == self.FMT_TXT:
byteFmt.append("plaintext") byteFmt.append("plaintext")
fileExt = "txt" fileExt = "txt"
@@ -471,20 +474,28 @@ class GuiBuildNovel(QDialog):
), nwAlert.ERROR ), nwAlert.ERROR
) )
elif outTool == "NW" and theFormat == self.FMT_HTM2: elif outTool == "NW":
try: try:
with open(savePath, mode="w", encoding="utf8") as outFile: with open(savePath, mode="w", encoding="utf8") as outFile:
outFile.write("<!DOCTYPE html>\n") if theFormat == self.FMT_HTM:
outFile.write("<html>\n") # Write novelWriter HTML data
outFile.write("<head>\n") outFile.write("<!DOCTYPE html>\n")
outFile.write("<meta charset='utf-8'>\n") outFile.write("<html>\n")
outFile.write("</head>\n") outFile.write("<head>\n")
outFile.write("<body>\n") outFile.write("<meta charset='utf-8'>\n")
outFile.write("<article style='width: 800px; margin: 40px auto'>\n") outFile.write("</head>\n")
outFile.write(self.htmlText) outFile.write("<body>\n")
outFile.write("</article>\n") outFile.write("<article style='width: 800px; margin: 40px auto'>\n")
outFile.write("</body>\n") for aLine in self.htmlText:
outFile.write("</html>\n") outFile.write(aLine)
outFile.write("</article>\n")
outFile.write("</body>\n")
outFile.write("</html>\n")
elif theFormat == self.FMT_NWD:
# Write novelWriter markdown data
for aLine in self.nwdText:
outFile.write(aLine)
self.theParent.makeAlert( self.theParent.makeAlert(
"Document successfully written in %s format to file: %s" % ( "Document successfully written in %s format to file: %s" % (