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 = []