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