From aa342a7f19d878e49ffd9841fc009c8d5922d101 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Tue, 12 May 2020 19:44:30 +0200 Subject: [PATCH] Dropped Qt html export, and added nw markdown export --- nw/core/tohtml.py | 44 ++++++++++++-------- nw/core/tokenizer.py | 2 + nw/gui/build.py | 95 ++++++++++++++++++++++++-------------------- 3 files changed, 83 insertions(+), 58 deletions(-) diff --git a/nw/core/tohtml.py b/nw/core/tohtml.py index 7980d80b..f10ee1e3 100644 --- a/nw/core/tohtml.py +++ b/nw/core/tohtml.py @@ -43,6 +43,18 @@ class ToHtml(Tokenizer): def __init__(self, theProject, theParent): Tokenizer.__init__(self, theProject, theParent) self.genMode = self.M_EXPORT + + self.repDict = { + "<" : "<", + ">" : ">", + "&" : "&", + "\t" : " ", + 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 ## @@ -58,6 +70,7 @@ class ToHtml(Tokenizer): self.genMode = self.M_PREVIEW self.doKeywords = True self.doComments = doComments + self.repDict["\t"] = " "*8 return ## @@ -70,23 +83,22 @@ class ToHtml(Tokenizer): """ Tokenizer.doAutoReplace(self) - if self.genMode == self.M_PREVIEW: - tabFmt = " "*8 - else: - tabFmt = " " + xRep = re.compile("|".join([re.escape(k) for k in self.repDict.keys()]), flags=re.DOTALL) + self.theText = xRep.sub(lambda x: self.repDict[x.group(0)], self.theText) - repDict = { - "<" : "<", - ">" : ">", - "&" : "&", - "\t" : tabFmt, - nwUnicode.U_ENDASH : nwUnicode.H_ENDASH, - nwUnicode.U_EMDASH : nwUnicode.H_EMDASH, - nwUnicode.U_HELLIP : nwUnicode.H_HELLIP, - nwUnicode.U_NBSP : nwUnicode.H_NBSP, - } - xRep = re.compile("|".join([re.escape(k) for k in repDict.keys()]), flags=re.DOTALL) - self.theText = xRep.sub(lambda x: repDict[x.group(0)], self.theText) + return + + def doPostProcessing(self): + """Reverse the html entities replacement on the markdown text. + Otherwise, all the &something; bits will also be in there. + """ + if self.genMode == self.M_PREVIEW: + # Doesn't matter for preview as we don't use the markdown + return + + revDict = dict(map(reversed, self.repDict.items())) + 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 diff --git a/nw/core/tokenizer.py b/nw/core/tokenizer.py index 025a9cfb..80cc216d 100644 --- a/nw/core/tokenizer.py +++ b/nw/core/tokenizer.py @@ -251,6 +251,8 @@ class Tokenizer(): return def doPostProcessing(self): + """Do some postprocessing. Overloaded by subclasses. + """ return def tokenizeText(self): diff --git a/nw/gui/build.py b/nw/gui/build.py index d95be6de..737a13c4 100644 --- a/nw/gui/build.py +++ b/nw/gui/build.py @@ -51,12 +51,12 @@ logger = logging.getLogger(__name__) class GuiBuildNovel(QDialog): - FMT_ODT = 1 - FMT_PDF = 2 - FMT_HTM1 = 3 - FMT_HTM2 = 4 - FMT_MD = 4 - FMT_TXT = 5 + FMT_ODT = 1 + FMT_PDF = 2 + FMT_HTM = 3 + FMT_MD = 4 + FMT_NWD = 5 + FMT_TXT = 6 def __init__(self, theParent, theProject): QDialog.__init__(self, theParent) @@ -69,8 +69,9 @@ class GuiBuildNovel(QDialog): self.theTheme = theParent.theTheme self.optState = self.theProject.optState - self.htmlText = "" - self.nwdText = "" + self.htmlText = [] # List of html document + self.nwdText = [] # List of markdown documents + self.textLayout = [] # List of nwItemLayout entries self.setWindowTitle("Build Novel Project") self.setMinimumWidth(800) @@ -226,19 +227,19 @@ class GuiBuildNovel(QDialog): 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("%s HTML (.htm)" % nw.__package__) - self.saveHTM2.triggered.connect(lambda: self._saveDocument(self.FMT_HTM2)) - self.saveMenu.addAction(self.saveHTM2) + self.saveHTM = QAction("%s HTML (.htm)" % nw.__package__) + self.saveHTM.triggered.connect(lambda: self._saveDocument(self.FMT_HTM)) + self.saveMenu.addAction(self.saveHTM) if self.mainConf.verQtValue >= 51400: self.saveMD = QAction("Markdown (.md)") self.saveMD.triggered.connect(lambda: self._saveDocument(self.FMT_MD)) 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.triggered.connect(lambda: self._saveDocument(self.FMT_TXT)) self.saveMenu.addAction(self.saveTXT) @@ -318,8 +319,10 @@ class GuiBuildNovel(QDialog): tStart = time() - tmpHtml = [] - tmpNwd = [] + self.htmlText = [] + self.nwdText = [] + self.textLayout = [] + for nItt, tItem in enumerate(self.theProject.projTree): if self._checkInclude(tItem, noteFiles, novelFiles, ignoreFlag): makeHtml.setText(tItem.itemHandle) @@ -328,17 +331,18 @@ class GuiBuildNovel(QDialog): makeHtml.doHeaders() makeHtml.doConvert() makeHtml.doPostProcessing() - tmpHtml.append(makeHtml.getResult()) - tmpNwd.append(makeHtml.getFilteredMarkdown()) - self.buildProgress.setValue(nItt+1) + self.htmlText.append(makeHtml.getResult()) + self.nwdText.append(makeHtml.getFilteredMarkdown()) + self.textLayout.append(tItem.itemLayout) - self.htmlText = "".join(tmpHtml) - self.nwdText = "".join(tmpNwd) + # Update progress bar, also for skipped items + self.buildProgress.setValue(nItt+1) tEnd = time() 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 @@ -402,13 +406,7 @@ class GuiBuildNovel(QDialog): textFmt = "PDF" outTool = "QtPrint" - elif theFormat == self.FMT_HTM1: - byteFmt.append("html") - fileExt = "htm" - textFmt = "Qt Style HTML" - outTool = "Qt" - - elif theFormat == self.FMT_HTM2: + elif theFormat == self.FMT_HTM: fileExt = "htm" textFmt = "Plain HTML" outTool = "NW" @@ -419,6 +417,11 @@ class GuiBuildNovel(QDialog): textFmt = "Markdown" outTool = "Qt" + elif theFormat == self.FMT_NWD: + fileExt = "nwd" + textFmt = "%s markdown" % nw.__package__ + outTool = "NW" + elif theFormat == self.FMT_TXT: byteFmt.append("plaintext") fileExt = "txt" @@ -471,20 +474,28 @@ class GuiBuildNovel(QDialog): ), nwAlert.ERROR ) - elif outTool == "NW" and theFormat == self.FMT_HTM2: + elif outTool == "NW": try: with open(savePath, mode="w", encoding="utf8") as outFile: - outFile.write("\n") - outFile.write("\n") - outFile.write("\n") - outFile.write("\n") - outFile.write("\n") - outFile.write("\n") - outFile.write("
\n") - outFile.write(self.htmlText) - outFile.write("
\n") - outFile.write("\n") - outFile.write("\n") + if theFormat == self.FMT_HTM: + # Write novelWriter HTML data + outFile.write("\n") + outFile.write("\n") + outFile.write("\n") + outFile.write("\n") + outFile.write("\n") + outFile.write("\n") + outFile.write("
\n") + for aLine in self.htmlText: + outFile.write(aLine) + outFile.write("
\n") + outFile.write("\n") + outFile.write("\n") + + elif theFormat == self.FMT_NWD: + # Write novelWriter markdown data + for aLine in self.nwdText: + outFile.write(aLine) self.theParent.makeAlert( "Document successfully written in %s format to file: %s" % (