From 05014cb4c999384b26ce9ea49605c0eacd011db5 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:12:45 +0200 Subject: [PATCH 1/4] Fixed out of bounds crash in HTML converter --- nw/core/tohtml.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/nw/core/tohtml.py b/nw/core/tohtml.py index 282717b3..61541f42 100644 --- a/nw/core/tohtml.py +++ b/nw/core/tohtml.py @@ -312,23 +312,24 @@ class ToHtml(Tokenizer): refTags = [] if theBits[0] in nwLabels.KEY_NAME: retText += "%s: " % nwLabels.KEY_NAME[theBits[0]] - if theBits[0] == nwKeyWords.TAG_KEY: - retText += "%s" % ( - theBits[1], theBits[1] - ) - else: - if self.genMode == self.M_PREVIEW: - for tTag in theBits[1:]: - refTags.append("%s" % ( - theBits[0][1:], tTag, tTag - )) - retText += ", ".join(refTags) + if len(theBits) > 1: + if theBits[0] == nwKeyWords.TAG_KEY: + retText += "%s" % ( + theBits[1], theBits[1] + ) else: - for tTag in theBits[1:]: - refTags.append("%s" % ( - tTag, tTag - )) - retText += ", ".join(refTags) + if self.genMode == self.M_PREVIEW: + for tTag in theBits[1:]: + refTags.append("%s" % ( + theBits[0][1:], tTag, tTag + )) + retText += ", ".join(refTags) + else: + for tTag in theBits[1:]: + refTags.append("%s" % ( + tTag, tTag + )) + retText += ", ".join(refTags) return "
%s
" % retText From 2c304b2bdd6cf1d894a51aec4d49635c6e547745 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:21:08 +0200 Subject: [PATCH 2/4] Made the doc viewer more fail tolerant --- nw/gui/docviewer.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/nw/gui/docviewer.py b/nw/gui/docviewer.py index 3c4f86b9..0624a321 100644 --- a/nw/gui/docviewer.py +++ b/nw/gui/docviewer.py @@ -135,11 +135,22 @@ class GuiDocViewer(QTextBrowser): aDoc = ToHtml(self.theProject, self.theParent) aDoc.setPreview(True, self.mainConf.viewComments) aDoc.setLinkHeaders(True) - aDoc.setText(tHandle) - aDoc.doAutoReplace() - aDoc.tokenizeText() - aDoc.doConvert() - aDoc.doPostProcessing() + + # Be extra careful here to prevent crashes when first opening a + # project as a crash here leaves no way of recovering. + # See issue #298 + try: + aDoc.setText(tHandle) + aDoc.doAutoReplace() + aDoc.tokenizeText() + aDoc.doConvert() + aDoc.doPostProcessing() + except Exception as e: + logger.error("Failed to generate preview for document with handle '%s'" % tHandle) + logger.error(str(e)) + self.setText("An error occurred while generating the preview.") + return False + self.setHtml(aDoc.theResult) if self.theHandle == tHandle: self.verticalScrollBar().setValue(sPos) From 9045269f344d63ff7a4a73246e8bbd5ac773b5eb Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:27:21 +0200 Subject: [PATCH 3/4] Also added bug-capturing in build tool for conversion errors --- nw/gui/build.py | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/nw/gui/build.py b/nw/gui/build.py index 87bb8e65..02841833 100644 --- a/nw/gui/build.py +++ b/nw/gui/build.py @@ -476,22 +476,32 @@ class GuiBuildNovel(QDialog): noteRoot &= tItem.itemType == nwItemType.ROOT noteRoot &= tItem.itemClass != nwItemClass.NOVEL - if noteRoot: - # Add headers for root folders of notes - makeHtml.addRootHeading(tItem.itemHandle) - makeHtml.doConvert() - self.htmlText.append(makeHtml.getResult()) - self.nwdText.append(makeHtml.getFilteredMarkdown()) + try: + if noteRoot: + # Add headers for root folders of notes + makeHtml.addRootHeading(tItem.itemHandle) + makeHtml.doConvert() + self.htmlText.append(makeHtml.getResult()) + self.nwdText.append(makeHtml.getFilteredMarkdown()) - elif self._checkInclude(tItem, noteFiles, novelFiles, ignoreFlag): - makeHtml.setText(tItem.itemHandle) - makeHtml.doAutoReplace() - makeHtml.tokenizeText() - makeHtml.doHeaders() - makeHtml.doConvert() - makeHtml.doPostProcessing() - self.htmlText.append(makeHtml.getResult()) - self.nwdText.append(makeHtml.getFilteredMarkdown()) + elif self._checkInclude(tItem, noteFiles, novelFiles, ignoreFlag): + makeHtml.setText(tItem.itemHandle) + makeHtml.doAutoReplace() + makeHtml.tokenizeText() + makeHtml.doHeaders() + makeHtml.doConvert() + makeHtml.doPostProcessing() + self.htmlText.append(makeHtml.getResult()) + self.nwdText.append(makeHtml.getFilteredMarkdown()) + + except Exception as e: + logger.error("Failed to generate html of document '%s'" % tItem.itemHandle) + logger.error(str(e)) + self.docView.setText(( + "Failed to generate preview. " + "Document with title '%s' could not be parsed." + ) % tItem.itemName) + return False # Update progress bar, also for skipped items self.buildProgress.setValue(nItt+1) From a62a7711bee12311f35fe3d225a9469c3c9df1e4 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:41:15 +0200 Subject: [PATCH 4/4] Added a printout of the version at the very start of the log --- nw/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nw/__init__.py b/nw/__init__.py index 2b8b15a1..0d1c2088 100644 --- a/nw/__init__.py +++ b/nw/__init__.py @@ -216,6 +216,7 @@ def main(sysArgs=None): logger.addHandler(cHandle) logger.setLevel(debugLevel) + logger.info("This is %s %s" % (__package__, __version__)) # Check Packages and Versions errorData = []