Always index main heading (#1183)
This commit is contained in:
@@ -91,7 +91,7 @@ class DocMerger:
|
||||
docText = (inDoc.readDocument() or "").rstrip("\n")
|
||||
|
||||
if addComment:
|
||||
docInfo = srcItem.describeMe("H0")
|
||||
docInfo = srcItem.describeMe()
|
||||
docSt, _ = srcItem.getImportStatus(incIcon=False)
|
||||
cmtLine = f"% {cmtPrefix} {docInfo}: {srcItem.itemName} [{docSt}]\n\n"
|
||||
docText = cmtLine + docText
|
||||
|
||||
+58
-59
@@ -243,20 +243,43 @@ class NWIndex:
|
||||
if theItem.itemParent is None:
|
||||
logger.info("Not indexing orphaned item '%s'", tHandle)
|
||||
return False
|
||||
if theItem.isInactive():
|
||||
logger.debug("Not indexing inactive item '%s'", tHandle)
|
||||
return False
|
||||
|
||||
logger.debug("Indexing item with handle '%s'", tHandle)
|
||||
if theItem.isInactive():
|
||||
self._scanInactive(theItem, theText)
|
||||
else:
|
||||
self._scanActive(tHandle, theItem, theText, itemTags)
|
||||
|
||||
# Scan the text content
|
||||
# Update timestamps for index changes
|
||||
nowTime = round(time())
|
||||
self._indexChange = nowTime
|
||||
self._rootChange[theItem.itemRoot] = nowTime
|
||||
|
||||
return True
|
||||
|
||||
##
|
||||
# Internal Indexer Helpers
|
||||
##
|
||||
|
||||
def _scanActive(self, tHandle, theItem, theText, itemTags):
|
||||
"""Scan an active document for meta data.
|
||||
"""
|
||||
nTitle = 0
|
||||
findHeader = True
|
||||
theLines = theText.splitlines()
|
||||
|
||||
for nLine, aLine in enumerate(theLines, start=1):
|
||||
|
||||
if len(aLine.strip()) == 0:
|
||||
continue
|
||||
|
||||
if aLine.startswith("#"):
|
||||
if findHeader:
|
||||
hDepth, _ = self._splitHeading(aLine)
|
||||
if hDepth != "H0":
|
||||
theItem.setMainHeading(hDepth)
|
||||
findHeader = False
|
||||
|
||||
isTitle = self._indexTitle(tHandle, aLine, nLine)
|
||||
if isTitle and nLine > 0:
|
||||
if nTitle > 0:
|
||||
@@ -292,45 +315,46 @@ class NWIndex:
|
||||
logger.verbose("Deleting removed tag '%s'", tTag)
|
||||
del self._tagsIndex[tTag]
|
||||
|
||||
# Update timestamps for index changes
|
||||
nowTime = round(time())
|
||||
self._indexChange = nowTime
|
||||
self._rootChange[theItem.itemRoot] = nowTime
|
||||
return
|
||||
|
||||
return True
|
||||
def _scanInactive(self, theItem, theText):
|
||||
"""Scan an inactive document for meta data.
|
||||
"""
|
||||
for aLine in theText.splitlines():
|
||||
if aLine.startswith("#"):
|
||||
hDepth, _ = self._splitHeading(aLine)
|
||||
if hDepth != "H0":
|
||||
theItem.setMainHeading(hDepth)
|
||||
break
|
||||
return
|
||||
|
||||
##
|
||||
# Internal Indexer Helpers
|
||||
##
|
||||
def _splitHeading(self, aLine):
|
||||
"""Split a heading into its header level and text value.
|
||||
"""
|
||||
if aLine.startswith("# "):
|
||||
return "H1", aLine[2:].strip()
|
||||
elif aLine.startswith("## "):
|
||||
return "H2", aLine[3:].strip()
|
||||
elif aLine.startswith("### "):
|
||||
return "H3", aLine[4:].strip()
|
||||
elif aLine.startswith("#### "):
|
||||
return "H4", aLine[5:].strip()
|
||||
elif aLine.startswith("#! "):
|
||||
return "H1", aLine[3:].strip()
|
||||
elif aLine.startswith("##! "):
|
||||
return "H2", aLine[4:].strip()
|
||||
return "H0", ""
|
||||
|
||||
def _indexTitle(self, tHandle, aLine, nTitle):
|
||||
"""Save information about the title and its location in the
|
||||
file to the index.
|
||||
"""
|
||||
if aLine.startswith("# "):
|
||||
hDepth = "H1"
|
||||
hText = aLine[2:].strip()
|
||||
elif aLine.startswith("## "):
|
||||
hDepth = "H2"
|
||||
hText = aLine[3:].strip()
|
||||
elif aLine.startswith("### "):
|
||||
hDepth = "H3"
|
||||
hText = aLine[4:].strip()
|
||||
elif aLine.startswith("#### "):
|
||||
hDepth = "H4"
|
||||
hText = aLine[5:].strip()
|
||||
elif aLine.startswith("#! "):
|
||||
hDepth = "H1"
|
||||
hText = aLine[3:].strip()
|
||||
elif aLine.startswith("##! "):
|
||||
hDepth = "H2"
|
||||
hText = aLine[4:].strip()
|
||||
else:
|
||||
hDepth, hText = self._splitHeading(aLine)
|
||||
if hDepth == "H0":
|
||||
return False
|
||||
|
||||
sTitle = f"T{nTitle:06d}"
|
||||
self._itemIndex.addItemHeading(tHandle, sTitle, hDepth, hText)
|
||||
|
||||
return True
|
||||
|
||||
def _indexWordCounts(self, tHandle, theText, nTitle):
|
||||
@@ -493,11 +517,6 @@ class NWIndex:
|
||||
for sTitle, hItem in self._itemIndex.iterItemHeaders(tHandle)
|
||||
]
|
||||
|
||||
def getHandleHeaderLevel(self, tHandle):
|
||||
"""Get the header level of the first header of a handle.
|
||||
"""
|
||||
return self._itemIndex.mainItemHeader(tHandle)
|
||||
|
||||
def getTableOfContents(self, rootHandle, maxDepth, skipExcl=True):
|
||||
"""Generate a table of contents up to a maximum depth.
|
||||
"""
|
||||
@@ -757,13 +776,6 @@ class ItemIndex:
|
||||
self._items[tHandle] = IndexItem(tHandle, tItem)
|
||||
return
|
||||
|
||||
def mainItemHeader(self, tHandle):
|
||||
"""Return the primary item header for an item.
|
||||
"""
|
||||
if tHandle in self._items:
|
||||
return self._items[tHandle].level
|
||||
return "H0"
|
||||
|
||||
def allItemTags(self, tHandle):
|
||||
"""Get all tags set for headings of an item.
|
||||
"""
|
||||
@@ -823,7 +835,6 @@ class ItemIndex:
|
||||
"""
|
||||
if tHandle in self._items:
|
||||
tItem = self._items[tHandle]
|
||||
tItem.updateLevel(hDepth)
|
||||
tItem.addHeading(IndexHeading(sTitle, hDepth, hText))
|
||||
return
|
||||
|
||||
@@ -899,7 +910,6 @@ class IndexItem:
|
||||
def __init__(self, tHandle, tItem):
|
||||
self._handle = tHandle
|
||||
self._item = tItem
|
||||
self._level = "H0"
|
||||
self._headings = {}
|
||||
self._index = 0
|
||||
|
||||
@@ -919,21 +929,10 @@ class IndexItem:
|
||||
def item(self):
|
||||
return self._item
|
||||
|
||||
@property
|
||||
def level(self):
|
||||
return self._level
|
||||
|
||||
##
|
||||
# Setters
|
||||
##
|
||||
|
||||
def updateLevel(self, level):
|
||||
"""Set the level only if it has not already been set.
|
||||
"""
|
||||
if self._level == "H0":
|
||||
self._level = level
|
||||
return
|
||||
|
||||
def addHeading(self, tHeading):
|
||||
"""Add a heading to the item. Also remove the placeholder entry
|
||||
if it exists.
|
||||
@@ -1013,7 +1012,7 @@ class IndexItem:
|
||||
if hRefs:
|
||||
refs[sTitle] = hRefs
|
||||
|
||||
data = {"level": self._level}
|
||||
data = {}
|
||||
data["headings"] = heads
|
||||
if refs:
|
||||
data["references"] = refs
|
||||
@@ -1023,7 +1022,6 @@ class IndexItem:
|
||||
def unpackData(self, data):
|
||||
"""Unpack an item entry from the data.
|
||||
"""
|
||||
self._level = data.get("level", "H0")
|
||||
references = data.get("references", {})
|
||||
for sTitle, hData in data.get("headings", {}).items():
|
||||
if not isTitleTag(sTitle):
|
||||
@@ -1032,6 +1030,7 @@ class IndexItem:
|
||||
tHeading.unpackData(hData)
|
||||
tHeading.unpackReferences(references.get(sTitle, {}))
|
||||
self.addHeading(tHeading)
|
||||
|
||||
return
|
||||
|
||||
# END Class IndexItem
|
||||
|
||||
+25
-11
@@ -31,7 +31,7 @@ from novelwriter.enum import nwItemType, nwItemClass, nwItemLayout
|
||||
from novelwriter.common import (
|
||||
checkInt, isHandle, isItemClass, isItemLayout, isItemType, simplified
|
||||
)
|
||||
from novelwriter.constants import nwLabels, trConst
|
||||
from novelwriter.constants import nwHeaders, nwLabels, trConst
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -56,11 +56,12 @@ class NWItem:
|
||||
self._exported = True
|
||||
|
||||
# Document Meta Data
|
||||
self._charCount = 0 # Current character count
|
||||
self._wordCount = 0 # Current word count
|
||||
self._paraCount = 0 # Current paragraph count
|
||||
self._cursorPos = 0 # Last cursor position
|
||||
self._initCount = 0 # Initial word count
|
||||
self._heading = "H0" # The main heading
|
||||
self._charCount = 0 # Current character count
|
||||
self._wordCount = 0 # Current word count
|
||||
self._paraCount = 0 # Current paragraph count
|
||||
self._cursorPos = 0 # Last cursor position
|
||||
self._initCount = 0 # Initial word count
|
||||
|
||||
return
|
||||
|
||||
@@ -122,6 +123,10 @@ class NWItem:
|
||||
def isExported(self):
|
||||
return self._exported
|
||||
|
||||
@property
|
||||
def mainHeading(self):
|
||||
return self._heading
|
||||
|
||||
@property
|
||||
def charCount(self):
|
||||
return self._charCount
|
||||
@@ -162,6 +167,7 @@ class NWItem:
|
||||
metaAttrib = {}
|
||||
metaAttrib["expanded"] = str(self._expanded)
|
||||
if self._type == nwItemType.FILE:
|
||||
metaAttrib["mainHeading"] = str(self._heading)
|
||||
metaAttrib["charCount"] = str(self._charCount)
|
||||
metaAttrib["wordCount"] = str(self._wordCount)
|
||||
metaAttrib["paraCount"] = str(self._paraCount)
|
||||
@@ -202,6 +208,7 @@ class NWItem:
|
||||
for xValue in xItem:
|
||||
if xValue.tag == "meta":
|
||||
self.setExpanded(xValue.attrib.get("expanded", False))
|
||||
self.setMainHeading(xValue.attrib.get("mainHeading", "H0"))
|
||||
self.setCharCount(xValue.attrib.get("charCount", 0))
|
||||
self.setWordCount(xValue.attrib.get("wordCount", 0))
|
||||
self.setParaCount(xValue.attrib.get("paraCount", 0))
|
||||
@@ -269,7 +276,7 @@ class NWItem:
|
||||
# Lookup Methods
|
||||
##
|
||||
|
||||
def describeMe(self, hLevel=None):
|
||||
def describeMe(self):
|
||||
"""Return a string description of the item.
|
||||
"""
|
||||
descKey = "none"
|
||||
@@ -279,13 +286,13 @@ class NWItem:
|
||||
descKey = "folder"
|
||||
elif self._type == nwItemType.FILE:
|
||||
if self._layout == nwItemLayout.DOCUMENT:
|
||||
if hLevel == "H1":
|
||||
if self._heading == "H1":
|
||||
descKey = "doc_h1"
|
||||
elif hLevel == "H2":
|
||||
elif self._heading == "H2":
|
||||
descKey = "doc_h2"
|
||||
elif hLevel == "H3":
|
||||
elif self._heading == "H3":
|
||||
descKey = "doc_h3"
|
||||
elif hLevel == "H4":
|
||||
elif self._heading == "H4":
|
||||
descKey = "doc_h4"
|
||||
else:
|
||||
descKey = "document"
|
||||
@@ -511,6 +518,13 @@ class NWItem:
|
||||
# Set Document Meta Data
|
||||
##
|
||||
|
||||
def setMainHeading(self, value):
|
||||
"""Set the main heading level.
|
||||
"""
|
||||
if value in nwHeaders.H_LEVEL:
|
||||
self._heading = value
|
||||
return
|
||||
|
||||
def setCharCount(self, count):
|
||||
"""Set the character count, and ensure that it is an integer.
|
||||
"""
|
||||
|
||||
@@ -155,9 +155,8 @@ class GuiDocMerge(QDialog):
|
||||
if nwItem is None or not nwItem.isFileType():
|
||||
continue
|
||||
|
||||
hLevel = self.theProject.index.getHandleHeaderLevel(tHandle)
|
||||
itemIcon = self.mainTheme.getItemIcon(
|
||||
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel
|
||||
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, nwItem.mainHeading
|
||||
)
|
||||
|
||||
newItem = QListWidgetItem()
|
||||
|
||||
@@ -508,9 +508,9 @@ class GuiDocEditor(QTextEdit):
|
||||
|
||||
self.setDocumentChanged(False)
|
||||
|
||||
oldHeader = self.theProject.index.getHandleHeaderLevel(tHandle)
|
||||
oldHeader = self._nwItem.mainHeading
|
||||
self.theProject.index.scanText(tHandle, docText)
|
||||
newHeader = self.theProject.index.getHandleHeaderLevel(tHandle)
|
||||
newHeader = self._nwItem.mainHeading
|
||||
|
||||
# ToDo: This should be a signal
|
||||
if self._updateHeaders(checkLevel=True):
|
||||
@@ -2972,8 +2972,7 @@ class GuiDocEditFooter(QWidget):
|
||||
else:
|
||||
theStatus, theIcon = self._theItem.getImportStatus()
|
||||
sIcon = theIcon.pixmap(self.sPx, self.sPx)
|
||||
hLevel = self.theProject.index.getHandleHeaderLevel(self._docHandle)
|
||||
sText = f"{theStatus} / {self._theItem.describeMe(hLevel)}"
|
||||
sText = f"{theStatus} / {self._theItem.describeMe()}"
|
||||
|
||||
self.statusIcon.setPixmap(sIcon)
|
||||
self.statusText.setText(sText)
|
||||
|
||||
@@ -273,12 +273,11 @@ class GuiItemDetails(QWidget):
|
||||
# Layout
|
||||
# ======
|
||||
|
||||
hLevel = self.theProject.index.getHandleHeaderLevel(tHandle)
|
||||
usageIcon = self.mainTheme.getItemIcon(
|
||||
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel
|
||||
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, nwItem.mainHeading
|
||||
)
|
||||
self.usageIcon.setPixmap(usageIcon.pixmap(iPx, iPx))
|
||||
self.usageData.setText(nwItem.describeMe(hLevel))
|
||||
self.usageData.setText(nwItem.describeMe())
|
||||
|
||||
# Counts
|
||||
# ======
|
||||
|
||||
@@ -685,7 +685,6 @@ class GuiOutlineTree(QTreeWidget):
|
||||
for _, tHandle, sTitle, novIdx in novStruct:
|
||||
|
||||
iLevel = nwHeaders.H_LEVEL.get(novIdx.level, 0)
|
||||
dLevel = self.theProject.index.getHandleHeaderLevel(tHandle)
|
||||
if iLevel == 0:
|
||||
continue
|
||||
|
||||
@@ -699,7 +698,7 @@ class GuiOutlineTree(QTreeWidget):
|
||||
trItem.setData(self._colIdx[nwOutline.TITLE], self.D_TITLE, sTitle)
|
||||
trItem.setFont(self._colIdx[nwOutline.TITLE], self._hFonts[iLevel])
|
||||
trItem.setText(self._colIdx[nwOutline.LEVEL], novIdx.level)
|
||||
trItem.setIcon(self._colIdx[nwOutline.LABEL], self._dIcon[dLevel])
|
||||
trItem.setIcon(self._colIdx[nwOutline.LABEL], self._dIcon[nwItem.mainHeading])
|
||||
trItem.setText(self._colIdx[nwOutline.LABEL], nwItem.itemName)
|
||||
trItem.setText(self._colIdx[nwOutline.LINE], sTitle[1:].lstrip("0"))
|
||||
trItem.setText(self._colIdx[nwOutline.SYNOP], novIdx.synopsis)
|
||||
|
||||
@@ -516,7 +516,7 @@ class GuiProjectTree(QTreeWidget):
|
||||
# Collect some information about the selected item that
|
||||
pItem = self.theProject.tree[sHandle]
|
||||
qItem = self._getTreeItem(sHandle)
|
||||
sLevel = nwHeaders.H_LEVEL.get(self.theProject.index.getHandleHeaderLevel(sHandle), 0)
|
||||
sLevel = nwHeaders.H_LEVEL.get(pItem.mainHeading, 0)
|
||||
sIsParent = False if qItem is None else qItem.childCount() > 0
|
||||
|
||||
if self.theProject.tree.isTrash(sHandle):
|
||||
@@ -897,7 +897,7 @@ class GuiProjectTree(QTreeWidget):
|
||||
return
|
||||
|
||||
itemStatus, statusIcon = nwItem.getImportStatus()
|
||||
hLevel = self.theProject.index.getHandleHeaderLevel(tHandle)
|
||||
hLevel = nwItem.mainHeading
|
||||
itemIcon = self.mainTheme.getItemIcon(
|
||||
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel
|
||||
)
|
||||
|
||||
+22
-22
@@ -1,13 +1,13 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-15 12:12:59">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 20:17:35">
|
||||
<project>
|
||||
<name>Sample Project</name>
|
||||
<title>Sample Project</title>
|
||||
<author>Jane Smith</author>
|
||||
<author>Jay Doh</author>
|
||||
<saveCount>1382</saveCount>
|
||||
<saveCount>1383</saveCount>
|
||||
<autoCount>236</autoCount>
|
||||
<editTime>69339</editTime>
|
||||
<editTime>69344</editTime>
|
||||
</project>
|
||||
<settings>
|
||||
<doBackup>False</doBackup>
|
||||
@@ -55,43 +55,43 @@
|
||||
<name status="sc24b8f" import="ia857f0">Novel</name>
|
||||
</item>
|
||||
<item handle="53b69b83cdafc" parent="7031beac91f75" root="7031beac91f75" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="93" wordCount="19" paraCount="2" cursorPos="119"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="93" wordCount="19" paraCount="2" cursorPos="119"/>
|
||||
<name status="sc24b8f" import="ia857f0" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="974e400180a99" parent="7031beac91f75" root="7031beac91f75" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="251" wordCount="50" paraCount="2" cursorPos="277"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="251" wordCount="50" paraCount="2" cursorPos="277"/>
|
||||
<name status="sf12341" import="ia857f0" exported="True">Page</name>
|
||||
</item>
|
||||
<item handle="edca4be2fcaf8" parent="7031beac91f75" root="7031beac91f75" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="26" wordCount="6" paraCount="1" cursorPos="36"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="26" wordCount="6" paraCount="1" cursorPos="36"/>
|
||||
<name status="s90e6c9" import="ia857f0" exported="True">Part One</name>
|
||||
</item>
|
||||
<item handle="6a2d6d5f4f401" parent="7031beac91f75" root="7031beac91f75" order="3" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="True" charCount="95" wordCount="18" paraCount="1" cursorPos="291"/>
|
||||
<meta expanded="True" mainHeading="H2" charCount="95" wordCount="18" paraCount="1" cursorPos="291"/>
|
||||
<name status="sf24ce6" import="ia857f0" exported="True">Chapter One</name>
|
||||
</item>
|
||||
<item handle="636b6aa9b697b" parent="6a2d6d5f4f401" root="7031beac91f75" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="2687" wordCount="479" paraCount="14" cursorPos="67"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="2687" wordCount="479" paraCount="14" cursorPos="67"/>
|
||||
<name status="s90e6c9" import="ia857f0" exported="True">Making a Scene</name>
|
||||
</item>
|
||||
<item handle="bc0cbd2a407f3" parent="6a2d6d5f4f401" root="7031beac91f75" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="548" wordCount="108" paraCount="3" cursorPos="465"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="548" wordCount="108" paraCount="3" cursorPos="465"/>
|
||||
<name status="s90e6c9" import="ia857f0" exported="True">Another Scene</name>
|
||||
</item>
|
||||
<item handle="ba8a28a246524" parent="7031beac91f75" root="7031beac91f75" order="4" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="617" wordCount="101" paraCount="3" cursorPos="310"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="617" wordCount="101" paraCount="3" cursorPos="310"/>
|
||||
<name status="s78ea90" import="ia857f0" exported="True">Interlude</name>
|
||||
</item>
|
||||
<item handle="96b68994dfa3d" parent="7031beac91f75" root="7031beac91f75" order="5" type="FILE" class="NOVEL" layout="NOTE">
|
||||
<meta expanded="False" charCount="1909" wordCount="346" paraCount="7" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="1909" wordCount="346" paraCount="7" cursorPos="0"/>
|
||||
<name status="sf24ce6" import="ia857f0" exported="False">A Note on Structure</name>
|
||||
</item>
|
||||
<item handle="88706ddc78b1b" parent="7031beac91f75" root="7031beac91f75" order="6" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="True" charCount="139" wordCount="28" paraCount="1" cursorPos="188"/>
|
||||
<meta expanded="True" mainHeading="H2" charCount="139" wordCount="28" paraCount="1" cursorPos="188"/>
|
||||
<name status="s90e6c9" import="ia857f0" exported="True">Chapter Two</name>
|
||||
</item>
|
||||
<item handle="ae7339df26ded" parent="88706ddc78b1b" root="7031beac91f75" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="189" wordCount="37" paraCount="1" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="189" wordCount="37" paraCount="1" cursorPos="0"/>
|
||||
<name status="s90e6c9" import="ia857f0" exported="True">We Found John!</name>
|
||||
</item>
|
||||
<item handle="e5e47ebf63b1c" parent="None" root="e5e47ebf63b1c" order="1" type="ROOT" class="NOVEL">
|
||||
@@ -99,11 +99,11 @@
|
||||
<name status="sf12341" import="ia857f0">Sequel</name>
|
||||
</item>
|
||||
<item handle="bacb7059e3083" parent="e5e47ebf63b1c" root="e5e47ebf63b1c" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="27" wordCount="5" paraCount="1" cursorPos="100"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="27" wordCount="5" paraCount="1" cursorPos="100"/>
|
||||
<name status="sc24b8f" import="ia857f0" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="a520879ca0b45" parent="e5e47ebf63b1c" root="e5e47ebf63b1c" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="299" wordCount="55" paraCount="2" cursorPos="104"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="299" wordCount="55" paraCount="2" cursorPos="104"/>
|
||||
<name status="s90e6c9" import="ia857f0" exported="True">Chapter One</name>
|
||||
</item>
|
||||
<item handle="f6622b4617424" parent="None" root="f6622b4617424" order="2" type="ROOT" class="CHARACTER">
|
||||
@@ -115,11 +115,11 @@
|
||||
<name status="sf12341" import="ia857f0">Main Characters</name>
|
||||
</item>
|
||||
<item handle="14298de4d9524" parent="f7e2d9f330615" root="f6622b4617424" order="0" type="FILE" class="CHARACTER" layout="NOTE">
|
||||
<meta expanded="False" charCount="49" wordCount="9" paraCount="1" cursorPos="24"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="49" wordCount="9" paraCount="1" cursorPos="24"/>
|
||||
<name status="sf12341" import="icfb3a5" exported="True">John Smith</name>
|
||||
</item>
|
||||
<item handle="bb2c23b3c42cc" parent="f7e2d9f330615" root="f6622b4617424" order="1" type="FILE" class="CHARACTER" layout="NOTE">
|
||||
<meta expanded="False" charCount="55" wordCount="9" paraCount="1" cursorPos="25"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="55" wordCount="9" paraCount="1" cursorPos="25"/>
|
||||
<name status="sf12341" import="i2d7a54" exported="True">Jane Smith</name>
|
||||
</item>
|
||||
<item handle="15c4492bd5107" parent="None" root="15c4492bd5107" order="3" type="ROOT" class="WORLD">
|
||||
@@ -127,15 +127,15 @@
|
||||
<name status="sf12341" import="ia857f0">Locations</name>
|
||||
</item>
|
||||
<item handle="b3e74dbc1f584" parent="15c4492bd5107" root="15c4492bd5107" order="0" type="FILE" class="WORLD" layout="NOTE">
|
||||
<meta expanded="False" charCount="76" wordCount="15" paraCount="1" cursorPos="20"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="76" wordCount="15" paraCount="1" cursorPos="20"/>
|
||||
<name status="sf12341" import="i56be10" exported="True">Earth</name>
|
||||
</item>
|
||||
<item handle="f1471bef9f2ae" parent="15c4492bd5107" root="15c4492bd5107" order="1" type="FILE" class="WORLD" layout="NOTE">
|
||||
<meta expanded="False" charCount="115" wordCount="24" paraCount="1" cursorPos="133"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="115" wordCount="24" paraCount="1" cursorPos="133"/>
|
||||
<name status="sf12341" import="icfb3a5" exported="True">Space</name>
|
||||
</item>
|
||||
<item handle="5eaea4e8cdee8" parent="15c4492bd5107" root="15c4492bd5107" order="2" type="FILE" class="WORLD" layout="NOTE">
|
||||
<meta expanded="False" charCount="28" wordCount="6" paraCount="1" cursorPos="45"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="28" wordCount="6" paraCount="1" cursorPos="45"/>
|
||||
<name status="sf12341" import="i2d7a54" exported="True">Mars</name>
|
||||
</item>
|
||||
<item handle="6827118336ac1" parent="None" root="6827118336ac1" order="4" type="ROOT" class="ARCHIVE">
|
||||
@@ -147,7 +147,7 @@
|
||||
<name status="sf12341" import="ia857f0">Scenes</name>
|
||||
</item>
|
||||
<item handle="8a5deb88c0e97" parent="ae9bf3c3ea159" root="6827118336ac1" order="0" type="FILE" class="ARCHIVE" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="232" wordCount="42" paraCount="1" cursorPos="239"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="232" wordCount="42" paraCount="1" cursorPos="239"/>
|
||||
<name status="s90e6c9" import="ia857f0" exported="True">Old File</name>
|
||||
</item>
|
||||
<item handle="98acd8c76c93a" parent="None" root="98acd8c76c93a" order="5" type="ROOT" class="TRASH">
|
||||
@@ -155,7 +155,7 @@
|
||||
<name status="sf12341" import="ia857f0">Trash</name>
|
||||
</item>
|
||||
<item handle="b8136a5a774a0" parent="98acd8c76c93a" root="98acd8c76c93a" order="0" type="FILE" class="TRASH" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="30" wordCount="6" paraCount="1" cursorPos="36"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="30" wordCount="6" paraCount="1" cursorPos="36"/>
|
||||
<name status="sf12341" import="ia857f0" exported="True">Delete Me!</name>
|
||||
</item>
|
||||
</content>
|
||||
|
||||
+18
-18
@@ -1,12 +1,12 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-23 15:34:13">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 21:17:31">
|
||||
<project>
|
||||
<name>Lorem Ipsum</name>
|
||||
<title>Lorem Ipsum</title>
|
||||
<author>lipsum.com</author>
|
||||
<saveCount>26</saveCount>
|
||||
<saveCount>28</saveCount>
|
||||
<autoCount>24</autoCount>
|
||||
<editTime>1863</editTime>
|
||||
<editTime>1874</editTime>
|
||||
</project>
|
||||
<settings>
|
||||
<doBackup>False</doBackup>
|
||||
@@ -50,19 +50,19 @@
|
||||
<name status="sbaa94f" import="i613591">Novel</name>
|
||||
</item>
|
||||
<item handle="7a992350f3eb6" parent="b3643d0f92e32" root="b3643d0f92e32" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="230" wordCount="40" paraCount="3" cursorPos="148"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="230" wordCount="40" paraCount="3" cursorPos="148"/>
|
||||
<name status="sedd043" import="i613591" exported="True">Lorem Ipsum</name>
|
||||
</item>
|
||||
<item handle="8c58a65414c23" parent="b3643d0f92e32" root="b3643d0f92e32" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="1058" wordCount="176" paraCount="2" cursorPos="43"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="1058" wordCount="176" paraCount="2" cursorPos="43"/>
|
||||
<name status="sedd043" import="i613591" exported="True">Front Matter</name>
|
||||
</item>
|
||||
<item handle="88d59a277361b" parent="b3643d0f92e32" root="b3643d0f92e32" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="584" wordCount="92" paraCount="1" cursorPos="4"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="584" wordCount="92" paraCount="1" cursorPos="4"/>
|
||||
<name status="s92a87b" import="i613591" exported="True">Prologue</name>
|
||||
</item>
|
||||
<item handle="db7e733775d4d" parent="b3643d0f92e32" root="b3643d0f92e32" order="3" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="35" wordCount="6" paraCount="1" cursorPos="42"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="35" wordCount="6" paraCount="1" cursorPos="42"/>
|
||||
<name status="sbaa94f" import="i613591" exported="True">Act One</name>
|
||||
</item>
|
||||
<item handle="45e6b01ca35c1" parent="b3643d0f92e32" root="b3643d0f92e32" order="4" type="FOLDER" class="NOVEL">
|
||||
@@ -70,19 +70,19 @@
|
||||
<name status="s92a87b" import="i613591">Chapter One</name>
|
||||
</item>
|
||||
<item handle="fb609cd8319dc" parent="45e6b01ca35c1" root="b3643d0f92e32" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="419" wordCount="67" paraCount="1" cursorPos="56"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="419" wordCount="67" paraCount="1" cursorPos="56"/>
|
||||
<name status="s92a87b" import="i613591" exported="True">Chapter One</name>
|
||||
</item>
|
||||
<item handle="88243afbe5ed8" parent="45e6b01ca35c1" root="b3643d0f92e32" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="2758" wordCount="404" paraCount="4" cursorPos="1528"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="2758" wordCount="404" paraCount="4" cursorPos="1528"/>
|
||||
<name status="sedd043" import="i613591" exported="True">Scene One</name>
|
||||
</item>
|
||||
<item handle="f96ec11c6a3da" parent="45e6b01ca35c1" root="b3643d0f92e32" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="4043" wordCount="600" paraCount="6" cursorPos="2335"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="4043" wordCount="600" paraCount="6" cursorPos="2335"/>
|
||||
<name status="sedd043" import="i613591" exported="True">Scene Two</name>
|
||||
</item>
|
||||
<item handle="846352075de7d" parent="b3643d0f92e32" root="b3643d0f92e32" order="5" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="631" wordCount="109" paraCount="3" cursorPos="376"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="631" wordCount="109" paraCount="3" cursorPos="376"/>
|
||||
<name status="sbaa94f" import="i613591" exported="False">Interlude</name>
|
||||
</item>
|
||||
<item handle="6bd935d2490cd" parent="b3643d0f92e32" root="b3643d0f92e32" order="6" type="FOLDER" class="NOVEL">
|
||||
@@ -90,19 +90,19 @@
|
||||
<name status="s92a87b" import="i613591">Chapter Two</name>
|
||||
</item>
|
||||
<item handle="441420a886d82" parent="6bd935d2490cd" root="b3643d0f92e32" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="477" wordCount="70" paraCount="1" cursorPos="56"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="477" wordCount="70" paraCount="1" cursorPos="56"/>
|
||||
<name status="s92a87b" import="i613591" exported="True">Chapter Two</name>
|
||||
</item>
|
||||
<item handle="eb103bc70c90c" parent="6bd935d2490cd" root="b3643d0f92e32" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="3006" wordCount="439" paraCount="4" cursorPos="57"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="3006" wordCount="439" paraCount="4" cursorPos="57"/>
|
||||
<name status="sedd043" import="i613591" exported="True">Scene Three</name>
|
||||
</item>
|
||||
<item handle="f8c0562e50f1b" parent="6bd935d2490cd" root="b3643d0f92e32" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="3839" wordCount="563" paraCount="6" cursorPos="56"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="3839" wordCount="563" paraCount="6" cursorPos="56"/>
|
||||
<name status="sedd043" import="i613591" exported="True">Scene Four</name>
|
||||
</item>
|
||||
<item handle="47666c91c7ccf" parent="6bd935d2490cd" root="b3643d0f92e32" order="3" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="3644" wordCount="543" paraCount="5" cursorPos="351"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="3644" wordCount="543" paraCount="5" cursorPos="351"/>
|
||||
<name status="sedd043" import="i613591" exported="True">Scene Five</name>
|
||||
</item>
|
||||
<item handle="67a8707f2f249" parent="None" root="67a8707f2f249" order="1" type="ROOT" class="CHARACTER">
|
||||
@@ -110,7 +110,7 @@
|
||||
<name status="sbaa94f" import="i613591">Characters</name>
|
||||
</item>
|
||||
<item handle="4c4f28287af27" parent="67a8707f2f249" root="67a8707f2f249" order="0" type="FILE" class="CHARACTER" layout="NOTE">
|
||||
<meta expanded="False" charCount="1864" wordCount="284" paraCount="3" cursorPos="1883"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="1864" wordCount="284" paraCount="3" cursorPos="1883"/>
|
||||
<name status="sbaa94f" import="i613591" exported="True">Mr. Nobody</name>
|
||||
</item>
|
||||
<item handle="6c6afb1247750" parent="None" root="6c6afb1247750" order="2" type="ROOT" class="PLOT">
|
||||
@@ -118,7 +118,7 @@
|
||||
<name status="sbaa94f" import="i613591">Plot</name>
|
||||
</item>
|
||||
<item handle="2426c6f0ca922" parent="6c6afb1247750" root="6c6afb1247750" order="0" type="FILE" class="PLOT" layout="NOTE">
|
||||
<meta expanded="False" charCount="1369" wordCount="195" paraCount="2" cursorPos="1387"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="1369" wordCount="195" paraCount="2" cursorPos="1387"/>
|
||||
<name status="sbaa94f" import="i613591" exported="True">Main</name>
|
||||
</item>
|
||||
<item handle="60bdf227455cc" parent="None" root="60bdf227455cc" order="3" type="ROOT" class="WORLD">
|
||||
@@ -126,7 +126,7 @@
|
||||
<name status="sbaa94f" import="i613591">World</name>
|
||||
</item>
|
||||
<item handle="04468803b92e1" parent="60bdf227455cc" root="60bdf227455cc" order="0" type="FILE" class="WORLD" layout="NOTE">
|
||||
<meta expanded="False" charCount="1770" wordCount="259" paraCount="3" cursorPos="1792"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="1770" wordCount="259" paraCount="3" cursorPos="1792"/>
|
||||
<name status="sbaa94f" import="i613591" exported="True">Ancient Europe</name>
|
||||
</item>
|
||||
</content>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-23 15:34:21">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 20:32:06">
|
||||
<project>
|
||||
<name>Test Minimal</name>
|
||||
<title>Minimal</title>
|
||||
<author>Jane Doe</author>
|
||||
<author>John Doh</author>
|
||||
<saveCount>17</saveCount>
|
||||
<saveCount>19</saveCount>
|
||||
<autoCount>2</autoCount>
|
||||
<editTime>150</editTime>
|
||||
<editTime>167</editTime>
|
||||
</project>
|
||||
<settings>
|
||||
<doBackup>True</doBackup>
|
||||
@@ -16,7 +16,7 @@
|
||||
<spellLang>None</spellLang>
|
||||
<lastEdited>None</lastEdited>
|
||||
<lastViewed>None</lastViewed>
|
||||
<lastNovel>None</lastNovel>
|
||||
<lastNovel>a508bb932959c</lastNovel>
|
||||
<lastOutline>None</lastOutline>
|
||||
<lastWordCount>10</lastWordCount>
|
||||
<novelWordCount>10</novelWordCount>
|
||||
@@ -48,7 +48,7 @@
|
||||
<name status="s72322d" import="iffcacb">Novel</name>
|
||||
</item>
|
||||
<item handle="a35baf2e93843" parent="a508bb932959c" root="a508bb932959c" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="28" wordCount="6" paraCount="1" cursorPos="33"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="28" wordCount="6" paraCount="1" cursorPos="33"/>
|
||||
<name status="s72322d" import="iffcacb" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="a6d311a93600a" parent="a508bb932959c" root="a508bb932959c" order="1" type="FOLDER" class="NOVEL">
|
||||
@@ -56,11 +56,11 @@
|
||||
<name status="s72322d" import="iffcacb">New Chapter</name>
|
||||
</item>
|
||||
<item handle="f5ab3e30151e1" parent="a6d311a93600a" root="a508bb932959c" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="11" wordCount="2" paraCount="0" cursorPos="16"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="11" wordCount="2" paraCount="0" cursorPos="16"/>
|
||||
<name status="s72322d" import="iffcacb" exported="True">New Chapter</name>
|
||||
</item>
|
||||
<item handle="8c659a11cd429" parent="a6d311a93600a" root="a508bb932959c" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="9" wordCount="2" paraCount="0" cursorPos="15"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="9" wordCount="2" paraCount="0" cursorPos="15"/>
|
||||
<name status="s72322d" import="iffcacb" exported="True">New Scene</name>
|
||||
</item>
|
||||
<item handle="7695ce551d265" parent="None" root="7695ce551d265" order="1" type="ROOT" class="PLOT">
|
||||
|
||||
@@ -7,7 +7,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc maximus justo non
|
||||
|
||||
Nullam laoreet lorem nec malesuada vehicula. Vivamus tempus sodales lectus sed viverra. Aenean lacinia sollicitudin quam, quis tempus eros suscipit id. Duis sed rutrum nisi, ut pulvinar magna. Nam et cursus tortor. Phasellus ac odio tellus. Nullam in iaculis ipsum. Vivamus ante sem, ultricies sed varius quis, tristique nec tellus. Nullam eu urna vitae lacus hendrerit gravida. Quisque pulvinar erat ex, id efficitur velit sodales vitae. Proin vestibulum, sapien eget mattis euismod, tortor quam viverra risus, at congue mauris tortor eu nunc. Mauris pellentesque elit leo, quis eleifend sem placerat a. Vivamus iaculis dui eget tellus volutpat, ac varius nisi facilisis.
|
||||
|
||||
% Merge Novel Document: Scene 1.1 [New]
|
||||
% Merge Novel Scene: Scene 1.1 [New]
|
||||
|
||||
### Scene 1.1
|
||||
|
||||
@@ -15,7 +15,7 @@ Nullam laoreet lorem nec malesuada vehicula. Vivamus tempus sodales lectus sed v
|
||||
|
||||
Nullam a nisl magna. Praesent commodo nec diam aliquet vestibulum. In sapien velit, sodales feugiat porta ut, rhoncus a elit. Quisque egestas nisi eu eros laoreet, quis facilisis est pretium. Nullam bibendum sed tellus nec lobortis. Duis elit massa, volutpat a lacinia a, ullamcorper in dui. Suspendisse ac laoreet dui. Curabitur elementum, tortor elementum ultricies laoreet, nunc massa vulputate augue, vitae tincidunt nunc enim eget nisl.
|
||||
|
||||
% Merge Novel Document: Scene 1.2 [New]
|
||||
% Merge Novel Scene: Scene 1.2 [New]
|
||||
|
||||
### Scene 1.2
|
||||
|
||||
@@ -23,7 +23,7 @@ Nullam a nisl magna. Praesent commodo nec diam aliquet vestibulum. In sapien vel
|
||||
|
||||
Pellentesque nibh urna, volutpat et feugiat porta, rutrum sed lectus. Aliquam eget risus id orci tincidunt condimentum et sit amet purus. Curabitur tincidunt odio vel ante feugiat feugiat. Proin nunc lorem, molestie a sapien et, varius elementum nunc. Donec non fermentum nisl. In et massa placerat, faucibus felis eu, congue nisi. Proin sed tortor non lorem mattis cursus. Vestibulum magna neque, bibendum vel nibh et, tincidunt rhoncus nisi. Duis pulvinar mi a quam rutrum maximus. Nunc sollicitudin, urna in cursus facilisis, augue neque imperdiet metus, ac finibus lorem ante id nulla. Sed maximus eleifend justo id feugiat. Cras eget diam vel est blandit tempor nec a leo. Mauris risus est, fringilla in aliquam a, sagittis vel enim. Nullam sodales id erat placerat lobortis.
|
||||
|
||||
% Merge Novel Document: Scene 1.3 [New]
|
||||
% Merge Novel Scene: Scene 1.3 [New]
|
||||
|
||||
### Scene 1.3
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
%%~name: All of Chapter 1
|
||||
%%~path: 0000000000008/0000000000014
|
||||
%%~kind: NOVEL/DOCUMENT
|
||||
% Merge Novel Document: Chapter 1 [New]
|
||||
% Merge Novel Chapter: Chapter 1 [New]
|
||||
|
||||
## Chapter 1
|
||||
|
||||
@@ -9,7 +9,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc maximus justo non
|
||||
|
||||
Nullam laoreet lorem nec malesuada vehicula. Vivamus tempus sodales lectus sed viverra. Aenean lacinia sollicitudin quam, quis tempus eros suscipit id. Duis sed rutrum nisi, ut pulvinar magna. Nam et cursus tortor. Phasellus ac odio tellus. Nullam in iaculis ipsum. Vivamus ante sem, ultricies sed varius quis, tristique nec tellus. Nullam eu urna vitae lacus hendrerit gravida. Quisque pulvinar erat ex, id efficitur velit sodales vitae. Proin vestibulum, sapien eget mattis euismod, tortor quam viverra risus, at congue mauris tortor eu nunc. Mauris pellentesque elit leo, quis eleifend sem placerat a. Vivamus iaculis dui eget tellus volutpat, ac varius nisi facilisis.
|
||||
|
||||
% Merge Novel Document: Scene 1.1 [New]
|
||||
% Merge Novel Scene: Scene 1.1 [New]
|
||||
|
||||
### Scene 1.1
|
||||
|
||||
@@ -17,7 +17,7 @@ Nullam laoreet lorem nec malesuada vehicula. Vivamus tempus sodales lectus sed v
|
||||
|
||||
Nullam a nisl magna. Praesent commodo nec diam aliquet vestibulum. In sapien velit, sodales feugiat porta ut, rhoncus a elit. Quisque egestas nisi eu eros laoreet, quis facilisis est pretium. Nullam bibendum sed tellus nec lobortis. Duis elit massa, volutpat a lacinia a, ullamcorper in dui. Suspendisse ac laoreet dui. Curabitur elementum, tortor elementum ultricies laoreet, nunc massa vulputate augue, vitae tincidunt nunc enim eget nisl.
|
||||
|
||||
% Merge Novel Document: Scene 1.2 [New]
|
||||
% Merge Novel Scene: Scene 1.2 [New]
|
||||
|
||||
### Scene 1.2
|
||||
|
||||
@@ -25,7 +25,7 @@ Nullam a nisl magna. Praesent commodo nec diam aliquet vestibulum. In sapien vel
|
||||
|
||||
Pellentesque nibh urna, volutpat et feugiat porta, rutrum sed lectus. Aliquam eget risus id orci tincidunt condimentum et sit amet purus. Curabitur tincidunt odio vel ante feugiat feugiat. Proin nunc lorem, molestie a sapien et, varius elementum nunc. Donec non fermentum nisl. In et massa placerat, faucibus felis eu, congue nisi. Proin sed tortor non lorem mattis cursus. Vestibulum magna neque, bibendum vel nibh et, tincidunt rhoncus nisi. Duis pulvinar mi a quam rutrum maximus. Nunc sollicitudin, urna in cursus facilisis, augue neque imperdiet metus, ac finibus lorem ante id nulla. Sed maximus eleifend justo id feugiat. Cras eget diam vel est blandit tempor nec a leo. Mauris risus est, fringilla in aliquam a, sagittis vel enim. Nullam sodales id erat placerat lobortis.
|
||||
|
||||
% Merge Novel Document: Scene 1.3 [New]
|
||||
% Merge Novel Scene: Scene 1.3 [New]
|
||||
|
||||
### Scene 1.3
|
||||
|
||||
|
||||
@@ -6,31 +6,26 @@
|
||||
},
|
||||
"itemIndex": {
|
||||
"7a992350f3eb6": {
|
||||
"level": "H1",
|
||||
"headings": {
|
||||
"T000001": {"level": "H1", "title": "Lorem Ipsum", "tag": "", "cCount": 230, "wCount": 40, "pCount": 3, "synopsis": ""}
|
||||
}
|
||||
},
|
||||
"8c58a65414c23": {
|
||||
"level": "H0",
|
||||
"headings": {
|
||||
"T000000": {"level": "H0", "title": "", "tag": "", "cCount": 1058, "wCount": 176, "pCount": 2, "synopsis": ""}
|
||||
}
|
||||
},
|
||||
"88d59a277361b": {
|
||||
"level": "H2",
|
||||
"headings": {
|
||||
"T000001": {"level": "H2", "title": "Prologue", "tag": "", "cCount": 584, "wCount": 92, "pCount": 1, "synopsis": "Explanation from the lipsum.com website."}
|
||||
}
|
||||
},
|
||||
"db7e733775d4d": {
|
||||
"level": "H1",
|
||||
"headings": {
|
||||
"T000001": {"level": "H1", "title": "Act One", "tag": "", "cCount": 35, "wCount": 6, "pCount": 1, "synopsis": ""}
|
||||
}
|
||||
},
|
||||
"fb609cd8319dc": {
|
||||
"level": "H2",
|
||||
"headings": {
|
||||
"T000001": {"level": "H2", "title": "Chapter One", "tag": "", "cCount": 419, "wCount": 67, "pCount": 1, "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam."}
|
||||
},
|
||||
@@ -39,7 +34,6 @@
|
||||
}
|
||||
},
|
||||
"88243afbe5ed8": {
|
||||
"level": "H3",
|
||||
"headings": {
|
||||
"T000001": {"level": "H3", "title": "Scene One", "tag": "", "cCount": 1197, "wCount": 174, "pCount": 2, "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."},
|
||||
"T000013": {"level": "H4", "title": "Scene One, Section Two", "tag": "", "cCount": 1561, "wCount": 230, "pCount": 2, "synopsis": ""}
|
||||
@@ -49,7 +43,6 @@
|
||||
}
|
||||
},
|
||||
"f96ec11c6a3da": {
|
||||
"level": "H3",
|
||||
"headings": {
|
||||
"T000001": {"level": "H3", "title": "Scene Two", "tag": "", "cCount": 2034, "wCount": 299, "pCount": 3, "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."},
|
||||
"T000015": {"level": "H4", "title": "Scene Two, Section Two", "tag": "", "cCount": 2009, "wCount": 301, "pCount": 3, "synopsis": ""}
|
||||
@@ -59,13 +52,11 @@
|
||||
}
|
||||
},
|
||||
"846352075de7d": {
|
||||
"level": "H2",
|
||||
"headings": {
|
||||
"T000001": {"level": "H2", "title": "Why do we use it?", "tag": "", "cCount": 631, "wCount": 109, "pCount": 3, "synopsis": ""}
|
||||
}
|
||||
},
|
||||
"441420a886d82": {
|
||||
"level": "H2",
|
||||
"headings": {
|
||||
"T000001": {"level": "H2", "title": "Chapter Two", "tag": "", "cCount": 477, "wCount": 70, "pCount": 1, "synopsis": "Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue."}
|
||||
},
|
||||
@@ -74,7 +65,6 @@
|
||||
}
|
||||
},
|
||||
"eb103bc70c90c": {
|
||||
"level": "H3",
|
||||
"headings": {
|
||||
"T000001": {"level": "H3", "title": "Scene Three", "tag": "", "cCount": 3006, "wCount": 439, "pCount": 4, "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."}
|
||||
},
|
||||
@@ -83,7 +73,6 @@
|
||||
}
|
||||
},
|
||||
"f8c0562e50f1b": {
|
||||
"level": "H3",
|
||||
"headings": {
|
||||
"T000001": {"level": "H3", "title": "Scene Four", "tag": "", "cCount": 3839, "wCount": 563, "pCount": 6, "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."}
|
||||
},
|
||||
@@ -92,7 +81,6 @@
|
||||
}
|
||||
},
|
||||
"47666c91c7ccf": {
|
||||
"level": "H3",
|
||||
"headings": {
|
||||
"T000001": {"level": "H3", "title": "Scene Five", "tag": "", "cCount": 3644, "wCount": 543, "pCount": 5, "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."}
|
||||
},
|
||||
@@ -101,7 +89,6 @@
|
||||
}
|
||||
},
|
||||
"4c4f28287af27": {
|
||||
"level": "H1",
|
||||
"headings": {
|
||||
"T000001": {"level": "H1", "title": "Nobody Owens", "tag": "Bod", "cCount": 1864, "wCount": 284, "pCount": 3, "synopsis": ""}
|
||||
},
|
||||
@@ -110,13 +97,11 @@
|
||||
}
|
||||
},
|
||||
"2426c6f0ca922": {
|
||||
"level": "H1",
|
||||
"headings": {
|
||||
"T000001": {"level": "H1", "title": "Main Plot", "tag": "Main", "cCount": 1369, "wCount": 195, "pCount": 2, "synopsis": ""}
|
||||
}
|
||||
},
|
||||
"04468803b92e1": {
|
||||
"level": "H1",
|
||||
"headings": {
|
||||
"T000001": {"level": "H1", "title": "Ancient Europe", "tag": "Europe", "cCount": 1770, "wCount": 259, "pCount": 3, "synopsis": ""}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="1.7-beta1" hexVersion="0x010700b1" fileVersion="1.4" timeStamp="2022-07-31 18:40:28">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 20:24:37">
|
||||
<project>
|
||||
<name>Test Custom</name>
|
||||
<title>Test Novel</title>
|
||||
@@ -48,55 +48,55 @@
|
||||
<name status="s000008" import="i00000c">Novel</name>
|
||||
</item>
|
||||
<item handle="0000000000011" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="0000000000012" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Chapter 1</name>
|
||||
</item>
|
||||
<item handle="0000000000013" parent="0000000000012" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 1.1</name>
|
||||
</item>
|
||||
<item handle="0000000000014" parent="0000000000012" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 1.2</name>
|
||||
</item>
|
||||
<item handle="0000000000015" parent="0000000000012" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 1.3</name>
|
||||
</item>
|
||||
<item handle="0000000000016" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Chapter 2</name>
|
||||
</item>
|
||||
<item handle="0000000000017" parent="0000000000016" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 2.1</name>
|
||||
</item>
|
||||
<item handle="0000000000018" parent="0000000000016" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 2.2</name>
|
||||
</item>
|
||||
<item handle="0000000000019" parent="0000000000016" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 2.3</name>
|
||||
</item>
|
||||
<item handle="000000000001a" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Chapter 3</name>
|
||||
</item>
|
||||
<item handle="000000000001b" parent="000000000001a" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 3.1</name>
|
||||
</item>
|
||||
<item handle="000000000001c" parent="000000000001a" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 3.2</name>
|
||||
</item>
|
||||
<item handle="000000000001d" parent="000000000001a" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 3.3</name>
|
||||
</item>
|
||||
<item handle="000000000001e" parent="None" root="000000000001e" order="0" type="ROOT" class="PLOT">
|
||||
@@ -104,7 +104,7 @@
|
||||
<name status="s000008" import="i00000c">Plot</name>
|
||||
</item>
|
||||
<item handle="000000000001f" parent="000000000001e" root="000000000001e" order="0" type="FILE" class="PLOT" layout="NOTE">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Main Plot</name>
|
||||
</item>
|
||||
<item handle="0000000000020" parent="None" root="0000000000020" order="0" type="ROOT" class="CHARACTER">
|
||||
@@ -112,7 +112,7 @@
|
||||
<name status="s000008" import="i00000c">Characters</name>
|
||||
</item>
|
||||
<item handle="0000000000021" parent="0000000000020" root="0000000000020" order="0" type="FILE" class="CHARACTER" layout="NOTE">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Protagonist</name>
|
||||
</item>
|
||||
<item handle="0000000000022" parent="None" root="0000000000022" order="0" type="ROOT" class="WORLD">
|
||||
@@ -120,7 +120,7 @@
|
||||
<name status="s000008" import="i00000c">Locations</name>
|
||||
</item>
|
||||
<item handle="0000000000023" parent="0000000000022" root="0000000000022" order="0" type="FILE" class="WORLD" layout="NOTE">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Main Location</name>
|
||||
</item>
|
||||
<item handle="0000000000024" parent="None" root="0000000000024" order="0" type="ROOT" class="ARCHIVE">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="1.7-beta1" hexVersion="0x010700b1" fileVersion="1.4" timeStamp="2022-06-12 17:45:51">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 20:24:37">
|
||||
<project>
|
||||
<name>Test Custom</name>
|
||||
<title>Test Novel</title>
|
||||
@@ -48,31 +48,31 @@
|
||||
<name status="s000008" import="i00000c">Novel</name>
|
||||
</item>
|
||||
<item handle="0000000000011" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="0000000000012" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 1</name>
|
||||
</item>
|
||||
<item handle="0000000000013" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 2</name>
|
||||
</item>
|
||||
<item handle="0000000000014" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 3</name>
|
||||
</item>
|
||||
<item handle="0000000000015" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 4</name>
|
||||
</item>
|
||||
<item handle="0000000000016" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 5</name>
|
||||
</item>
|
||||
<item handle="0000000000017" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Scene 6</name>
|
||||
</item>
|
||||
<item handle="0000000000018" parent="None" root="0000000000018" order="0" type="ROOT" class="PLOT">
|
||||
@@ -80,7 +80,7 @@
|
||||
<name status="s000008" import="i00000c">Plot</name>
|
||||
</item>
|
||||
<item handle="0000000000019" parent="0000000000018" root="0000000000018" order="0" type="FILE" class="PLOT" layout="NOTE">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Main Plot</name>
|
||||
</item>
|
||||
<item handle="000000000001a" parent="None" root="000000000001a" order="0" type="ROOT" class="CHARACTER">
|
||||
@@ -88,7 +88,7 @@
|
||||
<name status="s000008" import="i00000c">Characters</name>
|
||||
</item>
|
||||
<item handle="000000000001b" parent="000000000001a" root="000000000001a" order="0" type="FILE" class="CHARACTER" layout="NOTE">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Protagonist</name>
|
||||
</item>
|
||||
<item handle="000000000001c" parent="None" root="000000000001c" order="0" type="ROOT" class="WORLD">
|
||||
@@ -96,7 +96,7 @@
|
||||
<name status="s000008" import="i00000c">Locations</name>
|
||||
</item>
|
||||
<item handle="000000000001d" parent="000000000001c" root="000000000001c" order="0" type="FILE" class="WORLD" layout="NOTE">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Main Location</name>
|
||||
</item>
|
||||
<item handle="000000000001e" parent="None" root="000000000001e" order="0" type="ROOT" class="ARCHIVE">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="2.0-beta1" hexVersion="0x020000b1" fileVersion="1.4" timeStamp="2022-10-11 21:40:10">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 20:44:05">
|
||||
<project>
|
||||
<name>New Project</name>
|
||||
<title>New Novel</title>
|
||||
@@ -17,8 +17,8 @@
|
||||
<lastViewed>None</lastViewed>
|
||||
<lastNovel>None</lastNovel>
|
||||
<lastOutline>None</lastOutline>
|
||||
<lastWordCount>4</lastWordCount>
|
||||
<novelWordCount>1</novelWordCount>
|
||||
<lastWordCount>13</lastWordCount>
|
||||
<novelWordCount>10</novelWordCount>
|
||||
<notesWordCount>3</notesWordCount>
|
||||
<autoReplace/>
|
||||
<titleFormat>
|
||||
@@ -59,7 +59,7 @@
|
||||
<name status="s000000" import="i000004">World</name>
|
||||
</item>
|
||||
<item handle="000000000000c" parent="0000000000008" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="20" wordCount="5" paraCount="1" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="000000000000d" parent="0000000000008" root="0000000000008" order="0" type="FOLDER" class="NOVEL">
|
||||
@@ -67,11 +67,11 @@
|
||||
<name status="s000000" import="i000004">New Chapter</name>
|
||||
</item>
|
||||
<item handle="000000000000e" parent="000000000000d" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Chapter</name>
|
||||
</item>
|
||||
<item handle="000000000000f" parent="000000000000d" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="9" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Scene</name>
|
||||
</item>
|
||||
<item handle="0000000000020" parent="0000000000008" root="0000000000008" order="0" type="FOLDER" class="NOVEL">
|
||||
@@ -79,11 +79,11 @@
|
||||
<name status="s000000" import="i000004">Stuff</name>
|
||||
</item>
|
||||
<item handle="0000000000021" parent="0000000000020" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="5" wordCount="1" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="5" wordCount="1" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">Hello</name>
|
||||
</item>
|
||||
<item handle="0000000000022" parent="000000000000a" root="000000000000a" order="0" type="FILE" class="CHARACTER" layout="NOTE">
|
||||
<meta expanded="False" charCount="11" wordCount="3" paraCount="1" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="11" wordCount="3" paraCount="1" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">Jane</name>
|
||||
</item>
|
||||
</content>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="1.7-beta1" hexVersion="0x010700b1" fileVersion="1.4" timeStamp="2022-07-31 18:40:28">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 20:24:37">
|
||||
<project>
|
||||
<name>New Project</name>
|
||||
<title></title>
|
||||
@@ -46,15 +46,15 @@
|
||||
<name status="s000008" import="i00000c">Novel</name>
|
||||
</item>
|
||||
<item handle="0000000000011" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="0000000000012" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">New Chapter</name>
|
||||
</item>
|
||||
<item handle="0000000000013" parent="0000000000012" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H0" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000008" import="i00000c" exported="True">New Scene</name>
|
||||
</item>
|
||||
<item handle="0000000000014" parent="None" root="0000000000014" order="0" type="ROOT" class="PLOT">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="2.0-beta1" hexVersion="0x020000b1" fileVersion="1.4" timeStamp="2022-10-11 21:30:35">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 20:44:05">
|
||||
<project>
|
||||
<name>New Project</name>
|
||||
<title>New Novel</title>
|
||||
@@ -17,8 +17,8 @@
|
||||
<lastViewed>None</lastViewed>
|
||||
<lastNovel>None</lastNovel>
|
||||
<lastOutline>None</lastOutline>
|
||||
<lastWordCount>0</lastWordCount>
|
||||
<novelWordCount>0</novelWordCount>
|
||||
<lastWordCount>9</lastWordCount>
|
||||
<novelWordCount>9</novelWordCount>
|
||||
<notesWordCount>0</notesWordCount>
|
||||
<autoReplace/>
|
||||
<titleFormat>
|
||||
@@ -59,7 +59,7 @@
|
||||
<name status="s000000" import="i000004">World</name>
|
||||
</item>
|
||||
<item handle="000000000000c" parent="0000000000008" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="20" wordCount="5" paraCount="1" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="000000000000d" parent="0000000000008" root="0000000000008" order="0" type="FOLDER" class="NOVEL">
|
||||
@@ -67,11 +67,11 @@
|
||||
<name status="s000000" import="i000004">New Chapter</name>
|
||||
</item>
|
||||
<item handle="000000000000e" parent="000000000000d" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Chapter</name>
|
||||
</item>
|
||||
<item handle="000000000000f" parent="000000000000d" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="9" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Scene</name>
|
||||
</item>
|
||||
<item handle="0000000000020" parent="None" root="0000000000020" order="0" type="ROOT" class="NOVEL">
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="2.0-beta1" hexVersion="0x020000b1" fileVersion="1.4" timeStamp="2022-10-11 22:21:42">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 20:39:50">
|
||||
<project>
|
||||
<name>New Project</name>
|
||||
<title>New Novel</title>
|
||||
<author>Jane Doe</author>
|
||||
<saveCount>4</saveCount>
|
||||
<autoCount>2</autoCount>
|
||||
<editTime>5</editTime>
|
||||
<editTime>4</editTime>
|
||||
</project>
|
||||
<settings>
|
||||
<doBackup>True</doBackup>
|
||||
@@ -47,7 +47,7 @@
|
||||
<name status="s000000" import="i000004">Novel</name>
|
||||
</item>
|
||||
<item handle="000000000000c" parent="0000000000008" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="20" wordCount="5" paraCount="1" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="20" wordCount="5" paraCount="1" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="000000000000d" parent="0000000000008" root="0000000000008" order="1" type="FOLDER" class="NOVEL">
|
||||
@@ -55,11 +55,11 @@
|
||||
<name status="s000000" import="i000004">New Chapter</name>
|
||||
</item>
|
||||
<item handle="000000000000e" parent="000000000000d" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Chapter</name>
|
||||
</item>
|
||||
<item handle="000000000000f" parent="000000000000d" root="0000000000008" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="781" wordCount="129" paraCount="14" cursorPos="1010"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="781" wordCount="129" paraCount="14" cursorPos="1010"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Scene</name>
|
||||
</item>
|
||||
<item handle="0000000000009" parent="None" root="0000000000009" order="1" type="ROOT" class="PLOT">
|
||||
@@ -67,7 +67,7 @@
|
||||
<name status="s000000" import="i000004">Plot</name>
|
||||
</item>
|
||||
<item handle="0000000000021" parent="0000000000009" root="0000000000009" order="0" type="FILE" class="PLOT" layout="NOTE">
|
||||
<meta expanded="False" charCount="48" wordCount="10" paraCount="1" cursorPos="69"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="48" wordCount="10" paraCount="1" cursorPos="69"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Note</name>
|
||||
</item>
|
||||
<item handle="000000000000a" parent="None" root="000000000000a" order="2" type="ROOT" class="CHARACTER">
|
||||
@@ -75,7 +75,7 @@
|
||||
<name status="s000000" import="i000004">Characters</name>
|
||||
</item>
|
||||
<item handle="0000000000020" parent="000000000000a" root="000000000000a" order="0" type="FILE" class="CHARACTER" layout="NOTE">
|
||||
<meta expanded="False" charCount="34" wordCount="8" paraCount="1" cursorPos="51"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="34" wordCount="8" paraCount="1" cursorPos="51"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Note</name>
|
||||
</item>
|
||||
<item handle="000000000000b" parent="None" root="000000000000b" order="3" type="ROOT" class="WORLD">
|
||||
@@ -83,7 +83,7 @@
|
||||
<name status="s000000" import="i000004">World</name>
|
||||
</item>
|
||||
<item handle="0000000000022" parent="000000000000b" root="000000000000b" order="0" type="FILE" class="WORLD" layout="NOTE">
|
||||
<meta expanded="False" charCount="51" wordCount="9" paraCount="1" cursorPos="68"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="51" wordCount="9" paraCount="1" cursorPos="68"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Note</name>
|
||||
</item>
|
||||
<item handle="0000000000024" parent="None" root="0000000000024" order="4" type="ROOT" class="TRASH">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="1.7-beta1" hexVersion="0x010700b1" fileVersion="1.4" timeStamp="2022-07-31 18:40:34">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 20:24:44">
|
||||
<project>
|
||||
<name>New Project</name>
|
||||
<title>New Novel</title>
|
||||
@@ -47,7 +47,7 @@
|
||||
<name status="s000000" import="i000004">Novel</name>
|
||||
</item>
|
||||
<item handle="000000000000c" parent="0000000000008" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="20" wordCount="5" paraCount="1" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="20" wordCount="5" paraCount="1" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="000000000000d" parent="0000000000008" root="0000000000008" order="1" type="FOLDER" class="NOVEL">
|
||||
@@ -55,11 +55,11 @@
|
||||
<name status="s000000" import="i000004">New Chapter</name>
|
||||
</item>
|
||||
<item handle="000000000000e" parent="000000000000d" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Chapter</name>
|
||||
</item>
|
||||
<item handle="000000000000f" parent="000000000000d" root="0000000000008" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="9" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="9" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Scene</name>
|
||||
</item>
|
||||
<item handle="0000000000009" parent="None" root="0000000000009" order="1" type="ROOT" class="PLOT">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<novelWriterXML appVersion="1.7-beta1" hexVersion="0x010700b1" fileVersion="1.4" timeStamp="2022-07-31 18:40:31">
|
||||
<novelWriterXML appVersion="2.0-rc1" hexVersion="0x020000c1" fileVersion="1.4" timeStamp="2022-10-17 20:24:40">
|
||||
<project>
|
||||
<name>Project Name</name>
|
||||
<title>Project Title</title>
|
||||
@@ -52,7 +52,7 @@
|
||||
<name status="s000000" import="i000004">Novel</name>
|
||||
</item>
|
||||
<item handle="000000000000c" parent="0000000000008" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="20" wordCount="5" paraCount="1" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H1" charCount="20" wordCount="5" paraCount="1" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">Title Page</name>
|
||||
</item>
|
||||
<item handle="000000000000d" parent="0000000000008" root="0000000000008" order="1" type="FOLDER" class="NOVEL">
|
||||
@@ -60,11 +60,11 @@
|
||||
<name status="s000000" import="i000004">New Chapter</name>
|
||||
</item>
|
||||
<item handle="000000000000e" parent="000000000000d" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H2" charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Chapter</name>
|
||||
</item>
|
||||
<item handle="000000000000f" parent="000000000000d" root="0000000000008" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||
<meta expanded="False" charCount="9" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<meta expanded="False" mainHeading="H3" charCount="9" wordCount="2" paraCount="0" cursorPos="0"/>
|
||||
<name status="s000000" import="i000004" exported="True">New Scene</name>
|
||||
</item>
|
||||
<item handle="0000000000009" parent="None" root="0000000000009" order="1" type="ROOT" class="PLOT">
|
||||
|
||||
@@ -26,7 +26,7 @@ import pytest
|
||||
from shutil import copyfile
|
||||
|
||||
from mock import causeException
|
||||
from tools import buildTestProject, cmpFiles, writeFile
|
||||
from tools import C, buildTestProject, cmpFiles, writeFile
|
||||
|
||||
from novelwriter.enum import nwItemClass, nwItemLayout
|
||||
from novelwriter.core.index import NWIndex, countWords, TagsIndex
|
||||
@@ -189,15 +189,17 @@ def testCoreIndex_CheckThese(mockGUI, fncDir, mockRnd):
|
||||
"""Test the tag checker function checkThese.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
mockRnd.reset()
|
||||
buildTestProject(theProject, fncDir)
|
||||
theIndex = theProject.index
|
||||
theIndex.clearIndex()
|
||||
|
||||
nHandle = theProject.newFile("Hello", "0000000000010")
|
||||
cHandle = theProject.newFile("Jane", "0000000000012")
|
||||
nHandle = theProject.newFile("Hello", C.hNovelRoot)
|
||||
cHandle = theProject.newFile("Jane", C.hCharRoot)
|
||||
nItem = theProject.tree[nHandle]
|
||||
cItem = theProject.tree[cHandle]
|
||||
|
||||
assert theIndex.rootChangedSince("0000000000010", 0) is False
|
||||
assert theIndex.rootChangedSince(C.hNovelRoot, 0) is False
|
||||
assert theIndex.indexChangedSince(0) is False
|
||||
|
||||
assert theIndex.scanText(cHandle, (
|
||||
@@ -227,11 +229,11 @@ def testCoreIndex_CheckThese(mockGUI, fncDir, mockRnd):
|
||||
"@time": []
|
||||
}
|
||||
|
||||
assert theIndex.rootChangedSince("0000000000010", 0) is True
|
||||
assert theIndex.rootChangedSince(C.hNovelRoot, 0) is True
|
||||
assert theIndex.indexChangedSince(0) is True
|
||||
|
||||
assert theIndex.getHandleHeaderLevel(cHandle) == "H1"
|
||||
assert theIndex.getHandleHeaderLevel(nHandle) == "H1"
|
||||
assert cItem.mainHeading == "H1"
|
||||
assert nItem.mainHeading == "H1"
|
||||
|
||||
# Zero Items
|
||||
assert theIndex.checkThese([], cItem) == []
|
||||
@@ -265,12 +267,13 @@ def testCoreIndex_ScanText(mockGUI, fncDir, mockRnd):
|
||||
"""Check the index text scanner.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
mockRnd.reset()
|
||||
buildTestProject(theProject, fncDir)
|
||||
theIndex = theProject.index
|
||||
|
||||
# Some items for fail to scan tests
|
||||
dHandle = theProject.newFolder("Folder", "0000000000010")
|
||||
xHandle = theProject.newFile("No Layout", "0000000000010")
|
||||
dHandle = theProject.newFolder("Folder", C.hNovelRoot)
|
||||
xHandle = theProject.newFile("No Layout", C.hNovelRoot)
|
||||
xItem = theProject.tree[xHandle]
|
||||
xItem.setLayout(nwItemLayout.NO_LAYOUT)
|
||||
|
||||
@@ -290,21 +293,23 @@ def testCoreIndex_ScanText(mockGUI, fncDir, mockRnd):
|
||||
theProject.tree.updateItemData(xItem.itemHandle)
|
||||
assert xItem.itemRoot == tHandle
|
||||
assert xItem.itemClass == nwItemClass.TRASH
|
||||
assert theIndex.scanText(xHandle, "Hello World!") is False
|
||||
assert theIndex.scanText(xHandle, "## Hello World!") is True
|
||||
assert xItem.mainHeading == "H2"
|
||||
|
||||
# Create the archive root
|
||||
aHandle = theProject.newRoot(nwItemClass.ARCHIVE)
|
||||
assert theProject.tree[aHandle] is not None
|
||||
xItem.setParent(aHandle)
|
||||
theProject.tree.updateItemData(xItem.itemHandle)
|
||||
assert theIndex.scanText(xHandle, "Hello World!") is False
|
||||
assert theIndex.scanText(xHandle, "### Hello World!") is True
|
||||
assert xItem.mainHeading == "H3"
|
||||
|
||||
# Make some usable items
|
||||
tHandle = theProject.newFile("Title", "0000000000010")
|
||||
pHandle = theProject.newFile("Page", "0000000000010")
|
||||
nHandle = theProject.newFile("Hello", "0000000000010")
|
||||
cHandle = theProject.newFile("Jane", "0000000000012")
|
||||
sHandle = theProject.newFile("Scene", "0000000000010")
|
||||
tHandle = theProject.newFile("Title", C.hNovelRoot)
|
||||
pHandle = theProject.newFile("Page", C.hNovelRoot)
|
||||
nHandle = theProject.newFile("Hello", C.hNovelRoot)
|
||||
cHandle = theProject.newFile("Jane", C.hCharRoot)
|
||||
sHandle = theProject.newFile("Scene", C.hNovelRoot)
|
||||
|
||||
# Text Indexing
|
||||
# =============
|
||||
@@ -474,23 +479,24 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
"""Check the index data extraction functions.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
mockRnd.reset()
|
||||
buildTestProject(theProject, fncDir)
|
||||
|
||||
theIndex = theProject.index
|
||||
theIndex.reIndexHandle("0000000000010")
|
||||
theIndex.reIndexHandle("0000000000011")
|
||||
theIndex.reIndexHandle("0000000000012")
|
||||
theIndex.reIndexHandle("0000000000013")
|
||||
theIndex.reIndexHandle("0000000000014")
|
||||
theIndex.reIndexHandle("0000000000015")
|
||||
theIndex.reIndexHandle("0000000000016")
|
||||
theIndex.reIndexHandle("0000000000017")
|
||||
theIndex.reIndexHandle(C.hNovelRoot)
|
||||
theIndex.reIndexHandle(C.hPlotRoot)
|
||||
theIndex.reIndexHandle(C.hCharRoot)
|
||||
theIndex.reIndexHandle(C.hWorldRoot)
|
||||
theIndex.reIndexHandle(C.hTitlePage)
|
||||
theIndex.reIndexHandle(C.hChapterDir)
|
||||
theIndex.reIndexHandle(C.hChapterDoc)
|
||||
theIndex.reIndexHandle(C.hSceneDoc)
|
||||
|
||||
nHandle = theProject.newFile("Hello", "0000000000010")
|
||||
cHandle = theProject.newFile("Jane", "0000000000012")
|
||||
nHandle = theProject.newFile("Hello", C.hNovelRoot)
|
||||
cHandle = theProject.newFile("Jane", C.hCharRoot)
|
||||
|
||||
assert theIndex.getNovelData("", "") is None
|
||||
assert theIndex.getNovelData("0000000000010", "") is None
|
||||
assert theIndex.getNovelData(C.hNovelRoot, "") is None
|
||||
|
||||
assert theIndex.scanText(cHandle, (
|
||||
"# Jane Smith\n"
|
||||
@@ -511,10 +517,10 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
theKeys.append(aKey)
|
||||
|
||||
assert theKeys == [
|
||||
"0000000000014:T000001",
|
||||
"0000000000016:T000001",
|
||||
"0000000000017:T000001",
|
||||
"%s:T000001" % nHandle,
|
||||
f"{C.hTitlePage}:T000001",
|
||||
f"{C.hChapterDoc}:T000001",
|
||||
f"{C.hSceneDoc}:T000001",
|
||||
f"{nHandle}:T000001",
|
||||
]
|
||||
|
||||
# Check that excluded files can be skipped
|
||||
@@ -525,10 +531,10 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
theKeys.append(aKey)
|
||||
|
||||
assert theKeys == [
|
||||
"0000000000014:T000001",
|
||||
"0000000000016:T000001",
|
||||
"0000000000017:T000001",
|
||||
"%s:T000001" % nHandle,
|
||||
f"{C.hTitlePage}:T000001",
|
||||
f"{C.hChapterDoc}:T000001",
|
||||
f"{C.hSceneDoc}:T000001",
|
||||
f"{nHandle}:T000001",
|
||||
]
|
||||
|
||||
theKeys = []
|
||||
@@ -536,9 +542,9 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
theKeys.append(aKey)
|
||||
|
||||
assert theKeys == [
|
||||
"0000000000014:T000001",
|
||||
"0000000000016:T000001",
|
||||
"0000000000017:T000001",
|
||||
f"{C.hTitlePage}:T000001",
|
||||
f"{C.hChapterDoc}:T000001",
|
||||
f"{C.hSceneDoc}:T000001",
|
||||
]
|
||||
|
||||
# The novel file should have the correct counts
|
||||
@@ -567,7 +573,7 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
assert theIndex.getBackReferenceList(None) == {}
|
||||
|
||||
# The Title Page file should have no references as it has no tag
|
||||
assert theIndex.getBackReferenceList("0000000000014") == {}
|
||||
assert theIndex.getBackReferenceList(C.hTitlePage) == {}
|
||||
|
||||
# The character file should have a record of the reference from the novel file
|
||||
theRefs = theIndex.getBackReferenceList(cHandle)
|
||||
@@ -656,9 +662,9 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
# Novel Stats
|
||||
# ===========
|
||||
|
||||
hHandle = theProject.newFile("Chapter", "0000000000010")
|
||||
sHandle = theProject.newFile("Scene One", "0000000000010")
|
||||
tHandle = theProject.newFile("Scene Two", "0000000000010")
|
||||
hHandle = theProject.newFile("Chapter", C.hNovelRoot)
|
||||
sHandle = theProject.newFile("Scene One", C.hNovelRoot)
|
||||
tHandle = theProject.newFile("Scene Two", C.hNovelRoot)
|
||||
|
||||
theProject.tree[hHandle].itemLayout == nwItemLayout.DOCUMENT
|
||||
theProject.tree[sHandle].itemLayout == nwItemLayout.DOCUMENT
|
||||
@@ -669,9 +675,9 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
assert theIndex.scanText(tHandle, "### Scene Two\n\n")
|
||||
|
||||
assert [(h, t) for h, t, _ in theIndex._itemIndex.iterNovelStructure(skipExcl=False)] == [
|
||||
("0000000000014", "T000001"),
|
||||
("0000000000016", "T000001"),
|
||||
("0000000000017", "T000001"),
|
||||
(C.hTitlePage, "T000001"),
|
||||
(C.hChapterDoc, "T000001"),
|
||||
(C.hSceneDoc, "T000001"),
|
||||
(nHandle, "T000001"),
|
||||
(nHandle, "T000011"),
|
||||
(hHandle, "T000001"),
|
||||
@@ -680,9 +686,9 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
]
|
||||
|
||||
assert [(h, t) for h, t, _ in theIndex._itemIndex.iterNovelStructure(skipExcl=True)] == [
|
||||
("0000000000014", "T000001"),
|
||||
("0000000000016", "T000001"),
|
||||
("0000000000017", "T000001"),
|
||||
(C.hTitlePage, "T000001"),
|
||||
(C.hChapterDoc, "T000001"),
|
||||
(C.hSceneDoc, "T000001"),
|
||||
(hHandle, "T000001"),
|
||||
(sHandle, "T000001"),
|
||||
(tHandle, "T000001"),
|
||||
@@ -691,9 +697,9 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
# Add a fake handle to the tree and check that it's ignored
|
||||
theProject.tree._treeOrder.append("0000000000000")
|
||||
assert [(h, t) for h, t, _ in theIndex._itemIndex.iterNovelStructure(skipExcl=False)] == [
|
||||
("0000000000014", "T000001"),
|
||||
("0000000000016", "T000001"),
|
||||
("0000000000017", "T000001"),
|
||||
(C.hTitlePage, "T000001"),
|
||||
(C.hChapterDoc, "T000001"),
|
||||
(C.hSceneDoc, "T000001"),
|
||||
(nHandle, "T000001"),
|
||||
(nHandle, "T000011"),
|
||||
(hHandle, "T000001"),
|
||||
@@ -709,29 +715,29 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
assert theIndex.getNovelTitleCounts(skipExcl=True) == [0, 1, 2, 3, 0]
|
||||
|
||||
# Table of Contents
|
||||
assert theIndex.getTableOfContents("0000000000010", 0, skipExcl=True) == []
|
||||
assert theIndex.getTableOfContents("0000000000010", 1, skipExcl=True) == [
|
||||
("0000000000014:T000001", 1, "New Novel", 15),
|
||||
assert theIndex.getTableOfContents(C.hNovelRoot, 0, skipExcl=True) == []
|
||||
assert theIndex.getTableOfContents(C.hNovelRoot, 1, skipExcl=True) == [
|
||||
(f"{C.hTitlePage}:T000001", 1, "New Novel", 15),
|
||||
]
|
||||
assert theIndex.getTableOfContents("0000000000010", 2, skipExcl=True) == [
|
||||
("0000000000014:T000001", 1, "New Novel", 5),
|
||||
("0000000000016:T000001", 2, "New Chapter", 4),
|
||||
("%s:T000001" % hHandle, 2, "Chapter One", 6),
|
||||
assert theIndex.getTableOfContents(C.hNovelRoot, 2, skipExcl=True) == [
|
||||
(f"{C.hTitlePage}:T000001", 1, "New Novel", 5),
|
||||
(f"{C.hChapterDoc}:T000001", 2, "New Chapter", 4),
|
||||
(f"{hHandle}:T000001", 2, "Chapter One", 6),
|
||||
]
|
||||
assert theIndex.getTableOfContents("0000000000010", 3, skipExcl=True) == [
|
||||
("0000000000014:T000001", 1, "New Novel", 5),
|
||||
("0000000000016:T000001", 2, "New Chapter", 2),
|
||||
("0000000000017:T000001", 3, "New Scene", 2),
|
||||
("%s:T000001" % hHandle, 2, "Chapter One", 2),
|
||||
("%s:T000001" % sHandle, 3, "Scene One", 2),
|
||||
("%s:T000001" % tHandle, 3, "Scene Two", 2),
|
||||
assert theIndex.getTableOfContents(C.hNovelRoot, 3, skipExcl=True) == [
|
||||
(f"{C.hTitlePage}:T000001", 1, "New Novel", 5),
|
||||
(f"{C.hChapterDoc}:T000001", 2, "New Chapter", 2),
|
||||
(f"{C.hSceneDoc}:T000001", 3, "New Scene", 2),
|
||||
(f"{hHandle}:T000001", 2, "Chapter One", 2),
|
||||
(f"{sHandle}:T000001", 3, "Scene One", 2),
|
||||
(f"{tHandle}:T000001", 3, "Scene Two", 2),
|
||||
]
|
||||
|
||||
assert theIndex.getTableOfContents("0000000000010", 0, skipExcl=False) == []
|
||||
assert theIndex.getTableOfContents("0000000000010", 1, skipExcl=False) == [
|
||||
("0000000000014:T000001", 1, "New Novel", 9),
|
||||
("%s:T000001" % nHandle, 1, "Hello World!", 12),
|
||||
("%s:T000011" % nHandle, 1, "Hello World!", 22),
|
||||
assert theIndex.getTableOfContents(C.hNovelRoot, 0, skipExcl=False) == []
|
||||
assert theIndex.getTableOfContents(C.hNovelRoot, 1, skipExcl=False) == [
|
||||
(f"{C.hTitlePage}:T000001", 1, "New Novel", 9),
|
||||
(f"{nHandle}:T000001", 1, "Hello World!", 12),
|
||||
(f"{nHandle}:T000011", 1, "Hello World!", 22),
|
||||
]
|
||||
|
||||
# Header Word Counts
|
||||
@@ -741,7 +747,7 @@ def testCoreIndex_ExtractData(mockGUI, fncDir, mockRnd):
|
||||
assert theIndex.getHandleWordCounts(sHandle) == [("%s:T000001" % sHandle, 2)]
|
||||
assert theIndex.getHandleWordCounts(tHandle) == [("%s:T000001" % tHandle, 2)]
|
||||
assert theIndex.getHandleWordCounts(nHandle) == [
|
||||
("%s:T000001" % nHandle, 12), ("%s:T000011" % nHandle, 16)
|
||||
(f"{nHandle}:T000001", 12), (f"{nHandle}:T000011", 16)
|
||||
]
|
||||
|
||||
assert theIndex.saveIndex() is True
|
||||
@@ -926,11 +932,13 @@ def testCoreIndex_ItemIndex(mockGUI, fncDir, mockRnd):
|
||||
"""Check the ItemIndex class.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
mockRnd.reset()
|
||||
buildTestProject(theProject, fncDir)
|
||||
theProject.index.clearIndex()
|
||||
|
||||
nHandle = "0000000000014"
|
||||
cHandle = "0000000000016"
|
||||
sHandle = "0000000000017"
|
||||
nHandle = C.hTitlePage
|
||||
cHandle = C.hChapterDoc
|
||||
sHandle = C.hSceneDoc
|
||||
|
||||
assert theProject.index.saveIndex() is True
|
||||
itemIndex = theProject.index._itemIndex
|
||||
@@ -948,13 +956,11 @@ def testCoreIndex_ItemIndex(mockGUI, fncDir, mockRnd):
|
||||
itemIndex.add(cHandle, theProject.tree[cHandle])
|
||||
assert cHandle in itemIndex
|
||||
assert itemIndex[cHandle].item == theProject.tree[cHandle]
|
||||
assert itemIndex.mainItemHeader(cHandle) == "H0"
|
||||
assert itemIndex.allItemTags(cHandle) == []
|
||||
assert list(itemIndex.iterItemHeaders(cHandle))[0][0] == "T000000"
|
||||
|
||||
# Add a heading to the item, which should replace the T000000 heading
|
||||
itemIndex.addItemHeading(cHandle, "T000001", "H2", "Chapter One")
|
||||
assert itemIndex.mainItemHeader(cHandle) == "H2"
|
||||
assert list(itemIndex.iterItemHeaders(cHandle))[0][0] == "T000001"
|
||||
|
||||
# Set the remainig data values
|
||||
@@ -966,7 +972,6 @@ def testCoreIndex_ItemIndex(mockGUI, fncDir, mockRnd):
|
||||
itemIndex.addHeadingReferences(cHandle, "T000001", ["Jane", "John"], "@char")
|
||||
idxData = itemIndex.packData()
|
||||
|
||||
assert idxData[cHandle]["level"] == "H2"
|
||||
assert idxData[cHandle]["headings"]["T000001"] == {
|
||||
"level": "H2", "title": "Chapter One", "tag": "One",
|
||||
"cCount": 60, "wCount": 10, "pCount": 2, "synopsis": "In the beginning ...",
|
||||
@@ -1026,7 +1031,6 @@ def testCoreIndex_ItemIndex(mockGUI, fncDir, mockRnd):
|
||||
assert allHeads[2][1] == "T000001"
|
||||
|
||||
# Ask for stuff that doesn't exist
|
||||
assert itemIndex.mainItemHeader("blablabla") == "H0"
|
||||
assert itemIndex.allItemTags("blablabla") == []
|
||||
|
||||
# Novel Structure
|
||||
@@ -1048,7 +1052,7 @@ def testCoreIndex_ItemIndex(mockGUI, fncDir, mockRnd):
|
||||
assert nStruct[3][0] == uHandle
|
||||
|
||||
# Novel structure with root handle set
|
||||
nStruct = list(itemIndex.iterNovelStructure(rootHandle="0000000000010"))
|
||||
nStruct = list(itemIndex.iterNovelStructure(rootHandle=C.hNovelRoot))
|
||||
assert len(nStruct) == 3
|
||||
assert nStruct[0][0] == nHandle
|
||||
assert nStruct[1][0] == cHandle
|
||||
@@ -1098,7 +1102,7 @@ def testCoreIndex_ItemIndex(mockGUI, fncDir, mockRnd):
|
||||
itemIndex.unpackData({"stuff": "more stuff"})
|
||||
|
||||
# Unknown keys should be skipped
|
||||
itemIndex.unpackData({"0000000000000": {}})
|
||||
itemIndex.unpackData({C.hInvalid: {}})
|
||||
assert itemIndex._items == {}
|
||||
|
||||
# Known keys can be added, even witout data
|
||||
|
||||
@@ -213,13 +213,34 @@ def testCoreItem_Methods(mockGUI):
|
||||
theItem.setLayout("DOCUMENT")
|
||||
assert theItem.isFileType() is True
|
||||
assert theItem.isDocumentLayout() is True
|
||||
|
||||
theItem.setMainHeading("HH")
|
||||
assert theItem.mainHeading == "H0"
|
||||
assert theItem.describeMe() == "Novel Document"
|
||||
assert theItem.describeMe("H0") == "Novel Document"
|
||||
assert theItem.describeMe("H1") == "Novel Title Page"
|
||||
assert theItem.describeMe("H2") == "Novel Chapter"
|
||||
assert theItem.describeMe("H3") == "Novel Scene"
|
||||
assert theItem.describeMe("H4") == "Novel Section"
|
||||
assert theItem.describeMe("H5") == "Novel Document"
|
||||
|
||||
theItem.setMainHeading("H0")
|
||||
assert theItem.mainHeading == "H0"
|
||||
assert theItem.describeMe() == "Novel Document"
|
||||
|
||||
theItem.setMainHeading("H1")
|
||||
assert theItem.mainHeading == "H1"
|
||||
assert theItem.describeMe() == "Novel Title Page"
|
||||
|
||||
theItem.setMainHeading("H2")
|
||||
assert theItem.mainHeading == "H2"
|
||||
assert theItem.describeMe() == "Novel Chapter"
|
||||
|
||||
theItem.setMainHeading("H3")
|
||||
assert theItem.mainHeading == "H3"
|
||||
assert theItem.describeMe() == "Novel Scene"
|
||||
|
||||
theItem.setMainHeading("H4")
|
||||
assert theItem.mainHeading == "H4"
|
||||
assert theItem.describeMe() == "Novel Section"
|
||||
|
||||
theItem.setMainHeading("H5")
|
||||
assert theItem.mainHeading == "H4"
|
||||
assert theItem.describeMe() == "Novel Section"
|
||||
|
||||
theItem.setLayout("NOTE")
|
||||
assert theItem.isNoteLayout() is True
|
||||
@@ -504,9 +525,9 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog, mockRnd):
|
||||
assert etree.tostring(xContent, pretty_print=False, encoding="utf-8") == (
|
||||
b'<content>'
|
||||
b'<item handle="0123456789abc" parent="0123456789abc" root="0123456789abc" order="1" '
|
||||
b'type="FILE" class="NOVEL" layout="NOTE"><meta expanded="False" charCount="7" '
|
||||
b'wordCount="5" paraCount="3" cursorPos="11"/><name status="None" import="%s" '
|
||||
b'exported="False">A Name</name></item>'
|
||||
b'type="FILE" class="NOVEL" layout="NOTE"><meta expanded="False" mainHeading="H0" '
|
||||
b'charCount="7" wordCount="5" paraCount="3" cursorPos="11"/><name status="None" '
|
||||
b'import="%s" exported="False">A Name</name></item>'
|
||||
b'</content>'
|
||||
) % bytes(importKeys[3], encoding="utf8")
|
||||
|
||||
|
||||
@@ -420,13 +420,13 @@ def testCoreTree_XMLPackUnpack(mockGUI, mockItems):
|
||||
b'type="FOLDER" class="NOVEL"><meta expanded="True"/><name status="s000000" '
|
||||
b'import="i000004">Act One</name></item>'
|
||||
b'<item handle="c000000000001" parent="b000000000001" root="a000000000001" order="0" '
|
||||
b'type="FILE" class="NOVEL" layout="DOCUMENT"><meta expanded="False" charCount="300" '
|
||||
b'wordCount="50" paraCount="2" cursorPos="0"/><name status="s000000" import="i000004" '
|
||||
b'exported="True">Chapter One</name></item>'
|
||||
b'type="FILE" class="NOVEL" layout="DOCUMENT"><meta expanded="False" mainHeading="H0" '
|
||||
b'charCount="300" wordCount="50" paraCount="2" cursorPos="0"/><name status="s000000" '
|
||||
b'import="i000004" exported="True">Chapter One</name></item>'
|
||||
b'<item handle="c000000000002" parent="b000000000001" root="a000000000001" order="0" '
|
||||
b'type="FILE" class="NOVEL" layout="DOCUMENT"><meta expanded="False" charCount="3000" '
|
||||
b'wordCount="500" paraCount="20" cursorPos="0"/><name status="s000000" import="i000004" '
|
||||
b'exported="True">Scene One</name></item>'
|
||||
b'type="FILE" class="NOVEL" layout="DOCUMENT"><meta expanded="False" mainHeading="H0" '
|
||||
b'charCount="3000" wordCount="500" paraCount="20" cursorPos="0"/><name status="s000000" '
|
||||
b'import="i000004" exported="True">Scene One</name></item>'
|
||||
b'<item handle="a000000000002" parent="None" root="a000000000002" order="0" type="ROOT" '
|
||||
b'class="ARCHIVE"><meta expanded="False"/><name status="s000000" '
|
||||
b'import="i000004">Outtakes</name></item>'
|
||||
@@ -437,9 +437,9 @@ def testCoreTree_XMLPackUnpack(mockGUI, mockItems):
|
||||
b'class="CHARACTER"><meta expanded="True"/><name status="s000000" '
|
||||
b'import="i000004">Characters</name></item>'
|
||||
b'<item handle="b000000000002" parent="a000000000004" root="a000000000004" order="0" '
|
||||
b'type="FILE" class="CHARACTER" layout="NOTE"><meta expanded="False" charCount="2000" '
|
||||
b'wordCount="400" paraCount="16" cursorPos="0"/><name status="s000000" import="i000004" '
|
||||
b'exported="True">Jane Doe</name></item>'
|
||||
b'type="FILE" class="CHARACTER" layout="NOTE"><meta expanded="False" mainHeading="H0" '
|
||||
b'charCount="2000" wordCount="400" paraCount="16" cursorPos="0"/><name status="s000000" '
|
||||
b'import="i000004" exported="True">Jane Doe</name></item>'
|
||||
b'</content>'
|
||||
b'</novelWriterXML>'
|
||||
)
|
||||
|
||||
+4
-2
@@ -173,13 +173,16 @@ def buildTestProject(theObject, projPath):
|
||||
xHandle[8] = theProject.newFile("New Scene", xHandle[6])
|
||||
|
||||
aDoc = NWDoc(theProject, xHandle[5])
|
||||
aDoc.writeDocument("#! New Novel\n\n>> By Jane DOe <<\n")
|
||||
aDoc.writeDocument("#! New Novel\n\n>> By Jane Doe <<\n")
|
||||
theProject.index.reIndexHandle(xHandle[5])
|
||||
|
||||
aDoc = NWDoc(theProject, xHandle[7])
|
||||
aDoc.writeDocument("## %s\n\n" % theProject.tr("New Chapter"))
|
||||
theProject.index.reIndexHandle(xHandle[7])
|
||||
|
||||
aDoc = NWDoc(theProject, xHandle[8])
|
||||
aDoc.writeDocument("### %s\n\n" % theProject.tr("New Scene"))
|
||||
theProject.index.reIndexHandle(xHandle[8])
|
||||
|
||||
theProject.projOpened = time.time()
|
||||
theProject.setProjectChanged(True)
|
||||
@@ -188,6 +191,5 @@ def buildTestProject(theObject, projPath):
|
||||
if theGUI is not None:
|
||||
theGUI.hasProject = True
|
||||
theGUI.rebuildTrees()
|
||||
theGUI.rebuildIndex(beQuiet=True)
|
||||
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user