Added large size handling to build tool
This commit is contained in:
+17
-1
@@ -33,7 +33,7 @@ from PyQt5.QtCore import QRegularExpression
|
||||
|
||||
from nw.core.document import NWDoc
|
||||
from nw.core.tools import numberToWord, numberToRoman
|
||||
from nw.constants import nwItemLayout, nwItemType, nwRegEx
|
||||
from nw.constants import nwConst, nwItemLayout, nwItemType, nwRegEx
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -120,6 +120,9 @@ class Tokenizer():
|
||||
self.isNote = False
|
||||
self.isNovel = False
|
||||
|
||||
# Error Handling
|
||||
self.errData = []
|
||||
|
||||
return
|
||||
|
||||
##
|
||||
@@ -212,6 +215,14 @@ class Tokenizer():
|
||||
theDocument = NWDoc(self.theProject, self.theParent)
|
||||
self.theText = theDocument.openDocument(theHandle)
|
||||
|
||||
docSize = len(self.theText)
|
||||
if docSize > nwConst.maxDocSize:
|
||||
errVal = "Document '%s' is too big (%.2f MB). Skipping." % (
|
||||
self.theItem.itemName, docSize/1.0e6
|
||||
)
|
||||
self.theText = "# ERROR\n\n%s\n\n" % errVal
|
||||
self.errData.append(errVal)
|
||||
|
||||
self.isNone = self.theItem.itemLayout == nwItemLayout.NO_LAYOUT
|
||||
self.isTitle = self.theItem.itemLayout == nwItemLayout.TITLE
|
||||
self.isBook = self.theItem.itemLayout == nwItemLayout.BOOK
|
||||
@@ -230,6 +241,11 @@ class Tokenizer():
|
||||
"""
|
||||
return self.theResult
|
||||
|
||||
def getResultSize(self):
|
||||
"""Return the size of the result from the conversion.
|
||||
"""
|
||||
return len(self.theResult)
|
||||
|
||||
def getFilteredMarkdown(self):
|
||||
"""Return the novelWriter markdown after the filters have been applied.
|
||||
"""
|
||||
|
||||
+40
-4
@@ -49,7 +49,7 @@ from nw.common import fuzzyTime, makeFileNameSafe
|
||||
from nw.gui.custom import QSwitch
|
||||
from nw.core import ToHtml
|
||||
from nw.constants import (
|
||||
nwAlert, nwFiles, nwItemType, nwItemLayout, nwItemClass
|
||||
nwConst, nwAlert, nwFiles, nwItemType, nwItemLayout, nwItemClass
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -77,7 +77,7 @@ class GuiBuildNovel(QDialog):
|
||||
self.theTheme = theParent.theTheme
|
||||
self.optState = self.theProject.optState
|
||||
|
||||
self.htmlText = [] # List of html document
|
||||
self.htmlText = [] # List of html documents
|
||||
self.htmlStyle = [] # List of html styles
|
||||
self.nwdText = [] # List of markdown documents
|
||||
self.buildTime = 0 # The timestamp of the last build
|
||||
@@ -494,7 +494,15 @@ class GuiBuildNovel(QDialog):
|
||||
self.docView.clearStyleSheet()
|
||||
else:
|
||||
self.docView.setStyleSheet(self.htmlStyle)
|
||||
self.docView.setContent(self.htmlText, self.buildTime)
|
||||
|
||||
htmlSize = sum([len(x) for x in self.htmlText])
|
||||
if htmlSize < nwConst.maxBuildSize:
|
||||
self.docView.setContent(self.htmlText, self.buildTime)
|
||||
else:
|
||||
self.docView.setText(
|
||||
"Failed to generate preview. The result is too big."
|
||||
)
|
||||
self._enableQtSave(False)
|
||||
else:
|
||||
self.htmlText = []
|
||||
self.htmlStyle = []
|
||||
@@ -554,6 +562,8 @@ class GuiBuildNovel(QDialog):
|
||||
self.htmlStyle = []
|
||||
self.nwdText = []
|
||||
|
||||
htmlSize = 0
|
||||
|
||||
for nItt, tItem in enumerate(self.theProject.projTree):
|
||||
|
||||
noteRoot = noteFiles
|
||||
@@ -578,6 +588,7 @@ class GuiBuildNovel(QDialog):
|
||||
makeHtml.doPostProcessing()
|
||||
self.htmlText.append(makeHtml.getResult())
|
||||
self.nwdText.append(makeHtml.getFilteredMarkdown())
|
||||
htmlSize += makeHtml.getResultSize()
|
||||
|
||||
except Exception as e:
|
||||
logger.error("Failed to generate html of document '%s'" % tItem.itemHandle)
|
||||
@@ -591,6 +602,12 @@ class GuiBuildNovel(QDialog):
|
||||
# Update progress bar, also for skipped items
|
||||
self.buildProgress.setValue(nItt+1)
|
||||
|
||||
if makeHtml.errData:
|
||||
self.theParent.makeAlert((
|
||||
"There were problems when building the project:"
|
||||
"<br>- %s"
|
||||
) % "<br>- ".join(makeHtml.errData), nwAlert.ERROR)
|
||||
|
||||
if replaceTabs:
|
||||
htmlText = []
|
||||
eightSpace = " "*8
|
||||
@@ -615,7 +632,16 @@ class GuiBuildNovel(QDialog):
|
||||
self.docView.clearStyleSheet()
|
||||
else:
|
||||
self.docView.setStyleSheet(self.htmlStyle)
|
||||
self.docView.setContent(self.htmlText, self.buildTime)
|
||||
|
||||
if htmlSize < nwConst.maxBuildSize:
|
||||
self.docView.setContent(self.htmlText, self.buildTime)
|
||||
self._enableQtSave(True)
|
||||
else:
|
||||
self.docView.setText(
|
||||
"Failed to generate preview. The result is too big."
|
||||
)
|
||||
allowQtSave = False
|
||||
self._enableQtSave(False)
|
||||
|
||||
self._saveCache()
|
||||
|
||||
@@ -962,6 +988,16 @@ class GuiBuildNovel(QDialog):
|
||||
# Internal Functions
|
||||
##
|
||||
|
||||
def _enableQtSave(self, theState):
|
||||
"""Set the enabled status of Save menu entries that depend on
|
||||
the QTextDocument.
|
||||
"""
|
||||
self.saveODT.setEnabled(theState)
|
||||
self.savePDF.setEnabled(theState)
|
||||
self.saveMD.setEnabled(theState)
|
||||
self.saveTXT.setEnabled(theState)
|
||||
return
|
||||
|
||||
def _saveSettings(self):
|
||||
"""Save the various user settings.
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user