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)