-
diff --git a/tests/test_core/test_core_docbuild.py b/tests/test_core/test_core_docbuild.py
index dde00264..0dabad71 100644
--- a/tests/test_core/test_core_docbuild.py
+++ b/tests/test_core/test_core_docbuild.py
@@ -80,7 +80,7 @@ def testCoreDocBuild_OpenDocument(monkeypatch, mockGUI, prjLipsum, fncPath, tstP
docBuild = NWBuildDocument(project, build)
docBuild.queueAll()
- assert docBuild.buildLength == 21
+ assert len(docBuild) == 21
# Check FODT Build
# ================
@@ -139,7 +139,7 @@ def testCoreDocBuild_OpenDocument(monkeypatch, mockGUI, prjLipsum, fncPath, tstP
mp.setattr("novelwriter.core.toodt.ToOdt.doConvert", causeException)
docBuild.addDocument("0000000000000")
- assert docBuild.buildLength == 22
+ assert len(docBuild) == 22
count = 0
error = []
@@ -188,7 +188,7 @@ def testCoreDocBuild_HTML(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths):
docBuild = NWBuildDocument(project, build)
docBuild.queueAll()
- assert docBuild.buildLength == 21
+ assert len(docBuild) == 21
# Check HTML5 Build
# =================
@@ -239,7 +239,7 @@ def testCoreDocBuild_Markdown(monkeypatch, mockGUI, prjLipsum, fncPath, tstPaths
docBuild = NWBuildDocument(project, build)
docBuild.queueAll()
- assert docBuild.buildLength == 21
+ assert len(docBuild) == 21
# Check Standard Markdown Build
# =============================
From 8fdec71f4b49adb3f3e57d3ccbb1d9817fcef3f3 Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Thu, 1 Jun 2023 00:12:27 +0200
Subject: [PATCH 42/74] Improve how manuscript dialog closing is handled
---
novelwriter/tools/manuscript.py | 33 ++++++++-------
novelwriter/tools/manussettings.py | 64 ++++++++++++++++++------------
2 files changed, 54 insertions(+), 43 deletions(-)
diff --git a/novelwriter/tools/manuscript.py b/novelwriter/tools/manuscript.py
index 59abadbd..fe4c6693 100644
--- a/novelwriter/tools/manuscript.py
+++ b/novelwriter/tools/manuscript.py
@@ -56,7 +56,7 @@ class GuiManuscript(QDialog):
def __init__(self, mainGui: GuiMain):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiManuscript ...")
+ logger.debug("Created: GuiManuscript")
self.setObjectName("GuiManuscript")
self.mainGui = mainGui
@@ -161,10 +161,14 @@ class GuiManuscript(QDialog):
self.setLayout(self.outerBox)
self.setSizeGripEnabled(True)
- logger.debug("GuiManuscript initialisation complete")
+ logger.debug("Ready: GuiManuscript")
return
+ def __del__(self):
+ logger.debug("Deleted: GuiManuscript")
+ return
+
def loadContent(self):
"""Load dialog content from project data.
"""
@@ -179,8 +183,13 @@ class GuiManuscript(QDialog):
def closeEvent(self, event):
"""Capture the user closing the window so we can save settings.
"""
- self._beforeClose()
+ self._saveSettings()
+ for obj in self.children():
+ # Make sure we don't have any settings windows open
+ if isinstance(obj, GuiBuildSettings) and obj.isVisible():
+ obj.close()
event.accept()
+ self.deleteLater()
return
##
@@ -216,7 +225,8 @@ class GuiManuscript(QDialog):
@pyqtSlot()
def _generatePreview(self):
- """
+ """Run the document builder on the current build settings for
+ the preview widget.
"""
build = self._getSelectedBuild()
if build is None:
@@ -255,7 +265,6 @@ class GuiManuscript(QDialog):
def _doClose(self):
"""The close button has been clicked.
"""
- self._beforeClose()
self.close()
return
@@ -278,15 +287,6 @@ class GuiManuscript(QDialog):
"""
return
- def _beforeClose(self):
- """List of things to do before closing.
- """
- self._saveSettings()
- for qWidget in qApp.topLevelWidgets():
- if qWidget.objectName() == "GuiBuildSettings":
- qWidget.close()
- return
-
def _saveSettings(self):
"""Save the various user settings.
"""
@@ -309,16 +309,15 @@ class GuiManuscript(QDialog):
return
def _openSettingsDialog(self, build: BuildSettings):
- """Open a new build settings dialog.
+ """Open the build settings dialog.
"""
- dlgSettings = GuiBuildSettings(self.mainGui, build)
+ dlgSettings = GuiBuildSettings(self, self.mainGui, build)
dlgSettings.setModal(False)
dlgSettings.show()
dlgSettings.raise_()
qApp.processEvents()
dlgSettings.loadContent()
dlgSettings.newSettingsReady.connect(self._processNewSettings)
-
return
def _updateBuildsList(self):
diff --git a/novelwriter/tools/manussettings.py b/novelwriter/tools/manussettings.py
index c638edc9..c68eae80 100644
--- a/novelwriter/tools/manussettings.py
+++ b/novelwriter/tools/manussettings.py
@@ -65,10 +65,10 @@ class GuiBuildSettings(QDialog):
newSettingsReady = pyqtSignal(BuildSettings)
- def __init__(self, mainGui: GuiMain, build: BuildSettings):
- super().__init__(parent=mainGui)
+ def __init__(self, parent: QWidget, mainGui: GuiMain, build: BuildSettings):
+ super().__init__(parent=parent)
- logger.debug("Initialising GuiBuildSettings ...")
+ logger.debug("Created: GuiBuildSettings")
self.setObjectName("GuiBuildSettings")
self.mainGui = mainGui
@@ -159,10 +159,13 @@ class GuiBuildSettings(QDialog):
# Set Default Tab
self.optSideBar.setSelected(self.OPT_FILTERS)
- logger.debug("GuiBuildSettings initialisation complete")
+ logger.debug("Ready: GuiBuildSettings")
return
+ def __del__(self):
+ logger.debug("Deleted: GuiBuildSettings")
+
def loadContent(self):
"""Populate the child widgets.
"""
@@ -199,21 +202,13 @@ class GuiBuildSettings(QDialog):
"""Handle button clicks from the dialog button box.
"""
role = self.dlgButtons.buttonRole(button)
- if role in (QDialogButtonBox.ApplyRole, QDialogButtonBox.AcceptRole):
- self._build.setName(self.editBuildName.text())
- self.optTabHeadings.saveContent()
- self.optTabContent.saveContent()
- self.optTabFormat.saveContent()
- self.optTabOutput.saveContent()
- self.newSettingsReady.emit(self._build)
-
- self._saveSettings()
- if role == QDialogButtonBox.AcceptRole:
- self.accept()
+ if role == QDialogButtonBox.ApplyRole:
+ self._emitBuildData()
+ elif role == QDialogButtonBox.AcceptRole:
+ self._emitBuildData()
+ self.close()
elif role == QDialogButtonBox.RejectRole:
- if self._checkOkClose():
- self.reject()
-
+ self.close()
return
##
@@ -223,25 +218,30 @@ class GuiBuildSettings(QDialog):
def closeEvent(self, event: QEvent):
"""Capture the user closing the window so we can save settings.
"""
- if self._checkOkClose():
- self._saveSettings()
- event.accept()
+ logger.debug("Closing: GuiBuildSettings")
+ self._askToSaveBuild()
+ self._saveSettings()
+ event.accept()
+ self.deleteLater()
return
##
# Internal Functions
##
- def _checkOkClose(self) -> bool:
+ def _askToSaveBuild(self):
"""Check if there are unsaved changes, and if there are, ask if
- it';'s ok to reject them.
+ it's ok to reject them.
"""
if self._build.changed:
- return self.mainGui.askQuestion(
+ doSave = self.mainGui.askQuestion(
self.tr("Build Settings"),
- self.tr("There are unsaved changes. Close anyway?")
+ self.tr("Do you want to save your changes?")
)
- return True
+ if doSave:
+ self._emitBuildData()
+ self._build.resetChangedState()
+ return
def _saveSettings(self):
"""Save the various user settings.
@@ -262,6 +262,18 @@ class GuiBuildSettings(QDialog):
return
+ def _emitBuildData(self):
+ """Assemble the build data and emit the signal.
+ """
+ self._build.setName(self.editBuildName.text())
+ self.optTabHeadings.saveContent()
+ self.optTabContent.saveContent()
+ self.optTabFormat.saveContent()
+ self.optTabOutput.saveContent()
+ self.newSettingsReady.emit(self._build)
+ self._build.resetChangedState()
+ return
+
# END Class GuiBuildSettings
From 3e34721b661d10a263a92b4a36ae5fcbe4cf8c64 Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Thu, 1 Jun 2023 00:31:42 +0200
Subject: [PATCH 43/74] Make gui class debug messages consistent
---
novelwriter/dialogs/about.py | 8 ++++++--
novelwriter/dialogs/docmerge.py | 8 ++++++--
novelwriter/dialogs/docsplit.py | 8 ++++++--
novelwriter/dialogs/preferences.py | 8 ++++++--
novelwriter/dialogs/projdetails.py | 8 ++++++--
novelwriter/dialogs/projload.py | 8 ++++++--
novelwriter/dialogs/projsettings.py | 8 ++++++--
novelwriter/dialogs/updates.py | 8 ++++++--
novelwriter/dialogs/wordlist.py | 8 ++++++--
novelwriter/gui/doceditor.py | 16 ++++++++--------
novelwriter/gui/dochighlight.py | 5 +++--
novelwriter/gui/docviewer.py | 17 +++++++++--------
novelwriter/gui/itemdetails.py | 5 +++--
novelwriter/gui/mainmenu.py | 5 +++--
novelwriter/gui/noveltree.py | 8 ++++----
novelwriter/gui/outline.py | 12 ++++++------
novelwriter/gui/projtree.py | 8 ++++----
novelwriter/gui/sidebar.py | 4 ++--
novelwriter/gui/statusbar.py | 4 ++--
novelwriter/guimain.py | 4 ++--
novelwriter/tools/lipsum.py | 8 ++++++--
novelwriter/tools/manusbuild.py | 10 ++++++++++
novelwriter/tools/manuscript.py | 4 ++--
novelwriter/tools/manussettings.py | 4 ++--
novelwriter/tools/projwizard.py | 8 ++++++--
novelwriter/tools/writingstats.py | 8 ++++++--
26 files changed, 132 insertions(+), 70 deletions(-)
diff --git a/novelwriter/dialogs/about.py b/novelwriter/dialogs/about.py
index 607cada2..d2f7d512 100644
--- a/novelwriter/dialogs/about.py
+++ b/novelwriter/dialogs/about.py
@@ -47,7 +47,7 @@ class GuiAbout(QDialog):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiAbout ...")
+ logger.debug("Create: GuiAbout")
self.setObjectName("GuiAbout")
self.mainGui = mainGui
@@ -110,10 +110,14 @@ class GuiAbout(QDialog):
self.outerBox.addWidget(self.buttonBox)
self.setLayout(self.outerBox)
- logger.debug("GuiAbout initialisation complete")
+ logger.debug("Ready: GuiAbout")
return
+ def __del__(self):
+ logger.debug("Delete: GuiAbout")
+ return
+
def populateGUI(self):
"""Populate tabs with text.
"""
diff --git a/novelwriter/dialogs/docmerge.py b/novelwriter/dialogs/docmerge.py
index 32d7770c..ea04d184 100644
--- a/novelwriter/dialogs/docmerge.py
+++ b/novelwriter/dialogs/docmerge.py
@@ -44,7 +44,7 @@ class GuiDocMerge(QDialog):
def __init__(self, mainGui, sHandle, itemList):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiDocMerge ...")
+ logger.debug("Create: GuiDocMerge")
self.setObjectName("GuiDocMerge")
self.mainGui = mainGui
@@ -107,10 +107,14 @@ class GuiDocMerge(QDialog):
# Load Content
self._loadContent(sHandle, itemList)
- logger.debug("GuiDocMerge initialisation complete")
+ logger.debug("Ready: GuiDocMerge")
return
+ def __del__(self):
+ logger.debug("Delete: GuiDocMerge")
+ return
+
def getData(self):
"""Return the user's choices.
"""
diff --git a/novelwriter/dialogs/docsplit.py b/novelwriter/dialogs/docsplit.py
index c1f97e2a..d66e0278 100644
--- a/novelwriter/dialogs/docsplit.py
+++ b/novelwriter/dialogs/docsplit.py
@@ -48,7 +48,7 @@ class GuiDocSplit(QDialog):
def __init__(self, mainGui, sHandle):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiDocSplit ...")
+ logger.debug("Create: GuiDocSplit")
self.setObjectName("GuiDocSplit")
self.mainGui = mainGui
@@ -138,10 +138,14 @@ class GuiDocSplit(QDialog):
# Load Content
self._loadContent(sHandle)
- logger.debug("GuiDocSplit initialisation complete")
+ logger.debug("Ready: GuiDocSplit")
return
+ def __del__(self):
+ logger.debug("Delete: GuiDocSplit")
+ return
+
def getData(self):
"""Return the user's choices. Also save the users options for
the next time the dialog is used.
diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py
index 6a685eaf..5d89cadc 100644
--- a/novelwriter/dialogs/preferences.py
+++ b/novelwriter/dialogs/preferences.py
@@ -46,7 +46,7 @@ class GuiPreferences(NPagedDialog):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiPreferences ...")
+ logger.debug("Create: GuiPreferences")
self.setObjectName("GuiPreferences")
self.mainGui = mainGui
@@ -83,10 +83,14 @@ class GuiPreferences(NPagedDialog):
self._needsRestart = False
self._refreshTree = False
- logger.debug("GuiPreferences initialisation complete")
+ logger.debug("Ready: GuiPreferences")
return
+ def __del__(self):
+ logger.debug("Delete: GuiPreferences")
+ return
+
##
# Properties
##
diff --git a/novelwriter/dialogs/projdetails.py b/novelwriter/dialogs/projdetails.py
index 1ae21ab7..d4cff393 100644
--- a/novelwriter/dialogs/projdetails.py
+++ b/novelwriter/dialogs/projdetails.py
@@ -48,7 +48,7 @@ class GuiProjectDetails(NPagedDialog):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiProjectDetails ...")
+ logger.debug("Create: GuiProjectDetails")
self.setObjectName("GuiProjectDetails")
self.mainGui = mainGui
@@ -78,10 +78,14 @@ class GuiProjectDetails(NPagedDialog):
self.buttonBox.rejected.connect(self._doClose)
self.addControls(self.buttonBox)
- logger.debug("GuiProjectDetails initialisation complete")
+ logger.debug("Ready: GuiProjectDetails")
return
+ def __del__(self):
+ logger.debug("Delete: GuiProjectDetails")
+ return
+
def updateValues(self):
"""Set all the values of the pages.
"""
diff --git a/novelwriter/dialogs/projload.py b/novelwriter/dialogs/projload.py
index 2dfd41f6..f00f1c47 100644
--- a/novelwriter/dialogs/projload.py
+++ b/novelwriter/dialogs/projload.py
@@ -56,7 +56,7 @@ class GuiProjectLoad(QDialog):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiProjectLoad ...")
+ logger.debug("Create: GuiProjectLoad")
self.setObjectName("GuiProjectLoad")
self.mainGui = mainGui
@@ -145,10 +145,14 @@ class GuiProjectLoad(QDialog):
keyDelete.setKey(QKeySequence(Qt.Key_Delete))
keyDelete.activated.connect(self._doDeleteRecent)
- logger.debug("GuiProjectLoad initialisation complete")
+ logger.debug("Ready: GuiProjectLoad")
return
+ def __del__(self):
+ logger.debug("Delete: GuiProjectLoad")
+ return
+
##
# Buttons
##
diff --git a/novelwriter/dialogs/projsettings.py b/novelwriter/dialogs/projsettings.py
index 0bc0229f..f78efd8c 100644
--- a/novelwriter/dialogs/projsettings.py
+++ b/novelwriter/dialogs/projsettings.py
@@ -52,7 +52,7 @@ class GuiProjectSettings(NPagedDialog):
def __init__(self, mainGui, focusTab=TAB_MAIN):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiProjectSettings ...")
+ logger.debug("Create: GuiProjectSettings")
self.setObjectName("GuiProjectSettings")
self.mainGui = mainGui
@@ -93,10 +93,14 @@ class GuiProjectSettings(NPagedDialog):
# Focus Tab
self._focusTab(focusTab)
- logger.debug("GuiProjectSettings initialisation complete")
+ logger.debug("Ready: GuiProjectSettings")
return
+ def __del__(self):
+ logger.debug("Delete: GuiProjectSettings")
+ return
+
@property
def spellChanged(self):
return self._spellChanged
diff --git a/novelwriter/dialogs/updates.py b/novelwriter/dialogs/updates.py
index 8eaa353e..15e40f8e 100644
--- a/novelwriter/dialogs/updates.py
+++ b/novelwriter/dialogs/updates.py
@@ -47,7 +47,7 @@ class GuiUpdates(QDialog):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiUpdates ...")
+ logger.debug("Create: GuiUpdates")
self.setObjectName("GuiUpdates")
self.mainGui = mainGui
@@ -113,10 +113,14 @@ class GuiUpdates(QDialog):
self.setLayout(self.outerBox)
- logger.debug("GuiUpdates initialisation complete")
+ logger.debug("Ready: GuiUpdates")
return
+ def __del__(self):
+ logger.debug("Delete: GuiUpdates")
+ return
+
def checkLatest(self):
"""Check for latest release.
"""
diff --git a/novelwriter/dialogs/wordlist.py b/novelwriter/dialogs/wordlist.py
index 73886bab..f2e7ddfe 100644
--- a/novelwriter/dialogs/wordlist.py
+++ b/novelwriter/dialogs/wordlist.py
@@ -46,7 +46,7 @@ class GuiWordList(QDialog):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiWordList ...")
+ logger.debug("Create: GuiWordList")
self.setObjectName("GuiWordList")
self.mainGui = mainGui
@@ -108,10 +108,14 @@ class GuiWordList(QDialog):
self._loadWordList()
- logger.debug("GuiWordList initialisation complete")
+ logger.debug("Ready: GuiWordList")
return
+ def __del__(self):
+ logger.debug("Delete: GuiWordList")
+ return
+
##
# Slots
##
diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py
index 2425d6be..499ddf2a 100644
--- a/novelwriter/gui/doceditor.py
+++ b/novelwriter/gui/doceditor.py
@@ -78,7 +78,7 @@ class GuiDocEditor(QTextEdit):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiDocEditor ...")
+ logger.debug("Create: GuiDocEditor")
# Class Variables
self.mainGui = mainGui
@@ -183,7 +183,7 @@ class GuiDocEditor(QTextEdit):
self.updateSyntaxColours()
self.initEditor()
- logger.debug("GuiDocEditor initialisation complete")
+ logger.debug("Ready: GuiDocEditor")
return
@@ -2227,7 +2227,7 @@ class GuiDocEditSearch(QFrame):
def __init__(self, docEditor):
super().__init__(parent=docEditor)
- logger.debug("Initialising GuiDocEditSearch ...")
+ logger.debug("Create: GuiDocEditSearch")
self.docEditor = docEditor
self.mainGui = docEditor.mainGui
@@ -2371,7 +2371,7 @@ class GuiDocEditSearch(QFrame):
self.updateTheme()
- logger.debug("GuiDocEditSearch initialisation complete")
+ logger.debug("Ready: GuiDocEditSearch")
return
@@ -2642,7 +2642,7 @@ class GuiDocEditHeader(QWidget):
def __init__(self, docEditor):
super().__init__(parent=docEditor)
- logger.debug("Initialising GuiDocEditHeader ...")
+ logger.debug("Create: GuiDocEditHeader")
self.docEditor = docEditor
self.mainGui = docEditor.mainGui
@@ -2727,7 +2727,7 @@ class GuiDocEditHeader(QWidget):
self.updateTheme()
- logger.debug("GuiDocEditHeader initialisation complete")
+ logger.debug("Ready: GuiDocEditHeader")
return
@@ -2877,7 +2877,7 @@ class GuiDocEditFooter(QWidget):
def __init__(self, docEditor):
super().__init__(parent=docEditor)
- logger.debug("Initialising GuiDocEditFooter ...")
+ logger.debug("Create: GuiDocEditFooter")
self.docEditor = docEditor
self.mainGui = docEditor.mainGui
@@ -2971,7 +2971,7 @@ class GuiDocEditFooter(QWidget):
self.updateLineCount()
self.updateCounts()
- logger.debug("GuiDocEditFooter initialisation complete")
+ logger.debug("Ready: GuiDocEditFooter")
return
diff --git a/novelwriter/gui/dochighlight.py b/novelwriter/gui/dochighlight.py
index a4d86c98..0d366b05 100644
--- a/novelwriter/gui/dochighlight.py
+++ b/novelwriter/gui/dochighlight.py
@@ -49,7 +49,8 @@ class GuiDocHighlighter(QSyntaxHighlighter):
def __init__(self, theDoc, mainGui, spEnchant):
super().__init__(theDoc)
- logger.debug("Initialising GuiDocHighlighter ...")
+ logger.debug("Create: GuiDocHighlighter")
+
self.theDoc = theDoc
self.spEnchant = spEnchant
self.mainGui = mainGui
@@ -76,7 +77,7 @@ class GuiDocHighlighter(QSyntaxHighlighter):
self.initHighlighter()
- logger.debug("GuiDocHighlighter initialisation complete")
+ logger.debug("Ready: GuiDocHighlighter")
return
diff --git a/novelwriter/gui/docviewer.py b/novelwriter/gui/docviewer.py
index bae5c39a..be25e4b5 100644
--- a/novelwriter/gui/docviewer.py
+++ b/novelwriter/gui/docviewer.py
@@ -56,7 +56,7 @@ class GuiDocViewer(QTextBrowser):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiDocViewer ...")
+ logger.debug("Create: GuiDocViewer")
# Class Variables
self.mainGui = mainGui
@@ -88,7 +88,7 @@ class GuiDocViewer(QTextBrowser):
self.initViewer()
- logger.debug("GuiDocViewer initialisation complete")
+ logger.debug("Ready: GuiDocViewer")
return
@@ -679,7 +679,7 @@ class GuiDocViewHeader(QWidget):
def __init__(self, docViewer):
super().__init__(parent=docViewer)
- logger.debug("Initialising GuiDocViewHeader ...")
+ logger.debug("Create: GuiDocViewHeader")
self.docViewer = docViewer
self.mainGui = docViewer.mainGui
@@ -766,7 +766,7 @@ class GuiDocViewHeader(QWidget):
# Fix the Colours
self.updateTheme()
- logger.debug("GuiDocViewHeader initialisation complete")
+ logger.debug("Ready: GuiDocViewHeader")
return
@@ -896,7 +896,7 @@ class GuiDocViewFooter(QWidget):
def __init__(self, docViewer):
super().__init__(parent=docViewer)
- logger.debug("Initialising GuiDocViewFooter ...")
+ logger.debug("Create: GuiDocViewFooter")
self.docViewer = docViewer
self.mainGui = docViewer.mainGui
@@ -1023,7 +1023,7 @@ class GuiDocViewFooter(QWidget):
# Fix the Colours
self.updateTheme()
- logger.debug("GuiDocViewFooter initialisation complete")
+ logger.debug("Ready: GuiDocViewFooter")
return
@@ -1139,7 +1139,8 @@ class GuiDocViewDetails(QScrollArea):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiDocViewDetails ...")
+ logger.debug("Create: GuiDocViewDetails")
+
self.mainGui = mainGui
self.theProject = mainGui.theProject
self.mainTheme = mainGui.mainTheme
@@ -1168,7 +1169,7 @@ class GuiDocViewDetails(QScrollArea):
self.setMinimumHeight(CONFIG.pxInt(50))
self.setFrameStyle(QFrame.NoFrame)
- logger.debug("GuiDocViewDetails initialisation complete")
+ logger.debug("Ready: GuiDocViewDetails")
return
diff --git a/novelwriter/gui/itemdetails.py b/novelwriter/gui/itemdetails.py
index e89ed7e2..be0cf144 100644
--- a/novelwriter/gui/itemdetails.py
+++ b/novelwriter/gui/itemdetails.py
@@ -40,7 +40,8 @@ class GuiItemDetails(QWidget):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiItemDetails ...")
+ logger.debug("Create: GuiItemDetails")
+
self.mainGui = mainGui
self.theProject = mainGui.theProject
self.mainTheme = mainGui.mainTheme
@@ -182,7 +183,7 @@ class GuiItemDetails(QWidget):
self.mainBox.setColumnMinimumWidth(1, flagWidth)
self.mainBox.setColumnMinimumWidth(4, countWidth)
- logger.debug("GuiItemDetails initialisation complete")
+ logger.debug("Ready: GuiItemDetails")
return
diff --git a/novelwriter/gui/mainmenu.py b/novelwriter/gui/mainmenu.py
index 93dbc184..8870fa37 100644
--- a/novelwriter/gui/mainmenu.py
+++ b/novelwriter/gui/mainmenu.py
@@ -49,7 +49,8 @@ class GuiMainMenu(QMenuBar):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiMainMenu ...")
+ logger.debug("Create: GuiMainMenu")
+
self.mainGui = mainGui
self.theProject = mainGui.theProject
@@ -69,7 +70,7 @@ class GuiMainMenu(QMenuBar):
self._docInsert = self.mainGui.docEditor.insertText
self._insertKeyWord = self.mainGui.docEditor.insertKeyWord
- logger.debug("GuiMainMenu initialisation complete")
+ logger.debug("Ready: GuiMainMenu")
return
diff --git a/novelwriter/gui/noveltree.py b/novelwriter/gui/noveltree.py
index d8fe310d..aaf9485d 100644
--- a/novelwriter/gui/noveltree.py
+++ b/novelwriter/gui/noveltree.py
@@ -196,7 +196,7 @@ class GuiNovelToolBar(QWidget):
def __init__(self, novelView):
super().__init__(parent=novelView)
- logger.debug("Initialising GuiNovelToolBar ...")
+ logger.debug("Create: GuiNovelToolBar")
self.novelView = novelView
self.mainGui = novelView.mainGui
@@ -264,7 +264,7 @@ class GuiNovelToolBar(QWidget):
self.updateTheme()
- logger.debug("GuiNovelToolBar initialisation complete")
+ logger.debug("Ready: GuiNovelToolBar")
return
@@ -395,7 +395,7 @@ class GuiNovelTree(QTreeWidget):
def __init__(self, novelView):
super().__init__(parent=novelView)
- logger.debug("Initialising GuiNovelTree ...")
+ logger.debug("Create: GuiNovelTree")
self.novelView = novelView
self.mainGui = novelView.mainGui
@@ -460,7 +460,7 @@ class GuiNovelTree(QTreeWidget):
self.initSettings()
self.updateTheme()
- logger.debug("GuiNovelTree initialisation complete")
+ logger.debug("Ready: GuiNovelTree")
return
diff --git a/novelwriter/gui/outline.py b/novelwriter/gui/outline.py
index fd288a11..7e282ab7 100644
--- a/novelwriter/gui/outline.py
+++ b/novelwriter/gui/outline.py
@@ -212,7 +212,7 @@ class GuiOutlineToolBar(QToolBar):
def __init__(self, theOutline):
super().__init__(parent=theOutline)
- logger.debug("Initialising GuiOutlineToolBar ...")
+ logger.debug("Create: GuiOutlineToolBar")
self.mainGui = theOutline.mainGui
self.theProject = theOutline.mainGui.theProject
@@ -260,7 +260,7 @@ class GuiOutlineToolBar(QToolBar):
self.updateTheme()
- logger.debug("GuiOutlineToolBar initialisation complete")
+ logger.debug("Ready: GuiOutlineToolBar")
return
@@ -369,7 +369,7 @@ class GuiOutlineTree(QTreeWidget):
def __init__(self, outlineView):
super().__init__(parent=outlineView)
- logger.debug("Initialising GuiOutlineTree ...")
+ logger.debug("Create: GuiOutlineTree")
self.outlineView = outlineView
self.mainGui = outlineView.mainGui
@@ -423,7 +423,7 @@ class GuiOutlineTree(QTreeWidget):
self.hiddenStateChanged.emit()
- logger.debug("GuiOutlineTree initialisation complete")
+ logger.debug("Ready: GuiOutlineTree")
return
@@ -796,7 +796,7 @@ class GuiOutlineDetails(QScrollArea):
def __init__(self, theOutline):
super().__init__(parent=theOutline)
- logger.debug("Initialising GuiOutlineDetails ...")
+ logger.debug("Create: GuiOutlineDetails")
self.theOutline = theOutline
self.mainGui = theOutline.mainGui
@@ -982,7 +982,7 @@ class GuiOutlineDetails(QScrollArea):
self.initSettings()
- logger.debug("GuiOutlineDetails initialisation complete")
+ logger.debug("Ready: GuiOutlineDetails")
return
diff --git a/novelwriter/gui/projtree.py b/novelwriter/gui/projtree.py
index e5bce3a6..acc75191 100644
--- a/novelwriter/gui/projtree.py
+++ b/novelwriter/gui/projtree.py
@@ -215,7 +215,7 @@ class GuiProjectToolBar(QWidget):
def __init__(self, projView):
super().__init__(parent=projView)
- logger.debug("Initialising GuiProjectToolBar ...")
+ logger.debug("Create: GuiProjectToolBar")
self.projView = projView
self.projTree = projView.projTree
@@ -328,7 +328,7 @@ class GuiProjectToolBar(QWidget):
self.setLayout(self.outerBox)
self.updateTheme()
- logger.debug("GuiProjectToolBar initialisation complete")
+ logger.debug("Ready: GuiProjectToolBar")
return
@@ -455,7 +455,7 @@ class GuiProjectTree(QTreeWidget):
def __init__(self, projView):
super().__init__(parent=projView)
- logger.debug("Initialising GuiProjectTree ...")
+ logger.debug("Create: GuiProjectTree")
self.projView = projView
self.mainGui = projView.mainGui
@@ -522,7 +522,7 @@ class GuiProjectTree(QTreeWidget):
# Set custom settings
self.initSettings()
- logger.debug("GuiProjectTree initialisation complete")
+ logger.debug("Ready: GuiProjectTree")
return
diff --git a/novelwriter/gui/sidebar.py b/novelwriter/gui/sidebar.py
index 12d26d93..66370b36 100644
--- a/novelwriter/gui/sidebar.py
+++ b/novelwriter/gui/sidebar.py
@@ -43,7 +43,7 @@ class GuiSideBar(QToolBar):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiSideBar ...")
+ logger.debug("Create: GuiSideBar")
self.mainGui = mainGui
self.mainTheme = mainGui.mainTheme
@@ -122,7 +122,7 @@ class GuiSideBar(QToolBar):
self.updateTheme()
- logger.debug("GuiSideBar initialisation complete")
+ logger.debug("Ready: GuiSideBar")
return
diff --git a/novelwriter/gui/statusbar.py b/novelwriter/gui/statusbar.py
index 5d90dcd3..10f16c08 100644
--- a/novelwriter/gui/statusbar.py
+++ b/novelwriter/gui/statusbar.py
@@ -44,7 +44,7 @@ class GuiMainStatus(QStatusBar):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiMainStatus ...")
+ logger.debug("Create: GuiMainStatus")
self.mainGui = mainGui
self.mainTheme = mainGui.mainTheme
@@ -108,7 +108,7 @@ class GuiMainStatus(QStatusBar):
# Other Settings
self.setSizeGripEnabled(True)
- logger.debug("GuiMainStatus initialisation complete")
+ logger.debug("Ready: GuiMainStatus")
self.updateTheme()
self.clearStatus()
diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py
index 41dd5904..d3c5a5cc 100644
--- a/novelwriter/guimain.py
+++ b/novelwriter/guimain.py
@@ -78,7 +78,7 @@ class GuiMain(QMainWindow):
def __init__(self):
super().__init__()
- logger.debug("Initialising GUI ...")
+ logger.debug("Create: GUI")
self.setObjectName("GuiMain")
self.threadPool = QThreadPool()
@@ -302,7 +302,7 @@ class GuiMain(QMainWindow):
if CONFIG.isFullScreen:
self.toggleFullScreenMode()
- logger.debug("GUI initialisation complete")
+ logger.debug("Ready: GUI")
if __hexversion__[-2] == "a" and logger.getEffectiveLevel() > logging.DEBUG:
self.makeAlert(self.tr(
diff --git a/novelwriter/tools/lipsum.py b/novelwriter/tools/lipsum.py
index 3a6f1f42..af152397 100644
--- a/novelwriter/tools/lipsum.py
+++ b/novelwriter/tools/lipsum.py
@@ -44,7 +44,7 @@ class GuiLipsum(QDialog):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiLipsum ...")
+ logger.debug("Create: GuiLipsum")
self.setObjectName("GuiLipsum")
self.mainGui = mainGui
@@ -107,10 +107,14 @@ class GuiLipsum(QDialog):
self.outerBox.setSpacing(CONFIG.pxInt(16))
self.setLayout(self.outerBox)
- logger.debug("GuiLipsum initialisation complete")
+ logger.debug("Ready: GuiLipsum")
return
+ def __del__(self):
+ logger.debug("Delete: GuiLipsum")
+ return
+
##
# Slots
##
diff --git a/novelwriter/tools/manusbuild.py b/novelwriter/tools/manusbuild.py
index 4dd8343c..dbb07607 100644
--- a/novelwriter/tools/manusbuild.py
+++ b/novelwriter/tools/manusbuild.py
@@ -35,8 +35,18 @@ class GuiManuscriptBuild(QDialog):
def __init__(self, parent: QWidget):
super().__init__(parent=parent)
+
+ logger.debug("Create: GuiManuscriptBuild")
+ self.setObjectName("GuiManuscriptBuild")
+
self._parent = parent
+ logger.debug("Ready: GuiManuscriptBuild")
+
+ return
+
+ def __del__(self):
+ logger.debug("Delete: GuiManuscriptBuild")
return
# END Class GuiManuscriptBuild
diff --git a/novelwriter/tools/manuscript.py b/novelwriter/tools/manuscript.py
index fe4c6693..33e1be9f 100644
--- a/novelwriter/tools/manuscript.py
+++ b/novelwriter/tools/manuscript.py
@@ -56,7 +56,7 @@ class GuiManuscript(QDialog):
def __init__(self, mainGui: GuiMain):
super().__init__(parent=mainGui)
- logger.debug("Created: GuiManuscript")
+ logger.debug("Create: GuiManuscript")
self.setObjectName("GuiManuscript")
self.mainGui = mainGui
@@ -166,7 +166,7 @@ class GuiManuscript(QDialog):
return
def __del__(self):
- logger.debug("Deleted: GuiManuscript")
+ logger.debug("Delete: GuiManuscript")
return
def loadContent(self):
diff --git a/novelwriter/tools/manussettings.py b/novelwriter/tools/manussettings.py
index c68eae80..c05bda6b 100644
--- a/novelwriter/tools/manussettings.py
+++ b/novelwriter/tools/manussettings.py
@@ -68,7 +68,7 @@ class GuiBuildSettings(QDialog):
def __init__(self, parent: QWidget, mainGui: GuiMain, build: BuildSettings):
super().__init__(parent=parent)
- logger.debug("Created: GuiBuildSettings")
+ logger.debug("Create: GuiBuildSettings")
self.setObjectName("GuiBuildSettings")
self.mainGui = mainGui
@@ -164,7 +164,7 @@ class GuiBuildSettings(QDialog):
return
def __del__(self):
- logger.debug("Deleted: GuiBuildSettings")
+ logger.debug("Delete: GuiBuildSettings")
def loadContent(self):
"""Populate the child widgets.
diff --git a/novelwriter/tools/projwizard.py b/novelwriter/tools/projwizard.py
index fdf5ea3a..1fe6cdc2 100644
--- a/novelwriter/tools/projwizard.py
+++ b/novelwriter/tools/projwizard.py
@@ -50,7 +50,7 @@ class GuiProjectWizard(QWizard):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiProjectWizard ...")
+ logger.debug("Create: GuiProjectWizard")
self.setObjectName("GuiProjectWizard")
self.mainGui = mainGui
@@ -76,10 +76,14 @@ class GuiProjectWizard(QWizard):
self.setOption(QWizard.NoBackButtonOnStartPage, True)
- logger.debug("GuiProjectWizard initialisation complete")
+ logger.debug("Ready: GuiProjectWizard")
return
+ def __del__(self):
+ logger.debug("Delete: GuiProjectWizard")
+ return
+
# END Class GuiProjectWizard
diff --git a/novelwriter/tools/writingstats.py b/novelwriter/tools/writingstats.py
index 8f4ba724..ce7fc184 100644
--- a/novelwriter/tools/writingstats.py
+++ b/novelwriter/tools/writingstats.py
@@ -60,7 +60,7 @@ class GuiWritingStats(QDialog):
def __init__(self, mainGui):
super().__init__(parent=mainGui)
- logger.debug("Initialising GuiWritingStats ...")
+ logger.debug("Create: GuiWritingStats")
self.setObjectName("GuiWritingStats")
self.mainGui = mainGui
@@ -286,10 +286,14 @@ class GuiWritingStats(QDialog):
self.setLayout(self.outerBox)
- logger.debug("GuiWritingStats initialisation complete")
+ logger.debug("Ready: GuiWritingStats")
return
+ def __del__(self):
+ logger.debug("Delete: GuiWritingStats")
+ return
+
def populateGUI(self):
"""Populate list box with data from the log file.
"""
From 8631ea3d5a54df9be0f8be619eb02158239e951b Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Thu, 1 Jun 2023 15:39:42 +0200
Subject: [PATCH 44/74] Update test CI jobs
---
.github/workflows/test_linux.yml | 6 ++----
.github/workflows/test_mac.yml | 9 +++------
.github/workflows/test_win.yml | 6 ++----
3 files changed, 7 insertions(+), 14 deletions(-)
diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml
index 4a784e63..951215be 100644
--- a/.github/workflows/test_linux.yml
+++ b/.github/workflows/test_linux.yml
@@ -14,7 +14,7 @@ jobs:
testLinux:
strategy:
matrix:
- python-version: ["3.8", "3.9", "3.10", "3.11"]
+ python-version: ["3.8", "3.9", "3.10", "3.11", "3.12-dev"]
runs-on: ubuntu-latest
steps:
- name: Python Setup
@@ -30,9 +30,7 @@ jobs:
uses: actions/checkout@v3
- name: Install Dependencies (pip)
run: |
- pip install --upgrade pip
- pip install -r requirements.txt
- pip install -r requirements-dev.txt
+ pip install -U -r requirements.txt -r requirements-dev.txt
- name: Run Build Commands
run: python setup.py qtlrelease sample
- name: Run Tests
diff --git a/.github/workflows/test_mac.yml b/.github/workflows/test_mac.yml
index 36394f43..e4ef9cc4 100644
--- a/.github/workflows/test_mac.yml
+++ b/.github/workflows/test_mac.yml
@@ -19,17 +19,14 @@ jobs:
with:
python-version: "3.10"
architecture: x64
- - name: Install Packages
+ - name: Install Packages (brew)
run: |
brew install enchant
- name: Checkout Source
uses: actions/checkout@v3
- - name: Install Dependencies
+ - name: Install Dependencies (pip)
run: |
- pip install --upgrade pip
- pip install -r requirements.txt
- pip install -r requirements-dev.txt
- pip install pyobjc
+ pip install -U pyobjc -r requirements.txt -r requirements-dev.txt
- name: Run Tests
run: |
export QT_QPA_PLATFORM=offscreen
diff --git a/.github/workflows/test_win.yml b/.github/workflows/test_win.yml
index cea804e9..f3197a41 100644
--- a/.github/workflows/test_win.yml
+++ b/.github/workflows/test_win.yml
@@ -21,11 +21,9 @@ jobs:
architecture: x64
- name: Checkout Source
uses: actions/checkout@v3
- - name: Install Dependencies
+ - name: Install Dependencies (pip)
run: |
- pip install --upgrade pip
- pip install -r requirements.txt
- pip install -r requirements-dev.txt
+ pip install -U -r requirements.txt -r requirements-dev.txt
- name: Run Tests
run: |
pytest -v --cov=novelwriter --timeout=60
From dbb8f4fa5a895620d0b0be3455e22cd85a56faf9 Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Thu, 1 Jun 2023 15:41:56 +0200
Subject: [PATCH 45/74] Remove lxml as a test dependency
---
requirements.txt | 1 -
1 file changed, 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index b47e1e91..af56101a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,2 @@
pyqt5>=5.10
-lxml>=4.2.0
pyenchant>=3.0.0
From 7ff5ffaebda7380261667b421554f564838a2205 Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Thu, 1 Jun 2023 15:46:39 +0200
Subject: [PATCH 46/74] Remove python 3.12-dev tests again
---
.github/workflows/test_linux.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/test_linux.yml b/.github/workflows/test_linux.yml
index 951215be..6a778d2f 100644
--- a/.github/workflows/test_linux.yml
+++ b/.github/workflows/test_linux.yml
@@ -14,7 +14,7 @@ jobs:
testLinux:
strategy:
matrix:
- python-version: ["3.8", "3.9", "3.10", "3.11", "3.12-dev"]
+ python-version: ["3.8", "3.9", "3.10", "3.11"]
runs-on: ubuntu-latest
steps:
- name: Python Setup
From 3a2733eee5f1e9854a0488b6512aa9ef7a26716e Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Sat, 3 Jun 2023 15:46:51 +0200
Subject: [PATCH 47/74] Make new code pass docstring linting
---
novelwriter/core/buildsettings.py | 93 +++++++++------------
novelwriter/core/docbuild.py | 38 +++++----
novelwriter/guimain.py | 21 ++++-
novelwriter/tools/manusbuild.py | 9 +-
novelwriter/tools/manuscript.py | 59 ++++++--------
novelwriter/tools/manussettings.py | 127 ++++++++++++-----------------
6 files changed, 169 insertions(+), 178 deletions(-)
diff --git a/novelwriter/core/buildsettings.py b/novelwriter/core/buildsettings.py
index cc4b3df1..5a04f00b 100644
--- a/novelwriter/core/buildsettings.py
+++ b/novelwriter/core/buildsettings.py
@@ -1,7 +1,6 @@
"""
-novelWriter – Build Settings Class
-==================================
-A class to hold build settings for the build tool
+novelWriter – Build Settings
+============================
File History:
Created: 2023-02-14 [2.1b1] BuildSettings
@@ -117,6 +116,7 @@ SETTINGS_LABELS = {
class FilterMode(Enum):
+ """The decision reason for an item in a filtered project."""
UNKNOWN = 0
FILTERED = 1
@@ -128,6 +128,11 @@ class FilterMode(Enum):
class BuildSettings:
+ """Core: Build Settings Class
+
+ This class manages the build settings for a Manuscript build job.
+ The settings can be packed/unpacked to/from a dictionary for JSON.
+ """
def __init__(self):
self._name = ""
@@ -145,14 +150,17 @@ class BuildSettings:
@property
def name(self) -> str:
+ """Return the build name."""
return self._name
@property
def buildID(self) -> str:
+ """Return the build ID."""
return self._uuid
@property
def changed(self) -> bool:
+ """Return the changed status of the build."""
return self._changed
##
@@ -161,33 +169,28 @@ class BuildSettings:
@staticmethod
def getLabel(key: str) -> str:
- """Extract the label for a specific item.
- """
+ """Extract the GUI label for a specific setting."""
return SETTINGS_LABELS.get(key, "ERROR")
def getStr(self, key: str) -> str:
- """Type safe value access for strings.
- """
+ """Type safe value access for strings."""
value = self._settings.get(key, SETTINGS_TEMPLATE.get(key, (None, None)[1]))
return str(value)
def getBool(self, key: str) -> bool:
- """Type safe value access for bools.
- """
+ """Type safe value access for bools."""
value = self._settings.get(key, SETTINGS_TEMPLATE.get(key, (None, None)[1]))
return bool(value)
def getInt(self, key: str) -> int:
- """Type safe value access for integers.
- """
+ """Type safe value access for integers."""
value = self._settings.get(key, SETTINGS_TEMPLATE.get(key, (None, None)[1]))
if isinstance(value, int):
return value
return 0
def getFloat(self, key: str) -> float:
- """Type safe value access for float.
- """
+ """Type safe value access for float."""
value = self._settings.get(key, SETTINGS_TEMPLATE.get(key, (None, None)[1]))
if isinstance(value, float):
return value
@@ -198,14 +201,12 @@ class BuildSettings:
##
def setName(self, name: str):
- """Set the build setting display name.
- """
+ """Set the build setting display name."""
self._name = str(name)
return
def setBuildID(self, value: str | uuid.UUID):
- """Set a UUID build ID.
- """
+ """Set a UUID build ID."""
value = checkUuid(value, "")
if not value:
self._uuid = str(uuid.uuid4())
@@ -214,32 +215,28 @@ class BuildSettings:
return
def setFiltered(self, tHandle: str):
- """Set an item as filtered.
- """
+ """Set an item as filtered."""
self._excluded.discard(tHandle)
self._included.discard(tHandle)
self._changed = True
return
def setIncluded(self, tHandle: str):
- """Set an item as explicitly included.
- """
+ """Set an item as explicitly included."""
self._excluded.discard(tHandle)
self._included.add(tHandle)
self._changed = True
return
def setExcluded(self, tHandle: str):
- """Set an item as explicitly excluded.
- """
+ """Set an item as explicitly excluded."""
self._excluded.add(tHandle)
self._included.discard(tHandle)
self._changed = True
return
def setSkipRoot(self, tHandle: str, state: bool):
- """Set a specific root folder as skipped or not.
- """
+ """Set a specific root folder as skipped or not."""
if state is True:
self._skipRoot.discard(tHandle)
self._changed = True
@@ -249,8 +246,7 @@ class BuildSettings:
return
def setValue(self, key: str, value: str | int | bool | float) -> bool:
- """Set a specific value for a build setting.
- """
+ """Set a specific value for a build setting."""
if key not in SETTINGS_TEMPLATE:
return False
definition = SETTINGS_TEMPLATE[key]
@@ -267,19 +263,11 @@ class BuildSettings:
# Methods
##
- def isFiltered(self, tHandle: str) -> bool:
- return tHandle not in self._included and tHandle not in self._excluded
-
- def isIncluded(self, tHandle: str) -> bool:
- return tHandle in self._included
-
- def isExcluded(self, tHandle: str) -> bool:
- return tHandle in self._excluded
-
def isRootAllowed(self, tHandle: str) -> bool:
+ """Check if a root handle is allowed in the build."""
return tHandle not in self._skipRoot
- def buildItemFilter(self, project: NWProject) -> dict:
+ def buildItemFilter(self, project: NWProject) -> dict[str, tuple[bool, FilterMode]]:
"""Return a dictionary of item handles with filter decissions
applied.
"""
@@ -325,15 +313,14 @@ class BuildSettings:
return result
def resetChangedState(self):
- """This must be called when the changes to this class has been
- safely saved to file or passed on.
+ """Reset the changed status of the settings object. This must be
+ called when the changes have been safely saved or passed on.
"""
self._changed = False
return
def pack(self) -> dict:
- """Pack all content into a JSON compatible dictionary.
- """
+ """Pack all content into a JSON compatible dictionary."""
logger.debug("Collecting build setting for '%s'", self._name)
return {
"name": self._name,
@@ -347,8 +334,7 @@ class BuildSettings:
}
def unpack(self, data: dict):
- """Unpack a dictionary and populate the class.
- """
+ """Unpack a dictionary and populate the class."""
settings = data.get("settings", {})
content = data.get("content", {})
included = content.get("included", [])
@@ -377,6 +363,12 @@ class BuildSettings:
class BuildCollection:
+ """Core: Build Collection Class
+
+ This object holds all the build setting objects defined by the given
+ project. The build settings are saved as a single JSON file in the
+ project folder.
+ """
def __init__(self, project: NWProject):
self._project = project
@@ -384,8 +376,7 @@ class BuildCollection:
return
def getBuild(self, buildID: str) -> BuildSettings | None:
- """Get a specific build settings object.
- """
+ """Get a specific build settings object."""
if buildID not in self._builds:
return None
build = BuildSettings()
@@ -393,8 +384,7 @@ class BuildCollection:
return build
def setBuild(self, build: BuildSettings) -> bool:
- """Set build settings data in the collection.
- """
+ """Set build settings data in the collection."""
if not isinstance(build, BuildSettings):
return False
buildID = build.buildID
@@ -402,15 +392,13 @@ class BuildCollection:
return True
def builds(self) -> Iterable[tuple[str, str]]:
- """Iterate over all avaiable builds.
- """
+ """Iterate over all avaiable builds."""
for buildID in self._builds:
yield buildID, self._builds[buildID].get("name", "")
return
def loadCollection(self) -> bool:
- """Load build collections file.
- """
+ """Load build collections file."""
buildsFile = self._project.storage.getMetaFile(nwFiles.BUILDS_FILE)
if not isinstance(buildsFile, Path):
return False
@@ -442,8 +430,7 @@ class BuildCollection:
return True
def saveCollection(self) -> bool:
- """Save build collections file.
- """
+ """Save build collections file."""
buildsFile = self._project.storage.getMetaFile(nwFiles.BUILDS_FILE)
if not isinstance(buildsFile, Path):
return False
diff --git a/novelwriter/core/docbuild.py b/novelwriter/core/docbuild.py
index b946d20f..2270f708 100644
--- a/novelwriter/core/docbuild.py
+++ b/novelwriter/core/docbuild.py
@@ -1,10 +1,9 @@
"""
-novelWriter – Build Document Tool
-=================================
-A class to build one or more novelWriter files to a single document
+novelWriter – Manuscript Document Builder
+=========================================
File History:
-Created: 2022-12-01 [2.1b1]
+Created: 2022-12-01 [2.1b1] NWBuildDocument
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -44,6 +43,11 @@ logger = logging.getLogger(__name__)
class NWBuildDocument:
+ """Core: Manuscript Document Build Class
+
+ This is the core tool that assembles a project and outputs a
+ manuscript, based on a build definition object (BuildSettings).
+ """
__slots__ = ("_project", "_build", "_queue", "_error", "_cache")
@@ -61,10 +65,15 @@ class NWBuildDocument:
@property
def error(self) -> str | None:
+ """Return the last error, if any."""
return self._error
@property
def lastBuild(self) -> Tokenizer | None:
+ """Return the build object of the last build process, if any.
+ This is useful for accessing build details and data after the
+ build job is completed.
+ """
return self._cache
##
@@ -72,6 +81,7 @@ class NWBuildDocument:
##
def __len__(self) -> int:
+ """Return the length of the build queue."""
return len(self._queue)
##
@@ -79,17 +89,17 @@ class NWBuildDocument:
##
def addDocument(self, tHandle: str):
- """Add a document to the build queue manually.
- """
+ """Add a document to the build queue manually."""
self._queue.append(tHandle)
return
def queueAll(self):
- """Queue all document as defined by the build setup.
- """
+ """Queue all document as defined by the build settings."""
filtered = self._build.buildItemFilter(self._project)
noteTitles = self._build.getBool("text.addNoteHeadings")
for item in self._project.tree:
+ if not item.itemHandle:
+ continue
if filtered.get(item.itemHandle, False):
self._queue.append(item.itemHandle)
elif item.isRootType() and noteTitles:
@@ -97,8 +107,7 @@ class NWBuildDocument:
return
def iterBuildOpenDocument(self, path: Path, isFlat: bool) -> Iterable[tuple[int, bool]]:
- """Build an Open Document file.
- """
+ """Build an Open Document file."""
makeOdt = ToOdt(self._project, isFlat=isFlat)
self._setupBuild(makeOdt)
makeOdt.initDocument()
@@ -146,8 +155,7 @@ class NWBuildDocument:
return
def iterBuildMarkdown(self, path: Path, extendedMd: bool) -> Iterable[tuple[int, bool]]:
- """Build a Markdown file.
- """
+ """Build a Markdown file."""
makeMd = ToMarkdown(self._project)
self._setupBuild(makeMd)
@@ -177,8 +185,7 @@ class NWBuildDocument:
##
def _setupBuild(self, bldObj: Tokenizer):
- """Configure the build object.
- """
+ """Configure the build object."""
# Get Settings
fmtTitle = self._build.getStr("headings.fmtTitle")
fmtChapter = self._build.getStr("headings.fmtChapter")
@@ -240,8 +247,7 @@ class NWBuildDocument:
return
def _doBuild(self, bldObj: Tokenizer, tHandle: str) -> bool:
- """Build a single document and add it to the build object.
- """
+ """Build a single document and add it to the build object."""
self._error = None
tItem = self._project.tree[tHandle]
if tItem is None:
diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py
index d3c5a5cc..f2922b24 100644
--- a/novelwriter/guimain.py
+++ b/novelwriter/guimain.py
@@ -1,10 +1,9 @@
"""
novelWriter – GUI Main Window
=============================
-The main application window
File History:
-Created: 2018-09-22 [0.0.1]
+Created: 2018-09-22 [0.0.1] GuiMain
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -74,6 +73,24 @@ logger = logging.getLogger(__name__)
class GuiMain(QMainWindow):
+ """Main GUI Window
+
+ The Main GUI window class. It is the entry point of the
+ application, and holds all runtime objects aside from the main
+ Config instance, which is created before the Main GUI.
+
+ The Main GUI is split up into GUI components, assembled in the init
+ function. Also, the project instance and theme instance are created
+ here. These should be passed around to all other objects who need
+ them and new instances of them should generally not be created.
+
+ * All other GUI classes that depend on any components from the
+ main GUI should be passed a reference to the instance of this
+ class.
+ * All non-GUI classes can be passed a reference to the NWProject
+ instance if the Main GUI is not needed (which it generally
+ shouldn't need).
+ """
def __init__(self):
super().__init__()
diff --git a/novelwriter/tools/manusbuild.py b/novelwriter/tools/manusbuild.py
index dbb07607..199dbf7f 100644
--- a/novelwriter/tools/manusbuild.py
+++ b/novelwriter/tools/manusbuild.py
@@ -1,10 +1,9 @@
"""
novelWriter – GUI Build Manuscript
==================================
-GUI classes for the Manuscript Build Tool
File History:
-Created: 2023-05-24 [2.1b1]
+Created: 2023-05-24 [2.1b1] GuiManuscriptBuild
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -32,6 +31,11 @@ logger = logging.getLogger(__name__)
class GuiManuscriptBuild(QDialog):
+ """GUI Tools: Manucript Builder Dialog
+
+ This is the tool for running the build itself. It can be accessed
+ independently of the Manuscript Build Tool.
+ """
def __init__(self, parent: QWidget):
super().__init__(parent=parent)
@@ -46,6 +50,7 @@ class GuiManuscriptBuild(QDialog):
return
def __del__(self):
+ """For debug use only."""
logger.debug("Delete: GuiManuscriptBuild")
return
diff --git a/novelwriter/tools/manuscript.py b/novelwriter/tools/manuscript.py
index 33e1be9f..f8ed9d34 100644
--- a/novelwriter/tools/manuscript.py
+++ b/novelwriter/tools/manuscript.py
@@ -1,11 +1,9 @@
"""
-novelWriter – GUI Build Manuscript
-==================================
-GUI classes for the Manuscript Build Tool
+novelWriter – GUI Manuscript Tool
+=================================
File History:
Created: 2023-05-13 [2.1b1] GuiManuscript
-Created: 2023-05-13 [2.1b1] GuiManuscriptPreview
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -52,6 +50,12 @@ logger = logging.getLogger(__name__)
class GuiManuscript(QDialog):
+ """GUI Tools: Manuscript Tool
+
+ The dialog displays all the users build definitions, a preview panel
+ for the manuscript, and can trigger the actual build dialog to build
+ a document directly to disk.
+ """
def __init__(self, mainGui: GuiMain):
super().__init__(parent=mainGui)
@@ -98,7 +102,7 @@ class GuiManuscript(QDialog):
self.buildProgress = QProgressBar()
self.btnPreview = QPushButton(self.tr("Build Preview"))
self.btnPreview.clicked.connect(self._generatePreview)
- self.manPreview = GuiManuscriptPreview(self.mainGui)
+ self.manPreview = _PreviewWidget(self.mainGui)
self.menuPrint = QMenu(self)
self.aPrintSend = self.menuPrint.addAction(self.tr("Print Preview"))
@@ -166,12 +170,12 @@ class GuiManuscript(QDialog):
return
def __del__(self):
+ """For debug use only."""
logger.debug("Delete: GuiManuscript")
return
def loadContent(self):
- """Load dialog content from project data.
- """
+ """Load dialog content from project data."""
self._builds.loadCollection()
self._updateBuildsList()
return
@@ -181,7 +185,9 @@ class GuiManuscript(QDialog):
##
def closeEvent(self, event):
- """Capture the user closing the window so we can save settings.
+ """Capture the user closing the window so we can save GUI
+ settings. We also check that we don't have a build settings
+ diralog open.
"""
self._saveSettings()
for obj in self.children():
@@ -198,8 +204,7 @@ class GuiManuscript(QDialog):
@pyqtSlot()
def _createNewBuild(self):
- """Open the build settings dialog for a new build.
- """
+ """Open the build settings dialog for a new build."""
build = BuildSettings()
build.setName(self.tr("My Manuscript"))
self._openSettingsDialog(build)
@@ -207,8 +212,7 @@ class GuiManuscript(QDialog):
@pyqtSlot()
def _editSelectedBuild(self):
- """Edit the currently selected build settings entry.
- """
+ """Edit the currently selected build settings entry."""
build = self._getSelectedBuild()
if build is not None:
self._openSettingsDialog(build)
@@ -216,8 +220,7 @@ class GuiManuscript(QDialog):
@pyqtSlot(BuildSettings)
def _processNewSettings(self, build: BuildSettings):
- """Process new build settings from the settings dialog.
- """
+ """Process new build settings from the settings dialog."""
self._builds.setBuild(build)
self._builds.saveCollection()
self._updateBuildItem(build)
@@ -263,8 +266,7 @@ class GuiManuscript(QDialog):
@pyqtSlot()
def _doClose(self):
- """The close button has been clicked.
- """
+ """Forward the close button to the default close method."""
self.close()
return
@@ -273,8 +275,7 @@ class GuiManuscript(QDialog):
##
def _getSelectedBuild(self) -> BuildSettings | None:
- """Get the currently selected build.
- """
+ """Get the currently selected build."""
bItems = self.buildList.selectedItems()
if bItems:
build = self._builds.getBuild(bItems[0].data(Qt.UserRole))
@@ -283,13 +284,11 @@ class GuiManuscript(QDialog):
return None
def _saveManuscript(self, outFormat: int):
- """Save the manuscript file or files.
- """
+ """Save the manuscript file or files."""
return
def _saveSettings(self):
- """Save the various user settings.
- """
+ """Save the user GUI settings."""
logger.debug("Saving GuiManuscript settings")
winWidth = CONFIG.rpxInt(self.width())
@@ -309,8 +308,7 @@ class GuiManuscript(QDialog):
return
def _openSettingsDialog(self, build: BuildSettings):
- """Open the build settings dialog.
- """
+ """Open the build settings dialog."""
dlgSettings = GuiBuildSettings(self, self.mainGui, build)
dlgSettings.setModal(False)
dlgSettings.show()
@@ -321,8 +319,7 @@ class GuiManuscript(QDialog):
return
def _updateBuildsList(self):
- """Update the list of available builds.
- """
+ """Update the list of available builds."""
self.buildList.clear()
for key, name in self._builds.builds():
bItem = QListWidgetItem()
@@ -333,8 +330,7 @@ class GuiManuscript(QDialog):
return
def _updateBuildItem(self, build: BuildSettings):
- """Update the entry of a specific build item.
- """
+ """Update the entry of a specific build item."""
bItem = self._buildMap.get(build.buildID, None)
if isinstance(bItem, QListWidgetItem):
bItem.setText(build.name)
@@ -345,7 +341,7 @@ class GuiManuscript(QDialog):
# END Class GuiManuscript
-class GuiManuscriptPreview(QTextBrowser):
+class _PreviewWidget(QTextBrowser):
def __init__(self, mainGui: GuiMain):
super().__init__(parent=mainGui)
@@ -357,8 +353,7 @@ class GuiManuscriptPreview(QTextBrowser):
return
def setContent(self, data: dict):
- """
- """
+ """Set the content of the preview widget."""
sPos = self.verticalScrollBar().value()
qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
@@ -377,4 +372,4 @@ class GuiManuscriptPreview(QTextBrowser):
return
-# END Class GuiManuscriptPreview
+# END Class _PreviewWidget
diff --git a/novelwriter/tools/manussettings.py b/novelwriter/tools/manussettings.py
index c05bda6b..f97df0c5 100644
--- a/novelwriter/tools/manussettings.py
+++ b/novelwriter/tools/manussettings.py
@@ -1,10 +1,9 @@
"""
novelWriter – GUI Build Settings
================================
-GUI classes for editing Manuscript Build Settings
File History:
-Created: 2023-02-13 [2.1b1]
+Created: 2023-02-13 [2.1b1] GuiBuildSettings
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -34,8 +33,8 @@ from PyQt5.QtGui import (
from PyQt5.QtCore import QEvent, QSize, Qt, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import (
QAbstractButton, QAbstractItemView, QComboBox, QDialog, QDialogButtonBox,
- QDoubleSpinBox, QFontDialog, QFrame, QGridLayout, QHBoxLayout, QHeaderView, QLabel,
- QLineEdit, QMenu, QPlainTextEdit, QPushButton, QSpinBox, QSplitter,
+ QDoubleSpinBox, QFontDialog, QFrame, QGridLayout, QHBoxLayout, QHeaderView,
+ QLabel, QLineEdit, QMenu, QPlainTextEdit, QPushButton, QSpinBox, QSplitter,
QStackedWidget, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout,
QWidget
)
@@ -56,6 +55,11 @@ logger = logging.getLogger(__name__)
class GuiBuildSettings(QDialog):
+ """GUI Tools: Manuscript Build Settings Dialog
+
+ The main tool for configuring manuscript builds. It's a GUI tool for
+ editing JSON build definitions, wrapped as a BuildSettings object.
+ """
OPT_FILTERS = 1
OPT_HEADINGS = 2
@@ -112,11 +116,11 @@ class GuiBuildSettings(QDialog):
# ============
# Create Tabs
- self.optTabSelect = GuiBuildFilterTab(self, self._build)
- self.optTabHeadings = GuiBuildHeadingsTab(self, self._build)
- self.optTabFormat = GuiBuildFormatTab(self, self._build)
- self.optTabContent = GuiBuildContentTab(self, self._build)
- self.optTabOutput = GuiBuildOutputTab(self, self._build)
+ self.optTabSelect = _FilterTab(self, self._build)
+ self.optTabHeadings = _HeadingsTab(self, self._build)
+ self.optTabFormat = _FormatTab(self, self._build)
+ self.optTabContent = _ContentTab(self, self._build)
+ self.optTabOutput = _OutputTab(self, self._build)
# Add Tabs
self.toolStack = QStackedWidget(self)
@@ -164,11 +168,11 @@ class GuiBuildSettings(QDialog):
return
def __del__(self):
+ """For debug use only."""
logger.debug("Delete: GuiBuildSettings")
def loadContent(self):
- """Populate the child widgets.
- """
+ """Populate the child widgets."""
self.editBuildName.setText(self._build.name)
self.optTabSelect.loadContent()
self.optTabHeadings.loadContent()
@@ -183,8 +187,7 @@ class GuiBuildSettings(QDialog):
@pyqtSlot(int)
def _stackPageSelected(self, pageId: int):
- """Process a user request to switch page.
- """
+ """Process a user request to switch page."""
if pageId == self.OPT_FILTERS:
self.toolStack.setCurrentWidget(self.optTabSelect)
elif pageId == self.OPT_HEADINGS:
@@ -199,8 +202,7 @@ class GuiBuildSettings(QDialog):
@pyqtSlot("QAbstractButton*")
def _dialogButtonClicked(self, button: QAbstractButton):
- """Handle button clicks from the dialog button box.
- """
+ """Handle button clicks from the dialog button box."""
role = self.dlgButtons.buttonRole(button)
if role == QDialogButtonBox.ApplyRole:
self._emitBuildData()
@@ -216,7 +218,8 @@ class GuiBuildSettings(QDialog):
##
def closeEvent(self, event: QEvent):
- """Capture the user closing the window so we can save settings.
+ """Capture the user closing the window so we can save
+ settings.
"""
logger.debug("Closing: GuiBuildSettings")
self._askToSaveBuild()
@@ -244,8 +247,7 @@ class GuiBuildSettings(QDialog):
return
def _saveSettings(self):
- """Save the various user settings.
- """
+ """Save the various user settings."""
logger.debug("Saving GuiBuildSettings settings")
winWidth = CONFIG.rpxInt(self.width())
@@ -263,8 +265,7 @@ class GuiBuildSettings(QDialog):
return
def _emitBuildData(self):
- """Assemble the build data and emit the signal.
- """
+ """Assemble the build data and emit the signal."""
self._build.setName(self.editBuildName.text())
self.optTabHeadings.saveContent()
self.optTabContent.saveContent()
@@ -277,7 +278,7 @@ class GuiBuildSettings(QDialog):
# END Class GuiBuildSettings
-class GuiBuildFilterTab(QWidget):
+class _FilterTab(QWidget):
C_DATA = 0
C_NAME = 0
@@ -398,15 +399,13 @@ class GuiBuildFilterTab(QWidget):
return
def loadContent(self):
- """Populate the widgets.
- """
+ """Populate the widgets."""
self._populateTree()
self._populateFilters()
return
def mainSplitSizes(self) -> tuple[int, int]:
- """Extract the sizes of the main splitter.
- """
+ """Extract the sizes of the main splitter."""
sizes = self.mainSplit.sizes()
if len(sizes) < 2:
return 0, 0
@@ -418,8 +417,7 @@ class GuiBuildFilterTab(QWidget):
@pyqtSlot(str, bool)
def _applyFilterSwitch(self, key: str, state: bool):
- """A filter switch has been toggled, so update the settings.
- """
+ """Apply filter switch and update the settings."""
if key.startswith("doc:"):
self._build.setValue(key[4:], state)
self._setTreeItemMode()
@@ -433,8 +431,7 @@ class GuiBuildFilterTab(QWidget):
##
def _populateTree(self):
- """Build the tree of project items.
- """
+ """Build the tree of project items."""
logger.debug("Building project tree")
self._treeMap = {}
self.optTree.clear()
@@ -490,8 +487,7 @@ class GuiBuildFilterTab(QWidget):
return
def _populateFilters(self):
- """Populate the filter options switches.
- """
+ """Populate the filter options switches."""
self.filterOpt.clear()
self.filterOpt.addLabel(self._build.getLabel("filter"))
self.filterOpt.addItem(
@@ -530,8 +526,7 @@ class GuiBuildFilterTab(QWidget):
return
def _setSelectedMode(self, mode: int):
- """Set the mode for the selected items.
- """
+ """Set the mode for the selected items."""
for item in self.optTree.selectedItems():
if not isinstance(item, QTreeWidgetItem):
continue
@@ -551,8 +546,7 @@ class GuiBuildFilterTab(QWidget):
return
def _setTreeItemMode(self):
- """Update the filtered mode icon on all items.
- """
+ """Update the filtered mode icon on all items."""
filtered = self._build.buildItemFilter(self.theProject)
for tHandle, item in self._treeMap.items():
allow, mode = filtered.get(tHandle, (False, FilterMode.UNKNOWN))
@@ -566,10 +560,10 @@ class GuiBuildFilterTab(QWidget):
item.setIcon(self.C_STATUS, self._statusFlags[self.F_NONE][1])
return
-# END Class GuiBuildFilterTab
+# END Class _FilterTab
-class GuiBuildHeadingsTab(QWidget):
+class _HeadingsTab(QWidget):
EDIT_TITLE = 1
EDIT_CHAPTER = 2
@@ -707,7 +701,7 @@ class GuiBuildHeadingsTab(QWidget):
self.editTextBox.setFixedHeight(5*iPx)
self.editTextBox.setEnabled(False)
- self.formSyntax = GuiHeadingSyntax(self.editTextBox.document(), self.mainTheme)
+ self.formSyntax = _HeadingSyntaxHighlighter(self.editTextBox.document(), self.mainTheme)
self.menuInsert = QMenu()
self.aInsTitle = self.menuInsert.addAction(self.tr("Title"))
@@ -756,8 +750,7 @@ class GuiBuildHeadingsTab(QWidget):
return
def loadContent(self):
- """Populate the widgets.
- """
+ """Populate the widgets."""
self.fmtTitle.setText(self._build.getStr("headings.fmtTitle"))
self.fmtChapter.setText(self._build.getStr("headings.fmtChapter"))
self.fmtUnnumbered.setText(self._build.getStr("headings.fmtUnnumbered"))
@@ -768,8 +761,7 @@ class GuiBuildHeadingsTab(QWidget):
return
def saveContent(self):
- """Save choices back into build object.
- """
+ """Save choices back into build object."""
self._build.setValue("headings.hideScene", self.swtScene.isChecked())
self._build.setValue("headings.hideSection", self.swtSection.isChecked())
return
@@ -779,8 +771,7 @@ class GuiBuildHeadingsTab(QWidget):
##
def _insertIntoForm(self, text: str):
- """Insert formatting text from the dropdown menu.
- """
+ """Insert formatting text from the dropdown menu."""
if self._editing > 0:
cursor = self.editTextBox.textCursor()
cursor.insertText(text)
@@ -788,8 +779,7 @@ class GuiBuildHeadingsTab(QWidget):
return
def _editHeading(self, heading: int):
- """Populate the form with a specific heading format.
- """
+ """Populate the form with a specific heading format."""
self._editing = heading
self.editTextBox.setEnabled(True)
if heading == self.EDIT_TITLE:
@@ -823,8 +813,7 @@ class GuiBuildHeadingsTab(QWidget):
##
def _saveFormat(self):
- """Save the format from the edit text box.
- """
+ """Save the format from the edit text box."""
heading = self._editing
text = self.editTextBox.toPlainText().replace("\n", "//")
if heading == self.EDIT_TITLE:
@@ -850,10 +839,10 @@ class GuiBuildHeadingsTab(QWidget):
return
-# END Class GuiBuildHeadingsTab
+# END Class _HeadingsTab
-class GuiHeadingSyntax(QSyntaxHighlighter):
+class _HeadingSyntaxHighlighter(QSyntaxHighlighter):
def __init__(self, document: QTextDocument, mainTheme: GuiTheme):
super().__init__(document)
@@ -864,8 +853,7 @@ class GuiHeadingSyntax(QSyntaxHighlighter):
return
def highlightBlock(self, text: str):
- """Add syntax highlighting to the text block.
- """
+ """Add syntax highlighting to the text block."""
for heading in nwHeadFmt.ALL:
pos = text.find(heading)
if pos >= 0:
@@ -877,10 +865,10 @@ class GuiHeadingSyntax(QSyntaxHighlighter):
self.setFormat(pos + ddots, 1, self._fmtSymbol)
return
-# END Class GuiHeadingSyntax
+# END Class _HeadingSyntaxHighlighter
-class GuiBuildContentTab(QWidget):
+class _ContentTab(QWidget):
def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings):
super().__init__(parent=buildMain)
@@ -932,8 +920,7 @@ class GuiBuildContentTab(QWidget):
return
def loadContent(self):
- """Populate the widgets.
- """
+ """Populate the widgets."""
self.incSynopsis.setChecked(self._build.getBool("text.includeSynopsis"))
self.incComments.setChecked(self._build.getBool("text.includeComments"))
self.incKeywords.setChecked(self._build.getBool("text.includeKeywords"))
@@ -942,8 +929,7 @@ class GuiBuildContentTab(QWidget):
return
def saveContent(self):
- """Save choices back into build object.
- """
+ """Save choices back into build object."""
self._build.setValue("text.includeSynopsis", self.incSynopsis.isChecked())
self._build.setValue("text.includeComments", self.incComments.isChecked())
self._build.setValue("text.includeKeywords", self.incKeywords.isChecked())
@@ -951,10 +937,10 @@ class GuiBuildContentTab(QWidget):
self._build.setValue("text.addNoteHeadings", self.addNoteHead.isChecked())
return
-# END Class GuiBuildContentTab
+# END Class _ContentTab
-class GuiBuildFormatTab(QWidget):
+class _FormatTab(QWidget):
def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings):
super().__init__(parent=buildMain)
@@ -1035,8 +1021,7 @@ class GuiBuildFormatTab(QWidget):
return
def loadContent(self):
- """Populate the widgets.
- """
+ """Populate the widgets."""
langIdx = self.buildLang.findData(self._build.getStr("format.buildLang"))
if langIdx != -1:
self.buildLang.setCurrentIndex(langIdx)
@@ -1056,8 +1041,7 @@ class GuiBuildFormatTab(QWidget):
return
def saveContent(self):
- """Save choices back into build object.
- """
+ """Save choices back into build object."""
self._build.setValue("format.buildLang", str(self.buildLang.currentData()))
self._build.setValue("format.textFont", self.textFont.text())
self._build.setValue("format.textSize", self.textSize.value())
@@ -1073,8 +1057,7 @@ class GuiBuildFormatTab(QWidget):
@pyqtSlot()
def _selectFont(self):
- """Open the QFontDialog and set a font for the font style.
- """
+ """Open the QFontDialog and set a font for the font style."""
currFont = QFont()
currFont.setFamily(self.textFont.text())
currFont.setPointSize(self.textSize.value())
@@ -1084,10 +1067,10 @@ class GuiBuildFormatTab(QWidget):
self.textSize.setValue(theFont.pointSize())
return
-# END Class GuiBuildFormatTab
+# END Class _FormatTab
-class GuiBuildOutputTab(QWidget):
+class _OutputTab(QWidget):
def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings):
super().__init__(parent=buildMain)
@@ -1133,17 +1116,15 @@ class GuiBuildOutputTab(QWidget):
return
def loadContent(self):
- """Populate the widgets.
- """
+ """Populate the widgets."""
self.odtAddColours.setChecked(self._build.getBool("odt.addColours"))
self.htmlAddStyles.setChecked(self._build.getBool("html.addStyles"))
return
def saveContent(self):
- """Save choices back into build object.
- """
+ """Save choices back into build object."""
self._build.setValue("odt.addColours", self.odtAddColours.isChecked())
self._build.setValue("html.addStyles", self.htmlAddStyles.isChecked())
return
-# END Class GuiBuildOutputTab
+# END Class _OutputTab
From 95145785546d80d61c6f96d08ebe9cd373d68f5b Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Sat, 3 Jun 2023 16:51:45 +0200
Subject: [PATCH 48/74] Add the build preview functionality from the old build
tool
---
novelwriter/common.py | 27 ++---
novelwriter/tools/manuscript.py | 187 ++++++++++++++++++++++++++++++--
2 files changed, 189 insertions(+), 25 deletions(-)
diff --git a/novelwriter/common.py b/novelwriter/common.py
index 5813ec1e..3ccdd751 100644
--- a/novelwriter/common.py
+++ b/novelwriter/common.py
@@ -22,7 +22,6 @@ General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
"""
-
from __future__ import annotations
import json
@@ -31,6 +30,7 @@ import hashlib
import logging
import xml.etree.ElementTree as ET
+from typing import Any
from pathlib import Path
from datetime import datetime
from configparser import ConfigParser
@@ -49,9 +49,8 @@ logger = logging.getLogger(__name__)
# Checker Functions
# =============================================================================================== #
-def checkStringNone(value, default):
- """Check if a variable is a string or a None.
- """
+def checkStringNone(value: Any, default: str | None) -> str | None:
+ """Check if a variable is a string or a None."""
if value is None or value == "None":
return None
if isinstance(value, str):
@@ -59,35 +58,31 @@ def checkStringNone(value, default):
return default
-def checkString(value, default):
- """Check if a variable is a string.
- """
+def checkString(value: Any, default: str) -> str:
+ """Check if a variable is a string."""
if isinstance(value, str):
return str(value)
return default
-def checkInt(value, default):
- """Check if a variable is an integer.
- """
+def checkInt(value: Any, default: int) -> int:
+ """Check if a variable is an integer."""
try:
return int(value)
except Exception:
return default
-def checkFloat(value, default):
- """Check if a variable is a float.
- """
+def checkFloat(value: Any, default: float) -> float:
+ """Check if a variable is a float."""
try:
return float(value)
except Exception:
return default
-def checkBool(value, default):
- """Check if a variable is a boolean.
- """
+def checkBool(value: Any, default: bool) -> bool:
+ """Check if a variable is a boolean."""
if isinstance(value, bool):
return value
elif isinstance(value, str):
diff --git a/novelwriter/tools/manuscript.py b/novelwriter/tools/manuscript.py
index f8ed9d34..2260650a 100644
--- a/novelwriter/tools/manuscript.py
+++ b/novelwriter/tools/manuscript.py
@@ -28,16 +28,19 @@ import logging
from time import time
from typing import TYPE_CHECKING
+from datetime import datetime
-from PyQt5.QtGui import QCursor
-from PyQt5.QtCore import Qt, pyqtSlot
+from PyQt5.QtGui import QColor, QCursor, QFont, QPalette, QResizeEvent
+from PyQt5.QtCore import QTimer, Qt, pyqtSlot
from PyQt5.QtWidgets import (
- QDialog, QHBoxLayout, QListWidget, QListWidgetItem, QMenu, QProgressBar,
- QPushButton, QSplitter, QTextBrowser, QVBoxLayout, QWidget, qApp
+ QDialog, QHBoxLayout, QLabel, QListWidget, QListWidgetItem, QMenu,
+ QProgressBar, QPushButton, QSplitter, QTextBrowser, QVBoxLayout, QWidget,
+ qApp
)
from novelwriter import CONFIG
from novelwriter.error import logException
+from novelwriter.common import checkInt, fuzzyTime
from novelwriter.core.tohtml import ToHtml
from novelwriter.core.docbuild import NWBuildDocument
from novelwriter.core.buildsettings import BuildCollection, BuildSettings
@@ -178,6 +181,21 @@ class GuiManuscript(QDialog):
"""Load dialog content from project data."""
self._builds.loadCollection()
self._updateBuildsList()
+
+ logger.debug("Loading build cache")
+ cache = CONFIG.dataPath("cache") / f"build_{self.theProject.data.uuid}.json"
+ if cache.is_file():
+ try:
+ with open(cache, mode="r", encoding="utf-8") as fObj:
+ data = json.load(fObj)
+ build = self._builds.getBuild(data.get("uuid", ""))
+ if isinstance(build, BuildSettings):
+ self._updatePreview(data, build)
+ except Exception:
+ logger.error("Failed to save build cache")
+ logException()
+ return
+
return
##
@@ -245,13 +263,16 @@ class GuiManuscript(QDialog):
buildObj = docBuild.lastBuild
assert isinstance(buildObj, ToHtml)
result = {
+ "uuid": build.buildID,
"time": int(time()),
- "style": buildObj.getStyleSheet(),
+ "styles": buildObj.getStyleSheet(),
"html": buildObj.fullHTML,
}
+ self._updatePreview(result, build)
+
logger.debug("Saving build cache")
- cache = CONFIG.dataPath("cache") / f"build_{build.buildID}.json"
+ cache = CONFIG.dataPath("cache") / f"build_{self.theProject.data.uuid}.json"
try:
with open(cache, mode="w+", encoding="utf-8") as outFile:
outFile.write(json.dumps(result, indent=2))
@@ -260,8 +281,6 @@ class GuiManuscript(QDialog):
logException()
return
- self.manPreview.setContent(result)
-
return
@pyqtSlot()
@@ -274,6 +293,19 @@ class GuiManuscript(QDialog):
# Internal Functions
##
+ def _updatePreview(self, data: dict, build: BuildSettings):
+ """Update the preview widget and set relevant values."""
+ self.manPreview.setContent(data)
+ self.manPreview.setBuildName(build.name)
+ self.manPreview.setTextFont(
+ build.getStr("format.textFont"),
+ build.getInt("format.textSize")
+ )
+ self.manPreview.setJustify(
+ build.getBool("format.justifyText")
+ )
+ return
+
def _getSelectedBuild(self) -> BuildSettings | None:
"""Get the currently selected build."""
bItems = self.buildList.selectedItems()
@@ -350,26 +382,163 @@ class _PreviewWidget(QTextBrowser):
self.mainTheme = mainGui.mainTheme
self.theProject = mainGui.theProject
+ self._docTime = 0
+ self._buildName = ""
+
+ # Document Setup
+ dPalette = self.palette()
+ dPalette.setColor(QPalette.Base, QColor(255, 255, 255))
+ dPalette.setColor(QPalette.Text, QColor(0, 0, 0))
+ self.setPalette(dPalette)
+
+ self.setMinimumWidth(40*self.mainGui.mainTheme.textNWidth)
+ self.setTextFont(CONFIG.textFont, CONFIG.textSize)
+ self.setTabStopDistance(CONFIG.getTabWidth())
+ self.setOpenExternalLinks(False)
+
+ self.document().setDocumentMargin(CONFIG.getTextMargin())
+ self.setPlaceholderText(self.tr(
+ "Press the \"Build Preview\" button to generate ..."
+ ))
+
+ # Document Age
+ aPalette = self.palette()
+ aPalette.setColor(QPalette.Background, aPalette.toolTipBase().color())
+ aPalette.setColor(QPalette.Foreground, aPalette.toolTipText().color())
+
+ aFont = self.font()
+ aFont.setPointSizeF(0.9*self.mainTheme.fontPointSize)
+
+ self.ageLabel = QLabel("", self)
+ self.ageLabel.setIndent(0)
+ self.ageLabel.setFont(aFont)
+ self.ageLabel.setPalette(aPalette)
+ self.ageLabel.setAutoFillBackground(True)
+ self.ageLabel.setAlignment(Qt.AlignCenter)
+ self.ageLabel.setFixedHeight(int(2.1*self.mainTheme.fontPixelSize))
+
+ self._updateDocMargins()
+ self._updateBuildAge()
+
+ # Age Timer
+ self.ageTimer = QTimer()
+ self.ageTimer.setInterval(10)
+ self.ageTimer.timeout.connect(self._updateBuildAge)
+ self.ageTimer.start()
+
return
+ ##
+ # Setters
+ ##
+
+ def setBuildName(self, name: str):
+ """Set the build name for the document label."""
+ self._buildName = name
+ self._updateBuildAge()
+ return
+
+ def setJustify(self, state: bool):
+ """Enable/disable the justify text option."""
+ options = self.document().defaultTextOption()
+ if state:
+ options.setAlignment(Qt.AlignJustify)
+ else:
+ options.setAlignment(Qt.AlignAbsolute)
+ self.document().setDefaultTextOption(options)
+ return
+
+ def setTextFont(self, family: str, size: int):
+ """Set the text font properties."""
+ font = QFont()
+ font.setFamily(family)
+ font.setPointSize(size)
+ self.setFont(font)
+ return
+
+ ##
+ # Methods
+ ##
+
def setContent(self, data: dict):
"""Set the content of the preview widget."""
sPos = self.verticalScrollBar().value()
qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
+ styles = "\n".join(data.get("styles", [
+ "h1, h2 {color: rgb(66, 113, 174);}",
+ "h3, h4 {color: rgb(50, 50, 50);}",
+ "a {color: rgb(66, 113, 174);}",
+ ".tags {color: rgb(245, 135, 31); font-weight: bold;}",
+ ]))
+ self.document().setDefaultStyleSheet(styles)
+
html = "".join(data.get("html", []))
html = html.replace("\t", "!!tab!!")
html = html.replace("
", "")
html = html.replace("", "")
self.setHtml(html)
qApp.processEvents()
-
while self.find("!!tab!!"):
theCursor = self.textCursor()
theCursor.insertText("\t")
self.verticalScrollBar().setValue(sPos)
+ self._docTime = checkInt(data.get("time"), 0)
+ self._updateBuildAge()
+
+ # Since we change the content while it may still be rendering, we mark
+ # the document dirty again to make sure it's re-rendered properly.
+ self.document().markContentsDirty(0, self.document().characterCount())
+ qApp.restoreOverrideCursor()
return
+ ##
+ # Events
+ ##
+
+ def resizeEvent(self, event: QResizeEvent):
+ """Capture resize and update the document margins."""
+ super().resizeEvent(event)
+ self._updateDocMargins()
+ return
+
+ ##
+ # Private Slots
+ ##
+
+ @pyqtSlot()
+ def _updateBuildAge(self):
+ """Update the build time and the fuzzy age."""
+ if self._docTime > 0:
+ strBuildTime = "%s (%s)" % (
+ datetime.fromtimestamp(self._docTime).strftime("%x %X"),
+ fuzzyTime(time() - self._docTime)
+ )
+ else:
+ strBuildTime = self.tr("Unknown")
+ text = "{0} {1}".format(self.tr("Built"), strBuildTime)
+ if self._buildName:
+ text = "{0}
{1}".format(self._buildName, text)
+ self.ageLabel.setText(text)
+ return
+
+ ##
+ # Internal Functions
+ ##
+
+ def _updateDocMargins(self):
+ """Automatically adjust the header to fill the top of the
+ document within the viewport.
+ """
+ vBar = self.verticalScrollBar()
+ sW = vBar.width() if vBar.isVisible() else 0
+ tB = self.frameWidth()
+ tW = self.width() - 2*tB - sW
+ tH = self.ageLabel.height()
+ self.ageLabel.setGeometry(tB, tB, tW, tH)
+ self.setViewportMargins(0, tH, 0, 0)
+ return
+
# END Class _PreviewWidget
From 4c439910dcd928e677e10ed6ec3b13f9095041d9 Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Sat, 3 Jun 2023 17:03:30 +0200
Subject: [PATCH 49/74] Remove the old build tool
---
novelwriter/core/options.py | 7 -
novelwriter/gui/mainmenu.py | 5 -
novelwriter/gui/sidebar.py | 4 +-
novelwriter/guimain.py | 21 -
novelwriter/tools/build.py | 1425 --------------------------
tests/test_core/test_core_options.py | 84 +-
tests/test_gui/test_gui_guimain.py | 2 +-
tests/test_tools/test_tools_build.py | 262 -----
8 files changed, 42 insertions(+), 1768 deletions(-)
delete mode 100644 novelwriter/tools/build.py
delete mode 100644 tests/test_tools/test_tools_build.py
diff --git a/novelwriter/core/options.py b/novelwriter/core/options.py
index e0ce2a2c..bad425b1 100644
--- a/novelwriter/core/options.py
+++ b/novelwriter/core/options.py
@@ -43,13 +43,6 @@ VALID_MAP = {
"hideZeros", "hideNegative", "groupByDay", "showIdleTime", "histMax",
},
"GuiDocSplit": {"spLevel", "intoFolder", "docHierarchy"},
- "GuiBuildNovel": {
- "winWidth", "winHeight", "boxWidth", "docWidth", "hideScene",
- "hideSection", "addNovel", "addNotes", "ignoreFlag", "justifyText",
- "excludeBody", "textFont", "textSize", "lineHeight", "noStyling",
- "incSynopsis", "incComments", "incKeywords", "incBodyText",
- "replaceTabs", "replaceUCode", "rootFilter",
- },
"GuiOutline": {"headerOrder", "columnWidth", "columnHidden"},
"GuiProjectSettings": {
"winWidth", "winHeight", "replaceColW", "statusColW", "importColW",
diff --git a/novelwriter/gui/mainmenu.py b/novelwriter/gui/mainmenu.py
index 8870fa37..80b1f8ae 100644
--- a/novelwriter/gui/mainmenu.py
+++ b/novelwriter/gui/mainmenu.py
@@ -829,11 +829,6 @@ class GuiMainMenu(QMenuBar):
self.aBackupProject.triggered.connect(lambda: self.theProject.backupProject(True))
self.toolsMenu.addAction(self.aBackupProject)
- # Tools > Build Novel Project
- self.aBuildProject = QAction(self.tr("Build Novel Project"), self)
- self.aBuildProject.triggered.connect(self.mainGui.showBuildProjectDialog)
- self.toolsMenu.addAction(self.aBuildProject)
-
# Tools > Build Manuscript
self.aBuildManuscript = QAction(self.tr("Build Manuscript"), self)
self.aBuildManuscript.setShortcut("F5")
diff --git a/novelwriter/gui/sidebar.py b/novelwriter/gui/sidebar.py
index 66370b36..637e11a5 100644
--- a/novelwriter/gui/sidebar.py
+++ b/novelwriter/gui/sidebar.py
@@ -82,8 +82,8 @@ class GuiSideBar(QToolBar):
self.aBuild = QAction(self.tr("Build"), self)
self.aBuild.setFont(lblFont)
- self.aBuild.setToolTip(self.tr("Build Novel Project"))
- self.aBuild.triggered.connect(lambda: self.mainGui.showBuildProjectDialog())
+ self.aBuild.setToolTip(self.tr("Build Manuscript"))
+ self.aBuild.triggered.connect(lambda: self.mainGui.showBuildManuscriptDialog())
self.aDetails = QAction(self.tr("Details"), self)
self.aDetails.setFont(lblFont)
diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py
index f2922b24..2b536b8a 100644
--- a/novelwriter/guimain.py
+++ b/novelwriter/guimain.py
@@ -55,7 +55,6 @@ from novelwriter.dialogs.wordlist import GuiWordList
from novelwriter.dialogs.preferences import GuiPreferences
from novelwriter.dialogs.projdetails import GuiProjectDetails
from novelwriter.dialogs.projsettings import GuiProjectSettings
-from novelwriter.tools.build import GuiBuildNovel
from novelwriter.tools.lipsum import GuiLipsum
from novelwriter.tools.manuscript import GuiManuscript
from novelwriter.tools.projwizard import GuiProjectWizard
@@ -1010,26 +1009,6 @@ class GuiMain(QMainWindow):
return True
- def showBuildProjectDialog(self):
- """Open the build project dialog.
- """
- if not self.hasProject:
- logger.error("No project open")
- return False
-
- dlgBuild = getGuiItem("GuiBuildNovel")
- if dlgBuild is None:
- dlgBuild = GuiBuildNovel(self)
- assert isinstance(dlgBuild, GuiBuildNovel)
-
- dlgBuild.setModal(False)
- dlgBuild.show()
- dlgBuild.raise_()
- qApp.processEvents()
- dlgBuild.viewCachedDoc()
-
- return True
-
@pyqtSlot()
def showBuildManuscriptDialog(self):
"""Open the build manuscript dialog.
diff --git a/novelwriter/tools/build.py b/novelwriter/tools/build.py
deleted file mode 100644
index c013c7b8..00000000
--- a/novelwriter/tools/build.py
+++ /dev/null
@@ -1,1425 +0,0 @@
-"""
-novelWriter – GUI Build Novel Project
-=====================================
-GUI classes for the build novel project dialog
-
-File History:
-Created: 2020-05-09 [0.5]
-
-This file is a part of novelWriter
-Copyright 2018–2023, Veronica Berglyd Olsen
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see .
-"""
-
-import json
-import logging
-
-from time import time
-from pathlib import Path
-from datetime import datetime
-
-from PyQt5.QtGui import (
- QPalette, QColor, QFont, QCursor, QFontInfo
-)
-from PyQt5.QtCore import Qt, QTimer
-from PyQt5.QtWidgets import (
- qApp, QDialog, QVBoxLayout, QHBoxLayout, QTextBrowser, QPushButton, QLabel,
- QLineEdit, QGroupBox, QGridLayout, QProgressBar, QMenu, QAction,
- QFileDialog, QFontDialog, QSpinBox, QScrollArea, QSplitter, QWidget,
- QSizePolicy, QDoubleSpinBox, QComboBox
-)
-from PyQt5.QtPrintSupport import QPrinter, QPrintPreviewDialog
-
-from novelwriter import CONFIG
-from novelwriter.enum import nwAlert, nwItemType, nwItemLayout, nwItemClass
-from novelwriter.error import formatException, logException
-from novelwriter.common import fuzzyTime, makeFileNameSafe
-from novelwriter.constants import nwConst, nwFiles
-from novelwriter.core.tomd import ToMarkdown
-from novelwriter.core.toodt import ToOdt
-from novelwriter.core.tohtml import ToHtml
-from novelwriter.extensions.switch import NSwitch
-
-logger = logging.getLogger(__name__)
-
-
-class GuiBuildNovel(QDialog):
-
- FMT_PDF = 1 # Print to PDF
- FMT_ODT = 2 # Open Document file
- FMT_FODT = 3 # Flat Open Document file
- FMT_HTM = 4 # HTML5
- FMT_NWD = 5 # nW Markdown
- FMT_MD = 6 # Standard Markdown
- FMT_GH = 7 # GitHub Markdown
- FMT_JSON_H = 8 # HTML5 wrapped in JSON
- FMT_JSON_M = 9 # nW Markdown wrapped in JSON
-
- def __init__(self, mainGui):
- super().__init__(parent=mainGui)
-
- logger.debug("Initialising GuiBuildNovel ...")
- self.setObjectName("GuiBuildNovel")
-
- self.mainGui = mainGui
- self.mainTheme = mainGui.mainTheme
- self.theProject = mainGui.theProject
-
- self.htmlText = [] # List of html documents
- self.htmlStyle = [] # List of html styles
- self.htmlSize = 0 # Size of the html document
- self.buildTime = 0 # The timestamp of the last build
-
- self.setWindowTitle(self.tr("Build Novel Project"))
- self.setMinimumWidth(CONFIG.pxInt(700))
- self.setMinimumHeight(CONFIG.pxInt(600))
-
- pOptions = self.theProject.options
- self.resize(
- CONFIG.pxInt(pOptions.getInt("GuiBuildNovel", "winWidth", 900)),
- CONFIG.pxInt(pOptions.getInt("GuiBuildNovel", "winHeight", 800))
- )
-
- self.docView = GuiBuildNovelDocView(self, self.theProject)
-
- hS = self.mainTheme.fontPixelSize
- wS = 2*hS
-
- # Title Formats
- # =============
-
- self.titleGroup = QGroupBox(self.tr("Title Formats for Novel Files"), self)
- self.titleForm = QGridLayout(self)
- self.titleGroup.setLayout(self.titleForm)
-
- fmtHelp = "
".join([
- "%s" % self.tr("Formatting Codes:"),
- self.tr("{0} for the title as set in the document").format(r"%title%"),
- self.tr("{0} for chapter number (1, 2, 3)").format(r"%ch%"),
- self.tr("{0} for chapter number as a word (one, two)").format(r"%chw%"),
- self.tr("{0} for chapter number in upper case Roman").format(r"%chI%"),
- self.tr("{0} for chapter number in lower case Roman").format(r"%chi%"),
- self.tr("{0} for scene number within chapter").format(r"%sc%"),
- self.tr("{0} for scene number within novel").format(r"%sca%"),
- ])
- fmtScHelp = "
%s" % self.tr(
- "Leave blank to skip this heading, or set to a static text, like "
- "for instance '{0}', to make a separator. The separator will "
- "be centred automatically and only appear between sections of "
- "the same type."
- ).format("* * *")
- xFmt = CONFIG.pxInt(100)
-
- self.fmtTitle = QLineEdit()
- self.fmtTitle.setMaxLength(200)
- self.fmtTitle.setMinimumWidth(xFmt)
- self.fmtTitle.setToolTip(fmtHelp)
- self.fmtTitle.setText(
- self._reFmtCodes(self.theProject.data.getTitleFormat("title"))
- )
-
- self.fmtChapter = QLineEdit()
- self.fmtChapter.setMaxLength(200)
- self.fmtChapter.setMinimumWidth(xFmt)
- self.fmtChapter.setToolTip(fmtHelp)
- self.fmtChapter.setText(
- self._reFmtCodes(self.theProject.data.getTitleFormat("chapter"))
- )
-
- self.fmtUnnumbered = QLineEdit()
- self.fmtUnnumbered.setMaxLength(200)
- self.fmtUnnumbered.setMinimumWidth(xFmt)
- self.fmtUnnumbered.setToolTip(fmtHelp)
- self.fmtUnnumbered.setText(
- self._reFmtCodes(self.theProject.data.getTitleFormat("unnumbered"))
- )
-
- self.fmtScene = QLineEdit()
- self.fmtScene.setMaxLength(200)
- self.fmtScene.setMinimumWidth(xFmt)
- self.fmtScene.setToolTip(fmtHelp + fmtScHelp)
- self.fmtScene.setText(
- self._reFmtCodes(self.theProject.data.getTitleFormat("scene"))
- )
-
- self.fmtSection = QLineEdit()
- self.fmtSection.setMaxLength(200)
- self.fmtSection.setMinimumWidth(xFmt)
- self.fmtSection.setToolTip(fmtHelp + fmtScHelp)
- self.fmtSection.setText(
- self._reFmtCodes(self.theProject.data.getTitleFormat("section"))
- )
-
- self.buildLang = QComboBox()
- self.buildLang.setMinimumWidth(xFmt)
- theLangs = CONFIG.listLanguages(CONFIG.LANG_PROJ)
- self.buildLang.addItem("[%s]" % self.tr("Not Set"), "None")
- for langID, langName in theLangs:
- self.buildLang.addItem(langName, langID)
-
- langIdx = self.buildLang.findData(self.theProject.data.language)
- if langIdx != -1:
- self.buildLang.setCurrentIndex(langIdx)
-
- self.hideScene = NSwitch(width=wS, height=hS)
- self.hideScene.setChecked(
- pOptions.getBool("GuiBuildNovel", "hideScene", False)
- )
-
- self.hideSection = NSwitch(width=wS, height=hS)
- self.hideSection.setChecked(
- pOptions.getBool("GuiBuildNovel", "hideSection", True)
- )
-
- # Wrapper boxes due to QGridView and QLineEdit expand bug
- self.boxTitle = QHBoxLayout()
- self.boxTitle.addWidget(self.fmtTitle)
- self.boxChapter = QHBoxLayout()
- self.boxChapter.addWidget(self.fmtChapter)
- self.boxUnnumb = QHBoxLayout()
- self.boxUnnumb.addWidget(self.fmtUnnumbered)
- self.boxScene = QHBoxLayout()
- self.boxScene.addWidget(self.fmtScene)
- self.boxSection = QHBoxLayout()
- self.boxSection.addWidget(self.fmtSection)
-
- titleLabel = QLabel(self.tr("Title"))
- chapterLabel = QLabel(self.tr("Chapter"))
- unnumbLabel = QLabel(self.tr("Unnumbered"))
- sceneLabel = QLabel(self.tr("Scene"))
- sectionLabel = QLabel(self.tr("Section"))
- langLabel = QLabel(self.tr("Language"))
- hSceneLabel = QLabel(self.tr("Hide scene"))
- hSectionLabel = QLabel(self.tr("Hide section"))
-
- self.titleForm.addWidget(titleLabel, 0, 0, 1, 1, Qt.AlignLeft)
- self.titleForm.addLayout(self.boxTitle, 0, 1, 1, 1, Qt.AlignRight)
- self.titleForm.addWidget(chapterLabel, 1, 0, 1, 1, Qt.AlignLeft)
- self.titleForm.addLayout(self.boxChapter, 1, 1, 1, 1, Qt.AlignRight)
- self.titleForm.addWidget(unnumbLabel, 2, 0, 1, 1, Qt.AlignLeft)
- self.titleForm.addLayout(self.boxUnnumb, 2, 1, 1, 1, Qt.AlignRight)
- self.titleForm.addWidget(sceneLabel, 3, 0, 1, 1, Qt.AlignLeft)
- self.titleForm.addLayout(self.boxScene, 3, 1, 1, 1, Qt.AlignRight)
- self.titleForm.addWidget(sectionLabel, 4, 0, 1, 1, Qt.AlignLeft)
- self.titleForm.addLayout(self.boxSection, 4, 1, 1, 1, Qt.AlignRight)
- self.titleForm.addWidget(langLabel, 5, 0, 1, 1, Qt.AlignLeft)
- self.titleForm.addWidget(self.buildLang, 5, 1, 1, 1, Qt.AlignRight)
- self.titleForm.addWidget(hSceneLabel, 6, 0, 1, 1, Qt.AlignLeft)
- self.titleForm.addWidget(self.hideScene, 6, 1, 1, 1, Qt.AlignRight)
- self.titleForm.addWidget(hSectionLabel, 7, 0, 1, 1, Qt.AlignLeft)
- self.titleForm.addWidget(self.hideSection, 7, 1, 1, 1, Qt.AlignRight)
-
- self.titleForm.setColumnStretch(0, 0)
- self.titleForm.setColumnStretch(1, 1)
-
- # Font Options
- # ============
-
- self.fontGroup = QGroupBox(self.tr("Font Options"), self)
- self.fontForm = QGridLayout(self)
- self.fontGroup.setLayout(self.fontForm)
-
- # Font Family
- self.textFont = QLineEdit()
- self.textFont.setReadOnly(True)
- self.textFont.setMinimumWidth(xFmt)
- self.textFont.setText(
- pOptions.getString("GuiBuildNovel", "textFont", CONFIG.textFont)
- )
- self.fontButton = QPushButton("...")
- self.fontButton.setMaximumWidth(int(2.5*self.mainTheme.getTextWidth("...")))
- self.fontButton.clicked.connect(self._selectFont)
-
- self.textSize = QSpinBox(self)
- self.textSize.setFixedWidth(6*self.mainTheme.textNWidth)
- self.textSize.setMinimum(6)
- self.textSize.setMaximum(72)
- self.textSize.setSingleStep(1)
- self.textSize.setValue(
- pOptions.getInt("GuiBuildNovel", "textSize", CONFIG.textSize)
- )
-
- self.lineHeight = QDoubleSpinBox(self)
- self.lineHeight.setFixedWidth(6*self.mainTheme.textNWidth)
- self.lineHeight.setMinimum(0.8)
- self.lineHeight.setMaximum(3.0)
- self.lineHeight.setSingleStep(0.05)
- self.lineHeight.setDecimals(2)
- self.lineHeight.setValue(
- pOptions.getFloat("GuiBuildNovel", "lineHeight", 1.15)
- )
-
- # Wrapper box due to QGridView and QLineEdit expand bug
- self.boxFont = QHBoxLayout()
- self.boxFont.addWidget(self.textFont)
-
- fontFamilyLabel = QLabel(self.tr("Font family"))
- fontSizeLabel = QLabel(self.tr("Font size"))
- lineHeightLabel = QLabel(self.tr("Line height"))
- justifyLabel = QLabel(self.tr("Justify text"))
- stylingLabel = QLabel(self.tr("Disable styling"))
-
- self.fontForm.addWidget(fontFamilyLabel, 0, 0, 1, 1, Qt.AlignLeft)
- self.fontForm.addLayout(self.boxFont, 0, 1, 1, 1, Qt.AlignRight)
- self.fontForm.addWidget(self.fontButton, 0, 2, 1, 1, Qt.AlignRight)
- self.fontForm.addWidget(fontSizeLabel, 1, 0, 1, 1, Qt.AlignLeft)
- self.fontForm.addWidget(self.textSize, 1, 1, 1, 2, Qt.AlignRight)
- self.fontForm.addWidget(lineHeightLabel, 2, 0, 1, 1, Qt.AlignLeft)
- self.fontForm.addWidget(self.lineHeight, 2, 1, 1, 2, Qt.AlignRight)
-
- self.fontForm.setColumnStretch(0, 0)
- self.fontForm.setColumnStretch(1, 1)
- self.fontForm.setColumnStretch(2, 0)
-
- # Styling Options
- # ===============
-
- self.styleGroup = QGroupBox(self.tr("Styling Options"), self)
- self.styleForm = QGridLayout(self)
- self.styleGroup.setLayout(self.styleForm)
-
- self.justifyText = NSwitch(width=wS, height=hS)
- self.justifyText.setChecked(
- pOptions.getBool("GuiBuildNovel", "justifyText", False)
- )
-
- self.noStyling = NSwitch(width=wS, height=hS)
- self.noStyling.setChecked(
- pOptions.getBool("GuiBuildNovel", "noStyling", False)
- )
-
- self.styleForm.addWidget(justifyLabel, 1, 0, 1, 1, Qt.AlignLeft)
- self.styleForm.addWidget(self.justifyText, 1, 1, 1, 2, Qt.AlignRight)
- self.styleForm.addWidget(stylingLabel, 2, 0, 1, 1, Qt.AlignLeft)
- self.styleForm.addWidget(self.noStyling, 2, 1, 1, 2, Qt.AlignRight)
-
- self.styleForm.setColumnStretch(0, 0)
- self.styleForm.setColumnStretch(1, 1)
-
- # Include Options
- # ===============
-
- self.textGroup = QGroupBox(self.tr("Include Options"), self)
- self.textForm = QGridLayout(self)
- self.textGroup.setLayout(self.textForm)
-
- self.includeSynopsis = NSwitch(width=wS, height=hS)
- self.includeSynopsis.setChecked(
- pOptions.getBool("GuiBuildNovel", "incSynopsis", False)
- )
-
- self.includeComments = NSwitch(width=wS, height=hS)
- self.includeComments.setChecked(
- pOptions.getBool("GuiBuildNovel", "incComments", False)
- )
-
- self.includeKeywords = NSwitch(width=wS, height=hS)
- self.includeKeywords.setChecked(
- pOptions.getBool("GuiBuildNovel", "incKeywords", False)
- )
-
- self.includeBody = NSwitch(width=wS, height=hS)
- self.includeBody.setChecked(
- pOptions.getBool("GuiBuildNovel", "incBodyText", True)
- )
-
- synopsisLabel = QLabel(self.tr("Include synopsis"))
- commentsLabel = QLabel(self.tr("Include comments"))
- keywordsLabel = QLabel(self.tr("Include keywords"))
- bodyLabel = QLabel(self.tr("Include body text"))
-
- self.textForm.addWidget(synopsisLabel, 0, 0, 1, 1, Qt.AlignLeft)
- self.textForm.addWidget(self.includeSynopsis, 0, 1, 1, 1, Qt.AlignRight)
- self.textForm.addWidget(commentsLabel, 1, 0, 1, 1, Qt.AlignLeft)
- self.textForm.addWidget(self.includeComments, 1, 1, 1, 1, Qt.AlignRight)
- self.textForm.addWidget(keywordsLabel, 2, 0, 1, 1, Qt.AlignLeft)
- self.textForm.addWidget(self.includeKeywords, 2, 1, 1, 1, Qt.AlignRight)
- self.textForm.addWidget(bodyLabel, 3, 0, 1, 1, Qt.AlignLeft)
- self.textForm.addWidget(self.includeBody, 3, 1, 1, 1, Qt.AlignRight)
-
- self.textForm.setColumnStretch(0, 1)
- self.textForm.setColumnStretch(1, 0)
-
- # Root Filter Options
- # ===================
-
- self.rootGroup = QGroupBox(self.tr("Root Filter Options"), self)
- self.rootForm = QGridLayout(self)
- self.rootGroup.setLayout(self.rootForm)
-
- rootFilter = pOptions.getValue("GuiBuildNovel", "rootFilter", [])
- if not isinstance(rootFilter, list):
- rootFilter = []
-
- iRow = 0
- self.rootSelection = {}
- for tHandle, nwItem in self.theProject.tree.iterRoots(None):
- if not nwItem.isInactiveClass():
- rootLabel = QLabel(nwItem.itemName)
- rootLabel.setWordWrap(True)
-
- rootValue = NSwitch(width=wS, height=hS)
- rootValue.setChecked(tHandle not in rootFilter)
-
- self.rootSelection[tHandle] = rootValue
- self.rootForm.addWidget(rootLabel, iRow, 0, 1, 1, Qt.AlignLeft)
- self.rootForm.addWidget(rootValue, iRow, 1, 1, 1, Qt.AlignRight)
-
- iRow += 1
-
- self.rootForm.setColumnStretch(0, 1)
- self.rootForm.setColumnStretch(1, 0)
-
- # File Filter Options
- # ===================
-
- self.fileGroup = QGroupBox(self.tr("File Filter Options"), self)
- self.fileForm = QGridLayout(self)
- self.fileGroup.setLayout(self.fileForm)
-
- self.novelFiles = NSwitch(width=wS, height=hS)
- self.novelFiles.setChecked(
- pOptions.getBool("GuiBuildNovel", "addNovel", True)
- )
-
- self.noteFiles = NSwitch(width=wS, height=hS)
- self.noteFiles.setChecked(
- pOptions.getBool("GuiBuildNovel", "addNotes", False)
- )
-
- self.ignoreFlag = NSwitch(width=wS, height=hS)
- self.ignoreFlag.setChecked(
- pOptions.getBool("GuiBuildNovel", "ignoreFlag", False)
- )
-
- novelLabel = QLabel(self.tr("Include novel files"))
- notesLabel = QLabel(self.tr("Include note files"))
- activeLabel = QLabel(self.tr("Include inactive files"))
-
- self.fileForm.addWidget(novelLabel, 0, 0, 1, 1, Qt.AlignLeft)
- self.fileForm.addWidget(self.novelFiles, 0, 1, 1, 1, Qt.AlignRight)
- self.fileForm.addWidget(notesLabel, 1, 0, 1, 1, Qt.AlignLeft)
- self.fileForm.addWidget(self.noteFiles, 1, 1, 1, 1, Qt.AlignRight)
- self.fileForm.addWidget(activeLabel, 2, 0, 1, 1, Qt.AlignLeft)
- self.fileForm.addWidget(self.ignoreFlag, 2, 1, 1, 1, Qt.AlignRight)
-
- self.fileForm.setColumnStretch(0, 1)
- self.fileForm.setColumnStretch(1, 0)
-
- # Export Options
- # ==============
-
- self.exportGroup = QGroupBox(self.tr("Export Options"), self)
- self.exportForm = QGridLayout(self)
- self.exportGroup.setLayout(self.exportForm)
-
- self.replaceTabs = NSwitch(width=wS, height=hS)
- self.replaceTabs.setChecked(
- pOptions.getBool("GuiBuildNovel", "replaceTabs", False)
- )
-
- self.replaceUCode = NSwitch(width=wS, height=hS)
- self.replaceUCode.setChecked(
- pOptions.getBool("GuiBuildNovel", "replaceUCode", False)
- )
-
- tabsLabel = QLabel(self.tr("Replace tabs with spaces"))
- uCodeLabel = QLabel(self.tr("Replace Unicode in HTML"))
-
- self.exportForm.addWidget(tabsLabel, 0, 0, 1, 1, Qt.AlignLeft)
- self.exportForm.addWidget(self.replaceTabs, 0, 1, 1, 1, Qt.AlignRight)
- self.exportForm.addWidget(uCodeLabel, 1, 0, 1, 1, Qt.AlignLeft)
- self.exportForm.addWidget(self.replaceUCode, 1, 1, 1, 1, Qt.AlignRight)
-
- self.exportForm.setColumnStretch(0, 1)
- self.exportForm.setColumnStretch(1, 0)
-
- # Build Button
- # ============
-
- self.buildProgress = QProgressBar()
-
- self.buildNovel = QPushButton(self.tr("Build Preview"))
- self.buildNovel.clicked.connect(self._buildPreview)
-
- # Action Buttons
- # ==============
-
- self.buttonBox = QHBoxLayout()
-
- # Printing
-
- self.printMenu = QMenu(self)
- self.btnPrint = QPushButton(self.tr("Print"))
- self.btnPrint.setMenu(self.printMenu)
-
- self.printSend = QAction(self.tr("Print Preview"), self)
- self.printSend.triggered.connect(self._printDocument)
- self.printMenu.addAction(self.printSend)
-
- self.printFile = QAction(self.tr("Print to PDF"), self)
- self.printFile.triggered.connect(lambda: self._saveDocument(self.FMT_PDF))
- self.printMenu.addAction(self.printFile)
-
- # Saving to File
-
- self.saveMenu = QMenu(self)
- self.btnSave = QPushButton(self.tr("Save As"))
- self.btnSave.setMenu(self.saveMenu)
-
- self.saveODT = QAction(self.tr("Open Document (.odt)"), self)
- self.saveODT.triggered.connect(lambda: self._saveDocument(self.FMT_ODT))
- self.saveMenu.addAction(self.saveODT)
-
- self.saveFODT = QAction(self.tr("Flat Open Document (.fodt)"), self)
- self.saveFODT.triggered.connect(lambda: self._saveDocument(self.FMT_FODT))
- self.saveMenu.addAction(self.saveFODT)
-
- self.saveHTM = QAction(self.tr("novelWriter HTML (.htm)"), self)
- self.saveHTM.triggered.connect(lambda: self._saveDocument(self.FMT_HTM))
- self.saveMenu.addAction(self.saveHTM)
-
- self.saveNWD = QAction(self.tr("novelWriter Markdown (.nwd)"), self)
- self.saveNWD.triggered.connect(lambda: self._saveDocument(self.FMT_NWD))
- self.saveMenu.addAction(self.saveNWD)
-
- self.saveMD = QAction(self.tr("Standard Markdown (.md)"), self)
- self.saveMD.triggered.connect(lambda: self._saveDocument(self.FMT_MD))
- self.saveMenu.addAction(self.saveMD)
-
- self.saveGH = QAction(self.tr("GitHub Markdown (.md)"), self)
- self.saveGH.triggered.connect(lambda: self._saveDocument(self.FMT_GH))
- self.saveMenu.addAction(self.saveGH)
-
- self.saveJsonH = QAction(self.tr("JSON + novelWriter HTML (.json)"), self)
- self.saveJsonH.triggered.connect(lambda: self._saveDocument(self.FMT_JSON_H))
- self.saveMenu.addAction(self.saveJsonH)
-
- self.saveJsonM = QAction(self.tr("JSON + novelWriter Markdown (.json)"), self)
- self.saveJsonM.triggered.connect(lambda: self._saveDocument(self.FMT_JSON_M))
- self.saveMenu.addAction(self.saveJsonM)
-
- self.btnClose = QPushButton(self.tr("Close"))
- self.btnClose.clicked.connect(self._doClose)
-
- self.buttonBox.addWidget(self.btnSave)
- self.buttonBox.addWidget(self.btnPrint)
- self.buttonBox.addWidget(self.btnClose)
- self.buttonBox.setSpacing(CONFIG.pxInt(4))
-
- # Assemble GUI
- # ============
-
- # Splitter Position
- boxWidth = CONFIG.pxInt(350)
- boxWidth = pOptions.getInt("GuiBuildNovel", "boxWidth", boxWidth)
- docWidth = max(self.width() - boxWidth, 100)
- docWidth = pOptions.getInt("GuiBuildNovel", "docWidth", docWidth)
-
- # The Tool Box
- self.toolsBox = QVBoxLayout()
- self.toolsBox.addWidget(self.titleGroup)
- self.toolsBox.addWidget(self.fontGroup)
- self.toolsBox.addWidget(self.styleGroup)
- self.toolsBox.addWidget(self.textGroup)
- self.toolsBox.addWidget(self.rootGroup)
- self.toolsBox.addWidget(self.fileGroup)
- self.toolsBox.addWidget(self.exportGroup)
- self.toolsBox.addStretch(1)
-
- # Tool Box Wrapper Widget
- self.toolsWidget = QWidget()
- self.toolsWidget.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Minimum)
- self.toolsWidget.setLayout(self.toolsBox)
-
- # Tool Box Scroll Area
- self.toolsArea = QScrollArea()
- self.toolsArea.setMinimumWidth(CONFIG.pxInt(250))
- self.toolsArea.setWidgetResizable(True)
- self.toolsArea.setWidget(self.toolsWidget)
-
- if CONFIG.hideVScroll:
- self.toolsArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
- else:
- self.toolsArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
-
- if CONFIG.hideHScroll:
- self.toolsArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
- else:
- self.toolsArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
-
- # Tools and Buttons Layout
- tSp = CONFIG.pxInt(8)
- self.innerBox = QVBoxLayout()
- self.innerBox.addWidget(self.toolsArea)
- self.innerBox.addSpacing(tSp)
- self.innerBox.addWidget(self.buildProgress)
- self.innerBox.addWidget(self.buildNovel)
- self.innerBox.addSpacing(tSp)
- self.innerBox.addLayout(self.buttonBox)
-
- # Tools and Buttons Wrapper Widget
- self.innerWidget = QWidget()
- self.innerWidget.setLayout(self.innerBox)
-
- # Main Dialog Splitter
- self.mainSplit = QSplitter(Qt.Horizontal)
- self.mainSplit.addWidget(self.innerWidget)
- self.mainSplit.addWidget(self.docView)
- self.mainSplit.setSizes([boxWidth, docWidth])
-
- self.idxSettings = self.mainSplit.indexOf(self.innerWidget)
- self.idxDocument = self.mainSplit.indexOf(self.docView)
-
- self.mainSplit.setCollapsible(self.idxSettings, False)
- self.mainSplit.setCollapsible(self.idxDocument, False)
-
- # Outer Layout
- self.outerBox = QHBoxLayout()
- self.outerBox.addWidget(self.mainSplit)
-
- self.setLayout(self.outerBox)
- self.buildNovel.setFocus()
-
- logger.debug("GuiBuildNovel initialisation complete")
-
- return
-
- def viewCachedDoc(self):
- """Load the previously generated document from cache.
- """
- if self._loadCache():
- textFont = self.textFont.text()
- textSize = self.textSize.value()
- justifyText = self.justifyText.isChecked()
- self.docView.setTextFont(textFont, textSize)
- self.docView.setJustify(justifyText)
- if self.noStyling.isChecked():
- self.docView.clearStyleSheet()
- else:
- self.docView.setStyleSheet(self.htmlStyle)
-
- htmlSize = sum([len(x) for x in self.htmlText])
- if htmlSize < nwConst.MAX_BUILDSIZE:
- qApp.processEvents()
- self.docView.setContent(self.htmlText, self.buildTime)
- else:
- self.docView.setText(
- self.tr("Failed to generate preview. The result is too big.")
- )
-
- else:
- self.htmlText = []
- self.htmlStyle = []
- self.buildTime = 0
- return False
-
- return True
-
- ##
- # Slots and Related
- ##
-
- def _buildPreview(self):
- """Build a preview of the project in the document viewer.
- """
- # Get Settings
- justifyText = self.justifyText.isChecked()
- noStyling = self.noStyling.isChecked()
- textFont = self.textFont.text()
- textSize = self.textSize.value()
- replaceTabs = self.replaceTabs.isChecked()
-
- self.htmlText = []
- self.htmlStyle = []
- self.htmlSize = 0
-
- # Build Preview
- # =============
-
- makeHtml = ToHtml(self.theProject)
- self._doBuild(makeHtml, isPreview=True)
- if replaceTabs:
- makeHtml.replaceTabs()
-
- self.htmlText = makeHtml.fullHTML
- self.htmlStyle = makeHtml.getStyleSheet()
- self.htmlSize = makeHtml.getFullResultSize()
- self.buildTime = int(time())
-
- # Load Preview
- # ============
-
- self.docView.setTextFont(textFont, textSize)
- self.docView.setJustify(justifyText)
- if noStyling:
- self.docView.clearStyleSheet()
- else:
- self.docView.setStyleSheet(self.htmlStyle)
-
- if self.htmlSize < nwConst.MAX_BUILDSIZE:
- self.docView.setContent(self.htmlText, self.buildTime)
- else:
- self.docView.setText(
- "Failed to generate preview. The result is too big."
- )
-
- self._saveCache()
-
- return
-
- def _doBuild(self, bldObj, isPreview=False, doConvert=True):
- """Run the build with a specific build object.
- """
- tStart = int(time())
-
- # Get Settings
- fmtTitle = self.fmtTitle.text()
- fmtChapter = self.fmtChapter.text()
- fmtUnnumbered = self.fmtUnnumbered.text()
- fmtScene = self.fmtScene.text()
- fmtSection = self.fmtSection.text()
- buildLang = self.buildLang.currentData()
- hideScene = self.hideScene.isChecked()
- hideSection = self.hideSection.isChecked()
- textFont = self.textFont.text()
- textSize = self.textSize.value()
- lineHeight = self.lineHeight.value()
- justifyText = self.justifyText.isChecked()
- noStyling = self.noStyling.isChecked()
- incSynopsis = self.includeSynopsis.isChecked()
- incComments = self.includeComments.isChecked()
- incKeywords = self.includeKeywords.isChecked()
- novelFiles = self.novelFiles.isChecked()
- noteFiles = self.noteFiles.isChecked()
- ignoreFlag = self.ignoreFlag.isChecked()
- includeBody = self.includeBody.isChecked()
- replaceUCode = self.replaceUCode.isChecked()
-
- # The language lookup dict is reloaded if needed
- self.theProject.setProjectLang(buildLang)
-
- # Get font information
- fontInfo = QFontInfo(QFont(textFont, textSize))
- textFixed = fontInfo.fixedPitch()
-
- isHtml = isinstance(bldObj, ToHtml)
- isOdt = isinstance(bldObj, ToOdt)
-
- bldObj.setTitleFormat(fmtTitle)
- bldObj.setChapterFormat(fmtChapter)
- bldObj.setUnNumberedFormat(fmtUnnumbered)
- bldObj.setSceneFormat(fmtScene, hideScene)
- bldObj.setSectionFormat(fmtSection, hideSection)
-
- bldObj.setFont(textFont, textSize, textFixed)
- bldObj.setJustify(justifyText)
- bldObj.setLineHeight(lineHeight)
-
- bldObj.setSynopsis(incSynopsis)
- bldObj.setComments(incComments)
- bldObj.setKeywords(incKeywords)
- bldObj.setBodyText(includeBody)
-
- if isHtml:
- bldObj.setStyles(not noStyling)
- bldObj.setReplaceUnicode(replaceUCode)
-
- if isOdt:
- bldObj.setColourHeaders(not noStyling)
- bldObj.setLanguage(buildLang)
- bldObj.initDocument()
-
- # Make sure the project and document is up to date
- self.mainGui.saveDocument()
-
- self.buildProgress.setMaximum(len(self.theProject.tree))
- self.buildProgress.setValue(0)
-
- rootFilter = set(self._generateRootFilter())
- for nItt, tItem in enumerate(self.theProject.tree):
-
- noteRoot = noteFiles
- noteRoot &= tItem.itemType == nwItemType.ROOT
- noteRoot &= tItem.itemClass != nwItemClass.NOVEL
- noteRoot &= tItem.itemClass != nwItemClass.ARCHIVE
-
- try:
- if noteRoot:
- # Add headers for root folders of notes
- bldObj.addRootHeading(tItem.itemHandle)
- if doConvert:
- bldObj.doConvert()
-
- elif self._checkInclude(tItem, noteFiles, novelFiles, ignoreFlag, rootFilter):
- bldObj.setText(tItem.itemHandle)
- bldObj.doPreProcessing()
- bldObj.tokenizeText()
- bldObj.doHeaders()
- if doConvert:
- bldObj.doConvert()
-
- except Exception:
- logger.error("Failed to build document '%s'", tItem.itemHandle)
- logException()
- if isPreview:
- 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)
-
- if isOdt:
- bldObj.closeDocument()
-
- tEnd = int(time())
- logger.debug("Built project in %.3f ms", 1000*(tEnd - tStart))
-
- if bldObj.errData:
- self.mainGui.makeAlert([
- self.tr("There were problems when building the project:")
- ] + bldObj.errData, nwAlert.ERROR)
-
- return
-
- def _checkInclude(self, theItem, noteFiles, novelFiles, ignoreFlag, rootFilter):
- """This function checks whether a file should be included in the
- export or not. For standard note and novel files, this is
- controlled by the options selected by the user. For other files
- classified as non-exportable, a few checks must be made, and the
- following are not:
- * Items that are not actual files.
- * Items that have been orphaned which are tagged as NO_LAYOUT
- and NO_CLASS.
- * Items that appear in the TRASH folder or have parent set to
- None (orphaned files).
- """
- if theItem is None:
- return False
-
- if not (theItem.isActive or ignoreFlag):
- return False
-
- if theItem.itemRoot in rootFilter:
- return False
-
- isNone = not theItem.isFileType()
- isNone |= theItem.itemLayout == nwItemLayout.NO_LAYOUT
- isNone |= theItem.isInactiveClass()
- isNone |= theItem.itemParent is None
- isNote = theItem.isNoteLayout()
- isNovel = not isNone and not isNote
-
- if isNone:
- return False
- if isNote and not noteFiles:
- return False
- if isNovel and not novelFiles:
- return False
-
- return True
-
- def _saveDocument(self, theFmt):
- """Save the document to various formats.
- """
- replaceTabs = self.replaceTabs.isChecked()
-
- fileExt = ""
- textFmt = ""
-
- # Settings
- # ========
-
- if theFmt == self.FMT_ODT:
- fileExt = "odt"
- textFmt = self.tr("Open Document")
-
- elif theFmt == self.FMT_FODT:
- fileExt = "fodt"
- textFmt = self.tr("Flat Open Document")
-
- elif theFmt == self.FMT_HTM:
- fileExt = "htm"
- textFmt = self.tr("Plain HTML")
-
- elif theFmt == self.FMT_NWD:
- fileExt = "nwd"
- textFmt = self.tr("novelWriter Markdown")
-
- elif theFmt == self.FMT_MD:
- fileExt = "md"
- textFmt = self.tr("Standard Markdown")
-
- elif theFmt == self.FMT_GH:
- fileExt = "md"
- textFmt = self.tr("GitHub Markdown")
-
- elif theFmt == self.FMT_JSON_H:
- fileExt = "json"
- textFmt = self.tr("JSON + novelWriter HTML")
-
- elif theFmt == self.FMT_JSON_M:
- fileExt = "json"
- textFmt = self.tr("JSON + novelWriter Markdown")
-
- elif theFmt == self.FMT_PDF:
- fileExt = "pdf"
- textFmt = self.tr("PDF")
-
- else:
- return False
-
- # Generate File Name
- # ==================
-
- cleanName = makeFileNameSafe(self.theProject.data.name)
- fileName = "%s.%s" % (cleanName, fileExt)
- savePath = CONFIG.lastPath() / fileName
- savePath, _ = QFileDialog.getSaveFileName(
- self, self.tr("Save Document As"), str(savePath)
- )
- if not savePath:
- return False
-
- CONFIG.setLastPath(savePath)
-
- # Build and Write
- # ===============
-
- errMsg = ""
- wSuccess = False
-
- if theFmt == self.FMT_ODT:
- makeOdt = ToOdt(self.theProject, isFlat=False)
- self._doBuild(makeOdt)
- try:
- makeOdt.saveOpenDocText(savePath)
- wSuccess = True
- except Exception as exc:
- errMsg = formatException(exc)
-
- elif theFmt == self.FMT_FODT:
- makeOdt = ToOdt(self.theProject, isFlat=True)
- self._doBuild(makeOdt)
- try:
- makeOdt.saveFlatXML(savePath)
- wSuccess = True
- except Exception as exc:
- errMsg = formatException(exc)
-
- elif theFmt == self.FMT_HTM:
- makeHtml = ToHtml(self.theProject)
- self._doBuild(makeHtml)
- if replaceTabs:
- makeHtml.replaceTabs()
-
- try:
- makeHtml.saveHTML5(savePath)
- wSuccess = True
- except Exception as exc:
- errMsg = formatException(exc)
-
- elif theFmt == self.FMT_NWD:
- makeNwd = ToMarkdown(self.theProject)
- makeNwd.setKeepMarkdown(True)
- self._doBuild(makeNwd, doConvert=False)
- if replaceTabs:
- makeNwd.replaceTabs(spaceChar=" ")
-
- try:
- makeNwd.saveRawMarkdown(savePath)
- wSuccess = True
- except Exception as exc:
- errMsg = formatException(exc)
-
- elif theFmt in (self.FMT_MD, self.FMT_GH):
- makeMd = ToMarkdown(self.theProject)
- if theFmt == self.FMT_GH:
- makeMd.setGitHubMarkdown()
- else:
- makeMd.setStandardMarkdown()
-
- self._doBuild(makeMd)
- if replaceTabs:
- makeMd.replaceTabs(nSpaces=4, spaceChar=" ")
-
- try:
- makeMd.saveMarkdown(savePath)
- wSuccess = True
- except Exception as exc:
- errMsg = formatException(exc)
-
- elif theFmt == self.FMT_JSON_H or theFmt == self.FMT_JSON_M:
- jsonData = {
- "meta": {
- "projectName": self.theProject.data.name,
- "novelTitle": self.theProject.data.title,
- "novelAuthor": self.theProject.data.author,
- "buildTime": self.buildTime,
- }
- }
-
- if theFmt == self.FMT_JSON_H:
- makeHtml = ToHtml(self.theProject)
- self._doBuild(makeHtml)
- if replaceTabs:
- makeHtml.replaceTabs()
-
- theBody = []
- for htmlPage in makeHtml.fullHTML:
- theBody.append(htmlPage.rstrip("\n").split("\n"))
- jsonData["text"] = {
- "css": self.htmlStyle,
- "html": theBody,
- }
-
- elif theFmt == self.FMT_JSON_M:
- makeMd = ToHtml(self.theProject)
- makeMd.setKeepMarkdown(True)
- self._doBuild(makeMd, doConvert=False)
- if replaceTabs:
- makeMd.replaceTabs(spaceChar=" ")
-
- theBody = []
- for nwdPage in makeMd.theMarkdown:
- theBody.append(nwdPage.split("\n"))
- jsonData["text"] = {
- "nwd": theBody,
- }
-
- try:
- with open(savePath, mode="w", encoding="utf-8") as outFile:
- outFile.write(json.dumps(jsonData, indent=2))
- wSuccess = True
- except Exception as exc:
- errMsg = formatException(exc)
-
- elif theFmt == self.FMT_PDF:
- try:
- thePrinter = QPrinter()
- thePrinter.setOutputFormat(QPrinter.PdfFormat)
- thePrinter.setOrientation(QPrinter.Portrait)
- thePrinter.setDuplex(QPrinter.DuplexLongSide)
- thePrinter.setFontEmbeddingEnabled(True)
- thePrinter.setColorMode(QPrinter.Color)
- thePrinter.setOutputFileName(savePath)
- self.docView.document().print(thePrinter)
- wSuccess = True
-
- except Exception as exc:
- errMsg = formatException(exc)
-
- else:
- # If the if statements above and here match, it should not
- # be possible to reach this else statement.
- return False # pragma: no cover
-
- # Report to User
- # ==============
-
- if wSuccess:
- self.mainGui.makeAlert([
- self.tr("{0} file successfully written to:").format(textFmt), savePath
- ], nwAlert.INFO)
- else:
- self.mainGui.makeAlert(self.tr(
- "Failed to write {0} file. {1}"
- ).format(textFmt, errMsg), nwAlert.ERROR)
-
- return wSuccess
-
- def _printDocument(self):
- """Open the print preview dialog.
- """
- thePreview = QPrintPreviewDialog(self)
- thePreview.paintRequested.connect(self._doPrintPreview)
- thePreview.exec_()
- return
-
- def _doPrintPreview(self, thePrinter):
- """Connect the print preview painter to the document viewer.
- """
- qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
- thePrinter.setOrientation(QPrinter.Portrait)
- self.docView.document().print(thePrinter)
- qApp.restoreOverrideCursor()
- return
-
- def _selectFont(self):
- """Open the QFontDialog and set a font for the font style.
- """
- currFont = QFont()
- currFont.setFamily(self.textFont.text())
- currFont.setPointSize(self.textSize.value())
- theFont, theStatus = QFontDialog.getFont(currFont, self)
- if theStatus:
- self.textFont.setText(theFont.family())
- self.textSize.setValue(theFont.pointSize())
-
- self.raise_() # Move the dialog to front (fixes a bug on macOS)
-
- return
-
- def _generateRootFilter(self):
- """Return a list of all root folders that are filtered out.
- """
- return [h for h, s in self.rootSelection.items() if not s.isChecked()]
-
- def _loadCache(self):
- """Save the current data to cache.
- """
- buildCache = self.theProject.storage.getCacheFile(nwFiles.BUILD_CACHE)
- if not isinstance(buildCache, Path):
- return False
-
- dataCount = 0
- if buildCache.exists():
- logger.debug("Loading build cache")
- try:
- with open(buildCache, mode="r", encoding="utf-8") as inFile:
- theJson = inFile.read()
- theData = json.loads(theJson)
- except Exception:
- logger.error("Failed to load build cache")
- logException()
- return False
-
- if "buildTime" in theData.keys():
- self.buildTime = theData["buildTime"]
- if "htmlStyle" in theData.keys():
- self.htmlStyle = theData["htmlStyle"]
- dataCount += 1
- if "htmlText" in theData.keys():
- self.htmlText = theData["htmlText"]
- dataCount += 1
-
- return dataCount == 2
-
- def _saveCache(self):
- """Save the current data to cache.
- """
- buildCache = self.theProject.storage.getCacheFile(nwFiles.BUILD_CACHE)
- if not isinstance(buildCache, Path):
- return False
-
- logger.debug("Saving build cache")
- try:
- with open(buildCache, mode="w+", encoding="utf-8") as outFile:
- outFile.write(json.dumps({
- "buildTime": self.buildTime,
- "htmlStyle": self.htmlStyle,
- "htmlText": self.htmlText,
- }, indent=2))
- except Exception:
- logger.error("Failed to save build cache")
- logException()
- return False
-
- return True
-
- def _doClose(self):
- """Close button was clicked.
- """
- self.close()
- return
-
- ##
- # Events
- ##
-
- def closeEvent(self, theEvent):
- """Capture the user closing the window so we can save settings.
- """
- self._saveSettings()
- self.docView.clear()
- theEvent.accept()
- return
-
- ##
- # Internal Functions
- ##
-
- def _saveSettings(self):
- """Save the various user settings.
- """
- logger.debug("Saving GuiBuildNovel settings")
-
- # Formatting
- self.theProject.data.setTitleFormat({
- "title": self.fmtTitle.text().strip(),
- "chapter": self.fmtChapter.text().strip(),
- "unnumbered": self.fmtUnnumbered.text().strip(),
- "scene": self.fmtScene.text().strip(),
- "section": self.fmtSection.text().strip(),
- })
-
- buildLang = self.buildLang.currentData()
- hideScene = self.hideScene.isChecked()
- hideSection = self.hideSection.isChecked()
- winWidth = CONFIG.rpxInt(self.width())
- winHeight = CONFIG.rpxInt(self.height())
- justifyText = self.justifyText.isChecked()
- noStyling = self.noStyling.isChecked()
- textFont = self.textFont.text()
- textSize = self.textSize.value()
- lineHeight = self.lineHeight.value()
- novelFiles = self.novelFiles.isChecked()
- noteFiles = self.noteFiles.isChecked()
- ignoreFlag = self.ignoreFlag.isChecked()
- incSynopsis = self.includeSynopsis.isChecked()
- incComments = self.includeComments.isChecked()
- incKeywords = self.includeKeywords.isChecked()
- incBodyText = self.includeBody.isChecked()
- replaceTabs = self.replaceTabs.isChecked()
- replaceUCode = self.replaceUCode.isChecked()
- rootFilter = self._generateRootFilter()
-
- mainSplit = self.mainSplit.sizes()
- boxWidth = CONFIG.rpxInt(mainSplit[0])
- docWidth = CONFIG.rpxInt(mainSplit[1])
-
- self.theProject.setProjectLang(buildLang)
-
- # GUI Settings
- pOptions = self.theProject.options
- pOptions.setValue("GuiBuildNovel", "hideScene", hideScene)
- pOptions.setValue("GuiBuildNovel", "hideSection", hideSection)
- pOptions.setValue("GuiBuildNovel", "winWidth", winWidth)
- pOptions.setValue("GuiBuildNovel", "winHeight", winHeight)
- pOptions.setValue("GuiBuildNovel", "boxWidth", boxWidth)
- pOptions.setValue("GuiBuildNovel", "docWidth", docWidth)
- pOptions.setValue("GuiBuildNovel", "justifyText", justifyText)
- pOptions.setValue("GuiBuildNovel", "noStyling", noStyling)
- pOptions.setValue("GuiBuildNovel", "textFont", textFont)
- pOptions.setValue("GuiBuildNovel", "textSize", textSize)
- pOptions.setValue("GuiBuildNovel", "lineHeight", lineHeight)
- pOptions.setValue("GuiBuildNovel", "addNovel", novelFiles)
- pOptions.setValue("GuiBuildNovel", "addNotes", noteFiles)
- pOptions.setValue("GuiBuildNovel", "ignoreFlag", ignoreFlag)
- pOptions.setValue("GuiBuildNovel", "incSynopsis", incSynopsis)
- pOptions.setValue("GuiBuildNovel", "incComments", incComments)
- pOptions.setValue("GuiBuildNovel", "incKeywords", incKeywords)
- pOptions.setValue("GuiBuildNovel", "incBodyText", incBodyText)
- pOptions.setValue("GuiBuildNovel", "replaceTabs", replaceTabs)
- pOptions.setValue("GuiBuildNovel", "replaceUCode", replaceUCode)
- pOptions.setValue("GuiBuildNovel", "rootFilter", rootFilter)
- pOptions.saveSettings()
-
- return
-
- def _reFmtCodes(self, theFormat):
- """Translates old formatting codes to new ones.
- """
- theFormat = theFormat.replace(r"%chnum%", r"%ch%")
- theFormat = theFormat.replace(r"%scnum%", r"%sc%")
- theFormat = theFormat.replace(r"%scabsnum%", r"%sca%")
- theFormat = theFormat.replace(r"%chnumword%", r"%chw%")
- return theFormat
-
-# END Class GuiBuildNovel
-
-
-class GuiBuildNovelDocView(QTextBrowser):
-
- def __init__(self, mainGui, theProject):
- super().__init__(parent=mainGui)
-
- logger.debug("Initialising GuiBuildNovelDocView ...")
-
- self.theProject = theProject
- self.mainGui = mainGui
- self.mainTheme = mainGui.mainTheme
- self.buildTime = 0
-
- self.setMinimumWidth(40*self.mainGui.mainTheme.textNWidth)
- self.setOpenExternalLinks(False)
-
- self.document().setDocumentMargin(CONFIG.getTextMargin())
- self.setPlaceholderText(self.tr(
- "This area will show the content of the document to be "
- "exported or printed. Press the \"Build Preview\" button "
- "to generate content."
- ))
-
- theFont = QFont()
- theFont.setFamily(CONFIG.textFont)
- theFont.setPointSize(CONFIG.textSize)
- self.setFont(theFont)
-
- # Set the tab stops
- self.setTabStopDistance(CONFIG.getTabWidth())
-
- docPalette = self.palette()
- docPalette.setColor(QPalette.Base, QColor(255, 255, 255))
- docPalette.setColor(QPalette.Text, QColor(0, 0, 0))
- self.setPalette(docPalette)
-
- lblPalette = self.palette()
- lblPalette.setColor(QPalette.Background, lblPalette.toolTipBase().color())
- lblPalette.setColor(QPalette.Foreground, lblPalette.toolTipText().color())
-
- lblFont = self.font()
- lblFont.setPointSizeF(0.9*self.mainTheme.fontPointSize)
-
- fPx = int(1.1*self.mainTheme.fontPixelSize)
-
- self.theTitle = QLabel("", self)
- self.theTitle.setIndent(0)
- self.theTitle.setAutoFillBackground(True)
- self.theTitle.setAlignment(Qt.AlignCenter)
- self.theTitle.setFixedHeight(fPx)
- self.theTitle.setPalette(lblPalette)
- self.theTitle.setFont(lblFont)
-
- self._updateDocMargins()
- self._updateBuildAge()
- self.setStyleSheet()
-
- # Age Timer
- self.ageTimer = QTimer()
- self.ageTimer.setInterval(10000)
- self.ageTimer.timeout.connect(self._updateBuildAge)
- self.ageTimer.start()
-
- logger.debug("GuiBuildNovelDocView initialisation complete")
-
- return
-
- def setJustify(self, doJustify):
- """Set the justify text option.
- """
- theOpt = self.document().defaultTextOption()
- if doJustify:
- theOpt.setAlignment(Qt.AlignJustify)
- else:
- theOpt.setAlignment(Qt.AlignAbsolute)
- self.document().setDefaultTextOption(theOpt)
- return
-
- def setTextFont(self, textFont, textSize):
- """Set the text font properties.
- """
- theFont = QFont()
- theFont.setFamily(textFont)
- theFont.setPointSize(textSize)
- self.setFont(theFont)
- return
-
- def setContent(self, theText, timeStamp):
- """Set the content, either from text or list of text.
- """
- if isinstance(theText, list):
- theText = "".join(theText)
-
- self.buildTime = timeStamp
- sPos = self.verticalScrollBar().value()
- qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
-
- theText = theText.replace("\t", "!!tab!!")
- theText = theText.replace("", "")
- theText = theText.replace("", "")
- self.setHtml(theText)
- qApp.processEvents()
-
- while self.find("!!tab!!"):
- theCursor = self.textCursor()
- theCursor.insertText("\t")
-
- self.verticalScrollBar().setValue(sPos)
- self._updateBuildAge()
-
- # Since we change the content while it may still be rendering, we mark
- # the document dirty again to make sure it's re-rendered properly.
- self.document().markContentsDirty(0, self.document().characterCount())
- qApp.restoreOverrideCursor()
-
- return
-
- def setStyleSheet(self, theStyles=None):
- """Set the stylesheet for the preview document.
- """
- if theStyles is None:
- theStyles = []
-
- if not theStyles:
- theStyles.append("h1, h2 {color: rgb(66, 113, 174);}")
- theStyles.append("h3, h4 {color: rgb(50, 50, 50);}")
- theStyles.append("a {color: rgb(66, 113, 174);}")
- theStyles.append(".tags {color: rgb(245, 135, 31); font-weight: bold;}")
-
- self.document().setDefaultStyleSheet("\n".join(theStyles))
-
- return
-
- def clearStyleSheet(self):
- """Clears the document stylesheet.
- """
- self.document().setDefaultStyleSheet("")
- return
-
- ##
- # Events
- ##
-
- def resizeEvent(self, theEvent):
- """Make sure the document title is the same width as the window.
- """
- super().resizeEvent(theEvent)
- self._updateDocMargins()
- return
-
- ##
- # Internal Functions
- ##
-
- def _updateBuildAge(self):
- """Update the build time and the fuzzy age.
- """
- if self.buildTime > 0:
- strBuildTime = "%s (%s)" % (
- datetime.fromtimestamp(self.buildTime).strftime("%x %X"),
- fuzzyTime(time() - self.buildTime)
- )
- else:
- strBuildTime = self.tr("Unknown")
-
- self.theTitle.setText("%s %s" % (self.tr("Build Time:"), strBuildTime))
-
- return
-
- def _updateDocMargins(self):
- """Automatically adjust the header to fill the top of the
- document within the viewport.
- """
- vBar = self.verticalScrollBar()
- if vBar.isVisible():
- sW = vBar.width()
- else:
- sW = 0
-
- tB = self.frameWidth()
- tW = self.width() - 2*tB - sW
- tH = self.theTitle.height()
-
- self.theTitle.setGeometry(tB, tB, tW, tH)
- self.setViewportMargins(0, tH, 0, 0)
-
- return
-
-# END Class GuiBuildNovelDocView
diff --git a/tests/test_core/test_core_options.py b/tests/test_core/test_core_options.py
index 1a9cf381..ce26dbe1 100644
--- a/tests/test_core/test_core_options.py
+++ b/tests/test_core/test_core_options.py
@@ -32,8 +32,7 @@ from novelwriter.gui.noveltree import NovelTreeColumn
@pytest.mark.core
def testCoreOptions_LoadSave(monkeypatch, mockGUI, fncPath):
- """Test loading and saving from the OptionState class.
- """
+ """Test loading and saving from the OptionState class."""
theProject = NWProject(mockGUI)
theOpts = OptionState(theProject)
@@ -43,13 +42,12 @@ def testCoreOptions_LoadSave(monkeypatch, mockGUI, fncPath):
# Write a test file
optFile = metaDir / nwFiles.OPTS_FILE
optFile.write_text(json.dumps({
- "GuiBuildNovel": {
- "winWidth": 1000,
- "winHeight": 700,
- "addNovel": True,
- "addNotes": False,
- "textFont": "Cantarell",
- "mockItem": None,
+ "GuiProjectSettings": {
+ "winWidth": 570,
+ "winHeight": 375,
+ "replaceColW": 130,
+ "statusColW": 130,
+ "importColW": 130
},
"MockGroup": {
"mockItem": None,
@@ -76,12 +74,12 @@ def testCoreOptions_LoadSave(monkeypatch, mockGUI, fncPath):
# Check that unwanted items have been removed
assert theOpts._theState == {
- "GuiBuildNovel": {
- "winWidth": 1000,
- "winHeight": 700,
- "addNovel": True,
- "addNotes": False,
- "textFont": "Cantarell",
+ "GuiProjectSettings": {
+ "winWidth": 570,
+ "winHeight": 375,
+ "replaceColW": 130,
+ "statusColW": 130,
+ "importColW": 130
},
}
@@ -91,12 +89,12 @@ def testCoreOptions_LoadSave(monkeypatch, mockGUI, fncPath):
# Load again to check we get the values back
assert theOpts.loadSettings()
assert theOpts._theState == {
- "GuiBuildNovel": {
- "winWidth": 1000,
- "winHeight": 700,
- "addNovel": True,
- "addNotes": False,
- "textFont": "Cantarell",
+ "GuiProjectSettings": {
+ "winWidth": 570,
+ "winHeight": 375,
+ "replaceColW": 130,
+ "statusColW": 130,
+ "importColW": 130
},
}
@@ -105,8 +103,7 @@ def testCoreOptions_LoadSave(monkeypatch, mockGUI, fncPath):
@pytest.mark.core
def testCoreOptions_SetGet(mockGUI):
- """Test setting and getting values from the OptionState class.
- """
+ """Test setting and getting values from the OptionState class."""
theProject = NWProject(mockGUI)
theOpts = OptionState(theProject)
@@ -114,36 +111,33 @@ def testCoreOptions_SetGet(mockGUI):
# Set invalid values
assert theOpts.setValue("MockGroup", "mockItem", None) is False
- assert theOpts.setValue("GuiBuildNovel", "mockItem", None) is False
+ assert theOpts.setValue("GuiProjectSettings", "mockItem", None) is False
# Set valid value
- assert theOpts.setValue("GuiBuildNovel", "winWidth", 100)
+ assert theOpts.setValue("GuiProjectSettings", "winWidth", 100) is True
# Set some values of different types
- assert theOpts.setValue("GuiBuildNovel", "winWidth", 100)
- assert theOpts.setValue("GuiBuildNovel", "winHeight", 12.34)
- assert theOpts.setValue("GuiBuildNovel", "addNovel", True)
- assert theOpts.setValue("GuiBuildNovel", "textFont", "Cantarell")
- assert theOpts.setValue("GuiNovelView", "lastCol", nwColHidden)
+ assert theOpts.setValue("GuiProjectDetails", "winWidth", 100) is True
+ assert theOpts.setValue("GuiProjectDetails", "winHeight", 12.34) is True
+ assert theOpts.setValue("GuiProjectDetails", "clearDouble", True) is True
+ assert theOpts.setValue("GuiNovelView", "lastCol", nwColHidden) is True
# Generic get, doesn't check type
- assert theOpts.getValue("GuiBuildNovel", "winWidth", None) == 100
- assert theOpts.getValue("GuiBuildNovel", "winHeight", None) == 12.34
- assert theOpts.getValue("GuiBuildNovel", "addNovel", None) is True
- assert theOpts.getValue("GuiBuildNovel", "textFont", None) == "Cantarell"
- assert theOpts.getValue("GuiBuildNovel", "mockItem", None) is None
+ assert theOpts.getValue("GuiProjectDetails", "winWidth", None) == 100
+ assert theOpts.getValue("GuiProjectDetails", "winHeight", None) == 12.34
+ assert theOpts.getValue("GuiProjectDetails", "clearDouble", None) is True
+ assert theOpts.getValue("GuiProjectDetails", "mockItem", None) is None
# Get type-specific
- assert theOpts.getString("GuiBuildNovel", "winWidth", None) is None
- assert theOpts.getString("GuiBuildNovel", "mockItem", None) is None
- assert theOpts.getInt("GuiBuildNovel", "winWidth", None) == 100
- assert theOpts.getInt("GuiBuildNovel", "textFont", None) is None
- assert theOpts.getInt("GuiBuildNovel", "mockItem", None) is None
- assert theOpts.getFloat("GuiBuildNovel", "winWidth", None) == 100.0
- assert theOpts.getFloat("GuiBuildNovel", "textFont", None) is None
- assert theOpts.getFloat("GuiBuildNovel", "mockItem", None) is None
- assert theOpts.getBool("GuiBuildNovel", "addNovel", None) is True
- assert theOpts.getBool("GuiBuildNovel", "mockItem", None) is None
+ assert theOpts.getString("GuiProjectDetails", "winWidth", None) is None
+ assert theOpts.getString("GuiProjectDetails", "mockItem", None) is None
+ assert theOpts.getInt("GuiProjectDetails", "winWidth", None) == 100
+ assert theOpts.getInt("GuiProjectDetails", "textFont", None) is None
+ assert theOpts.getInt("GuiProjectDetails", "mockItem", None) is None
+ assert theOpts.getFloat("GuiProjectDetails", "winWidth", None) == 100.0
+ assert theOpts.getFloat("GuiProjectDetails", "mockItem", None) is None
+ assert theOpts.getBool("GuiProjectDetails", "clearDouble", None) is True
+ assert theOpts.getBool("GuiProjectDetails", "mockItem", None) is None
assert theOpts.getEnum("GuiNovelView", "lastCol", NovelTreeColumn, None) == nwColHidden
# Get from non-existent groups
diff --git a/tests/test_gui/test_gui_guimain.py b/tests/test_gui/test_gui_guimain.py
index f5b9ecc6..7c49585d 100644
--- a/tests/test_gui/test_gui_guimain.py
+++ b/tests/test_gui/test_gui_guimain.py
@@ -63,7 +63,7 @@ def testGuiMain_ProjectBlocker(nwGUI):
assert nwGUI.rebuildIndex() is False
assert nwGUI.showProjectSettingsDialog() is False
assert nwGUI.showProjectDetailsDialog() is False
- assert nwGUI.showBuildProjectDialog() is False
+ assert nwGUI.showBuildManuscriptDialog() is False
assert nwGUI.showProjectWordListDialog() is False
assert nwGUI.showWritingStatsDialog() is False
diff --git a/tests/test_tools/test_tools_build.py b/tests/test_tools/test_tools_build.py
deleted file mode 100644
index 798c3dfa..00000000
--- a/tests/test_tools/test_tools_build.py
+++ /dev/null
@@ -1,262 +0,0 @@
-"""
-novelWriter – Build Dialog Class Tester
-=======================================
-
-This file is a part of novelWriter
-Copyright 2018–2023, Veronica Berglyd Olsen
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see .
-"""
-
-import pytest
-
-from shutil import copyfile
-
-from tools import ODT_IGNORE, cmpFiles, getGuiItem
-
-from PyQt5.QtCore import Qt
-from PyQt5.QtWidgets import QAction, QFileDialog
-
-from novelwriter import CONFIG
-from novelwriter.tools.build import GuiBuildNovel
-
-
-@pytest.mark.gui
-@pytest.mark.skip
-def testToolBuild_Main(qtbot, monkeypatch, nwGUI, prjLipsum, tstPaths):
- """Test the build tool.
- """
- # Block message box
- monkeypatch.setattr(QFileDialog, "getSaveFileName", lambda a, b, c, **k: (c, None))
-
- # Check that we cannot open when there is no project
- nwGUI.mainMenu.aBuildProject.activate(QAction.Trigger)
- assert getGuiItem("GuiBuildNovel") is None
-
- # Open a project
- assert nwGUI.openProject(prjLipsum)
-
- # Open the tool
- nwGUI.mainMenu.aBuildProject.activate(QAction.Trigger)
- qtbot.waitUntil(lambda: getGuiItem("GuiBuildNovel") is not None, timeout=1000)
-
- nwBuild = getGuiItem("GuiBuildNovel")
- assert isinstance(nwBuild, GuiBuildNovel)
-
- nwBuild.textFont.setText("DejaVu Sans")
- nwBuild.textSize.setValue(11)
-
- # Test Save
- # =========
-
- # Invalid file format
- assert not nwBuild._saveDocument(-1)
-
- # No path selected
- with monkeypatch.context() as mp:
- mp.setattr(QFileDialog, "getSaveFileName", lambda *a, **k: ("", ""))
- assert not nwBuild._saveDocument(nwBuild.FMT_NWD)
-
- # Default Settings
- CONFIG._lastPath = prjLipsum
- qtbot.mouseClick(nwBuild.buildNovel, Qt.LeftButton)
-
- assert nwBuild._saveDocument(nwBuild.FMT_NWD)
- projFile = prjLipsum / "Lorem Ipsum.nwd"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step1_Lorem_Ipsum.nwd"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step1_Lorem_Ipsum.nwd"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_HTM)
- projFile = prjLipsum / "Lorem Ipsum.htm"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step1_Lorem_Ipsum.htm"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step1_Lorem_Ipsum.htm"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_MD)
- projFile = prjLipsum / "Lorem Ipsum.md"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step1_Lorem_Ipsum.md"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step1_Lorem_Ipsum.md"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_GH)
- projFile = prjLipsum / "Lorem Ipsum.md"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step1G_Lorem_Ipsum.md"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step1G_Lorem_Ipsum.md"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_FODT)
- projFile = prjLipsum / "Lorem Ipsum.fodt"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step1_Lorem_Ipsum.fodt"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step1_Lorem_Ipsum.fodt"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile, ignoreStart=ODT_IGNORE)
-
- # Change Title Formats and Flip Switches
- nwBuild.fmtChapter.setText(r"Chapter %chw%: %title%")
- nwBuild.fmtScene.setText(r"Scene %ch%.%sc%: %title%")
- nwBuild.fmtSection.setText(r"%ch%.%sc%.1: %title%")
-
- qtbot.mouseClick(nwBuild.justifyText, Qt.LeftButton)
- qtbot.mouseClick(nwBuild.includeSynopsis, Qt.LeftButton)
- qtbot.mouseClick(nwBuild.includeComments, Qt.LeftButton)
- qtbot.mouseClick(nwBuild.includeKeywords, Qt.LeftButton)
- qtbot.mouseClick(nwBuild.replaceUCode, Qt.LeftButton)
-
- qtbot.mouseClick(nwBuild.noteFiles, Qt.LeftButton)
- qtbot.mouseClick(nwBuild.ignoreFlag, Qt.LeftButton)
-
- qtbot.mouseClick(nwBuild.buildNovel, Qt.LeftButton)
-
- assert nwBuild._saveDocument(nwBuild.FMT_NWD)
- projFile = prjLipsum / "Lorem Ipsum.nwd"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step2_Lorem_Ipsum.nwd"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step2_Lorem_Ipsum.nwd"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_HTM)
- projFile = prjLipsum / "Lorem Ipsum.htm"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step2_Lorem_Ipsum.htm"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step2_Lorem_Ipsum.htm"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_MD)
- projFile = prjLipsum / "Lorem Ipsum.md"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step2_Lorem_Ipsum.md"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step2_Lorem_Ipsum.md"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_FODT)
- projFile = prjLipsum / "Lorem Ipsum.fodt"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step2_Lorem_Ipsum.fodt"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step2_Lorem_Ipsum.fodt"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile, ignoreStart=ODT_IGNORE)
-
- # Replace Tabs with Spaces
- qtbot.mouseClick(nwBuild.replaceTabs, Qt.LeftButton)
-
- qtbot.mouseClick(nwBuild.buildNovel, Qt.LeftButton)
-
- # Save files that can be compared
- assert nwBuild._saveDocument(nwBuild.FMT_NWD)
- projFile = prjLipsum / "Lorem Ipsum.nwd"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step3_Lorem_Ipsum.nwd"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step3_Lorem_Ipsum.nwd"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_HTM)
- projFile = prjLipsum / "Lorem Ipsum.htm"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step3_Lorem_Ipsum.htm"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step3_Lorem_Ipsum.htm"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_MD)
- projFile = prjLipsum / "Lorem Ipsum.md"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step3_Lorem_Ipsum.md"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step3_Lorem_Ipsum.md"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_FODT)
- projFile = prjLipsum / "Lorem Ipsum.fodt"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step3_Lorem_Ipsum.fodt"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step3_Lorem_Ipsum.fodt"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile, ignoreStart=ODT_IGNORE)
-
- # Putline Mode
- nwBuild.fmtChapter.setText(r"Chapter %chw%: %title%")
- nwBuild.fmtScene.setText(r"Scene %sca%: %title%")
- nwBuild.fmtSection.setText(r"Section: %title%")
-
- qtbot.mouseClick(nwBuild.includeComments, Qt.LeftButton)
- qtbot.mouseClick(nwBuild.noteFiles, Qt.LeftButton)
- qtbot.mouseClick(nwBuild.ignoreFlag, Qt.LeftButton)
- qtbot.mouseClick(nwBuild.includeBody, Qt.LeftButton)
-
- qtbot.mouseClick(nwBuild.buildNovel, Qt.LeftButton)
-
- # Save files that can be compared
- assert nwBuild._saveDocument(nwBuild.FMT_NWD)
- projFile = prjLipsum / "Lorem Ipsum.nwd"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step4_Lorem_Ipsum.nwd"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step4_Lorem_Ipsum.nwd"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- assert nwBuild._saveDocument(nwBuild.FMT_HTM)
- projFile = prjLipsum / "Lorem Ipsum.htm"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step4_Lorem_Ipsum.htm"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step4_Lorem_Ipsum.htm"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile)
-
- # Check the JSON files too at this stage
- assert nwBuild._saveDocument(nwBuild.FMT_JSON_H)
- projFile = prjLipsum / "Lorem Ipsum.json"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step4H_Lorem_Ipsum.json"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step4H_Lorem_Ipsum.json"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile, [6])
-
- assert nwBuild._saveDocument(nwBuild.FMT_JSON_M)
- projFile = prjLipsum / "Lorem Ipsum.json"
- testFile = tstPaths.outDir / "guiBuild_Tool_Step4M_Lorem_Ipsum.json"
- compFile = tstPaths.refDir / "guiBuild_Tool_Step4M_Lorem_Ipsum.json"
- copyfile(projFile, testFile)
- assert cmpFiles(testFile, compFile, [6])
-
- # Since odt and fodt is built by the same code, we don't check the
- # output. but just that the different format can be written as well
- assert nwBuild._saveDocument(nwBuild.FMT_ODT)
- assert (prjLipsum / "Lorem Ipsum.odt").is_file()
-
- # Print to PDF
- if not CONFIG.osDarwin:
- assert nwBuild._saveDocument(nwBuild.FMT_PDF)
- assert (prjLipsum / "Lorem Ipsum.pdf").is_file()
-
- # Close the build tool
- htmlText = nwBuild.htmlText
- htmlStyle = nwBuild.htmlStyle
- buildTime = nwBuild.buildTime
- nwBuild._doClose()
-
- # Re-open build dialog from cahce
- nwGUI.mainMenu.aBuildProject.activate(QAction.Trigger)
- qtbot.waitUntil(lambda: getGuiItem("GuiBuildNovel") is not None, timeout=1000)
-
- nwBuild = getGuiItem("GuiBuildNovel")
- assert isinstance(nwBuild, GuiBuildNovel)
-
- assert nwBuild.viewCachedDoc()
- assert nwBuild.htmlText == htmlText
- assert nwBuild.htmlStyle == htmlStyle
- assert nwBuild.buildTime == buildTime
-
- nwBuild._doClose()
-
- # qtbot.stop()
-
-# END Test testToolBuild_Main
From d915b1b02c21bb5a0388b3fb95ee1ab3df66a221 Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Sat, 3 Jun 2023 17:13:54 +0200
Subject: [PATCH 50/74] Remove old test reference files
---
.../guiBuild_Tool_Step1G_Lorem_Ipsum.md | 88 --------
.../guiBuild_Tool_Step1_Lorem_Ipsum.fodt | 142 ------------
.../guiBuild_Tool_Step1_Lorem_Ipsum.htm | 71 ------
.../guiBuild_Tool_Step1_Lorem_Ipsum.md | 88 --------
.../guiBuild_Tool_Step1_Lorem_Ipsum.nwd | 109 ---------
.../guiBuild_Tool_Step2_Lorem_Ipsum.fodt | 209 ------------------
.../guiBuild_Tool_Step2_Lorem_Ipsum.htm | 126 -----------
.../guiBuild_Tool_Step2_Lorem_Ipsum.md | 183 ---------------
.../guiBuild_Tool_Step2_Lorem_Ipsum.nwd | 184 ---------------
.../guiBuild_Tool_Step3_Lorem_Ipsum.fodt | 209 ------------------
.../guiBuild_Tool_Step3_Lorem_Ipsum.htm | 126 -----------
.../guiBuild_Tool_Step3_Lorem_Ipsum.md | 183 ---------------
.../guiBuild_Tool_Step3_Lorem_Ipsum.nwd | 184 ---------------
.../guiBuild_Tool_Step4H_Lorem_Ipsum.json | 91 --------
.../guiBuild_Tool_Step4M_Lorem_Ipsum.json | 149 -------------
.../guiBuild_Tool_Step4_Lorem_Ipsum.htm | 68 ------
.../guiBuild_Tool_Step4_Lorem_Ipsum.nwd | 104 ---------
17 files changed, 2314 deletions(-)
delete mode 100644 tests/reference/guiBuild_Tool_Step1G_Lorem_Ipsum.md
delete mode 100644 tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.fodt
delete mode 100644 tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.htm
delete mode 100644 tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.md
delete mode 100644 tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.nwd
delete mode 100644 tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.fodt
delete mode 100644 tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.htm
delete mode 100644 tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.md
delete mode 100644 tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.nwd
delete mode 100644 tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.fodt
delete mode 100644 tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.htm
delete mode 100644 tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.md
delete mode 100644 tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.nwd
delete mode 100644 tests/reference/guiBuild_Tool_Step4H_Lorem_Ipsum.json
delete mode 100644 tests/reference/guiBuild_Tool_Step4M_Lorem_Ipsum.json
delete mode 100644 tests/reference/guiBuild_Tool_Step4_Lorem_Ipsum.htm
delete mode 100644 tests/reference/guiBuild_Tool_Step4_Lorem_Ipsum.nwd
diff --git a/tests/reference/guiBuild_Tool_Step1G_Lorem_Ipsum.md b/tests/reference/guiBuild_Tool_Step1G_Lorem_Ipsum.md
deleted file mode 100644
index 8a24d29f..00000000
--- a/tests/reference/guiBuild_Tool_Step1G_Lorem_Ipsum.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# Lorem Ipsum
-
-**By lipsum.com**
-
-“Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
-
-“There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
-
-Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
-
-The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
-
-## Prologue
-
-_Lorem Ipsum_ is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-
-# Act One
-
-“Fusce maximus felis libero”
-
-## Chapter 1: Chapter One
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
-
-* * *
-
-Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
-
-Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
-
-Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
-
-Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
-
-* * *
-
-Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
-
-Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
-
-Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
-
-Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
-
-Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
-
-Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
-
-## Chapter 2: Chapter Two
-
-Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
-
-* * *
-
-Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
-
-Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
-
-Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
-
-Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
-
-* * *
-
-Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
-
-Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
-
-Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
-
-Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
-
-Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
-
-Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
-
-* * *
-
-Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
-
-In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
-
-Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
-
-Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
-
-Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-
diff --git a/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.fodt b/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.fodt
deleted file mode 100644
index 4bd71182..00000000
--- a/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.fodt
+++ /dev/null
@@ -1,142 +0,0 @@
-
-
-
- 2023-05-29T22:10:29
- novelWriter/2.0.7
- lipsum.com
- 40
- P0DT0H31M45S
- Lorem Ipsum
- 2023-05-29T22:10:29
- lipsum.com
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Lorem Ipsum / lipsum.com / 2
-
-
-
-
-
-
-
-
- Lorem Ipsum
- By lipsum.com
- “Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
- “There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
- Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
- The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
- Prologue
- Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
- Act One
- “Fusce maximus felis libero”
- Chapter 1: Chapter One
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
- * * *
- Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
- Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
- Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
- Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
- * * *
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
- Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
- Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
- Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
- Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
- Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
- Chapter 2: Chapter Two
- Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
- * * *
- Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
- Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
- Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
- Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
- * * *
- Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
- Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
- Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
- Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
- Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
- Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
- * * *
- Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
- In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
- Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
- Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
- Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-
-
-
diff --git a/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.htm b/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.htm
deleted file mode 100644
index 2295991a..00000000
--- a/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.htm
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-Lorem Ipsum
-
-
-
-
-Lorem Ipsum
-By lipsum.com
-“Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
-“There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
-Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
-The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
-Prologue
-Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-Act One
-“Fusce maximus felis libero”
-Chapter 1: Chapter One
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
-* * *
-Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
-Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
-Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
-Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
-* * *
-Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
-Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
-Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
-Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
-Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
-Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
-Chapter 2: Chapter Two
-Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
-* * *
-Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
-Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
-Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
-Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
-* * *
-Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
-Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
-Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
-Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
-Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
-Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
-* * *
-Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
-In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
-Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
-Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
-Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-
-
-
diff --git a/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.md b/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.md
deleted file mode 100644
index 8a24d29f..00000000
--- a/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# Lorem Ipsum
-
-**By lipsum.com**
-
-“Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
-
-“There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
-
-Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
-
-The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
-
-## Prologue
-
-_Lorem Ipsum_ is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-
-# Act One
-
-“Fusce maximus felis libero”
-
-## Chapter 1: Chapter One
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
-
-* * *
-
-Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
-
-Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
-
-Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
-
-Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
-
-* * *
-
-Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
-
-Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
-
-Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
-
-Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
-
-Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
-
-Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
-
-## Chapter 2: Chapter Two
-
-Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
-
-* * *
-
-Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
-
-Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
-
-Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
-
-Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
-
-* * *
-
-Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
-
-Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
-
-Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
-
-Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
-
-Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
-
-Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
-
-* * *
-
-Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
-
-In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
-
-Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
-
-Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
-
-Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-
diff --git a/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.nwd b/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.nwd
deleted file mode 100644
index 91e2f5c3..00000000
--- a/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.nwd
+++ /dev/null
@@ -1,109 +0,0 @@
-#! Lorem Ipsum
-
-**By lipsum.com**
-
-“Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
-
-“There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
-
-
-
-Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
-
-The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
-
-##! Prologue
-
-
-_Lorem Ipsum_ is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-
-# Act One
-
-“Fusce maximus felis libero”
-
-## Chapter One
-
-
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
-
-### Scene One
-
-
-
-Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
-
-Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
-
-#### Scene One, Section Two
-
-Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
-
-Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
-
-### Scene Two
-
-
-
-Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
-
-Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
-
-Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
-
-#### Scene Two, Section Two
-
-Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
-
-Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
-
-Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
-
-## Chapter Two
-
-
-
-Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
-
-### Scene Three
-
-
-
-Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
-
-Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
-
-Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
-
-Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
-
-### Scene Four
-
-
-
-Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
-
-Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
-
-Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
-
-Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
-
-Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
-
-Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
-
-### Scene Five
-
-
-
-Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
-
-In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
-
-Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
-
-Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
-
-Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-
diff --git a/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.fodt b/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.fodt
deleted file mode 100644
index cf329eb6..00000000
--- a/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.fodt
+++ /dev/null
@@ -1,209 +0,0 @@
-
-
-
- 2023-05-29T22:11:22
- novelWriter/2.0.7
- lipsum.com
- 40
- P0DT0H31M45S
- Lorem Ipsum
- 2023-05-29T22:11:22
- lipsum.com
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Lorem Ipsum / lipsum.com / 2
-
-
-
-
-
-
-
-
- Lorem Ipsum
- By lipsum.com
- “Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
- “There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
- Comment: Exctracted from the lipsum.com website.
- Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
- The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
- Prologue
- Synopsis: Explanation from the lipsum.com website.
- Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
- Act One
- “Fusce maximus felis libero”
- Chapter One: Chapter One
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
- Scene 1.1: Scene One
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
- Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
- Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
- 1.1.1: Scene One, Section Two
- Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
- Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
- Scene 1.2: Scene Two
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
- Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
- Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
- 1.2.1: Scene Two, Section Two
- Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
- Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
- Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
- Why do we use it?
- Comment: Exctracted from the lipsum.com website.
- It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
- The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
- Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
- Chapter Two: Chapter Two
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
- Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
- Scene 2.1: Scene Three
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
- Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
- Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
- Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
- Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
- Scene 2.2: Scene Four
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
- Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
- Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
- Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
- Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
- Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
- Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
- Scene 2.3: Scene Five
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
- Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
- In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
- Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
- Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
- Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
- Notes: Characters
- Nobody Owens
- Tag: Bod
- Plot: Main
- Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.
- Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.
- Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.
- Notes: Plot
- Main Plot
- Tag: Main
- Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.
- Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.
- Notes: World
- Ancient Europe
- Tag: Europe
- Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.
- Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.
- Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.
-
-
-
diff --git a/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.htm b/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.htm
deleted file mode 100644
index 0e672a68..00000000
--- a/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.htm
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-Lorem Ipsum
-
-
-
-
-Lorem Ipsum
-By lipsum.com
-“Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
-“There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
-
-Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
-The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
-Prologue
-Synopsis: Explanation from the lipsum.com website.
-Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-Act One
-“Fusce maximus felis libero”
-Chapter One: Chapter One
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
-Scene 1.1: Scene One
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
-Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
-Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
-1.1.1: Scene One, Section Two
-Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
-Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
-Scene 1.2: Scene Two
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
-Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
-Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
-Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
-1.2.1: Scene Two, Section Two
-Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
-Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
-Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
-Why do we use it?
-
- It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
- The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
- Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
-Chapter Two: Chapter Two
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
-Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
-Scene 2.1: Scene Three
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
-Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
-Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
-Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
-Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
-Scene 2.2: Scene Four
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
-Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
-Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
-Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
-Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
-Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
-Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
-Scene 2.3: Scene Five
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
-Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
-In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
-Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
-Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
-Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-Notes: Characters
-Nobody Owens
-Tag: Bod
-Plot: Main
-Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.
-Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.
-Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.
-Notes: Plot
-Main Plot
-Tag: Main
-Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.
-Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.
-Notes: World
-Ancient Europe
-Tag: Europe
-Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.
-Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.
-Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.
-
-
-
diff --git a/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.md b/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.md
deleted file mode 100644
index 37311525..00000000
--- a/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.md
+++ /dev/null
@@ -1,183 +0,0 @@
-# Lorem Ipsum
-
-**By lipsum.com**
-
-“Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
-
-“There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
-
-**Comment:** Exctracted from the lipsum.com website.
-
-Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
-
-The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
-
-## Prologue
-
-**Synopsis:** Explanation from the lipsum.com website.
-
-_Lorem Ipsum_ is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-
-# Act One
-
-“Fusce maximus felis libero”
-
-## Chapter One: Chapter One
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
-
-### Scene 1.1: Scene One
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
-
-Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
-
-Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
-
-#### 1.1.1: Scene One, Section Two
-
-Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
-
-Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
-
-### Scene 1.2: Scene Two
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
-
-Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
-
-Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
-
-Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
-
-#### 1.2.1: Scene Two, Section Two
-
-Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
-
-Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
-
-Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
-
-## Why do we use it?
-
-**Comment:** Exctracted from the lipsum.com website.
-
- It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
-
- The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
-
- Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
-
-## Chapter Two: Chapter Two
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
-
-Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
-
-### Scene 2.1: Scene Three
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
-
-Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
-
-Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
-
-Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
-
-Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
-
-### Scene 2.2: Scene Four
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
-
-Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
-
-Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
-
-Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
-
-Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
-
-Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
-
-Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
-
-### Scene 2.3: Scene Five
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
-
-Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
-
-In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
-
-Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
-
-Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
-
-Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-
-# Notes: Characters
-
-# Nobody Owens
-
-**Tag:** Bod
-**Plot:** Main
-
-Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.
-
-Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.
-
-Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.
-
-# Notes: Plot
-
-# Main Plot
-
-**Tag:** Main
-
-Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.
-
-Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.
-
-# Notes: World
-
-# Ancient Europe
-
-**Tag:** Europe
-
-Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.
-
-Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.
-
-Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.
-
diff --git a/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.nwd b/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.nwd
deleted file mode 100644
index f0e030c7..00000000
--- a/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.nwd
+++ /dev/null
@@ -1,184 +0,0 @@
-#! Lorem Ipsum
-
-**By lipsum.com**
-
-“Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
-
-“There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
-
-
-% Exctracted from the lipsum.com website.
-
-Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
-
-The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
-
-##! Prologue
-
-% Synopsis:Explanation from the lipsum.com website.
-
-_Lorem Ipsum_ is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-
-# Act One
-
-“Fusce maximus felis libero”
-
-## Chapter One
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
-
-### Scene One
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
-
-Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
-
-Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
-
-#### Scene One, Section Two
-
-Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
-
-Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
-
-### Scene Two
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
-
-Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
-
-Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
-
-Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
-
-#### Scene Two, Section Two
-
-Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
-
-Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
-
-Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
-
-##! Why do we use it?
-
-% Exctracted from the lipsum.com website.
-
- It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
-
- The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
-
- Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
-
-## Chapter Two
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
-
-Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
-
-### Scene Three
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
-
-Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
-
-Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
-
-Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
-
-Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
-
-### Scene Four
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
-
-Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
-
-Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
-
-Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
-
-Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
-
-Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
-
-Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
-
-### Scene Five
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
-
-Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
-
-In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
-
-Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
-
-Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
-
-Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-
-# Notes: Characters
-
-# Nobody Owens
-
-@tag: Bod
-@plot: Main
-
-Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.
-
-Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.
-
-Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.
-
-# Notes: Plot
-
-# Main Plot
-
-@tag: Main
-
-Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.
-
-Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.
-
-# Notes: World
-
-# Ancient Europe
-
-@tag: Europe
-
-Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.
-
-Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.
-
-Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.
-
diff --git a/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.fodt b/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.fodt
deleted file mode 100644
index d5891721..00000000
--- a/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.fodt
+++ /dev/null
@@ -1,209 +0,0 @@
-
-
-
- 2023-05-29T22:11:58
- novelWriter/2.0.7
- lipsum.com
- 40
- P0DT0H31M45S
- Lorem Ipsum
- 2023-05-29T22:11:58
- lipsum.com
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Lorem Ipsum / lipsum.com / 2
-
-
-
-
-
-
-
-
- Lorem Ipsum
- By lipsum.com
- “Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
- “There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
- Comment: Exctracted from the lipsum.com website.
- Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
- The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
- Prologue
- Synopsis: Explanation from the lipsum.com website.
- Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
- Act One
- “Fusce maximus felis libero”
- Chapter One: Chapter One
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
- Scene 1.1: Scene One
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
- Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
- Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
- 1.1.1: Scene One, Section Two
- Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
- Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
- Scene 1.2: Scene Two
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
- Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
- Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
- 1.2.1: Scene Two, Section Two
- Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
- Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
- Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
- Why do we use it?
- Comment: Exctracted from the lipsum.com website.
- It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
- The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
- Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
- Chapter Two: Chapter Two
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
- Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
- Scene 2.1: Scene Three
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
- Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
- Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
- Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
- Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
- Scene 2.2: Scene Four
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
- Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
- Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
- Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
- Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
- Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
- Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
- Scene 2.3: Scene Five
- Point of View: Bod
- Plot: Main
- Locations: Europe
- Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
- Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
- In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
- Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
- Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
- Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
- Notes: Characters
- Nobody Owens
- Tag: Bod
- Plot: Main
- Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.
- Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.
- Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.
- Notes: Plot
- Main Plot
- Tag: Main
- Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.
- Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.
- Notes: World
- Ancient Europe
- Tag: Europe
- Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.
- Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.
- Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.
-
-
-
diff --git a/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.htm b/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.htm
deleted file mode 100644
index 1a945ea4..00000000
--- a/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.htm
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-Lorem Ipsum
-
-
-
-
-Lorem Ipsum
-By lipsum.com
-“Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
-“There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
-
-Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
-The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
-Prologue
-Synopsis: Explanation from the lipsum.com website.
-Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-Act One
-“Fusce maximus felis libero”
-Chapter One: Chapter One
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
-Scene 1.1: Scene One
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
-Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
-Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
-1.1.1: Scene One, Section Two
-Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
-Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
-Scene 1.2: Scene Two
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
-Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
-Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
-Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
-1.2.1: Scene Two, Section Two
-Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
-Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
-Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
-Why do we use it?
-
- It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
- The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
- Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
-Chapter Two: Chapter Two
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
-Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
-Scene 2.1: Scene Three
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
-Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
-Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
-Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
-Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
-Scene 2.2: Scene Four
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
-Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
-Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
-Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
-Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
-Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
-Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
-Scene 2.3: Scene Five
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
-Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
-In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
-Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
-Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
-Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-Notes: Characters
-Nobody Owens
-Tag: Bod
-Plot: Main
-Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.
-Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.
-Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.
-Notes: Plot
-Main Plot
-Tag: Main
-Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.
-Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.
-Notes: World
-Ancient Europe
-Tag: Europe
-Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.
-Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.
-Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.
-
-
-
diff --git a/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.md b/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.md
deleted file mode 100644
index 4c2dee67..00000000
--- a/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.md
+++ /dev/null
@@ -1,183 +0,0 @@
-# Lorem Ipsum
-
-**By lipsum.com**
-
-“Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
-
-“There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
-
-**Comment:** Exctracted from the lipsum.com website.
-
-Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
-
-The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
-
-## Prologue
-
-**Synopsis:** Explanation from the lipsum.com website.
-
-_Lorem Ipsum_ is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-
-# Act One
-
-“Fusce maximus felis libero”
-
-## Chapter One: Chapter One
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
-
-### Scene 1.1: Scene One
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
-
-Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
-
-Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
-
-#### 1.1.1: Scene One, Section Two
-
-Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
-
-Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
-
-### Scene 1.2: Scene Two
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
-
-Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
-
-Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
-
-Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
-
-#### 1.2.1: Scene Two, Section Two
-
-Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
-
-Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
-
-Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
-
-## Why do we use it?
-
-**Comment:** Exctracted from the lipsum.com website.
-
- It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
-
- The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
-
- Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
-
-## Chapter Two: Chapter Two
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
-
-Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
-
-### Scene 2.1: Scene Three
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
-
-Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
-
-Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
-
-Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
-
-Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
-
-### Scene 2.2: Scene Four
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
-
-Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
-
-Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
-
-Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
-
-Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
-
-Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
-
-Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
-
-### Scene 2.3: Scene Five
-
-**Point of View:** Bod
-**Plot:** Main
-**Locations:** Europe
-
-**Synopsis:** Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
-
-Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
-
-In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
-
-Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
-
-Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
-
-Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-
-# Notes: Characters
-
-# Nobody Owens
-
-**Tag:** Bod
-**Plot:** Main
-
-Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.
-
-Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.
-
-Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.
-
-# Notes: Plot
-
-# Main Plot
-
-**Tag:** Main
-
-Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.
-
-Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.
-
-# Notes: World
-
-# Ancient Europe
-
-**Tag:** Europe
-
-Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.
-
-Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.
-
-Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.
-
diff --git a/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.nwd b/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.nwd
deleted file mode 100644
index f0e030c7..00000000
--- a/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.nwd
+++ /dev/null
@@ -1,184 +0,0 @@
-#! Lorem Ipsum
-
-**By lipsum.com**
-
-“Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…”
-
-“There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…”
-
-
-% Exctracted from the lipsum.com website.
-
-Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of “de Finibus Bonorum et Malorum” (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, “Lorem ipsum dolor sit amet..”, comes from a line in section 1.10.32.
-
-The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from “de Finibus Bonorum et Malorum” by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
-
-##! Prologue
-
-% Synopsis:Explanation from the lipsum.com website.
-
-_Lorem Ipsum_ is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-
-# Act One
-
-“Fusce maximus felis libero”
-
-## Chapter One
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.
-
-### Scene One
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
-
-Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.
-
-Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.
-
-#### Scene One, Section Two
-
-Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.
-
-Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.
-
-### Scene Two
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
-
-Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.
-
-Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.
-
-Nulla accumsan ante in pulvinar efficitur. Nulla non velit quis urna hendrerit bibendum. Suspendisse ultrices ante eu justo malesuada, sed fermentum enim rutrum. Nunc fermentum pharetra felis, vitae sollicitudin quam rutrum porta. Aliquam fringilla velit a mi laoreet, et luctus est rutrum. In gravida non ipsum sit amet tempus. Curabitur et eleifend purus. Nulla facilisi.
-
-#### Scene Two, Section Two
-
-Suspendisse potenti. Fusce tempus lorem nec laoreet suscipit. Fusce vulputate nisl ac diam tincidunt, nec malesuada quam pellentesque. Maecenas congue, tellus quis commodo rutrum, magna leo egestas arcu, quis suscipit ex risus id ligula. Suspendisse potenti. Morbi blandit lacus vitae laoreet vulputate. Donec vitae tellus eleifend, lobortis eros eu, tincidunt enim. Nullam et ullamcorper nisi. Vivamus tellus ex, lobortis quis rutrum ut, dapibus sit amet turpis. Phasellus pellentesque metus diam, commodo tristique ante commodo ac. Ut mollis ipsum nec diam blandit sollicitudin. Duis bibendum lacus nec commodo dapibus. Sed condimentum luctus ante, id ultricies urna varius nec. Nam convallis magna nec bibendum ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed auctor pharetra quam, vitae porta ex bibendum eu.
-
-Vivamus ut venenatis lectus. Phasellus nec elit id sem dictum ornare. Quisque feugiat, diam eget sagittis ultricies, orci turpis efficitur nisi, et fringilla justo odio nec nibh. In hac habitasse platea dictumst. Sed tempus bibendum feugiat. Etiam luctus mauris arcu, non interdum ipsum ultrices id. Vivamus blandit urna sit amet scelerisque vulputate. Quisque in metus eget massa rutrum dictum sit amet sed nulla. Vivamus vel efficitur dolor.
-
-Ut et consequat enim, quis ornare nibh. In lectus neque, mollis et suscipit et, vestibulum vitae augue. Praesent id ante sit amet odio venenatis placerat a at erat. Sed sed metus sed nisi dictum varius. Integer tincidunt fermentum purus ac porta. Fusce porttitor non risus eget tristique. Donec augue nunc, maximus at fermentum vel, varius et neque. Ut sed consectetur mauris. Quisque ipsum enim, porttitor vitae imperdiet sit amet, tempor et mauris. Aliquam malesuada tincidunt lectus quis blandit. Sed commodo orci felis, quis ultrices tellus facilisis sed. Nunc vel varius est. Duis ullamcorper eu metus in pulvinar. Morbi at sapien dictum, rutrum mauris eget, interdum tellus.
-
-##! Why do we use it?
-
-% Exctracted from the lipsum.com website.
-
- It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
-
- The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
-
- Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
-
-## Chapter Two
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
-
-Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.
-
-### Scene Three
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
-
-Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.
-
-Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.
-
-Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.
-
-Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.
-
-### Scene Four
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
-
-Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.
-
-Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.
-
-Etiam sagittis, erat vitae accumsan tempor, neque augue scelerisque nulla, ut ultrices justo urna sit amet augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean at pulvinar tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vel porta quam. Nullam eu mauris mollis, vehicula justo vel, placerat sapien. Phasellus viverra elit et vestibulum pharetra. Vestibulum commodo fermentum leo, eu porta nisi aliquam eget. Nulla tempus porttitor nisi nec mollis. Nam non mollis turpis. Nam finibus leo a bibendum tincidunt. Donec commodo velit magna, ac semper sapien mattis id. Proin sem velit, lobortis quis ultricies id, pharetra et lectus. Vestibulum condimentum neque vitae mi dapibus mollis. Mauris luctus vel sapien vitae hendrerit.
-
-Aenean vestibulum magna placerat fermentum tempus. Nam auctor condimentum nunc, in elementum quam ornare a. Etiam in ipsum elit. Proin pharetra, dolor sollicitudin pellentesque congue, lorem dolor ultricies magna, non iaculis risus nisl dictum diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vel euismod nibh, et lobortis dolor. Maecenas dui odio, gravida nec molestie ut, feugiat ut arcu. Pellentesque risus sapien, gravida a convallis quis, ullamcorper porttitor sapien.
-
-Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.
-
-Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.
-
-### Scene Five
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
-
-Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.
-
-In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.
-
-Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis.
-
-Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue.
-
-Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.
-
-# Notes: Characters
-
-# Nobody Owens
-
-@tag: Bod
-@plot: Main
-
-Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.
-
-Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.
-
-Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.
-
-# Notes: Plot
-
-# Main Plot
-
-@tag: Main
-
-Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.
-
-Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.
-
-# Notes: World
-
-# Ancient Europe
-
-@tag: Europe
-
-Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.
-
-Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.
-
-Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.
-
diff --git a/tests/reference/guiBuild_Tool_Step4H_Lorem_Ipsum.json b/tests/reference/guiBuild_Tool_Step4H_Lorem_Ipsum.json
deleted file mode 100644
index 87915317..00000000
--- a/tests/reference/guiBuild_Tool_Step4H_Lorem_Ipsum.json
+++ /dev/null
@@ -1,91 +0,0 @@
-{
- "meta": {
- "projectName": "Lorem Ipsum",
- "novelTitle": "Lorem Ipsum",
- "novelAuthor": "lipsum.com",
- "buildTime": 1669563813
- },
- "text": {
- "css": [
- "body {font-family: 'DejaVu Sans'; font-size: 11pt;}",
- "p {text-align: justify; line-height: 115%; margin-top: 0.00em; margin-bottom: 0.58em;}",
- "h1 {color: rgb(66, 113, 174); page-break-after: avoid; margin-top: 1.00em; margin-bottom: 0.50em;}",
- "h2 {color: rgb(66, 113, 174); page-break-after: avoid; margin-top: 0.83em; margin-bottom: 0.50em;}",
- "h3 {color: rgb(50, 50, 50); page-break-after: avoid; margin-top: 0.58em; margin-bottom: 0.50em;}",
- "h4 {color: rgb(50, 50, 50); page-break-after: avoid; margin-top: 0.58em; margin-bottom: 0.50em;}",
- ".title {font-size: 2.5em; margin-top: 1.00em; margin-bottom: 0.50em;}",
- ".sep, .skip {text-align: center; margin-top: 1.00em; margin-bottom: 1.00em;}",
- "a {color: rgb(66, 113, 174);}",
- ".tags {color: rgb(245, 135, 31); font-weight: bold;}",
- ".break {text-align: left;}",
- ".synopsis {font-style: italic;}",
- ".comment {font-style: italic; color: rgb(100, 100, 100);}"
- ],
- "html": [
- [
- "Lorem Ipsum
"
- ],
- [
- ""
- ],
- [
- "Prologue
",
- "Synopsis: Explanation from the lipsum.com website.
"
- ],
- [
- "Act One
"
- ],
- [
- "Chapter One: Chapter One
",
- "Point of View: Bod
",
- "Plot: Main
",
- "Locations: Europe
",
- "Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
"
- ],
- [
- "Scene 1: Scene One
",
- "Point of View: Bod
",
- "Plot: Main
",
- "Locations: Europe
",
- "Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
",
- "Section: Scene One, Section Two
"
- ],
- [
- "Scene 2: Scene Two
",
- "Point of View: Bod
",
- "Plot: Main
",
- "Locations: Europe
",
- "Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
",
- "Section: Scene Two, Section Two
"
- ],
- [
- "Chapter Two: Chapter Two
",
- "Point of View: Bod
",
- "Plot: Main
",
- "Locations: Europe
",
- "Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
"
- ],
- [
- "Scene 3: Scene Three
",
- "Point of View: Bod
",
- "Plot: Main
",
- "Locations: Europe
",
- "Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
"
- ],
- [
- "Scene 4: Scene Four
",
- "Point of View: Bod
",
- "Plot: Main
",
- "Locations: Europe
",
- "Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
"
- ],
- [
- "Scene 5: Scene Five
",
- "Point of View: Bod
",
- "Plot: Main
",
- "Locations: Europe
",
- "Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
"
- ]
- ]
- }
-}
diff --git a/tests/reference/guiBuild_Tool_Step4M_Lorem_Ipsum.json b/tests/reference/guiBuild_Tool_Step4M_Lorem_Ipsum.json
deleted file mode 100644
index 75a54741..00000000
--- a/tests/reference/guiBuild_Tool_Step4M_Lorem_Ipsum.json
+++ /dev/null
@@ -1,149 +0,0 @@
-{
- "meta": {
- "projectName": "Lorem Ipsum",
- "novelTitle": "Lorem Ipsum",
- "novelAuthor": "lipsum.com",
- "buildTime": 1669563891
- },
- "text": {
- "nwd": [
- [
- "#! Lorem Ipsum",
- "",
- "",
- "",
- "",
- ""
- ],
- [
- "",
- "",
- "",
- "",
- ""
- ],
- [
- "##! Prologue",
- "",
- "% Synopsis:Explanation from the lipsum.com website.",
- "",
- "",
- ""
- ],
- [
- "# Act One",
- "",
- "",
- ""
- ],
- [
- "## Chapter One",
- "",
- "@pov: Bod",
- "@plot: Main",
- "@location: Europe",
- "",
- "% Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.",
- "",
- "",
- ""
- ],
- [
- "### Scene One",
- "",
- "@pov: Bod",
- "@plot: Main",
- "@location: Europe",
- "",
- "% Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.",
- "",
- "",
- "",
- "#### Scene One, Section Two",
- "",
- "",
- "",
- ""
- ],
- [
- "### Scene Two",
- "",
- "@pov: Bod",
- "@plot: Main",
- "@location: Europe",
- "",
- "% Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. ",
- "",
- "",
- "",
- "",
- "#### Scene Two, Section Two",
- "",
- "",
- "",
- "",
- ""
- ],
- [
- "## Chapter Two",
- "",
- "@pov: Bod",
- "@plot: Main",
- "@location: Europe",
- "",
- "% Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.",
- "",
- "",
- ""
- ],
- [
- "### Scene Three",
- "",
- "@pov: Bod",
- "@plot: Main",
- "@location: Europe",
- "",
- "% Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",
- "",
- "",
- "",
- "",
- "",
- ""
- ],
- [
- "### Scene Four",
- "",
- "@pov: Bod",
- "@plot: Main",
- "@location: Europe",
- "",
- "% Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- ""
- ],
- [
- "### Scene Five",
- "",
- "@pov: Bod",
- "@plot: Main",
- "@location: Europe",
- "",
- "% Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.",
- "",
- "",
- "",
- "",
- "",
- "",
- ""
- ]
- ]
- }
-}
diff --git a/tests/reference/guiBuild_Tool_Step4_Lorem_Ipsum.htm b/tests/reference/guiBuild_Tool_Step4_Lorem_Ipsum.htm
deleted file mode 100644
index 20f6e6b6..00000000
--- a/tests/reference/guiBuild_Tool_Step4_Lorem_Ipsum.htm
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-Lorem Ipsum
-
-
-
-
-Lorem Ipsum
-Prologue
-Synopsis: Explanation from the lipsum.com website.
-Act One
-Chapter One: Chapter One
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
-Scene 1: Scene One
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
-Section: Scene One, Section Two
-Scene 2: Scene Two
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
-Section: Scene Two, Section Two
-Chapter Two: Chapter Two
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
-Scene 3: Scene Three
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
-Scene 4: Scene Four
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
-Scene 5: Scene Five
-Point of View: Bod
-Plot: Main
-Locations: Europe
-Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
-
-
-
diff --git a/tests/reference/guiBuild_Tool_Step4_Lorem_Ipsum.nwd b/tests/reference/guiBuild_Tool_Step4_Lorem_Ipsum.nwd
deleted file mode 100644
index fa1b8656..00000000
--- a/tests/reference/guiBuild_Tool_Step4_Lorem_Ipsum.nwd
+++ /dev/null
@@ -1,104 +0,0 @@
-#! Lorem Ipsum
-
-
-
-
-
-
-
-
-##! Prologue
-
-% Synopsis:Explanation from the lipsum.com website.
-
-
-# Act One
-
-
-## Chapter One
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.
-
-
-### Scene One
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.
-
-
-
-#### Scene One, Section Two
-
-
-
-### Scene Two
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.
-
-
-
-
-#### Scene Two, Section Two
-
-
-
-
-## Chapter Two
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.
-
-
-### Scene Three
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
-
-
-
-
-
-### Scene Four
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.
-
-
-
-
-
-
-
-### Scene Five
-
-@pov: Bod
-@plot: Main
-@location: Europe
-
-% Synopsis: Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
-
-
-
-
-
-
From db8140418e06f1a3908eb44ba82afa3beadc900b Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Sat, 3 Jun 2023 18:05:04 +0200
Subject: [PATCH 51/74] Fix typing and docstrings in Project data and XML
classes
---
novelwriter/common.py | 10 +-
novelwriter/core/projectdata.py | 155 ++++++++++++-----------
novelwriter/core/projectxml.py | 216 ++++++++++++++++----------------
3 files changed, 192 insertions(+), 189 deletions(-)
diff --git a/novelwriter/common.py b/novelwriter/common.py
index 3ccdd751..386681e4 100644
--- a/novelwriter/common.py
+++ b/novelwriter/common.py
@@ -1,7 +1,6 @@
"""
novelWriter – Common Functions
==============================
-Various common functions
File History:
Created: 2019-05-12 [0.1]
@@ -113,9 +112,8 @@ def checkHandle(value, default, allowNone=False):
return default
-def checkUuid(value, default):
- """Try to process a value as an uuid, or return a default.
- """
+def checkUuid(value: Any, default: str) -> str:
+ """Try to process a value as an uuid, or return a default."""
try:
return str(uuid.UUID(value))
except Exception:
@@ -236,7 +234,7 @@ def formatInt(value):
return str(value)
-def formatTimeStamp(value, fileSafe=False):
+def formatTimeStamp(value: float, fileSafe: bool = False) -> str:
"""Take a number (on the format returned by time.time()) and convert
it to a timestamp string.
"""
@@ -246,7 +244,7 @@ def formatTimeStamp(value, fileSafe=False):
return datetime.fromtimestamp(value).strftime(nwConst.FMT_TSTAMP)
-def formatTime(t):
+def formatTime(t: int) -> str:
"""Format a time in seconds in HH:MM:SS format or d-HH:MM:SS format
if a full day or longer.
"""
diff --git a/novelwriter/core/projectdata.py b/novelwriter/core/projectdata.py
index ad376cd1..50c48086 100644
--- a/novelwriter/core/projectdata.py
+++ b/novelwriter/core/projectdata.py
@@ -1,7 +1,6 @@
"""
novelWriter – Project Data Class
================================
-Data class for novelWriter projects
File History:
Created: 2022-10-30 [2.0rc2]
@@ -27,6 +26,8 @@ from __future__ import annotations
import uuid
import logging
+from typing import Any
+
from novelwriter.common import (
checkBool, checkInt, checkStringNone, checkUuid, isHandle, simplified
)
@@ -36,6 +37,11 @@ logger = logging.getLogger(__name__)
class NWProjectData:
+ """Core: Project Data Class
+
+ The class holds all project data from the main XML file, aside from
+ the list of project items.
+ """
def __init__(self, theProject):
@@ -84,75 +90,99 @@ class NWProjectData:
##
@property
- def uuid(self):
+ def uuid(self) -> str:
+ """Return the project ID."""
return self._uuid
@property
- def name(self):
+ def name(self) -> str:
+ """Return the project name."""
return self._name
@property
- def title(self):
+ def title(self) -> str:
+ """Return the project title."""
return self._title
@property
- def author(self):
+ def author(self) -> str:
+ """Return the project author."""
return self._author
@property
- def saveCount(self):
+ def saveCount(self) -> int:
+ """Return the count of project saves."""
return self._saveCount
@property
- def autoCount(self):
+ def autoCount(self) -> int:
+ """Return the count of project auto-saves."""
return self._autoCount
@property
- def editTime(self):
+ def editTime(self) -> int:
+ """Return the number of seconds the project has been edited."""
return self._editTime
@property
- def doBackup(self):
+ def doBackup(self) -> bool:
+ """Return the backup setting."""
return self._doBackup
@property
- def language(self):
+ def language(self) -> str | None:
+ """Return the project language setting."""
return self._language
@property
- def spellCheck(self):
+ def spellCheck(self) -> bool:
+ """Return the spell check enabled setting."""
return self._spellCheck
@property
- def spellLang(self):
+ def spellLang(self) -> str | None:
+ """Return the spell check language."""
return self._spellLang
@property
- def initCounts(self):
+ def initCounts(self) -> tuple[int, int]:
+ """Return the initial count of words for novel and note
+ documents.
+ """
return tuple(self._initCounts)
@property
- def currCounts(self):
+ def currCounts(self) -> tuple[int, int]:
+ """Return the current count of words for novel and note
+ documents.
+ """
return tuple(self._currCounts)
@property
- def lastHandle(self):
+ def lastHandle(self) -> dict[str, str | None]:
+ """Return the dictionary of last used handles for various
+ components of the GUI.
+ """
return self._lastHandle
@property
- def autoReplace(self):
+ def autoReplace(self) -> dict[str, str]:
+ """Return the autoreplace dictionary."""
return self._autoReplace
@property
def titleFormat(self):
+ """Delete"""
return self._titleFormat
@property
- def itemStatus(self):
+ def itemStatus(self) -> NWStatus:
+ """Return the status settings object."""
return self._status
@property
- def itemImport(self):
+ def itemImport(self) -> NWStatus:
+ """Return the importance settings object."""
return self._import
##
@@ -160,15 +190,13 @@ class NWProjectData:
##
def incSaveCount(self):
- """Increment the save count by one.
- """
+ """Increment the save count by one."""
self._saveCount += 1
self.theProject.setProjectChanged(True)
return
def incAutoCount(self):
- """Increment the auto save count by one.
- """
+ """Increment the auto save count by one."""
self._autoCount += 1
self.theProject.setProjectChanged(True)
return
@@ -177,23 +205,20 @@ class NWProjectData:
# Getters
##
- def getLastHandle(self, component):
- """Retrieve the last used handle for a given component.
- """
+ def getLastHandle(self, component: str) -> str | None:
+ """Retrieve the last used handle for a given component."""
return self._lastHandle.get(component, None)
def getTitleFormat(self, kind):
- """Retrieve the title format string for a given kind of header.
- """
+ """Retrieve the title format string for a given kind of header."""
return self._titleFormat.get(kind, "%title%")
##
# Setters
##
- def setUuid(self, value):
- """Set the project id.
- """
+ def setUuid(self, value: Any):
+ """Set the project id."""
value = checkUuid(value, "")
if not value:
self._uuid = str(uuid.uuid4())
@@ -202,84 +227,74 @@ class NWProjectData:
self.theProject.setProjectChanged(True)
return
- def setName(self, value):
- """Set a new project name.
- """
+ def setName(self, value: str | None):
+ """Set a new project name."""
if value != self._name:
self._name = simplified(str(value or ""))
self.theProject.setProjectChanged(True)
return
- def setTitle(self, value):
- """Set a new novel title.
- """
+ def setTitle(self, value: str | None):
+ """Set a new novel title."""
if value != self._title:
self._title = simplified(str(value or ""))
self.theProject.setProjectChanged(True)
return
- def setAuthor(self, value):
- """Set the author value.
- """
+ def setAuthor(self, value: str | None):
+ """Set the author value."""
if value != self._title:
self._author = simplified(str(value or ""))
self.theProject.setProjectChanged(True)
return
- def setSaveCount(self, value):
- """Set the save count from last session.
- """
+ def setSaveCount(self, value: Any):
+ """Set the save count from last session."""
self._saveCount = checkInt(value, 0)
self.theProject.setProjectChanged(True)
return
- def setAutoCount(self, value):
- """Set the auto save count from last session.
- """
+ def setAutoCount(self, value: Any):
+ """Set the auto save count from last session."""
self._autoCount = checkInt(value, 0)
self.theProject.setProjectChanged(True)
return
- def setEditTime(self, value):
- """Set tyje edit time from last session.
- """
+ def setEditTime(self, value: Any):
+ """Set tyje edit time from last session."""
self._editTime = checkInt(value, 0)
self.theProject.setProjectChanged(True)
return
- def setDoBackup(self, value):
- """Set the do write backup flag.
- """
+ def setDoBackup(self, value: Any):
+ """Set the do write backup flag."""
if value != self._doBackup:
self._doBackup = checkBool(value, False)
self.theProject.setProjectChanged(True)
return
- def setLanguage(self, value):
- """Set the project language.
- """
+ def setLanguage(self, value: str | None):
+ """Set the project language."""
if value != self._language:
self._language = checkStringNone(value, None)
self.theProject.setProjectChanged(True)
return
- def setSpellCheck(self, value):
- """Set the spell check flag.
- """
+ def setSpellCheck(self, value: Any):
+ """Set the spell check flag."""
if value != self._spellCheck:
self._spellCheck = checkBool(value, False)
self.theProject.setProjectChanged(True)
return
- def setSpellLang(self, value):
- """Set the spell check language.
- """
+ def setSpellLang(self, value: str | None):
+ """Set the spell check language."""
if value != self._spellLang:
self._spellLang = checkStringNone(value, None)
self.theProject.setProjectChanged(True)
return
- def setLastHandle(self, value, component=None):
+ def setLastHandle(self, value: dict, component: str | None = None):
"""Set a last used handle into the handle registry. If component
is None, the value is assumed to be the whole dictionary of
values.
@@ -294,9 +309,8 @@ class NWProjectData:
self.theProject.setProjectChanged(True)
return
- def setInitCounts(self, novel=None, notes=None):
- """Set the worc count totals for novel and note files.
- """
+ def setInitCounts(self, novel: Any = None, notes: Any = None):
+ """Set the word count totals for novel and note files."""
if novel is not None:
self._initCounts[0] = checkInt(novel, 0)
self._currCounts[0] = checkInt(novel, 0)
@@ -305,18 +319,16 @@ class NWProjectData:
self._currCounts[1] = checkInt(notes, 0)
return
- def setCurrCounts(self, novel=None, notes=None):
- """Set the worc count totals for novel and note files.
- """
+ def setCurrCounts(self, novel: Any = None, notes: Any = None):
+ """Set the word count totals for novel and note files."""
if novel is not None:
self._currCounts[0] = checkInt(novel, 0)
if notes is not None:
self._currCounts[1] = checkInt(notes, 0)
return
- def setAutoReplace(self, value):
- """Set the auto-replace dictionary.
- """
+ def setAutoReplace(self, value: dict):
+ """Set the auto-replace dictionary."""
if isinstance(value, dict):
self._autoReplace = {}
for key, entry in value.items():
@@ -326,8 +338,7 @@ class NWProjectData:
return
def setTitleFormat(self, value):
- """Set the title formats.
- """
+ """Set the title formats."""
if isinstance(value, dict):
for key, entry in value.items():
if key in self._titleFormat and isinstance(entry, str):
diff --git a/novelwriter/core/projectxml.py b/novelwriter/core/projectxml.py
index b39356a2..0726d7da 100644
--- a/novelwriter/core/projectxml.py
+++ b/novelwriter/core/projectxml.py
@@ -1,7 +1,6 @@
"""
novelWriter – Project XML Read/Write
====================================
-Classes for reading and writing the project XML file
File History:
Created: 2022-09-28 [2.0rc2] XMLReadState
@@ -24,6 +23,7 @@ General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
"""
+from __future__ import annotations
import logging
import xml.etree.ElementTree as ET
@@ -31,6 +31,7 @@ import xml.etree.ElementTree as ET
from enum import Enum
from time import time
from pathlib import Path
+from typing import TYPE_CHECKING
from novelwriter import __version__, __hexversion__
from novelwriter.common import (
@@ -39,6 +40,10 @@ from novelwriter.common import (
)
from novelwriter.constants import nwFiles
+if TYPE_CHECKING:
+ from novelwriter.core.status import NWStatus
+ from novelwriter.core.projectdata import NWProjectData
+
logger = logging.getLogger(__name__)
FILE_VERSION = "1.5" # The current project file format version
@@ -55,6 +60,7 @@ NUM_VERSION = {
class XMLReadState(Enum):
+ """The state of an XML read process."""
NO_ACTION = 0
NO_ERROR = 1
@@ -69,8 +75,10 @@ class XMLReadState(Enum):
class ProjectXMLReader:
- """The main project XML file reader class. All data is read into a
- NWProjectData instance, which must be provided.
+ """Core: Project XML Reader
+
+ All data is read into a NWProjectData instance, which must be
+ provided.
File Format Version Change History
==================================
@@ -100,16 +108,13 @@ class ProjectXMLReader:
"""
def __init__(self, path):
-
self._path = Path(path)
self._state = XMLReadState.NO_ACTION
-
self._root = ""
self._version = 0x0
self._appVersion = ""
self._hexVersion = 0x0
self._timeStamp = ""
-
return
##
@@ -117,55 +122,46 @@ class ProjectXMLReader:
##
@property
- def state(self):
- """The state of the parsing as an XMLReadState enum value.
- """
+ def state(self) -> XMLReadState:
+ """Return the parsing state."""
return self._state
@property
- def xmlRoot(self):
- """The root tag name of the XNL file,
- """
+ def xmlRoot(self) -> str:
+ """Return the root tag name of the XNL file."""
return self._root
@property
- def xmlVersion(self):
- """The project XML version number.
- """
+ def xmlVersion(self) -> int:
+ """Return the project XML version number."""
return self._version
@property
- def appVersion(self):
- """The novelWriter version number who wrote the file.
- """
+ def appVersion(self) -> str:
+ """Return the version number who wrote the file."""
return self._appVersion
@property
- def hexVersion(self):
- """The novelWriter version number who wrote the file as hex.
- """
+ def hexVersion(self) -> int:
+ """Return the version number who wrote the file as hex."""
return self._hexVersion
@property
- def timeStamp(self):
- """The date and time when the file was written.
- """
+ def timeStamp(self) -> str:
+ """Return the date and time when the file was written."""
return self._timeStamp
##
# Methods
##
- def read(self, projData, projContent):
- """Read and parse the project XML file.
- """
+ def read(self, data: NWProjectData, content: list) -> bool:
+ """Read and parse the project XML file."""
tStart = time()
logger.debug("Reading project XML")
-
try:
xml = ET.parse(str(self._path))
self._state = XMLReadState.NO_ERROR
-
except Exception as exc:
# Trying to open backup file instead
logger.error("Failed to parse project XML", exc_info=exc)
@@ -206,14 +202,14 @@ class ProjectXMLReader:
for xSection in xRoot:
if xSection.tag == "project":
- self._parseProjectMeta(xSection, projData)
+ self._parseProjectMeta(xSection, data)
elif xSection.tag == "settings":
- self._parseProjectSettings(xSection, projData)
+ self._parseProjectSettings(xSection, data)
elif xSection.tag == "content":
if self._version >= 0x0104:
- self._parseProjectContent(xSection, projData, projContent)
+ self._parseProjectContent(xSection, data, content)
else:
- self._parseProjectContentLegacy(xSection, projData, projContent)
+ self._parseProjectContentLegacy(xSection, data, content)
else:
logger.warning("Ignored in XML", xSection.tag)
@@ -230,23 +226,22 @@ class ProjectXMLReader:
# Internal Functions
##
- def _parseProjectMeta(self, xSection, projData):
- """Parse the project section of the XML file.
- """
+ def _parseProjectMeta(self, xSection: ET.Element, data: NWProjectData):
+ """Parse the project section of the XML file."""
logger.debug("Parsing section")
- projData.setUuid(xSection.attrib.get("id", None)) # Added in 1.5
- projData.setSaveCount(xSection.attrib.get("saveCount", 0)) # Moved in 1.5
- projData.setAutoCount(xSection.attrib.get("autoCount", 0)) # Moved in 1.5
- projData.setEditTime(xSection.attrib.get("editTime", 0)) # Moved in 1.5
+ data.setUuid(xSection.attrib.get("id", None)) # Added in 1.5
+ data.setSaveCount(xSection.attrib.get("saveCount", 0)) # Moved in 1.5
+ data.setAutoCount(xSection.attrib.get("autoCount", 0)) # Moved in 1.5
+ data.setEditTime(xSection.attrib.get("editTime", 0)) # Moved in 1.5
for xItem in xSection:
if xItem.tag == "name":
- projData.setName(xItem.text)
+ data.setName(xItem.text)
elif xItem.tag == "title":
- projData.setTitle(xItem.text)
+ data.setTitle(xItem.text)
elif xItem.tag == "author":
- projData.setAuthor(xItem.text)
+ data.setAuthor(xItem.text)
else:
logger.warning("Ignored in XML", xItem.tag)
@@ -254,43 +249,42 @@ class ProjectXMLReader:
if self._version < HEX_VERSION:
for xItem in xSection:
if xItem.tag == "saveCount": # Moved to attribute in 1.5
- projData.setSaveCount(xItem.text)
+ data.setSaveCount(xItem.text)
elif xItem.tag == "autoCount": # Moved to attribute in 1.5
- projData.setAutoCount(xItem.text)
+ data.setAutoCount(xItem.text)
elif xItem.tag == "editTime": # Moved to attribute in 1.5
- projData.setEditTime(xItem.text)
+ data.setEditTime(xItem.text)
return
- def _parseProjectSettings(self, xSection, projData):
- """Parse the settings section of the XML file.
- """
+ def _parseProjectSettings(self, xSection: ET.Element, data: NWProjectData):
+ """Parse the settings section of the XML file."""
logger.debug("Parsing section")
for xItem in xSection:
if xItem.tag == "doBackup":
- projData.setDoBackup(xItem.text)
+ data.setDoBackup(xItem.text)
elif xItem.tag == "language":
- projData.setLanguage(xItem.text)
+ data.setLanguage(xItem.text)
elif xItem.tag == "spellChecking":
- projData.setSpellLang(xItem.text)
- projData.setSpellCheck(xItem.attrib.get("auto", False))
+ data.setSpellLang(xItem.text)
+ data.setSpellCheck(xItem.attrib.get("auto", False))
elif xItem.tag == "status":
- self._parseStatusImport(xItem, projData.itemStatus)
+ self._parseStatusImport(xItem, data.itemStatus)
elif xItem.tag == "importance":
- self._parseStatusImport(xItem, projData.itemImport)
+ self._parseStatusImport(xItem, data.itemImport)
elif xItem.tag == "lastHandle":
- projData.setLastHandle(self._parseDictKeyText(xItem))
+ data.setLastHandle(self._parseDictKeyText(xItem))
elif xItem.tag == "autoReplace":
if self._version >= 0x0102:
- projData.setAutoReplace(self._parseDictKeyText(xItem))
+ data.setAutoReplace(self._parseDictKeyText(xItem))
else: # Pre 1.2 format
- projData.setAutoReplace(self._parseDictTagText(xItem))
+ data.setAutoReplace(self._parseDictTagText(xItem))
elif xItem.tag == "titleFormat":
if self._version >= 0x0105:
- projData.setTitleFormat(self._parseDictKeyText(xItem))
+ data.setTitleFormat(self._parseDictKeyText(xItem))
else: # Pre 1.4 format
- projData.setTitleFormat(self._parseDictTagText(xItem))
+ data.setTitleFormat(self._parseDictTagText(xItem))
else:
logger.warning("Ignored in XML", xItem.tag)
@@ -298,23 +292,22 @@ class ProjectXMLReader:
if self._version < HEX_VERSION:
for xItem in xSection:
if xItem.tag == "spellCheck": # Changed to spellChecking in 1.5
- projData.setSpellCheck(xItem.text)
+ data.setSpellCheck(xItem.text)
elif xItem.tag == "spellLang": # Changed to spellChecking in 1.5
- projData.setSpellLang(xItem.text)
+ data.setSpellLang(xItem.text)
elif xItem.tag == "novelWordCount": # Moved to content attribute in 1.5
- projData.setInitCounts(novel=xItem.text)
+ data.setInitCounts(novel=xItem.text)
elif xItem.tag == "notesWordCount": # Moved to content attribute in 1.5
- projData.setInitCounts(notes=xItem.text)
+ data.setInitCounts(notes=xItem.text)
return
- def _parseProjectContent(self, xSection, projData, projContent):
- """Parse the content section of the XML file.
- """
+ def _parseProjectContent(self, xSection: ET.Element, data: NWProjectData, content: list):
+ """Parse the content section of the XML file."""
logger.debug("Parsing section")
- projData.setInitCounts(novel=xSection.attrib.get("novelWords", None)) # Moved in 1.5
- projData.setInitCounts(notes=xSection.attrib.get("notesWords", None)) # Moved in 1.5
+ data.setInitCounts(novel=xSection.attrib.get("novelWords", None)) # Moved in 1.5
+ data.setInitCounts(notes=xSection.attrib.get("notesWords", None)) # Moved in 1.5
for xItem in xSection:
if xItem.tag != "item":
@@ -355,7 +348,7 @@ class ProjectXMLReader:
if xVal.tag == "name" and "exported" in xVal.attrib:
name["active"] = checkBool(xVal.attrib.get("exported"), False)
- projContent.append({
+ content.append({
"name": itemName,
"itemAttr": item,
"metaAttr": meta,
@@ -364,14 +357,13 @@ class ProjectXMLReader:
return
- def _parseProjectContentLegacy(self, xSection, projData, projContent):
- """Parse the content section of the XML file for older versions.
- """
+ def _parseProjectContentLegacy(self, xSection: ET.Element, data: NWProjectData, content: list):
+ """Parse the content section of the XML file for older versions."""
logger.debug("Parsing section (legacy format)")
# Create maps to look up name -> key for status and importance
- statusMap = {entry.get("name"): key for key, entry in projData.itemStatus.items()}
- importMap = {entry.get("name"): key for key, entry in projData.itemImport.items()}
+ statusMap = {entry.get("name"): key for key, entry in data.itemStatus.items()}
+ importMap = {entry.get("name"): key for key, entry in data.itemImport.items()}
for xItem in xSection:
if xItem.tag != "item":
@@ -432,7 +424,7 @@ class ProjectXMLReader:
if item.get("type", "") == "TRASH":
item["type"] = "ROOT"
- projContent.append({
+ content.append({
"name": itemName,
"itemAttr": item,
"metaAttr": meta,
@@ -441,9 +433,8 @@ class ProjectXMLReader:
return
- def _parseStatusImport(self, xItem, sObject):
- """Parse a status or importance entry.
- """
+ def _parseStatusImport(self, xItem: ET.Element, sObject: NWStatus):
+ """Parse a status or importance entry."""
for xEntry in xItem:
if xEntry.tag == "entry":
key = xEntry.attrib.get("key", None)
@@ -454,7 +445,7 @@ class ProjectXMLReader:
sObject.write(key, xEntry.text, (red, green, blue), count)
return
- def _parseDictKeyText(self, xItem):
+ def _parseDictKeyText(self, xItem: ET.Element) -> dict:
"""Parse a dictionary stored with key as an attribute and the
value as the text porperty.
"""
@@ -474,12 +465,15 @@ class ProjectXMLReader:
class ProjectXMLWriter:
+ """Core: Project XML Writer
+
+ The project writer class will only write a file according to the
+ very latest spec.
+ """
def __init__(self, path):
-
self._path = Path(path)
self._error = None
-
return
##
@@ -487,16 +481,16 @@ class ProjectXMLWriter:
##
@property
- def error(self):
+ def error(self) -> Exception | None:
+ """Return the error status."""
return self._error
##
# Methods
##
- def write(self, projData, projContent, saveTime, editTime):
- """Write the project data and content to the XML files.
- """
+ def write(self, data: NWProjectData, content: list, saveTime: float, editTime: int) -> bool:
+ """Write the project data and content to the XML files."""
tStart = time()
logger.debug("Writing project XML")
@@ -509,46 +503,46 @@ class ProjectXMLWriter:
# Save Project Meta
projAttr = {
- "id": projData.uuid,
- "saveCount": str(projData.saveCount),
- "autoCount": str(projData.autoCount),
+ "id": data.uuid,
+ "saveCount": str(data.saveCount),
+ "autoCount": str(data.autoCount),
"editTime": str(editTime),
}
xProject = ET.SubElement(xRoot, "project", attrib=projAttr)
- self._packSingleValue(xProject, "name", projData.name)
- self._packSingleValue(xProject, "title", projData.title)
- self._packSingleValue(xProject, "author", projData.author)
+ self._packSingleValue(xProject, "name", data.name)
+ self._packSingleValue(xProject, "title", data.title)
+ self._packSingleValue(xProject, "author", data.author)
# Save Project Settings
xSettings = ET.SubElement(xRoot, "settings")
- self._packSingleValue(xSettings, "doBackup", yesNo(projData.doBackup))
- self._packSingleValue(xSettings, "language", projData.language)
- self._packSingleValue(xSettings, "spellChecking", projData.spellLang, attrib={
- "auto": yesNo(projData.spellCheck)
+ self._packSingleValue(xSettings, "doBackup", yesNo(data.doBackup))
+ self._packSingleValue(xSettings, "language", data.language)
+ self._packSingleValue(xSettings, "spellChecking", data.spellLang, attrib={
+ "auto": yesNo(data.spellCheck)
})
- self._packDictKeyValue(xSettings, "lastHandle", projData.lastHandle)
- self._packDictKeyValue(xSettings, "autoReplace", projData.autoReplace)
- self._packDictKeyValue(xSettings, "titleFormat", projData.titleFormat)
+ self._packDictKeyValue(xSettings, "lastHandle", data.lastHandle)
+ self._packDictKeyValue(xSettings, "autoReplace", data.autoReplace)
+ self._packDictKeyValue(xSettings, "titleFormat", data.titleFormat)
# Save Status/Importance
xStatus = ET.SubElement(xSettings, "status")
- for label, attrib in projData.itemStatus.pack():
+ for label, attrib in data.itemStatus.pack():
self._packSingleValue(xStatus, "entry", label, attrib=attrib)
xImport = ET.SubElement(xSettings, "importance")
- for label, attrib in projData.itemImport.pack():
+ for label, attrib in data.itemImport.pack():
self._packSingleValue(xImport, "entry", label, attrib=attrib)
# Save Tree Content
contAttr = {
- "items": str(len(projContent)),
- "novelWords": str(projData.currCounts[0]),
- "notesWords": str(projData.currCounts[1]),
+ "items": str(len(content)),
+ "novelWords": str(data.currCounts[0]),
+ "notesWords": str(data.currCounts[1]),
}
xContent = ET.SubElement(xRoot, "content", attrib=contAttr)
- for item in projContent:
+ for item in content:
xItem = ET.SubElement(xContent, "item", attrib=item.get("itemAttr", {}))
ET.SubElement(xItem, "meta", attrib=item.get("metaAttr", {}))
xName = ET.SubElement(xItem, "name", attrib=item.get("nameAttr", {}))
@@ -584,16 +578,16 @@ class ProjectXMLWriter:
# Internal Functions
##
- def _packSingleValue(self, xParent, name, value, attrib=None):
- """Pack a single value into an XML element.
- """
+ def _packSingleValue(
+ self, xParent: ET.Element, name: str, value: str | None, attrib: dict | None = None
+ ):
+ """Pack a single value into an XML element."""
xItem = ET.SubElement(xParent, name, attrib=attrib or {})
xItem.text = str(value) or ""
return
- def _packDictKeyValue(self, xParent, name, data):
- """Pack the entries of a dictionary into an XML element.
- """
+ def _packDictKeyValue(self, xParent: ET.Element, name: str, data: dict):
+ """Pack the entries of a dictionary into an XML element."""
xItem = ET.SubElement(xParent, name)
for key, value in data.items():
if len(key) > 0:
From 0704812376f5afc24f4835da22541f5752edd343 Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Sat, 3 Jun 2023 18:13:02 +0200
Subject: [PATCH 52/74] Remove titleFormat from project XML and rename mock
test file
---
novelwriter/core/projectdata.py | 18 -------
novelwriter/core/projectxml.py | 6 ---
tests/conftest.py | 2 +-
tests/{mock.py => mocked.py} | 0
tests/test_base/test_base_common.py | 2 +-
tests/test_base/test_base_config.py | 2 +-
tests/test_base/test_base_error.py | 2 +-
tests/test_base/test_base_init.py | 2 +-
tests/test_core/test_core_coretools.py | 2 +-
tests/test_core/test_core_docbuild.py | 2 +-
tests/test_core/test_core_document.py | 2 +-
tests/test_core/test_core_index.py | 2 +-
tests/test_core/test_core_options.py | 2 +-
tests/test_core/test_core_project.py | 2 +-
tests/test_core/test_core_projectxml.py | 57 ++++-----------------
tests/test_core/test_core_spellcheck.py | 2 +-
tests/test_core/test_core_storage.py | 2 +-
tests/test_core/test_core_tree.py | 2 +-
tests/test_dialogs/test_dlg_wordlist.py | 2 +-
tests/test_gui/test_gui_doceditor.py | 2 +-
tests/test_gui/test_gui_docviewer.py | 2 +-
tests/test_gui/test_gui_projtree.py | 2 +-
tests/test_gui/test_gui_theme.py | 2 +-
tests/test_tools/test_tools_writingstats.py | 2 +-
24 files changed, 30 insertions(+), 91 deletions(-)
rename tests/{mock.py => mocked.py} (100%)
diff --git a/novelwriter/core/projectdata.py b/novelwriter/core/projectdata.py
index 50c48086..ea7415b6 100644
--- a/novelwriter/core/projectdata.py
+++ b/novelwriter/core/projectdata.py
@@ -170,11 +170,6 @@ class NWProjectData:
"""Return the autoreplace dictionary."""
return self._autoReplace
- @property
- def titleFormat(self):
- """Delete"""
- return self._titleFormat
-
@property
def itemStatus(self) -> NWStatus:
"""Return the status settings object."""
@@ -209,10 +204,6 @@ class NWProjectData:
"""Retrieve the last used handle for a given component."""
return self._lastHandle.get(component, None)
- def getTitleFormat(self, kind):
- """Retrieve the title format string for a given kind of header."""
- return self._titleFormat.get(kind, "%title%")
-
##
# Setters
##
@@ -337,13 +328,4 @@ class NWProjectData:
self.theProject.setProjectChanged(True)
return
- def setTitleFormat(self, value):
- """Set the title formats."""
- if isinstance(value, dict):
- for key, entry in value.items():
- if key in self._titleFormat and isinstance(entry, str):
- self._titleFormat[key] = simplified(entry)
- self.theProject.setProjectChanged(True)
- return
-
# END Class NWProjectData
diff --git a/novelwriter/core/projectxml.py b/novelwriter/core/projectxml.py
index 0726d7da..42f4e582 100644
--- a/novelwriter/core/projectxml.py
+++ b/novelwriter/core/projectxml.py
@@ -280,11 +280,6 @@ class ProjectXMLReader:
data.setAutoReplace(self._parseDictKeyText(xItem))
else: # Pre 1.2 format
data.setAutoReplace(self._parseDictTagText(xItem))
- elif xItem.tag == "titleFormat":
- if self._version >= 0x0105:
- data.setTitleFormat(self._parseDictKeyText(xItem))
- else: # Pre 1.4 format
- data.setTitleFormat(self._parseDictTagText(xItem))
else:
logger.warning("Ignored in XML", xItem.tag)
@@ -523,7 +518,6 @@ class ProjectXMLWriter:
})
self._packDictKeyValue(xSettings, "lastHandle", data.lastHandle)
self._packDictKeyValue(xSettings, "autoReplace", data.autoReplace)
- self._packDictKeyValue(xSettings, "titleFormat", data.titleFormat)
# Save Status/Importance
xStatus = ET.SubElement(xSettings, "status")
diff --git a/tests/conftest.py b/tests/conftest.py
index d333a1b9..c8c84095 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -25,7 +25,7 @@ import shutil
from pathlib import Path
-from mock import MockGuiMain
+from mocked import MockGuiMain
from tools import cleanProject
from PyQt5.QtWidgets import QMessageBox
diff --git a/tests/mock.py b/tests/mocked.py
similarity index 100%
rename from tests/mock.py
rename to tests/mocked.py
diff --git a/tests/test_base/test_base_common.py b/tests/test_base/test_base_common.py
index 5559439e..c244cd05 100644
--- a/tests/test_base/test_base_common.py
+++ b/tests/test_base/test_base_common.py
@@ -25,7 +25,7 @@ import hashlib
from pathlib import Path
-from mock import causeOSError
+from mocked import causeOSError
from tools import writeFile
from novelwriter.guimain import GuiMain
diff --git a/tests/test_base/test_base_config.py b/tests/test_base/test_base_config.py
index 0d986906..2a7e6130 100644
--- a/tests/test_base/test_base_config.py
+++ b/tests/test_base/test_base_config.py
@@ -25,7 +25,7 @@ import pytest
from shutil import copyfile
from pathlib import Path
-from mock import causeOSError, MockApp
+from mocked import causeOSError, MockApp
from tools import cmpFiles, writeFile
from novelwriter import CONFIG
diff --git a/tests/test_base/test_base_error.py b/tests/test_base/test_base_error.py
index d90e6eb1..d6a743c0 100644
--- a/tests/test_base/test_base_error.py
+++ b/tests/test_base/test_base_error.py
@@ -21,7 +21,7 @@ along with this program. If not, see .
import pytest
-from mock import causeException
+from mocked import causeException
from novelwriter.error import NWErrorMessage, exceptionHandler
diff --git a/tests/test_base/test_base_init.py b/tests/test_base/test_base_init.py
index a932dcfa..b6e09d15 100644
--- a/tests/test_base/test_base_init.py
+++ b/tests/test_base/test_base_init.py
@@ -23,7 +23,7 @@ import sys
import pytest
import logging
-from mock import MockGuiMain
+from mocked import MockGuiMain
from novelwriter import CONFIG, main, logger
diff --git a/tests/test_core/test_core_coretools.py b/tests/test_core/test_core_coretools.py
index 585a9fae..c28354f8 100644
--- a/tests/test_core/test_core_coretools.py
+++ b/tests/test_core/test_core_coretools.py
@@ -25,7 +25,7 @@ import pytest
from shutil import copyfile
from zipfile import ZipFile
-from mock import causeOSError
+from mocked import causeOSError
from tools import C, buildTestProject, cmpFiles, XML_IGNORE
from novelwriter import CONFIG
diff --git a/tests/test_core/test_core_docbuild.py b/tests/test_core/test_core_docbuild.py
index 0dabad71..5953a10a 100644
--- a/tests/test_core/test_core_docbuild.py
+++ b/tests/test_core/test_core_docbuild.py
@@ -23,7 +23,7 @@ import pytest
from shutil import copyfile
-from mock import causeException, causeOSError
+from mocked import causeException, causeOSError
from novelwriter.core.buildsettings import BuildSettings
from tools import ODT_IGNORE, cmpFiles
diff --git a/tests/test_core/test_core_document.py b/tests/test_core/test_core_document.py
index 58eb10fc..319e2ef8 100644
--- a/tests/test_core/test_core_document.py
+++ b/tests/test_core/test_core_document.py
@@ -21,7 +21,7 @@ along with this program. If not, see .
import pytest
-from mock import causeOSError
+from mocked import causeOSError
from tools import C, buildTestProject, readFile, writeFile
from novelwriter.enum import nwItemClass, nwItemLayout
diff --git a/tests/test_core/test_core_index.py b/tests/test_core/test_core_index.py
index c3838772..5fada997 100644
--- a/tests/test_core/test_core_index.py
+++ b/tests/test_core/test_core_index.py
@@ -24,7 +24,7 @@ import pytest
from shutil import copyfile
-from mock import causeException
+from mocked import causeException
from tools import C, buildTestProject, cmpFiles, writeFile
from novelwriter.enum import nwItemClass, nwItemLayout
diff --git a/tests/test_core/test_core_options.py b/tests/test_core/test_core_options.py
index ce26dbe1..c241504e 100644
--- a/tests/test_core/test_core_options.py
+++ b/tests/test_core/test_core_options.py
@@ -22,7 +22,7 @@ along with this program. If not, see .
import json
import pytest
-from mock import causeOSError
+from mocked import causeOSError
from novelwriter.constants import nwFiles
from novelwriter.core.options import OptionState
diff --git a/tests/test_core/test_core_project.py b/tests/test_core/test_core_project.py
index 6425e4d8..05e4e6cc 100644
--- a/tests/test_core/test_core_project.py
+++ b/tests/test_core/test_core_project.py
@@ -26,7 +26,7 @@ from shutil import copyfile
from pathlib import Path
from zipfile import ZipFile
-from mock import causeOSError
+from mocked import causeOSError
from tools import C, cmpFiles, writeFile, buildTestProject, XML_IGNORE
from novelwriter import CONFIG
diff --git a/tests/test_core/test_core_projectxml.py b/tests/test_core/test_core_projectxml.py
index 35132107..d3108b72 100644
--- a/tests/test_core/test_core_projectxml.py
+++ b/tests/test_core/test_core_projectxml.py
@@ -25,8 +25,8 @@ import pytest
from shutil import copyfile
from datetime import datetime
-from mock import causeOSError
from tools import cmpFiles, writeFile
+from mocked import causeOSError
from novelwriter.core.item import NWItem
from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState
@@ -34,12 +34,16 @@ from novelwriter.core.projectdata import NWProjectData
class MockProject:
+ """Fake project object."""
+
def setProjectChanged(self, *a):
+ """Fake project method."""
pass
@pytest.fixture(scope="function", autouse=True)
def mockVersion(monkeypatch):
+ """Mock the version info to prevent diff from failing."""
monkeypatch.setattr("novelwriter.core.projectxml.__version__", "2.0-rc1")
monkeypatch.setattr("novelwriter.core.projectxml.__hexversion__", "0x020000c1")
return
@@ -47,8 +51,7 @@ def mockVersion(monkeypatch):
@pytest.mark.core
def testCoreProjectXML_ReadCurrent(monkeypatch, tstPaths, fncPath):
- """Test reading the current XML file format.
- """
+ """Test reading the current XML file format."""
refFile = tstPaths.filesDir / "nwProject-1.5.nwx"
tstFile = tstPaths.outDir / "ProjectXML_ReadCurrent.nwx"
xmlFile = fncPath / "nwProject-1.5.nwx"
@@ -160,12 +163,6 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, tstPaths, fncPath):
assert data.getLastHandle("novelTree") == "7031beac91f75"
assert data.getLastHandle("outline") == "7031beac91f75"
- assert data.getTitleFormat("title") == "%title%"
- assert data.getTitleFormat("chapter") == "Chapter %chw%: %title%"
- assert data.getTitleFormat("unnumbered") == "%title%"
- assert data.getTitleFormat("scene") == "Scene %ch%.%sc%: %title%"
- assert data.getTitleFormat("section") == ""
-
assert data.itemStatus.name("sf12341") == "New"
assert data.itemStatus.name("sf24ce6") == "Notes"
assert data.itemStatus.name("sc24b8f") == "Started"
@@ -286,12 +283,6 @@ def testCoreProjectXML_ReadLegacy10(tstPaths, fncPath, mockRnd):
assert data.getLastHandle("novelTree") is None # Doesn't exist in 1.0
assert data.getLastHandle("outline") is None # Doesn't exist in 1.0
- assert data.getTitleFormat("title") == "%title%"
- assert data.getTitleFormat("chapter") == "Chapter %ch%: %title%"
- assert data.getTitleFormat("unnumbered") == "%title%"
- assert data.getTitleFormat("scene") == "Scene %ch%.%sc%: %title%"
- assert data.getTitleFormat("section") == ""
-
assert data.itemStatus.name("s000000") == "New"
assert data.itemStatus.name("s000001") == "Notes"
assert data.itemStatus.name("s000002") == "Started"
@@ -388,8 +379,7 @@ def testCoreProjectXML_ReadLegacy10(tstPaths, fncPath, mockRnd):
@pytest.mark.core
def testCoreProjectXML_ReadLegacy11(tstPaths, fncPath, mockRnd):
- """Test reading the version 1.1 XML file format.
- """
+ """Test reading the version 1.1 XML file format."""
refFile = tstPaths.filesDir / "nwProject-1.1.nwx"
xmlFile = fncPath / "nwProject-1.1.nwx"
outFile = fncPath / "nwProject.nwx"
@@ -428,12 +418,6 @@ def testCoreProjectXML_ReadLegacy11(tstPaths, fncPath, mockRnd):
assert data.getLastHandle("novelTree") is None # Doesn't exist in 1.1
assert data.getLastHandle("outline") is None # Doesn't exist in 1.1
- assert data.getTitleFormat("title") == "%title%"
- assert data.getTitleFormat("chapter") == "Chapter %ch%: %title%"
- assert data.getTitleFormat("unnumbered") == "%title%"
- assert data.getTitleFormat("scene") == "Scene %ch%.%sc%: %title%"
- assert data.getTitleFormat("section") == ""
-
assert data.itemStatus.name("s000000") == "New"
assert data.itemStatus.name("s000001") == "Notes"
assert data.itemStatus.name("s000002") == "Started"
@@ -530,8 +514,7 @@ def testCoreProjectXML_ReadLegacy11(tstPaths, fncPath, mockRnd):
@pytest.mark.core
def testCoreProjectXML_ReadLegacy12(tstPaths, fncPath, mockRnd):
- """Test reading the version 1.2 XML file format.
- """
+ """Test reading the version 1.2 XML file format."""
refFile = tstPaths.filesDir / "nwProject-1.2.nwx"
xmlFile = fncPath / "nwProject-1.2.nwx"
outFile = fncPath / "nwProject.nwx"
@@ -570,12 +553,6 @@ def testCoreProjectXML_ReadLegacy12(tstPaths, fncPath, mockRnd):
assert data.getLastHandle("novelTree") is None # Doesn't exist in 1.2
assert data.getLastHandle("outline") is None # Doesn't exist in 1.2
- assert data.getTitleFormat("title") == "%title%"
- assert data.getTitleFormat("chapter") == "Chapter %chw%: %title%"
- assert data.getTitleFormat("unnumbered") == "%title%"
- assert data.getTitleFormat("scene") == "Scene %ch%.%sc%: %title%"
- assert data.getTitleFormat("section") == ""
-
assert data.itemStatus.name("s000000") == "New"
assert data.itemStatus.name("s000001") == "Notes"
assert data.itemStatus.name("s000002") == "Started"
@@ -675,8 +652,7 @@ def testCoreProjectXML_ReadLegacy12(tstPaths, fncPath, mockRnd):
@pytest.mark.core
def testCoreProjectXML_ReadLegacy13(tstPaths, fncPath, mockRnd):
- """Test reading the version 1.3 XML file format.
- """
+ """Test reading the version 1.3 XML file format."""
refFile = tstPaths.filesDir / "nwProject-1.3.nwx"
xmlFile = fncPath / "nwProject-1.3.nwx"
outFile = fncPath / "nwProject.nwx"
@@ -715,12 +691,6 @@ def testCoreProjectXML_ReadLegacy13(tstPaths, fncPath, mockRnd):
assert data.getLastHandle("novelTree") is None # Doesn't exist in 1.3
assert data.getLastHandle("outline") is None # Doesn't exist in 1.3
- assert data.getTitleFormat("title") == "%title%"
- assert data.getTitleFormat("chapter") == "Chapter %chw%: %title%"
- assert data.getTitleFormat("unnumbered") == "%title%"
- assert data.getTitleFormat("scene") == "Scene %ch%.%sc%: %title%"
- assert data.getTitleFormat("section") == ""
-
assert data.itemStatus.name("s000000") == "New"
assert data.itemStatus.name("s000001") == "Notes"
assert data.itemStatus.name("s000002") == "Started"
@@ -820,8 +790,7 @@ def testCoreProjectXML_ReadLegacy13(tstPaths, fncPath, mockRnd):
@pytest.mark.core
def testCoreProjectXML_ReadLegacy14(tstPaths, fncPath, mockRnd):
- """Test reading the version 1.4 XML file format.
- """
+ """Test reading the version 1.4 XML file format."""
refFile = tstPaths.filesDir / "nwProject-1.4.nwx"
xmlFile = fncPath / "nwProject-1.4.nwx"
outFile = fncPath / "nwProject.nwx"
@@ -860,12 +829,6 @@ def testCoreProjectXML_ReadLegacy14(tstPaths, fncPath, mockRnd):
assert data.getLastHandle("novelTree") is None # Doesn't exist in 1.3
assert data.getLastHandle("outline") is None # Doesn't exist in 1.3
- assert data.getTitleFormat("title") == "%title%"
- assert data.getTitleFormat("chapter") == "Chapter %chw%: %title%"
- assert data.getTitleFormat("unnumbered") == "%title%"
- assert data.getTitleFormat("scene") == "Scene %ch%.%sc%: %title%"
- assert data.getTitleFormat("section") == ""
-
assert data.itemStatus.name("sf12341") == "New"
assert data.itemStatus.name("sf24ce6") == "Notes"
assert data.itemStatus.name("sc24b8f") == "Started"
diff --git a/tests/test_core/test_core_spellcheck.py b/tests/test_core/test_core_spellcheck.py
index b13e7100..1782adb4 100644
--- a/tests/test_core/test_core_spellcheck.py
+++ b/tests/test_core/test_core_spellcheck.py
@@ -22,7 +22,7 @@ along with this program. If not, see .
import sys
import pytest
-from mock import causeOSError
+from mocked import causeOSError
from tools import readFile, writeFile
from novelwriter.core.spellcheck import FakeEnchant, NWSpellEnchant
diff --git a/tests/test_core/test_core_storage.py b/tests/test_core/test_core_storage.py
index fe1dedc4..5baa8cf0 100644
--- a/tests/test_core/test_core_storage.py
+++ b/tests/test_core/test_core_storage.py
@@ -22,7 +22,7 @@ along with this program. If not, see .
from zipfile import ZipFile
import pytest
-from mock import causeOSError
+from mocked import causeOSError
from tools import C, buildTestProject, writeFile
from novelwriter import CONFIG
diff --git a/tests/test_core/test_core_tree.py b/tests/test_core/test_core_tree.py
index 80a6e7cc..ee9ce687 100644
--- a/tests/test_core/test_core_tree.py
+++ b/tests/test_core/test_core_tree.py
@@ -24,7 +24,7 @@ import random
from pathlib import Path
-from mock import causeOSError
+from mocked import causeOSError
from tools import readFile
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
diff --git a/tests/test_dialogs/test_dlg_wordlist.py b/tests/test_dialogs/test_dlg_wordlist.py
index fef4b4a3..8781a82d 100644
--- a/tests/test_dialogs/test_dlg_wordlist.py
+++ b/tests/test_dialogs/test_dlg_wordlist.py
@@ -25,7 +25,7 @@ from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDialog, QAction
from tools import buildTestProject, writeFile, readFile, getGuiItem
-from mock import causeOSError
+from mocked import causeOSError
from novelwriter.constants import nwFiles
from novelwriter.dialogs.wordlist import GuiWordList
diff --git a/tests/test_gui/test_gui_doceditor.py b/tests/test_gui/test_gui_doceditor.py
index 34f9dfd1..1dc3610b 100644
--- a/tests/test_gui/test_gui_doceditor.py
+++ b/tests/test_gui/test_gui_doceditor.py
@@ -21,7 +21,7 @@ along with this program. If not, see .
import pytest
-from mock import causeOSError
+from mocked import causeOSError
from tools import C, buildTestProject
from PyQt5.QtCore import Qt
diff --git a/tests/test_gui/test_gui_docviewer.py b/tests/test_gui/test_gui_docviewer.py
index 2bd7ad7a..bb3437dd 100644
--- a/tests/test_gui/test_gui_docviewer.py
+++ b/tests/test_gui/test_gui_docviewer.py
@@ -21,7 +21,7 @@ along with this program. If not, see .
import pytest
-from mock import causeException
+from mocked import causeException
from PyQt5.QtCore import Qt, QUrl
from PyQt5.QtGui import QTextCursor
diff --git a/tests/test_gui/test_gui_projtree.py b/tests/test_gui/test_gui_projtree.py
index dbaeb09f..92b68e9a 100644
--- a/tests/test_gui/test_gui_projtree.py
+++ b/tests/test_gui/test_gui_projtree.py
@@ -21,7 +21,7 @@ along with this program. If not, see .
import pytest
-from mock import causeOSError
+from mocked import causeOSError
from tools import C, buildTestProject
from PyQt5.QtCore import Qt
diff --git a/tests/test_gui/test_gui_theme.py b/tests/test_gui/test_gui_theme.py
index a4aa6b2a..3ba5f405 100644
--- a/tests/test_gui/test_gui_theme.py
+++ b/tests/test_gui/test_gui_theme.py
@@ -24,7 +24,7 @@ import pytest
from pathlib import Path
from configparser import ConfigParser
-from mock import causeOSError
+from mocked import causeOSError
from tools import writeFile
from PyQt5.QtGui import QIcon, QPalette, QPixmap
diff --git a/tests/test_tools/test_tools_writingstats.py b/tests/test_tools/test_tools_writingstats.py
index 7cf832f6..af2e4f0c 100644
--- a/tests/test_tools/test_tools_writingstats.py
+++ b/tests/test_tools/test_tools_writingstats.py
@@ -22,7 +22,7 @@ along with this program. If not, see .
import json
import pytest
-from mock import causeOSError
+from mocked import causeOSError
from tools import getGuiItem, writeFile, buildTestProject
from PyQt5.QtCore import Qt
From 8ef3b3e09a4b28fd20a4fec9d34172ef0e9379bc Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Sat, 3 Jun 2023 18:37:41 +0200
Subject: [PATCH 53/74] Add project file revision number, and update all test
reference files
---
docs/FileFormatSpec-1.5.fodt | 1272 +++++++++--------
docs/source/fileformatspec15.pdf | Bin 307438 -> 319906 bytes
novelwriter/core/projectxml.py | 17 +-
sample/nwProject.nwx | 13 +-
tests/files/nwProject-1.5.nwx | 9 +-
tests/lipsum/nwProject.nwx | 15 +-
.../coreProject_NewFileFolder_nwProject.nwx | 9 +-
.../coreProject_NewRoot_nwProject.nwx | 9 +-
.../coreTools_NewCustomA_nwProject.nwx | 9 +-
.../coreTools_NewCustomB_nwProject.nwx | 9 +-
.../coreTools_NewMinimal_nwProject.nwx | 9 +-
.../guiEditor_Main_Final_nwProject.nwx | 9 +-
.../guiEditor_Main_Initial_nwProject.nwx | 9 +-
tests/reference/projectXML_ReadLegacy10.nwx | 9 +-
tests/reference/projectXML_ReadLegacy11.nwx | 9 +-
tests/reference/projectXML_ReadLegacy12.nwx | 9 +-
tests/reference/projectXML_ReadLegacy13.nwx | 9 +-
tests/reference/projectXML_ReadLegacy14.nwx | 9 +-
18 files changed, 733 insertions(+), 701 deletions(-)
diff --git a/docs/FileFormatSpec-1.5.fodt b/docs/FileFormatSpec-1.5.fodt
index 67ceb247..a57c8627 100644
--- a/docs/FileFormatSpec-1.5.fodt
+++ b/docs/FileFormatSpec-1.5.fodt
@@ -1,29 +1,31 @@
-
- Veronica Olsen2022-11-05T18:25:44.8874731592023-02-09T13:03:44.196703858Veronica OlsenPT3H48M55S42LibreOffice/7.0.4.2$Linux_X86_64 LibreOffice_project/00$Build-2
+
+ Veronica Olsen2022-11-05T18:25:44.8874731592023-06-03T18:35:47.268848685Veronica OlsenPT4H19S53LibreOffice/7.4.5.1$Linux_X86_64 LibreOffice_project/40$Build-1
- 9825
+ 0
0
- 35909
- 19657
+ 35645
+ 20394
true
false
view2
- 23216
- 176844
+ 15145
+ 7216
0
- 9825
- 35907
- 29480
+ 0
+ 35643
+ 20392
0
1
false
140
false
+ false
+ false
false
@@ -47,12 +49,14 @@
false
true
false
+ false
false
false
true
true
true
false
+ false
false
false
false
@@ -70,6 +74,7 @@
0
1
true
+ false
high-resolution
true
@@ -79,16 +84,18 @@
false
true
false
+ false
true
true
false
true
true
- 695346
+ 805029
true
false
+ true
true
0
@@ -98,12 +105,15 @@
true
false
true
+ 0
false
false
false
false
true
+ false
false
+ false
false
false
@@ -137,26 +147,26 @@
-
+
+
-
-
-
+
+
-
+
-
+
-
+
@@ -167,7 +177,7 @@
-
+
@@ -176,15 +186,15 @@
-
+
-
+
-
+
@@ -238,53 +248,57 @@
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -355,6 +369,15 @@
+
+
+
+
+
+
+
+
+
@@ -536,13 +559,9 @@
-
-
-
-
-
-
-
+
+
+
@@ -1012,202 +1031,229 @@
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1240,66 +1286,130 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
-
+
@@ -1310,829 +1420,845 @@
- novelWriter
- Project File Format 1.5 Specification
-
- This document covers the file format specification for the 1.5 file format for novelWriter project files. See the documentation1
- See: https://novelwriter.readthedocs.io/ for a full description of the app’s functionality.
- The target audience of this document is developers who intend to write a tool or script that generates valid novelWriter project files from data from other applications, or for templating purposes.
- Note that flags are generally written out as yes/no values, but also true/false and on/off are understood by the application. The None value that occasionally occurs in actual project files is the text representation of the Python None value, and indicates that there is no value set.
+ novelWriter
+ Project File Format 1.5 Specification
+
+ This document covers the file format specification for the 1.5 file format for novelWriter project files. See the documentation1
+ See: https://docs.novelwriter.io for a full description of the app’s functionality. The file format was intrioduced in Release 2.0.
+ The target audience of this document is developers who intend to write a tool or script that generates valid novelWriter project files from data from other applications, or for templating purposes.
+ Note that flags are generally written out as yes/no values, but also true/false and on/off are understood by the application. The None value that occasionally occurs in actual project files is the text representation of the Python None value, and indicates that there is no value set.
+ Revisions
+
+
+ From Release 2.1 Beta 1: Removed the titleFormat node from settings.
+
+
XML Root
- Tag: novelWriterXML
- The root tag of a novelWriter project file must be named “novelWriterXML”. This value is case sensitive. The fileVersion attribute must also be set to the appropriate format version in order to be parsed correctly.
- Attributes
+ Tag: novelWriterXML
+ The root tag of a novelWriter project file must be named “novelWriterXML”. This value is case sensitive. The fileVersion attribute must also be set to the appropriate format version in order to be parsed correctly.
+ Attributes
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- appVersion
+ appVersion
- No
+ No
- A string representation of the novelWriter version used to write the file. The value is not required, but is used to report to the user when the file format is converted.
+ A string representation of the novelWriter version used to write the file. The value is not required, but is used to report to the user when the file format is converted.
-
-
- hexVersion
+
+
+ hexVersion
- No
+ No
- A hex representation of the novelWriter version used to write the file. The value is used to check if the project is opened by a lower version than was used to write it, which issues a warning. Defaults to 0x0.
+ A hex representation of the novelWriter version used to write the file. The value is used to check if the project is opened by a lower version than was used to write it, which issues a warning. Defaults to 0x0.
-
-
- fileVersion
+
+
+ fileVersion
- Yes
+ Yes
- The file format version used when writing the project file. This determines how the file is parsed, so it is important that it is set correctly. Valid values are “1.0”, “1.1”, “1.2”, “1.3”, “1.4”, and “1.5”.
+ The file format version used when writing the project file. This determines how the file is parsed, so it is important that it is set correctly. Valid values are “1.0”, “1.1”, “1.2”, “1.3”, “1.4”, and “1.5”.
-
-
- timeStamp
+
+
+ fileRevision
-
- No
+
+ No
-
- The ISO 8601 timestamp of when the file was saved. This information is not used by the parser, and is purely for debugging.
+
+ The revision of the file format used for non-breaking changes. This is an interger value.
+
+
+
+
+ timeStamp
+
+
+ No
+
+
+ The ISO 8601 timestamp of when the file was saved. This information is not used by the parser, and is purely for debugging.
- Example
- <novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1"
- fileVersion="1.5" timeStamp="2022-11-05 17:46:51">
-
- Project Node
- Tag: project
- The project section is a level one node under the root. It stores the primary settings for the project. The only required values are the id attribute and the name value. All other entries are set to default values during parsing if ommitted from the XML.
- Attributes
+ Example
+ <novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1"
+ fileVersion="1.5" fileRevision="1"
+ timeStamp="2022-11-05 17:46:51">
+ Project Node
+ Tag: project
+ The project section is a level one node under the root. It stores the primary settings for the project. The only required values are the id attribute and the name value. All other entries are set to default values during parsing if ommitted from the XML.
+ Attributes
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- id
+ id
- Yes
+ Yes
- A UUID that is unique for the project and does not change during the lifetime of the project. It is used by novelWriter to keep track of temporary files and to associate cross-project settings with specific projects without relying on the project name.
+ A UUID that is unique for the project and does not change during the lifetime of the project. It is used by novelWriter to keep track of temporary files and to associate cross-project settings with specific projects without relying on the project name.
-
-
- saveCount
+
+
+ saveCount
- No
+ No
- A number representing the number of times the project file has been written as a result of user interaction with the application.
+ A number representing the number of times the project file has been written as a result of user interaction with the application.
-
-
- autoCount
+
+
+ autoCount
- No
+ No
- A number representing the number of times the project file has been written as a result of internal timed automatic operations of the application.
+ A number representing the number of times the project file has been written as a result of internal timed automatic operations of the application.
-
+
- editTime
+ editTime
- No
+ No
- A number representing the accumulated time in seconds the project has been open.
+ A number representing the accumulated time in seconds the project has been open.
- Values
+ Values
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- name
+ name
- Yes
+ Yes
- The name the user has given to the project.
+ The name the user has given to the project.
-
-
- title
+
+
+ title
- No
+ No
- The title the user has given to the project, which may differ from the project name. The value is used in some places in the user interface, and can be added to manuscript builds.
+ The title the user has given to the project, which may differ from the project name. The value is used in some places in the user interface, and can be added to manuscript builds.
-
-
- author
+
+
+ author
- No
+ No
- The name of the novel author or authors. The value is used in some places in the user interface, and can be added to manuscript builds.
+ The name of the novel author or authors. The value is used in some places in the user interface, and can be added to manuscript builds.
- Example
- <project id="e2be99af-f9bf-4403-857a-c3d1ac25abea"
- saveCount="5" autoCount="10" editTime="1000">
- <name>Sample Project</name>
- <title>Sample Project</title>
- <author>Jane Smith</author>
- </project>
-
- Settings Node
- Tag: settings
- The settings section is a level one node under the root. It stores the various runtime values for the project, and the settings available from the Project Settings panel. None of these settings are required, and if missing, will be set to default values. The entire settings section can thus be ommitted.
- Attributes
- None
- Values
+ Example
+ <project id="e2be99af-f9bf-4403-857a-c3d1ac25abea"
+ saveCount="5" autoCount="10" editTime="1000">
+ <name>Sample Project</name>
+ <title>Sample Project</title>
+ <author>Jane Smith</author>
+ </project>
+
+ Settings Node
+ Tag: settings
+ The settings section is a level one node under the root. It stores the various runtime values for the project, and the settings available from the Project Settings panel. None of these settings are required, and if missing, will be set to default values. The entire settings section can thus be ommitted.
+ Attributes
+ None
+ Values
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- doBackup
+ doBackup
- No
+ No
- User-controlled setting for whether or not to run backup when the project is closed.
+ User-controlled setting for whether or not to run backup when the project is closed.
-
+
- language
+ language
- No
+ No
- The language used when building the manuscript. The setting is controlled from the Build Novel Project tool.
+ The language used when building the manuscript. The setting is controlled from the Build Novel Project tool.
-
+
- spellChecking
+ spellChecking
- No
+ No
- The spell checking language to use for this project if it differs from the default spell checking language for the application.
-
- Attribute auto: A flag determining whether the spell checking is automatic or not.
+ The spell checking language to use for this project if it differs from the default spell checking language for the application.
+
+ Attribute auto: A flag determining whether the spell checking is automatic or not.
-
+
- lastHandle
+ lastHandle
- No
+ No
- An auto-generated list of the last documents open in the editor and viewer, and which novel root folder was last viewed in the Novel Tree and Outline View. These are saved as key/value pairs. See separate section for how they are stored as XML.
+ An auto-generated list of the last documents open in the editor and viewer, and which novel root folder was last viewed in the Novel Tree and Outline View. These are saved as key/value pairs. See separate section for how they are stored as XML.
-
+
- autoReplace
+ autoReplace
- No
+ No
- The entries of the auto-replace feature available from Project Settings. These are saved as key/value pairs. See separate section for how they are stored as XML.
+ The entries of the auto-replace feature available from Project Settings. These are saved as key/value pairs. See separate section for how they are stored as XML.
-
+
- titleFormat
+ titleFormat
-
- No
+
+ No
-
- The formatting specifications set by the user in the Build Novel Project tool for formatting headers in the manuscript. These are saved as key/value pairs. See separate section for how they are stored as XML.
+
+ Removed in Revision 1.
-
+
- status
+ status
- No
+ No
- The status labels as defined by the user in Project Settings. These are saved as special key/value pars. See separate section for how they are stored as XML.
+ The status labels as defined by the user in Project Settings. These are saved as special key/value pars. See separate section for how they are stored as XML.
-
+
- importance
+ importance
- No
+ No
- The importance labels as defined by the user in Project Settings. These are saved as special key/value pars. See separate section for how they are stored as XML.
+ The importance labels as defined by the user in Project Settings. These are saved as special key/value pars. See separate section for how they are stored as XML.
- Example
- <settings>
- <doBackup>yes</doBackup>
- <language>en_GB</language>
- <spellChecking auto="yes">en_GB</spellChecking>
- <lastHandle />
- <autoReplace />
- <titleFormat />
- <status />
- <importance />
- </settings>
-
- Key/Value Nodes
- The key/value nodes are used for lastHandle, autoReplace and titleFormat settings. The lookup key is stored as an attribute, and the value is the text of the node.
- Attributes
+ Example
+ <settings>
+ <doBackup>yes</doBackup>
+ <language>en_GB</language>
+ <spellChecking auto="yes">en_GB</spellChecking>
+ <lastHandle />
+ <autoReplace />
+ <status />
+ <importance />
+ </settings>
+
+ Key/Value Nodes
+ The key/value nodes are used for lastHandle, autoReplace and titleFormat settings. The lookup key is stored as an attribute, and the value is the text of the node.
+ Attributes
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- key
+ key
- Yes
+ Yes
- The lookup key.
+ The lookup key.
- Example
- <lastHandle>
- <entry key="editor">636b6aa9b697b</entry>
- <entry key="viewer">636b6aa9b697b</entry>
- <entry key="novelTree">7031beac91f75</entry>
- <entry key="outline">7031beac91f75</entry>
- </lastHandle>
- Status/Importance Key/Value Nodes
- The status and importance settings are stored as key/value nodes with additional data attributes. The label of the status or importance setting is saved as the node text value.
- Attributes
+ Example
+ <lastHandle>
+ <entry key="editor">636b6aa9b697b</entry>
+ <entry key="viewer">636b6aa9b697b</entry>
+ <entry key="novelTree">7031beac91f75</entry>
+ <entry key="outline">7031beac91f75</entry>
+ </lastHandle>
+ Status/Importance Key/Value Nodes
+ The status and importance settings are stored as key/value nodes with additional data attributes. The label of the status or importance setting is saved as the node text value.
+ Attributes
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- key
+ key
- Yes
+ Yes
- The lookup key. For status labels, it must consist of an “s” followed by six hexadecimal numbers. For importance labels it must consist of an “i” followed by six hexadecimal numbers. Each key string must be unique. Internally, they are random numbers, but also sequential values are valid.
+ The lookup key. For status labels, it must consist of an “s” followed by six hexadecimal numbers. For importance labels it must consist of an “i” followed by six hexadecimal numbers. Each key string must be unique. Internally, they are random numbers, but also sequential values are valid.
-
-
- count
+
+
+ count
- No
+ No
- A record of the number of times each label is used in the project content.
+ A record of the number of times each label is used in the project content.
-
-
- red
+
+
+ red
- Yes
+ Yes
- A number between 0 and 255 representing the red component of the label colour.
+ A number between 0 and 255 representing the red component of the label colour.
-
+
- green
+ green
- Yes
+ Yes
- A number between 0 and 255 representing the green component of the label colour.
+ A number between 0 and 255 representing the green component of the label colour.
-
+
- blue
+ blue
- Yes
+ Yes
- A number between 0 and 255 representing the blue component of the label colour.
+ A number between 0 and 255 representing the blue component of the label colour.
- Example
- <status>
- <entry key="sf12341" count="4"
- red="100" green="100" blue="100">New</entry>
- <entry key="sd51c5b" count="0"
- red="193" green="129" blue="0">Draft</entry>
- <entry key="s78ea90" count="1"
- red="58" green="180" blue="58">Finished</entry>
- </status>
- <importance>
- <entry key="ia857f0" count="5"
- red="100" green="100" blue="100">None</entry>
- <entry key="icfb3a5" count="2"
- red="0" green="122" blue="188">Minor</entry>
- <entry key="i2d7a54" count="2"
- red="21" green="0" blue="180">Major</entry>
- </importance>
-
- Content Node
- Tag: content
- The content section is a level one node under the root. It stores all the project items of the project. The items are stored in the order in which they appear in the project tree, so altering the order will affect the project structure. The attribute with the order number is not used when processing the data. It is written to the XML for debugging purposes.
- Attributes
+ Example
+ <status>
+ <entry key="sf12341" count="4"
+ red="100" green="100" blue="100">New</entry>
+ <entry key="sd51c5b" count="0"
+ red="193" green="129" blue="0">Draft</entry>
+ <entry key="s78ea90" count="1"
+ red="58" green="180" blue="58">Finished</entry>
+ </status>
+ <importance>
+ <entry key="ia857f0" count="5"
+ red="100" green="100" blue="100">None</entry>
+ <entry key="icfb3a5" count="2"
+ red="0" green="122" blue="188">Minor</entry>
+ <entry key="i2d7a54" count="2"
+ red="21" green="0" blue="180">Major</entry>
+ </importance>
+
+ Content Node
+ Tag: content
+ The content section is a level one node under the root. It stores all the project items of the project. The items are stored in the order in which they appear in the project tree, so altering the order will affect the project structure. The attribute with the order number is not used when processing the data. It is written to the XML for debugging purposes.
+ Attributes
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
-
- items
+
+
+ items
- No
+ No
- The number of project items in the content section.
+ The number of project items in the content section.
-
-
- novelWords
+
+
+ novelWords
- No
+ No
- The number of words in total for all document nodes with layout DOCUMENT. The value defaults to 0, but this number forms the basis of computing writing statistics during a session, so the number should be properly set to ensure correct statistics.
+ The number of words in total for all document nodes with layout DOCUMENT. The value defaults to 0, but this number forms the basis of computing writing statistics during a session, so the number should be properly set to ensure correct statistics.
-
+
- notesWords
+ notesWords
- No
+ No
- The number of words in total for all document nodes with layout NOTE. The value defaults to 0, but this number forms the basis of computing writing statistics during a session, so the number should be properly set to ensure correct statistics.
+ The number of words in total for all document nodes with layout NOTE. The value defaults to 0, but this number forms the basis of computing writing statistics during a session, so the number should be properly set to ensure correct statistics.
- Values
+ Values
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- item
+ item
- No
+ No
- A node representing a project item.
+ A node representing a project item.
- Example
- <content items="27" novelWords="954" notesWords="409">
- <item handle="7031beac91f75" parent="None" root="7031beac91f75"
- order="0" type="ROOT" class="NOVEL">
- <meta expanded="yes"/>
- <name status="sc24b8f" import="ia857f0">Novel</name>
- </item>
- ...
- </content>
- Item Nodes
- The item nodes make up the actual project content of the project. Each node represents either a root folder, a regular folder, or a document. Each node has a type, class and layout setting that determine its category. Each item is given a handle that is a random hexadecimal string of length 13.
- For the items that are document files, the handle corresponds to its expected filename. It is therefore important that they match in generated projects. Each document node is expected to correspond to a file in the contents folder of the project named “content/7031beac91f75.nwd” for the item handle “7031beac91f75”. If there is no such file, the document item is assumed to contain no text, and a file is created when the user tries to save text to it.
- Each item node has a meta data node and a name node. The meta data node contains only collected information, and is thus not strictly required. However, an accurate word count and setting the correct icon in the project tree depend on these values. These values are set by the indexer class, so rebuilding the index should restore the data.
- The name node contains the primary user defined settings for an item, and is required for the entry to be valid.
-
- Attributes
+ Example
+ <content items="27" novelWords="954" notesWords="409">
+ <item handle="7031beac91f75" parent="None" root="7031beac91f75"
+ order="0" type="ROOT" class="NOVEL">
+ <meta expanded="yes"/>
+ <name status="sc24b8f" import="ia857f0">Novel</name>
+ </item>
+ ...
+ </content>
+ Item Nodes
+ The item nodes make up the actual project content of the project. Each node represents either a root folder, a regular folder, or a document. Each node has a type, class and layout setting that determine its category. Each item is given a handle that is a random hexadecimal string of length 13.
+ For the items that are document files, the handle corresponds to its expected filename. It is therefore important that they match in generated projects. Each document node is expected to correspond to a file in the contents folder of the project named “content/7031beac91f75.nwd” for the item handle “7031beac91f75”. If there is no such file, the document item is assumed to contain no text, and a file is created when the user tries to save text to it.
+ Each item node has a meta data node and a name node. The meta data node contains only collected information, and is thus not strictly required. However, an accurate word count and setting the correct icon in the project tree depend on these values. These values are set by the indexer class, so rebuilding the index should restore the data.
+ The name node contains the primary user defined settings for an item, and is required for the entry to be valid.
+
+ Attributes
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- handle
+ handle
- Yes
+ Yes
- The 13 value hexadecimal string that represents the item in the project. This is the primary identifier of a project item, and is required. It must be unique withing a project. Internally, it is generated as a random value, but it can also be sequential.
+ The 13 value hexadecimal string that represents the item in the project. This is the primary identifier of a project item, and is required. It must be unique withing a project. Internally, it is generated as a random value, but it can also be sequential.
-
-
- parent
+
+
+ parent
-
- Yes
+
+ Yes
-
- The handle of the parent item in the tree. This value should only be None for root folders. All other items must have a parent handle set. If the parent handle is None for an item that isn’t a root folder, the item will be treated as orphaned during project loading.
+
+ The handle of the parent item in the tree. This value should only be None for root folders. All other items must have a parent handle set. If the parent handle is None for an item that isn’t a root folder, the item will be treated as orphaned during project loading.
-
-
- root
+
+
+ root
-
- No
+
+ No
-
- The handle of the top of its hierarchy of parent items. That is, the root folder which it ultimately sits under. If the attribute is not set, it will be computed during loading. It is saved to the XML file for efficiency reasons.
+
+ The handle of the top of its hierarchy of parent items. That is, the root folder which it ultimately sits under. If the attribute is not set, it will be computed during loading. It is saved to the XML file for efficiency reasons.
-
-
- order
+
+
+ order
-
- No
+
+ No
-
- The numerical order of the item under its parent item. This value is not used during the loading process as the physical item order in the content node is used instead. It is primarily saved to the XML for debugging purposes.
+
+ The numerical order of the item under its parent item. This value is not used during the loading process as the physical item order in the content node is used instead. It is primarily saved to the XML for debugging purposes.
-
-
- type
+
+
+ type
-
- Yes
+
+ Yes
-
- The item type of the item node. Allowed values are ROOT, FOLDER and FILE.
+
+ The item type of the item node. Allowed values are ROOT, FOLDER and FILE.
-
-
- class
+
+
+ class
-
- Yes
+
+ Yes
-
- The item class of the item node. There are a number of item classes available in the app, all corresponding to a specific type of root folder. Each item in a root folder should have the same class set as the root folder itself. The attribute is not strictly required for items that aren’t root folders as it will be automatically set to match during loading. Allowed values are NOVEL, PLOT, CHARACTER, WORLD, TIMELINE, OBJECT, ENTITY, CUSTOM, ARCHIVE and TRASH.
+
+ The item class of the item node. There are a number of item classes available in the app, all corresponding to a specific type of root folder. Each item in a root folder should have the same class set as the root folder itself. The attribute is not strictly required for items that aren’t root folders as it will be automatically set to match during loading. Allowed values are NOVEL, PLOT, CHARACTER, WORLD, TIMELINE, OBJECT, ENTITY, CUSTOM, ARCHIVE and TRASH.
-
+
- layout
+ layout
- Yes
+ Yes
- The item layout of the item node. Allowed values are DOCUMENT and NOTE. This is the attribute that determines if a FILE type item is a Novel Document or a Project Note.
+ The item layout of the item node. Allowed values are DOCUMENT and NOTE. This is the attribute that determines if a FILE type item is a Novel Document or a Project Note.
- Values
+ Values
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- meta
+ meta
- No
+ No
- A node of meta data attributes for the item.
+ A node of meta data attributes for the item.
-
+
- name
+ name
- Yes
+ Yes
- A node of user settings for the item.
+ A node of user settings for the item.
- Meta Nodes
- The meta data collected for the current item. This data either represents the item’s last state in the app, or consists of data collected by the indexer. It can be restored by rebuilding the index, so the data is not essential.
- Attributes
+ Meta Nodes
+ The meta data collected for the current item. This data either represents the item’s last state in the app, or consists of data collected by the indexer. It can be restored by rebuilding the index, so the data is not essential.
+ Attributes
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- expanded
+ expanded
- No
+ No
- Whether the tree node in the project tree was expanded or collapsed during the last session. Applies to all item types, but is ignored for items without child items.
+ Whether the tree node in the project tree was expanded or collapsed during the last session. Applies to all item types, but is ignored for items without child items.
-
-
- heading
+
+
+ heading
-
- No
+
+ No
-
- The heading level of the first heading of the text of the item. Only applies to FILE item types. Allowed values are H0, H1, H2, H3, and H4. Other values are reset to H0.
+
+ The heading level of the first heading of the text of the item. Only applies to FILE item types. Allowed values are H0, H1, H2, H3, and H4. Other values are reset to H0.
-
-
- charCount
+
+
+ charCount
-
- No
+
+ No
-
- The number of characters in the text of the item. Only applies to FILE item types.
+
+ The number of characters in the text of the item. Only applies to FILE item types.
-
-
- wordCount
+
+
+ wordCount
-
- No
+
+ No
-
- The number of words in the text of the item. Only applies to FILE item types.
+
+ The number of words in the text of the item. Only applies to FILE item types.
-
-
- paraCount
+
+
+ paraCount
-
- No
+
+ No
-
- The number of paragraphs in the text of the item. Only applies to FILE item types.
+
+ The number of paragraphs in the text of the item. Only applies to FILE item types.
-
-
- cursorPos
+
+
+ cursorPos
-
- No
+
+ No
-
- The last cursor position in the text of the item from the last editing session. Only applies to FILE item types. The value is used to restore the cursor position when the document is opened in the editor.
+
+ The last cursor position in the text of the item from the last editing session. Only applies to FILE item types. The value is used to restore the cursor position when the document is opened in the editor.
- Name Nodes
- The name node contains information about an item that is set by the user. Including its label, which is the text value of the node. This is the label that is displayed in the project tree.
- Attributes
+ Name Nodes
+ The name node contains information about an item that is set by the user. Including its label, which is the text value of the node. This is the label that is displayed in the project tree.
+ Attributes
- Name
+ Name
- Required
+ Required
- Description
+ Description
-
+
- status
+ status
- No
+ No
- The ID of the status label that has been set for this item. Defaults to the first status item defined in the status section of the settings node.
+ The ID of the status label that has been set for this item. Defaults to the first status item defined in the status section of the settings node.
-
-
- import
+
+
+ import
-
- No
+
+ No
-
- The ID of the importance label that has been set for this item. Defaults to the first importance item defined in the importance section of the settings node.
+
+ The ID of the importance label that has been set for this item. Defaults to the first importance item defined in the importance section of the settings node.
-
-
- active
+
+
+ active
-
- No
+
+ No
-
- The active/inactive status of the document. Only applies to FILE item types.
+
+ The active/inactive status of the document. Only applies to FILE item types.
- Example
- <item handle="53b69b83cdafc" parent="7031beac91f75" root="7031beac91f75"
- order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
- <meta expanded="no" heading="H1" charCount="93" wordCount="19"
- paraCount="2" cursorPos="119"/>
- <name status="sc24b8f" import="ia857f0" active="yes">Title Page</name>
- </item>
+ Example
+ <item handle="53b69b83cdafc" parent="7031beac91f75" root="7031beac91f75"
+ order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
+ <meta expanded="no" heading="H1" charCount="93" wordCount="19"
+ paraCount="2" cursorPos="119"/>
+ <name status="sc24b8f" import="ia857f0" active="yes">Title Page</name>
+ </item>
\ No newline at end of file
diff --git a/docs/source/fileformatspec15.pdf b/docs/source/fileformatspec15.pdf
index b93a7bef3cf16928154c499a78906303551155a0..5115b5b1f82eb1e5e398d2c487e3b20bd618463e 100644
GIT binary patch
literal 319906
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