Make packing and unpacking item data consistent

This commit is contained in:
Veronica Berglyd Olsen
2022-11-03 17:30:54 +01:00
parent da4f4b0801
commit 3eee8442a7
9 changed files with 2650 additions and 1873 deletions
+23 -18
View File
@@ -187,29 +187,34 @@ class NWItem:
def unpack(self, data): def unpack(self, data):
"""Set the values from a data dictionary. """Set the values from a data dictionary.
""" """
if "handle" in data: item = data.get("itemAttr", {})
self.setHandle(data["handle"]) meta = data.get("metaAttr", {})
name = data.get("nameAttr", {})
if "handle" in item:
self.setHandle(item["handle"])
else: else:
logger.error("Item does not have a handle") logger.error("Item does not have a handle")
return False return False
self.setName(data.get("label", "")) self.setName(data.get("name", ""))
self.setParent(data.get("parent", None)) self.setParent(item.get("parent", None))
self.setRoot(data.get("root", None)) self.setRoot(item.get("root", None))
self.setOrder(data.get("order", 0)) self.setOrder(item.get("order", 0))
self.setType(data.get("type", nwItemType.NO_TYPE)) self.setType(item.get("type", nwItemType.NO_TYPE))
self.setClass(data.get("class", nwItemClass.NO_CLASS)) self.setClass(item.get("class", nwItemClass.NO_CLASS))
self.setLayout(data.get("layout", nwItemLayout.NO_LAYOUT)) self.setExpanded(meta.get("expanded", False))
self.setStatus(name.get("status", None))
self.setImport(name.get("import", None))
self.setExpanded(data.get("expanded", False)) if self._type == nwItemType.FILE:
self.setStatus(data.get("status", None)) self.setLayout(item.get("layout", nwItemLayout.NO_LAYOUT))
self.setImport(data.get("import", None)) self.setMainHeading(meta.get("heading", "H0"))
self.setMainHeading(data.get("heading", "H0")) self.setCharCount(meta.get("charCount", 0))
self.setCharCount(data.get("charCount", 0)) self.setWordCount(meta.get("wordCount", 0))
self.setWordCount(data.get("wordCount", 0)) self.setParaCount(meta.get("paraCount", 0))
self.setParaCount(data.get("paraCount", 0)) self.setCursorPos(meta.get("cursorPos", 0))
self.setCursorPos(data.get("cursorPos", 0)) self.setActive(name.get("active", True))
self.setActive(data.get("active", True))
# Make some checks to ensure consistency # Make some checks to ensure consistency
if self._type == nwItemType.ROOT: if self._type == nwItemType.ROOT:
+60 -42
View File
@@ -68,24 +68,24 @@ class ProjectXMLReader:
"""The main project XML file reader class. All data is read into a """The main project XML file reader class. All data is read into a
NWProjectData instance, which must be provided. NWProjectData instance, which must be provided.
Version Change History File Format Version Change History
====================== ==================================
1.0 Original file format. 1.0 Original file format.
1.1 Changes the way documents are structured in the project folder 1.1 Changes the way documents are structured in the project folder
from data_X, where X is the first hex value of the handle, to a from data_X, where X is the first hex value of the handle, to a
single content folder. Introduced in version 0.7. single content folder. Introduced in version 0.7.
1.2 Changes the way autoReplace entries are stored. The 1.1 parser 1.2 Changes the way autoReplace entries are stored. Introduced in
will lose the autoReplace settings if allowed to read the file. version 0.10.
Introduced in version 0.10.
1.3 Reduces the number of layouts to only two. One for novel 1.3 Reduces the number of layouts to only two. One for novel
documents and one for project notes. Introduced in version 1.5. documents and one for project notes. Introduced in version 1.5.
1.4 Introduces a more compact format for storing items. All settings 1.4 Introduces a more compact format for storing items. All settings
aside from name are now attributes. This format also changes the aside from name are now attributes. This format also changes the
way satus and importance labels are stored and handled. way satus and importance labels, last used handles, and title
formats are stored. They are now all stored as key/value sets.
Introduced in version 2.0. Introduced in version 2.0.
""" """
@@ -158,7 +158,7 @@ class ProjectXMLReader:
except Exception as exc: except Exception as exc:
# Trying to open backup file instead # Trying to open backup file instead
logger.error("Failed to parse project xml", exc_info=exc) logger.error("Failed to parse project XML", exc_info=exc)
self._state = XMLReadState.CANNOT_PARSE self._state = XMLReadState.CANNOT_PARSE
backFile = self._path[:-3]+"bak" backFile = self._path[:-3]+"bak"
@@ -168,7 +168,7 @@ class ProjectXMLReader:
self._state = XMLReadState.PARSED_BACKUP self._state = XMLReadState.PARSED_BACKUP
logger.info("Backup project file parsed") logger.info("Backup project file parsed")
except Exception as exc: except Exception as exc:
logger.error("Failed to parse backup project xml", exc_info=exc) logger.error("Failed to parse backup project XML", exc_info=exc)
self._state = XMLReadState.CANNOT_PARSE self._state = XMLReadState.CANNOT_PARSE
return False return False
else: else:
@@ -205,7 +205,7 @@ class ProjectXMLReader:
else: else:
self._parseProjectContentLegacy(xSection, projContent, projData) self._parseProjectContentLegacy(xSection, projContent, projData)
else: else:
logger.warning("Ignored <root/%s> in xml", xSection.tag) logger.warning("Ignored <root/%s> in XML", xSection.tag)
if self._version == 0x0104: if self._version == 0x0104:
self._state = XMLReadState.PARSED_OK self._state = XMLReadState.PARSED_OK
@@ -238,7 +238,7 @@ class ProjectXMLReader:
elif xItem.tag == "editTime": elif xItem.tag == "editTime":
projData.setEditTime(xItem.text) projData.setEditTime(xItem.text)
else: else:
logger.warning("Ignored <root/project/%s> in xml", xItem.tag) logger.warning("Ignored <root/project/%s> in XML", xItem.tag)
return return
@@ -277,7 +277,7 @@ class ProjectXMLReader:
else: # Pre 1.4 format else: # Pre 1.4 format
projData.setTitleFormat(self._parseDictTagText(xItem)) projData.setTitleFormat(self._parseDictTagText(xItem))
else: else:
logger.warning("Ignored <root/settings/%s> in xml", xItem.tag) logger.warning("Ignored <root/settings/%s> in XML", xItem.tag)
return return
@@ -289,6 +289,10 @@ class ProjectXMLReader:
for xItem in xSection: for xItem in xSection:
if xItem.tag == "item": if xItem.tag == "item":
item = {} item = {}
meta = {}
name = {}
itemName = ""
item["handle"] = checkStringNone(xItem.attrib.get("handle"), None) item["handle"] = checkStringNone(xItem.attrib.get("handle"), None)
item["parent"] = checkStringNone(xItem.attrib.get("parent"), None) item["parent"] = checkStringNone(xItem.attrib.get("parent"), None)
item["root"] = checkStringNone(xItem.attrib.get("root"), None) item["root"] = checkStringNone(xItem.attrib.get("root"), None)
@@ -298,28 +302,33 @@ class ProjectXMLReader:
item["layout"] = checkString(xItem.attrib.get("layout"), "NO_LAYOUT") item["layout"] = checkString(xItem.attrib.get("layout"), "NO_LAYOUT")
for xVal in xItem: for xVal in xItem:
if xVal.tag == "meta": if xVal.tag == "meta":
item["expanded"] = checkBool(xVal.attrib.get("expanded"), False) meta["expanded"] = checkBool(xVal.attrib.get("expanded"), False)
item["heading"] = checkString(xVal.attrib.get("heading"), "H0") meta["heading"] = checkString(xVal.attrib.get("heading"), "H0")
item["charCount"] = checkInt(xVal.attrib.get("charCount"), 0) meta["charCount"] = checkInt(xVal.attrib.get("charCount"), 0)
item["wordCount"] = checkInt(xVal.attrib.get("wordCount"), 0) meta["wordCount"] = checkInt(xVal.attrib.get("wordCount"), 0)
item["paraCount"] = checkInt(xVal.attrib.get("paraCount"), 0) meta["paraCount"] = checkInt(xVal.attrib.get("paraCount"), 0)
item["cursorPos"] = checkInt(xVal.attrib.get("cursorPos"), 0) meta["cursorPos"] = checkInt(xVal.attrib.get("cursorPos"), 0)
elif xVal.tag == "name": elif xVal.tag == "name":
item["label"] = simplified(checkString(xVal.text, "")) itemName = simplified(checkString(xVal.text, ""))
item["status"] = checkStringNone(xVal.attrib.get("status"), None) name["status"] = checkStringNone(xVal.attrib.get("status"), None)
item["import"] = checkStringNone(xVal.attrib.get("import"), None) name["import"] = checkStringNone(xVal.attrib.get("import"), None)
item["active"] = checkBool(xVal.attrib.get("active"), False) name["active"] = checkBool(xVal.attrib.get("active"), False)
# ToDo: Remove before 2.0 release. Only needed for 2.0 pre-releases. # ToDo: Remove before 2.0 release. Only needed for 2.0 pre-releases.
if "exported" in xVal.attrib: if "exported" in xVal.attrib:
item["active"] = checkBool(xVal.attrib.get("exported"), False) name["active"] = checkBool(xVal.attrib.get("exported"), False)
else: else:
logger.warning("Ignored <root/content/item/%s> in xml", xVal.tag) logger.warning("Ignored <root/content/item/%s> in XML", xVal.tag)
projContent.append(item) projContent.append({
"name": itemName,
"itemAttr": item,
"metaAttr": meta,
"nameAttr": name,
})
else: else:
logger.warning("Ignored item <root/content/%s> in xml", xItem.tag) logger.warning("Ignored item <root/content/%s> in XML", xItem.tag)
return return
@@ -334,17 +343,21 @@ class ProjectXMLReader:
for xItem in xSection: for xItem in xSection:
item = {} item = {}
meta = {}
name = {}
itemName = ""
if xItem.tag == "item": if xItem.tag == "item":
item["handle"] = checkStringNone(xItem.attrib.get("handle", None), None) item["handle"] = checkStringNone(xItem.attrib.get("handle", None), None)
item["parent"] = checkStringNone(xItem.attrib.get("parent", None), None) item["parent"] = checkStringNone(xItem.attrib.get("parent", None), None)
item["root"] = None # Value was added in 1.4 item["root"] = None # Value was added in 1.4
item["order"] = checkInt(xItem.attrib.get("order", 0), 0) item["order"] = checkInt(xItem.attrib.get("order", 0), 0)
item["heading"] = "H0" # Value was added in 1.4 meta["heading"] = "H0" # Value was added in 1.4
tmpStatus = "" tmpStatus = ""
for xVal in xItem: for xVal in xItem:
if xVal.tag == "name": if xVal.tag == "name":
item["label"] = simplified(checkString(xVal.text, "")) itemName = simplified(checkString(xVal.text, ""))
elif xVal.tag == "status": elif xVal.tag == "status":
tmpStatus = checkStringNone(xVal.text, None) tmpStatus = checkStringNone(xVal.text, None)
elif xVal.tag == "type": elif xVal.tag == "type":
@@ -354,25 +367,25 @@ class ProjectXMLReader:
elif xVal.tag == "layout": elif xVal.tag == "layout":
item["layout"] = checkString(xVal.text, "") item["layout"] = checkString(xVal.text, "")
elif xVal.tag == "expanded": elif xVal.tag == "expanded":
item["expanded"] = checkBool(xVal.text, False) meta["expanded"] = checkBool(xVal.text, False)
elif xVal.tag == "exported": # Renamed to active in 1.4 elif xVal.tag == "exported": # Renamed to active in 1.4
item["active"] = checkBool(xVal.text, False) name["active"] = checkBool(xVal.text, False)
elif xVal.tag == "charCount": elif xVal.tag == "charCount":
item["charCount"] = checkInt(xVal.text, 0) meta["charCount"] = checkInt(xVal.text, 0)
elif xVal.tag == "wordCount": elif xVal.tag == "wordCount":
item["wordCount"] = checkInt(xVal.text, 0) meta["wordCount"] = checkInt(xVal.text, 0)
elif xVal.tag == "paraCount": elif xVal.tag == "paraCount":
item["paraCount"] = checkInt(xVal.text, 0) meta["paraCount"] = checkInt(xVal.text, 0)
elif xVal.tag == "cursorPos": elif xVal.tag == "cursorPos":
item["cursorPos"] = checkInt(xVal.text, 0) meta["cursorPos"] = checkInt(xVal.text, 0)
else: else:
logger.warning("Ignored <root/content/item/%s> in xml", xVal.tag) logger.warning("Ignored <root/content/item/%s> in XML", xVal.tag)
# Status was split into separate status/import with a key in 1.4 # Status was split into separate status/import with a key in 1.4
if item.get("class", "") in ("NOVEL", "ARCHIVE"): if item.get("class", "") in ("NOVEL", "ARCHIVE"):
item["status"] = statusMap.get(tmpStatus, None) name["status"] = statusMap.get(tmpStatus, None)
else: else:
item["import"] = importMap.get(tmpStatus, None) name["import"] = importMap.get(tmpStatus, None)
# A number of layouts were removed in 1.3 # A number of layouts were removed in 1.3
if item.get("layout", "") in ( if item.get("layout", "") in (
@@ -384,10 +397,15 @@ class ProjectXMLReader:
if item.get("type", "") == "TRASH": if item.get("type", "") == "TRASH":
item["type"] = "ROOT" item["type"] = "ROOT"
projContent.append(item) projContent.append({
"name": itemName,
"itemAttr": item,
"metaAttr": meta,
"nameAttr": name,
})
else: else:
logger.warning("Ignored <root/content/%s> in xml", xItem.tag) logger.warning("Ignored <root/content/%s> in XML", xItem.tag)
return return
@@ -495,7 +513,7 @@ class ProjectXMLWriter:
xName = etree.SubElement(xItem, "name", attrib=item.get("nameAttr", {})) xName = etree.SubElement(xItem, "name", attrib=item.get("nameAttr", {}))
xName.text = item["name"] xName.text = item["name"]
# Write the xml tree to file # Write the XML tree to file
saveFile = os.path.join(self._path, nwFiles.PROJ_FILE) saveFile = os.path.join(self._path, nwFiles.PROJ_FILE)
tempFile = os.path.join(self._path, nwFiles.PROJ_FILE+"~") tempFile = os.path.join(self._path, nwFiles.PROJ_FILE+"~")
backFile = os.path.join(self._path, nwFiles.PROJ_FILE[:-3]+"bak") backFile = os.path.join(self._path, nwFiles.PROJ_FILE[:-3]+"bak")
@@ -530,14 +548,14 @@ class ProjectXMLWriter:
## ##
def _packSingleValue(self, xParent, name, value, attrib=None): def _packSingleValue(self, xParent, name, value, attrib=None):
"""Pack a single value into an xml element. """Pack a single value into an XML element.
""" """
xItem = etree.SubElement(xParent, name, attrib=attrib) xItem = etree.SubElement(xParent, name, attrib=attrib)
xItem.text = str(value) or "" xItem.text = str(value) or ""
return return
def _packListValue(self, xParent, name, data): def _packListValue(self, xParent, name, data):
"""Pack a list of values into an xml element. """Pack a list of values into an XML element.
""" """
for value in data: for value in data:
xItem = etree.SubElement(xParent, name) xItem = etree.SubElement(xParent, name)
@@ -545,7 +563,7 @@ class ProjectXMLWriter:
return return
def _packDictKeyValue(self, xParent, name, data): def _packDictKeyValue(self, xParent, name, data):
"""Pack the entries of a dictionary into an xml element. """Pack the entries of a dictionary into an XML element.
""" """
xItem = etree.SubElement(xParent, name) xItem = etree.SubElement(xParent, name)
for key, value in data.items(): for key, value in data.items():
+243 -81
View File
@@ -1,515 +1,677 @@
[ [
{ {
"name": "Novel",
"itemAttr": {
"handle": "7031beac91f75", "handle": "7031beac91f75",
"parent": null, "parent": null,
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 0, "order": 0,
"type": "ROOT", "type": "ROOT",
"class": "NOVEL", "class": "NOVEL",
"layout": "NO_LAYOUT", "layout": "NO_LAYOUT"
},
"metaAttr": {
"expanded": true, "expanded": true,
"heading": "H0", "heading": "H0",
"charCount": 0, "charCount": 0,
"wordCount": 0, "wordCount": 0,
"paraCount": 0, "paraCount": 0,
"cursorPos": 0, "cursorPos": 0
"label": "Novel", },
"nameAttr": {
"status": "sc24b8f", "status": "sc24b8f",
"import": "ia857f0", "import": "ia857f0",
"active": false "active": false
}
}, },
{ {
"name": "Title Page",
"itemAttr": {
"handle": "53b69b83cdafc", "handle": "53b69b83cdafc",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 0, "order": 0,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H1", "heading": "H1",
"charCount": 93, "charCount": 93,
"wordCount": 19, "wordCount": 19,
"paraCount": 2, "paraCount": 2,
"cursorPos": 119, "cursorPos": 119
"label": "Title Page", },
"nameAttr": {
"status": "sc24b8f", "status": "sc24b8f",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "Page",
"itemAttr": {
"handle": "974e400180a99", "handle": "974e400180a99",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 1, "order": 1,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H0", "heading": "H0",
"charCount": 251, "charCount": 251,
"wordCount": 50, "wordCount": 50,
"paraCount": 2, "paraCount": 2,
"cursorPos": 277, "cursorPos": 277
"label": "Page", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "Part One",
"itemAttr": {
"handle": "edca4be2fcaf8", "handle": "edca4be2fcaf8",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 2, "order": 2,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H1", "heading": "H1",
"charCount": 26, "charCount": 26,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 36, "cursorPos": 36
"label": "Part One", },
"nameAttr": {
"status": "s90e6c9", "status": "s90e6c9",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "Chapter One",
"itemAttr": {
"handle": "6a2d6d5f4f401", "handle": "6a2d6d5f4f401",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 3, "order": 3,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": true, "expanded": true,
"heading": "H2", "heading": "H2",
"charCount": 95, "charCount": 95,
"wordCount": 18, "wordCount": 18,
"paraCount": 1, "paraCount": 1,
"cursorPos": 291, "cursorPos": 291
"label": "Chapter One", },
"nameAttr": {
"status": "sf24ce6", "status": "sf24ce6",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "Making a Scene",
"itemAttr": {
"handle": "636b6aa9b697b", "handle": "636b6aa9b697b",
"parent": "6a2d6d5f4f401", "parent": "6a2d6d5f4f401",
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 0, "order": 0,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H3", "heading": "H3",
"charCount": 2687, "charCount": 2687,
"wordCount": 479, "wordCount": 479,
"paraCount": 14, "paraCount": 14,
"cursorPos": 67, "cursorPos": 67
"label": "Making a Scene", },
"nameAttr": {
"status": "s90e6c9", "status": "s90e6c9",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "Another Scene",
"itemAttr": {
"handle": "bc0cbd2a407f3", "handle": "bc0cbd2a407f3",
"parent": "6a2d6d5f4f401", "parent": "6a2d6d5f4f401",
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 1, "order": 1,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H3", "heading": "H3",
"charCount": 548, "charCount": 548,
"wordCount": 108, "wordCount": 108,
"paraCount": 3, "paraCount": 3,
"cursorPos": 465, "cursorPos": 465
"label": "Another Scene", },
"nameAttr": {
"status": "s90e6c9", "status": "s90e6c9",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "Interlude",
"itemAttr": {
"handle": "ba8a28a246524", "handle": "ba8a28a246524",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 4, "order": 4,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H2", "heading": "H2",
"charCount": 617, "charCount": 617,
"wordCount": 101, "wordCount": 101,
"paraCount": 3, "paraCount": 3,
"cursorPos": 310, "cursorPos": 310
"label": "Interlude", },
"nameAttr": {
"status": "s78ea90", "status": "s78ea90",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "A Note on Structure",
"itemAttr": {
"handle": "96b68994dfa3d", "handle": "96b68994dfa3d",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 5, "order": 5,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "NOTE", "layout": "NOTE"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H1", "heading": "H1",
"charCount": 1909, "charCount": 1909,
"wordCount": 346, "wordCount": 346,
"paraCount": 7, "paraCount": 7,
"cursorPos": 0, "cursorPos": 0
"label": "A Note on Structure", },
"nameAttr": {
"status": "sf24ce6", "status": "sf24ce6",
"import": "ia857f0", "import": "ia857f0",
"active": false "active": false
}
}, },
{ {
"name": "Chapter Two",
"itemAttr": {
"handle": "88706ddc78b1b", "handle": "88706ddc78b1b",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 6, "order": 6,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": true, "expanded": true,
"heading": "H2", "heading": "H2",
"charCount": 139, "charCount": 139,
"wordCount": 28, "wordCount": 28,
"paraCount": 1, "paraCount": 1,
"cursorPos": 188, "cursorPos": 188
"label": "Chapter Two", },
"nameAttr": {
"status": "s90e6c9", "status": "s90e6c9",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "We Found John!",
"itemAttr": {
"handle": "ae7339df26ded", "handle": "ae7339df26ded",
"parent": "88706ddc78b1b", "parent": "88706ddc78b1b",
"root": "7031beac91f75", "root": "7031beac91f75",
"order": 0, "order": 0,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H3", "heading": "H3",
"charCount": 189, "charCount": 189,
"wordCount": 37, "wordCount": 37,
"paraCount": 1, "paraCount": 1,
"cursorPos": 0, "cursorPos": 0
"label": "We Found John!", },
"nameAttr": {
"status": "s90e6c9", "status": "s90e6c9",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "Sequel",
"itemAttr": {
"handle": "e5e47ebf63b1c", "handle": "e5e47ebf63b1c",
"parent": null, "parent": null,
"root": "e5e47ebf63b1c", "root": "e5e47ebf63b1c",
"order": 1, "order": 1,
"type": "ROOT", "type": "ROOT",
"class": "NOVEL", "class": "NOVEL",
"layout": "NO_LAYOUT", "layout": "NO_LAYOUT"
},
"metaAttr": {
"expanded": true, "expanded": true,
"heading": "H0", "heading": "H0",
"charCount": 0, "charCount": 0,
"wordCount": 0, "wordCount": 0,
"paraCount": 0, "paraCount": 0,
"cursorPos": 0, "cursorPos": 0
"label": "Sequel", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "ia857f0", "import": "ia857f0",
"active": false "active": false
}
}, },
{ {
"name": "Title Page",
"itemAttr": {
"handle": "bacb7059e3083", "handle": "bacb7059e3083",
"parent": "e5e47ebf63b1c", "parent": "e5e47ebf63b1c",
"root": "e5e47ebf63b1c", "root": "e5e47ebf63b1c",
"order": 0, "order": 0,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H1", "heading": "H1",
"charCount": 27, "charCount": 27,
"wordCount": 5, "wordCount": 5,
"paraCount": 1, "paraCount": 1,
"cursorPos": 100, "cursorPos": 100
"label": "Title Page", },
"nameAttr": {
"status": "sc24b8f", "status": "sc24b8f",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "Chapter One",
"itemAttr": {
"handle": "a520879ca0b45", "handle": "a520879ca0b45",
"parent": "e5e47ebf63b1c", "parent": "e5e47ebf63b1c",
"root": "e5e47ebf63b1c", "root": "e5e47ebf63b1c",
"order": 1, "order": 1,
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H2", "heading": "H2",
"charCount": 299, "charCount": 299,
"wordCount": 55, "wordCount": 55,
"paraCount": 2, "paraCount": 2,
"cursorPos": 104, "cursorPos": 104
"label": "Chapter One", },
"nameAttr": {
"status": "s90e6c9", "status": "s90e6c9",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "Characters",
"itemAttr": {
"handle": "f6622b4617424", "handle": "f6622b4617424",
"parent": null, "parent": null,
"root": "f6622b4617424", "root": "f6622b4617424",
"order": 2, "order": 2,
"type": "ROOT", "type": "ROOT",
"class": "CHARACTER", "class": "CHARACTER",
"layout": "NO_LAYOUT", "layout": "NO_LAYOUT"
},
"metaAttr": {
"expanded": true, "expanded": true,
"heading": "H0", "heading": "H0",
"charCount": 0, "charCount": 0,
"wordCount": 0, "wordCount": 0,
"paraCount": 0, "paraCount": 0,
"cursorPos": 0, "cursorPos": 0
"label": "Characters", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "ia857f0", "import": "ia857f0",
"active": false "active": false
}
}, },
{ {
"name": "Main Characters",
"itemAttr": {
"handle": "f7e2d9f330615", "handle": "f7e2d9f330615",
"parent": "f6622b4617424", "parent": "f6622b4617424",
"root": "f6622b4617424", "root": "f6622b4617424",
"order": 0, "order": 0,
"type": "FOLDER", "type": "FOLDER",
"class": "CHARACTER", "class": "CHARACTER",
"layout": "NO_LAYOUT", "layout": "NO_LAYOUT"
},
"metaAttr": {
"expanded": true, "expanded": true,
"heading": "H0", "heading": "H0",
"charCount": 0, "charCount": 0,
"wordCount": 0, "wordCount": 0,
"paraCount": 0, "paraCount": 0,
"cursorPos": 0, "cursorPos": 0
"label": "Main Characters", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "ia857f0", "import": "ia857f0",
"active": false "active": false
}
}, },
{ {
"name": "John Smith",
"itemAttr": {
"handle": "14298de4d9524", "handle": "14298de4d9524",
"parent": "f7e2d9f330615", "parent": "f7e2d9f330615",
"root": "f6622b4617424", "root": "f6622b4617424",
"order": 0, "order": 0,
"type": "FILE", "type": "FILE",
"class": "CHARACTER", "class": "CHARACTER",
"layout": "NOTE", "layout": "NOTE"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H1", "heading": "H1",
"charCount": 49, "charCount": 49,
"wordCount": 9, "wordCount": 9,
"paraCount": 1, "paraCount": 1,
"cursorPos": 24, "cursorPos": 24
"label": "John Smith", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "icfb3a5", "import": "icfb3a5",
"active": true "active": true
}
}, },
{ {
"name": "Jane Smith",
"itemAttr": {
"handle": "bb2c23b3c42cc", "handle": "bb2c23b3c42cc",
"parent": "f7e2d9f330615", "parent": "f7e2d9f330615",
"root": "f6622b4617424", "root": "f6622b4617424",
"order": 1, "order": 1,
"type": "FILE", "type": "FILE",
"class": "CHARACTER", "class": "CHARACTER",
"layout": "NOTE", "layout": "NOTE"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H1", "heading": "H1",
"charCount": 55, "charCount": 55,
"wordCount": 9, "wordCount": 9,
"paraCount": 1, "paraCount": 1,
"cursorPos": 25, "cursorPos": 25
"label": "Jane Smith", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "i2d7a54", "import": "i2d7a54",
"active": true "active": true
}
}, },
{ {
"name": "Locations",
"itemAttr": {
"handle": "15c4492bd5107", "handle": "15c4492bd5107",
"parent": null, "parent": null,
"root": "15c4492bd5107", "root": "15c4492bd5107",
"order": 3, "order": 3,
"type": "ROOT", "type": "ROOT",
"class": "WORLD", "class": "WORLD",
"layout": "NO_LAYOUT", "layout": "NO_LAYOUT"
},
"metaAttr": {
"expanded": true, "expanded": true,
"heading": "H0", "heading": "H0",
"charCount": 0, "charCount": 0,
"wordCount": 0, "wordCount": 0,
"paraCount": 0, "paraCount": 0,
"cursorPos": 0, "cursorPos": 0
"label": "Locations", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "ia857f0", "import": "ia857f0",
"active": false "active": false
}
}, },
{ {
"name": "Earth",
"itemAttr": {
"handle": "b3e74dbc1f584", "handle": "b3e74dbc1f584",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": "15c4492bd5107", "root": "15c4492bd5107",
"order": 0, "order": 0,
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"layout": "NOTE", "layout": "NOTE"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H1", "heading": "H1",
"charCount": 76, "charCount": 76,
"wordCount": 15, "wordCount": 15,
"paraCount": 1, "paraCount": 1,
"cursorPos": 20, "cursorPos": 20
"label": "Earth", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "i56be10", "import": "i56be10",
"active": true "active": true
}
}, },
{ {
"name": "Space",
"itemAttr": {
"handle": "f1471bef9f2ae", "handle": "f1471bef9f2ae",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": "15c4492bd5107", "root": "15c4492bd5107",
"order": 1, "order": 1,
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"layout": "NOTE", "layout": "NOTE"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H1", "heading": "H1",
"charCount": 115, "charCount": 115,
"wordCount": 24, "wordCount": 24,
"paraCount": 1, "paraCount": 1,
"cursorPos": 133, "cursorPos": 133
"label": "Space", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "icfb3a5", "import": "icfb3a5",
"active": true "active": true
}
}, },
{ {
"name": "Mars",
"itemAttr": {
"handle": "5eaea4e8cdee8", "handle": "5eaea4e8cdee8",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": "15c4492bd5107", "root": "15c4492bd5107",
"order": 2, "order": 2,
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"layout": "NOTE", "layout": "NOTE"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H1", "heading": "H1",
"charCount": 28, "charCount": 28,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 45, "cursorPos": 45
"label": "Mars", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "i2d7a54", "import": "i2d7a54",
"active": true "active": true
}
}, },
{ {
"name": "Archive",
"itemAttr": {
"handle": "6827118336ac1", "handle": "6827118336ac1",
"parent": null, "parent": null,
"root": "6827118336ac1", "root": "6827118336ac1",
"order": 4, "order": 4,
"type": "ROOT", "type": "ROOT",
"class": "ARCHIVE", "class": "ARCHIVE",
"layout": "NO_LAYOUT", "layout": "NO_LAYOUT"
},
"metaAttr": {
"expanded": true, "expanded": true,
"heading": "H0", "heading": "H0",
"charCount": 0, "charCount": 0,
"wordCount": 0, "wordCount": 0,
"paraCount": 0, "paraCount": 0,
"cursorPos": 0, "cursorPos": 0
"label": "Archive", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "ia857f0", "import": "ia857f0",
"active": false "active": false
}
}, },
{ {
"name": "Scenes",
"itemAttr": {
"handle": "ae9bf3c3ea159", "handle": "ae9bf3c3ea159",
"parent": "6827118336ac1", "parent": "6827118336ac1",
"root": "6827118336ac1", "root": "6827118336ac1",
"order": 0, "order": 0,
"type": "FOLDER", "type": "FOLDER",
"class": "ARCHIVE", "class": "ARCHIVE",
"layout": "NO_LAYOUT", "layout": "NO_LAYOUT"
},
"metaAttr": {
"expanded": true, "expanded": true,
"heading": "H0", "heading": "H0",
"charCount": 0, "charCount": 0,
"wordCount": 0, "wordCount": 0,
"paraCount": 0, "paraCount": 0,
"cursorPos": 0, "cursorPos": 0
"label": "Scenes", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "ia857f0", "import": "ia857f0",
"active": false "active": false
}
}, },
{ {
"name": "Old File",
"itemAttr": {
"handle": "8a5deb88c0e97", "handle": "8a5deb88c0e97",
"parent": "ae9bf3c3ea159", "parent": "ae9bf3c3ea159",
"root": "6827118336ac1", "root": "6827118336ac1",
"order": 0, "order": 0,
"type": "FILE", "type": "FILE",
"class": "ARCHIVE", "class": "ARCHIVE",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H3", "heading": "H3",
"charCount": 232, "charCount": 232,
"wordCount": 42, "wordCount": 42,
"paraCount": 1, "paraCount": 1,
"cursorPos": 239, "cursorPos": 239
"label": "Old File", },
"nameAttr": {
"status": "s90e6c9", "status": "s90e6c9",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
}
}, },
{ {
"name": "Trash",
"itemAttr": {
"handle": "98acd8c76c93a", "handle": "98acd8c76c93a",
"parent": null, "parent": null,
"root": "98acd8c76c93a", "root": "98acd8c76c93a",
"order": 5, "order": 5,
"type": "ROOT", "type": "ROOT",
"class": "TRASH", "class": "TRASH",
"layout": "NO_LAYOUT", "layout": "NO_LAYOUT"
},
"metaAttr": {
"expanded": true, "expanded": true,
"heading": "H0", "heading": "H0",
"charCount": 0, "charCount": 0,
"wordCount": 0, "wordCount": 0,
"paraCount": 0, "paraCount": 0,
"cursorPos": 0, "cursorPos": 0
"label": "Trash", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "ia857f0", "import": "ia857f0",
"active": false "active": false
}
}, },
{ {
"name": "Delete Me!",
"itemAttr": {
"handle": "b8136a5a774a0", "handle": "b8136a5a774a0",
"parent": "98acd8c76c93a", "parent": "98acd8c76c93a",
"root": "98acd8c76c93a", "root": "98acd8c76c93a",
"order": 0, "order": 0,
"type": "FILE", "type": "FILE",
"class": "TRASH", "class": "TRASH",
"layout": "DOCUMENT", "layout": "DOCUMENT"
},
"metaAttr": {
"expanded": false, "expanded": false,
"heading": "H3", "heading": "H3",
"charCount": 30, "charCount": 30,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 36, "cursorPos": 36
"label": "Delete Me!", },
"nameAttr": {
"status": "sf12341", "status": "sf12341",
"import": "ia857f0", "import": "ia857f0",
"active": true "active": true
} }
}
] ]
+236 -104
View File
@@ -1,362 +1,494 @@
[ [
{ {
"name": "Novel",
"itemAttr": {
"handle": "7031beac91f75", "handle": "7031beac91f75",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Novel",
"type": "ROOT", "type": "ROOT",
"class": "NOVEL", "class": "NOVEL"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": "s000002" "status": "s000002"
}
}, },
{ {
"name": "Title Page",
"itemAttr": {
"handle": "53b69b83cdafc", "handle": "53b69b83cdafc",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Title Page",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "DOCUMENT",
"charCount": 72, "charCount": 72,
"wordCount": 15, "wordCount": 15,
"paraCount": 2, "paraCount": 2,
"cursorPos": 78, "cursorPos": 78
},
"nameAttr": {
"active": true,
"status": "s000002" "status": "s000002"
}
}, },
{ {
"name": "Page",
"itemAttr": {
"handle": "974e400180a99", "handle": "974e400180a99",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Page",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "DOCUMENT",
"charCount": 208, "charCount": 208,
"wordCount": 40, "wordCount": 40,
"paraCount": 2, "paraCount": 2,
"cursorPos": 213, "cursorPos": 213
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "Part One",
"itemAttr": {
"handle": "edca4be2fcaf8", "handle": "edca4be2fcaf8",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Part One",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "DOCUMENT",
"charCount": 23, "charCount": 23,
"wordCount": 5, "wordCount": 5,
"paraCount": 1, "paraCount": 1,
"cursorPos": 0, "cursorPos": 0
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "A Folder",
"itemAttr": {
"handle": "e7ded148d6e4a", "handle": "e7ded148d6e4a",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "A Folder",
"type": "FOLDER", "type": "FOLDER",
"class": "NOVEL", "class": "NOVEL"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Chapter One",
"itemAttr": {
"handle": "6a2d6d5f4f401", "handle": "6a2d6d5f4f401",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Chapter One",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "DOCUMENT",
"charCount": 12, "charCount": 12,
"wordCount": 3, "wordCount": 3,
"paraCount": 0, "paraCount": 0,
"cursorPos": 215, "cursorPos": 215
},
"nameAttr": {
"active": true,
"status": "s000001" "status": "s000001"
}
}, },
{ {
"name": "Making a Scene",
"itemAttr": {
"handle": "636b6aa9b697b", "handle": "636b6aa9b697b",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Making a Scene",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "DOCUMENT",
"charCount": 1199, "charCount": 1199,
"wordCount": 216, "wordCount": 216,
"paraCount": 7, "paraCount": 7,
"cursorPos": 527, "cursorPos": 527
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Another Scene",
"itemAttr": {
"handle": "bc0cbd2a407f3", "handle": "bc0cbd2a407f3",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Another Scene",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "DOCUMENT",
"charCount": 476, "charCount": 476,
"wordCount": 93, "wordCount": 93,
"paraCount": 3, "paraCount": 3,
"cursorPos": 551, "cursorPos": 551
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Interlude",
"itemAttr": {
"handle": "ba8a28a246524", "handle": "ba8a28a246524",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "Interlude",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "DOCUMENT",
"charCount": 633, "charCount": 633,
"wordCount": 101, "wordCount": 101,
"paraCount": 3, "paraCount": 3,
"cursorPos": 1238, "cursorPos": 1238
},
"nameAttr": {
"active": true,
"status": "s000006" "status": "s000006"
}
}, },
{ {
"name": "A Note on Structure",
"itemAttr": {
"handle": "96b68994dfa3d", "handle": "96b68994dfa3d",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 4, "order": 4,
"heading": "H0",
"label": "A Note on Structure",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "NOTE"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": false,
"layout": "NOTE",
"charCount": 1692, "charCount": 1692,
"wordCount": 313, "wordCount": 313,
"paraCount": 6, "paraCount": 6,
"cursorPos": 1721, "cursorPos": 1721
},
"nameAttr": {
"active": false,
"status": "s000004" "status": "s000004"
}
}, },
{ {
"name": "Chapter Two",
"itemAttr": {
"handle": "88706ddc78b1b", "handle": "88706ddc78b1b",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 5, "order": 5,
"heading": "H0",
"label": "Chapter Two",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "DOCUMENT",
"charCount": 139, "charCount": 139,
"wordCount": 28, "wordCount": 28,
"paraCount": 1, "paraCount": 1,
"cursorPos": 343, "cursorPos": 343
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "We Found John!",
"itemAttr": {
"handle": "ae7339df26ded", "handle": "ae7339df26ded",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 6, "order": 6,
"heading": "H0",
"label": "We Found John!",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "DOCUMENT",
"charCount": 189, "charCount": 189,
"wordCount": 37, "wordCount": 37,
"paraCount": 1, "paraCount": 1,
"cursorPos": 224, "cursorPos": 224
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Characters",
"itemAttr": {
"handle": "f6622b4617424", "handle": "f6622b4617424",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Characters",
"type": "ROOT", "type": "ROOT",
"class": "CHARACTER", "class": "CHARACTER"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Main Characters",
"itemAttr": {
"handle": "f7e2d9f330615", "handle": "f7e2d9f330615",
"parent": "f6622b4617424", "parent": "f6622b4617424",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Main Characters",
"type": "FOLDER", "type": "FOLDER",
"class": "CHARACTER", "class": "CHARACTER"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "John Smith",
"itemAttr": {
"handle": "14298de4d9524", "handle": "14298de4d9524",
"parent": "f7e2d9f330615", "parent": "f7e2d9f330615",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "John Smith",
"type": "FILE", "type": "FILE",
"class": "CHARACTER", "class": "CHARACTER",
"layout": "NOTE"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "NOTE",
"charCount": 49, "charCount": 49,
"wordCount": 9, "wordCount": 9,
"paraCount": 1, "paraCount": 1,
"cursorPos": 24, "cursorPos": 24
},
"nameAttr": {
"active": true,
"import": "i000008" "import": "i000008"
}
}, },
{ {
"name": "Jane Smith",
"itemAttr": {
"handle": "bb2c23b3c42cc", "handle": "bb2c23b3c42cc",
"parent": "f7e2d9f330615", "parent": "f7e2d9f330615",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Jane Smith",
"type": "FILE", "type": "FILE",
"class": "CHARACTER", "class": "CHARACTER",
"layout": "NOTE"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "NOTE",
"charCount": 55, "charCount": 55,
"wordCount": 9, "wordCount": 9,
"paraCount": 1, "paraCount": 1,
"cursorPos": 25, "cursorPos": 25
},
"nameAttr": {
"active": true,
"import": "i000009" "import": "i000009"
}
}, },
{ {
"name": "Locations",
"itemAttr": {
"handle": "15c4492bd5107", "handle": "15c4492bd5107",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Locations",
"type": "ROOT", "type": "ROOT",
"class": "WORLD", "class": "WORLD"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Earth",
"itemAttr": {
"handle": "b3e74dbc1f584", "handle": "b3e74dbc1f584",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Earth",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"layout": "NOTE"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "NOTE",
"charCount": 76, "charCount": 76,
"wordCount": 15, "wordCount": 15,
"paraCount": 1, "paraCount": 1,
"cursorPos": 20, "cursorPos": 20
},
"nameAttr": {
"active": true,
"import": "i00000a" "import": "i00000a"
}
}, },
{ {
"name": "Space",
"itemAttr": {
"handle": "f1471bef9f2ae", "handle": "f1471bef9f2ae",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Space",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"layout": "NOTE"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "NOTE",
"charCount": 115, "charCount": 115,
"wordCount": 24, "wordCount": 24,
"paraCount": 1, "paraCount": 1,
"cursorPos": 133, "cursorPos": 133
},
"nameAttr": {
"active": true,
"import": "i000008" "import": "i000008"
}
}, },
{ {
"name": "Mars",
"itemAttr": {
"handle": "5eaea4e8cdee8", "handle": "5eaea4e8cdee8",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Mars",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"layout": "NOTE"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "NOTE",
"charCount": 28, "charCount": 28,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 45, "cursorPos": 45
},
"nameAttr": {
"active": true,
"import": "i000009" "import": "i000009"
}
}, },
{ {
"name": "Trash",
"itemAttr": {
"handle": "98acd8c76c93a", "handle": "98acd8c76c93a",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "Trash",
"type": "ROOT", "type": "ROOT",
"class": "TRASH", "class": "TRASH"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Delete Me!",
"itemAttr": {
"handle": "b8136a5a774a0", "handle": "b8136a5a774a0",
"parent": "98acd8c76c93a", "parent": "98acd8c76c93a",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Delete Me!",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT"
},
"metaAttr": {
"heading": "H0",
"expanded": false, "expanded": false,
"active": true,
"layout": "DOCUMENT",
"charCount": 0, "charCount": 0,
"wordCount": 0, "wordCount": 0,
"paraCount": 0, "paraCount": 0,
"cursorPos": 36, "cursorPos": 36
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
} }
}
] ]
+236 -104
View File
@@ -1,346 +1,478 @@
[ [
{ {
"name": "Novel",
"itemAttr": {
"handle": "7031beac91f75", "handle": "7031beac91f75",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Novel",
"type": "ROOT", "type": "ROOT",
"class": "NOVEL", "class": "NOVEL"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": "s000002" "status": "s000002"
}
}, },
{ {
"name": "Title Page",
"itemAttr": {
"handle": "53b69b83cdafc", "handle": "53b69b83cdafc",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Title Page",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 72, "charCount": 72,
"wordCount": 15, "wordCount": 15,
"paraCount": 2, "paraCount": 2,
"cursorPos": 78, "cursorPos": 78
},
"nameAttr": {
"active": true,
"status": "s000002" "status": "s000002"
}
}, },
{ {
"name": "Page",
"itemAttr": {
"handle": "974e400180a99", "handle": "974e400180a99",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Page",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 210, "charCount": 210,
"wordCount": 40, "wordCount": 40,
"paraCount": 2, "paraCount": 2,
"cursorPos": 213, "cursorPos": 213
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "Part One",
"itemAttr": {
"handle": "edca4be2fcaf8", "handle": "edca4be2fcaf8",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Part One",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 23, "charCount": 23,
"wordCount": 5, "wordCount": 5,
"paraCount": 1, "paraCount": 1,
"cursorPos": 0, "cursorPos": 0
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "A Folder",
"itemAttr": {
"handle": "e7ded148d6e4a", "handle": "e7ded148d6e4a",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "A Folder",
"type": "FOLDER", "type": "FOLDER",
"class": "NOVEL", "class": "NOVEL"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Chapter One",
"itemAttr": {
"handle": "6a2d6d5f4f401", "handle": "6a2d6d5f4f401",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Chapter One",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 12, "charCount": 12,
"wordCount": 3, "wordCount": 3,
"paraCount": 0, "paraCount": 0,
"cursorPos": 215, "cursorPos": 215
},
"nameAttr": {
"active": true,
"status": "s000001" "status": "s000001"
}
}, },
{ {
"name": "Making a Scene",
"itemAttr": {
"handle": "636b6aa9b697b", "handle": "636b6aa9b697b",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Making a Scene",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 1483, "charCount": 1483,
"wordCount": 263, "wordCount": 263,
"paraCount": 8, "paraCount": 8,
"cursorPos": 1086, "cursorPos": 1086
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Another Scene",
"itemAttr": {
"handle": "bc0cbd2a407f3", "handle": "bc0cbd2a407f3",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Another Scene",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 476, "charCount": 476,
"wordCount": 93, "wordCount": 93,
"paraCount": 3, "paraCount": 3,
"cursorPos": 428, "cursorPos": 428
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Interlude",
"itemAttr": {
"handle": "ba8a28a246524", "handle": "ba8a28a246524",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "Interlude",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 633, "charCount": 633,
"wordCount": 101, "wordCount": 101,
"paraCount": 3, "paraCount": 3,
"cursorPos": 1238, "cursorPos": 1238
},
"nameAttr": {
"active": true,
"status": "s000006" "status": "s000006"
}
}, },
{ {
"name": "A Note on Structure",
"itemAttr": {
"handle": "96b68994dfa3d", "handle": "96b68994dfa3d",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 4, "order": 4,
"heading": "H0",
"label": "A Note on Structure",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": false, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 1692, "charCount": 1692,
"wordCount": 313, "wordCount": 313,
"paraCount": 6, "paraCount": 6,
"cursorPos": 1721, "cursorPos": 1721
},
"nameAttr": {
"active": false,
"status": "s000004" "status": "s000004"
}
}, },
{ {
"name": "Chapter Two",
"itemAttr": {
"handle": "88706ddc78b1b", "handle": "88706ddc78b1b",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 5, "order": 5,
"heading": "H0",
"label": "Chapter Two",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 139, "charCount": 139,
"wordCount": 28, "wordCount": 28,
"paraCount": 1, "paraCount": 1,
"cursorPos": 343, "cursorPos": 343
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "We Found John!",
"itemAttr": {
"handle": "ae7339df26ded", "handle": "ae7339df26ded",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 6, "order": 6,
"heading": "H0",
"label": "We Found John!",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 189, "charCount": 189,
"wordCount": 37, "wordCount": 37,
"paraCount": 1, "paraCount": 1,
"cursorPos": 224, "cursorPos": 224
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Characters",
"itemAttr": {
"handle": "f6622b4617424", "handle": "f6622b4617424",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Characters",
"type": "ROOT", "type": "ROOT",
"class": "CHARACTER", "class": "CHARACTER"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Main Characters",
"itemAttr": {
"handle": "f7e2d9f330615", "handle": "f7e2d9f330615",
"parent": "f6622b4617424", "parent": "f6622b4617424",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Main Characters",
"type": "FOLDER", "type": "FOLDER",
"class": "CHARACTER", "class": "CHARACTER"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "John Smith",
"itemAttr": {
"handle": "14298de4d9524", "handle": "14298de4d9524",
"parent": "f7e2d9f330615", "parent": "f7e2d9f330615",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "John Smith",
"type": "FILE", "type": "FILE",
"class": "CHARACTER", "class": "CHARACTER",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 49, "charCount": 49,
"wordCount": 9, "wordCount": 9,
"paraCount": 1, "paraCount": 1,
"cursorPos": 24, "cursorPos": 24
},
"nameAttr": {
"active": true,
"import": "i000008" "import": "i000008"
}
}, },
{ {
"name": "Jane Smith",
"itemAttr": {
"handle": "bb2c23b3c42cc", "handle": "bb2c23b3c42cc",
"parent": "f7e2d9f330615", "parent": "f7e2d9f330615",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Jane Smith",
"type": "FILE", "type": "FILE",
"class": "CHARACTER", "class": "CHARACTER",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 55, "charCount": 55,
"wordCount": 9, "wordCount": 9,
"paraCount": 1, "paraCount": 1,
"cursorPos": 25, "cursorPos": 25
},
"nameAttr": {
"active": true,
"import": "i000009" "import": "i000009"
}
}, },
{ {
"name": "Locations",
"itemAttr": {
"handle": "15c4492bd5107", "handle": "15c4492bd5107",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Locations",
"type": "ROOT", "type": "ROOT",
"class": "WORLD", "class": "WORLD"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Earth",
"itemAttr": {
"handle": "b3e74dbc1f584", "handle": "b3e74dbc1f584",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Earth",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 76, "charCount": 76,
"wordCount": 15, "wordCount": 15,
"paraCount": 1, "paraCount": 1,
"cursorPos": 20, "cursorPos": 20
},
"nameAttr": {
"active": true,
"import": "i00000a" "import": "i00000a"
}
}, },
{ {
"name": "Space",
"itemAttr": {
"handle": "f1471bef9f2ae", "handle": "f1471bef9f2ae",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Space",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 115, "charCount": 115,
"wordCount": 24, "wordCount": 24,
"paraCount": 1, "paraCount": 1,
"cursorPos": 133, "cursorPos": 133
},
"nameAttr": {
"active": true,
"import": "i000008" "import": "i000008"
}
}, },
{ {
"name": "Mars",
"itemAttr": {
"handle": "5eaea4e8cdee8", "handle": "5eaea4e8cdee8",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Mars",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 28, "charCount": 28,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 45, "cursorPos": 45
},
"nameAttr": {
"active": true,
"import": "i000009" "import": "i000009"
}
}, },
{ {
"name": "Trash",
"itemAttr": {
"handle": "98acd8c76c93a", "handle": "98acd8c76c93a",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "Trash",
"type": "ROOT", "type": "ROOT",
"class": "TRASH", "class": "TRASH"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Delete Me!",
"itemAttr": {
"handle": "b8136a5a774a0", "handle": "b8136a5a774a0",
"parent": "98acd8c76c93a", "parent": "98acd8c76c93a",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Delete Me!",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 30, "charCount": 30,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 36, "cursorPos": 36
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
} }
}
] ]
+267 -117
View File
@@ -1,387 +1,537 @@
[ [
{ {
"name": "Novel",
"itemAttr": {
"handle": "7031beac91f75", "handle": "7031beac91f75",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Novel",
"type": "ROOT", "type": "ROOT",
"class": "NOVEL", "class": "NOVEL"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": "s000002" "status": "s000002"
}
}, },
{ {
"name": "Title Page",
"itemAttr": {
"handle": "53b69b83cdafc", "handle": "53b69b83cdafc",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Title Page",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 241, "charCount": 241,
"wordCount": 42, "wordCount": 42,
"paraCount": 3, "paraCount": 3,
"cursorPos": 252, "cursorPos": 252
},
"nameAttr": {
"active": true,
"status": "s000002" "status": "s000002"
}
}, },
{ {
"name": "Page",
"itemAttr": {
"handle": "974e400180a99", "handle": "974e400180a99",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Page",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 125, "charCount": 125,
"wordCount": 26, "wordCount": 26,
"paraCount": 2, "paraCount": 2,
"cursorPos": 127, "cursorPos": 127
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "Part One",
"itemAttr": {
"handle": "edca4be2fcaf8", "handle": "edca4be2fcaf8",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Part One",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 26, "charCount": 26,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 30, "cursorPos": 30
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "A Folder",
"itemAttr": {
"handle": "e7ded148d6e4a", "handle": "e7ded148d6e4a",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "A Folder",
"type": "FOLDER", "type": "FOLDER",
"class": "NOVEL", "class": "NOVEL"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Chapter One",
"itemAttr": {
"handle": "6a2d6d5f4f401", "handle": "6a2d6d5f4f401",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Chapter One",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 75, "charCount": 75,
"wordCount": 14, "wordCount": 14,
"paraCount": 1, "paraCount": 1,
"cursorPos": 279, "cursorPos": 279
},
"nameAttr": {
"active": true,
"status": "s000001" "status": "s000001"
}
}, },
{ {
"name": "Making a Scene",
"itemAttr": {
"handle": "636b6aa9b697b", "handle": "636b6aa9b697b",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Making a Scene",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 2429, "charCount": 2429,
"wordCount": 432, "wordCount": 432,
"paraCount": 14, "paraCount": 14,
"cursorPos": 61, "cursorPos": 61
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Another Scene",
"itemAttr": {
"handle": "bc0cbd2a407f3", "handle": "bc0cbd2a407f3",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Another Scene",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 476, "charCount": 476,
"wordCount": 93, "wordCount": 93,
"paraCount": 3, "paraCount": 3,
"cursorPos": 577, "cursorPos": 577
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Interlude",
"itemAttr": {
"handle": "ba8a28a246524", "handle": "ba8a28a246524",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "Interlude",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 617, "charCount": 617,
"wordCount": 101, "wordCount": 101,
"paraCount": 3, "paraCount": 3,
"cursorPos": 1137, "cursorPos": 1137
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "A Note on Structure",
"itemAttr": {
"handle": "96b68994dfa3d", "handle": "96b68994dfa3d",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 4, "order": 4,
"heading": "H0",
"label": "A Note on Structure",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": false, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 1692, "charCount": 1692,
"wordCount": 313, "wordCount": 313,
"paraCount": 6, "paraCount": 6,
"cursorPos": 1110, "cursorPos": 1110
},
"nameAttr": {
"active": false,
"status": "s000004" "status": "s000004"
}
}, },
{ {
"name": "Chapter Two",
"itemAttr": {
"handle": "88706ddc78b1b", "handle": "88706ddc78b1b",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 5, "order": 5,
"heading": "H0",
"label": "Chapter Two",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 139, "charCount": 139,
"wordCount": 28, "wordCount": 28,
"paraCount": 1, "paraCount": 1,
"cursorPos": 343, "cursorPos": 343
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "We Found John!",
"itemAttr": {
"handle": "ae7339df26ded", "handle": "ae7339df26ded",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 6, "order": 6,
"heading": "H0",
"label": "We Found John!",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 189, "charCount": 189,
"wordCount": 37, "wordCount": 37,
"paraCount": 1, "paraCount": 1,
"cursorPos": 224, "cursorPos": 224
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Characters",
"itemAttr": {
"handle": "f6622b4617424", "handle": "f6622b4617424",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Characters",
"type": "ROOT", "type": "ROOT",
"class": "CHARACTER", "class": "CHARACTER"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Main Characters",
"itemAttr": {
"handle": "f7e2d9f330615", "handle": "f7e2d9f330615",
"parent": "f6622b4617424", "parent": "f6622b4617424",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Main Characters",
"type": "FOLDER", "type": "FOLDER",
"class": "CHARACTER", "class": "CHARACTER"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "John Smith",
"itemAttr": {
"handle": "14298de4d9524", "handle": "14298de4d9524",
"parent": "f7e2d9f330615", "parent": "f7e2d9f330615",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "John Smith",
"type": "FILE", "type": "FILE",
"class": "CHARACTER", "class": "CHARACTER",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 49, "charCount": 49,
"wordCount": 9, "wordCount": 9,
"paraCount": 1, "paraCount": 1,
"cursorPos": 24, "cursorPos": 24
},
"nameAttr": {
"active": true,
"import": "i000008" "import": "i000008"
}
}, },
{ {
"name": "Jane Smith",
"itemAttr": {
"handle": "bb2c23b3c42cc", "handle": "bb2c23b3c42cc",
"parent": "f7e2d9f330615", "parent": "f7e2d9f330615",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Jane Smith",
"type": "FILE", "type": "FILE",
"class": "CHARACTER", "class": "CHARACTER",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 55, "charCount": 55,
"wordCount": 9, "wordCount": 9,
"paraCount": 1, "paraCount": 1,
"cursorPos": 25, "cursorPos": 25
},
"nameAttr": {
"active": true,
"import": "i000009" "import": "i000009"
}
}, },
{ {
"name": "Locations",
"itemAttr": {
"handle": "15c4492bd5107", "handle": "15c4492bd5107",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Locations",
"type": "ROOT", "type": "ROOT",
"class": "WORLD", "class": "WORLD"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Earth",
"itemAttr": {
"handle": "b3e74dbc1f584", "handle": "b3e74dbc1f584",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Earth",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 76, "charCount": 76,
"wordCount": 15, "wordCount": 15,
"paraCount": 1, "paraCount": 1,
"cursorPos": 20, "cursorPos": 20
},
"nameAttr": {
"active": true,
"import": "i00000a" "import": "i00000a"
}
}, },
{ {
"name": "Space",
"itemAttr": {
"handle": "f1471bef9f2ae", "handle": "f1471bef9f2ae",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Space",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 115, "charCount": 115,
"wordCount": 24, "wordCount": 24,
"paraCount": 1, "paraCount": 1,
"cursorPos": 133, "cursorPos": 133
},
"nameAttr": {
"active": true,
"import": "i000008" "import": "i000008"
}
}, },
{ {
"name": "Mars",
"itemAttr": {
"handle": "5eaea4e8cdee8", "handle": "5eaea4e8cdee8",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Mars",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 28, "charCount": 28,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 45, "cursorPos": 45
},
"nameAttr": {
"active": true,
"import": "i000009" "import": "i000009"
}
}, },
{ {
"name": "Outtakes",
"itemAttr": {
"handle": "6827118336ac1", "handle": "6827118336ac1",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "Outtakes",
"type": "ROOT", "type": "ROOT",
"class": "ARCHIVE", "class": "ARCHIVE"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": null "status": null
}
}, },
{ {
"name": "Scenes",
"itemAttr": {
"handle": "ae9bf3c3ea159", "handle": "ae9bf3c3ea159",
"parent": "6827118336ac1", "parent": "6827118336ac1",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Scenes",
"type": "FOLDER", "type": "FOLDER",
"class": "ARCHIVE", "class": "ARCHIVE"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": null "status": null
}
}, },
{ {
"name": "Old File",
"itemAttr": {
"handle": "8a5deb88c0e97", "handle": "8a5deb88c0e97",
"parent": "ae9bf3c3ea159", "parent": "ae9bf3c3ea159",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Old File",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 315, "charCount": 315,
"wordCount": 55, "wordCount": 55,
"paraCount": 1, "paraCount": 1,
"cursorPos": 322, "cursorPos": 322
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Trash",
"itemAttr": {
"handle": "98acd8c76c93a", "handle": "98acd8c76c93a",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 4, "order": 4,
"heading": "H0",
"label": "Trash",
"type": "ROOT", "type": "ROOT",
"class": "TRASH", "class": "TRASH"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Delete Me!",
"itemAttr": {
"handle": "b8136a5a774a0", "handle": "b8136a5a774a0",
"parent": "98acd8c76c93a", "parent": "98acd8c76c93a",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Delete Me!",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 30, "charCount": 30,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 36, "cursorPos": 36
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
} }
}
] ]
+267 -117
View File
@@ -1,387 +1,537 @@
[ [
{ {
"name": "Novel",
"itemAttr": {
"handle": "7031beac91f75", "handle": "7031beac91f75",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Novel",
"type": "ROOT", "type": "ROOT",
"class": "NOVEL", "class": "NOVEL"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": "s000002" "status": "s000002"
}
}, },
{ {
"name": "Title Page",
"itemAttr": {
"handle": "53b69b83cdafc", "handle": "53b69b83cdafc",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Title Page",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 93, "charCount": 93,
"wordCount": 19, "wordCount": 19,
"paraCount": 2, "paraCount": 2,
"cursorPos": 2, "cursorPos": 2
},
"nameAttr": {
"active": true,
"status": "s000002" "status": "s000002"
}
}, },
{ {
"name": "Page",
"itemAttr": {
"handle": "974e400180a99", "handle": "974e400180a99",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Page",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 186, "charCount": 186,
"wordCount": 39, "wordCount": 39,
"paraCount": 2, "paraCount": 2,
"cursorPos": 212, "cursorPos": 212
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "Part One",
"itemAttr": {
"handle": "edca4be2fcaf8", "handle": "edca4be2fcaf8",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Part One",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 26, "charCount": 26,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 33, "cursorPos": 33
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "A Folder",
"itemAttr": {
"handle": "e7ded148d6e4a", "handle": "e7ded148d6e4a",
"parent": "7031beac91f75", "parent": "7031beac91f75",
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "A Folder",
"type": "FOLDER", "type": "FOLDER",
"class": "NOVEL", "class": "NOVEL"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Chapter One",
"itemAttr": {
"handle": "6a2d6d5f4f401", "handle": "6a2d6d5f4f401",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Chapter One",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 75, "charCount": 75,
"wordCount": 14, "wordCount": 14,
"paraCount": 1, "paraCount": 1,
"cursorPos": 279, "cursorPos": 279
},
"nameAttr": {
"active": true,
"status": "s000001" "status": "s000001"
}
}, },
{ {
"name": "Making a Scene",
"itemAttr": {
"handle": "636b6aa9b697b", "handle": "636b6aa9b697b",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Making a Scene",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 2429, "charCount": 2429,
"wordCount": 432, "wordCount": 432,
"paraCount": 14, "paraCount": 14,
"cursorPos": 62, "cursorPos": 62
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Another Scene",
"itemAttr": {
"handle": "bc0cbd2a407f3", "handle": "bc0cbd2a407f3",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Another Scene",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 476, "charCount": 476,
"wordCount": 93, "wordCount": 93,
"paraCount": 3, "paraCount": 3,
"cursorPos": 577, "cursorPos": 577
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Interlude",
"itemAttr": {
"handle": "ba8a28a246524", "handle": "ba8a28a246524",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "Interlude",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 617, "charCount": 617,
"wordCount": 101, "wordCount": 101,
"paraCount": 3, "paraCount": 3,
"cursorPos": 4, "cursorPos": 4
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "A Note on Structure",
"itemAttr": {
"handle": "96b68994dfa3d", "handle": "96b68994dfa3d",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 4, "order": 4,
"heading": "H0",
"label": "A Note on Structure",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": false, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 1692, "charCount": 1692,
"wordCount": 313, "wordCount": 313,
"paraCount": 6, "paraCount": 6,
"cursorPos": 1110, "cursorPos": 1110
},
"nameAttr": {
"active": false,
"status": "s000004" "status": "s000004"
}
}, },
{ {
"name": "Chapter Two",
"itemAttr": {
"handle": "88706ddc78b1b", "handle": "88706ddc78b1b",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 5, "order": 5,
"heading": "H0",
"label": "Chapter Two",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 139, "charCount": 139,
"wordCount": 28, "wordCount": 28,
"paraCount": 1, "paraCount": 1,
"cursorPos": 343, "cursorPos": 343
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "We Found John!",
"itemAttr": {
"handle": "ae7339df26ded", "handle": "ae7339df26ded",
"parent": "e7ded148d6e4a", "parent": "e7ded148d6e4a",
"root": null, "root": null,
"order": 6, "order": 6,
"heading": "H0",
"label": "We Found John!",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 189, "charCount": 189,
"wordCount": 37, "wordCount": 37,
"paraCount": 1, "paraCount": 1,
"cursorPos": 224, "cursorPos": 224
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Characters",
"itemAttr": {
"handle": "f6622b4617424", "handle": "f6622b4617424",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Characters",
"type": "ROOT", "type": "ROOT",
"class": "CHARACTER", "class": "CHARACTER"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Main Characters",
"itemAttr": {
"handle": "f7e2d9f330615", "handle": "f7e2d9f330615",
"parent": "f6622b4617424", "parent": "f6622b4617424",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Main Characters",
"type": "FOLDER", "type": "FOLDER",
"class": "CHARACTER", "class": "CHARACTER"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "John Smith",
"itemAttr": {
"handle": "14298de4d9524", "handle": "14298de4d9524",
"parent": "f7e2d9f330615", "parent": "f7e2d9f330615",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "John Smith",
"type": "FILE", "type": "FILE",
"class": "CHARACTER", "class": "CHARACTER",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 49, "charCount": 49,
"wordCount": 9, "wordCount": 9,
"paraCount": 1, "paraCount": 1,
"cursorPos": 24, "cursorPos": 24
},
"nameAttr": {
"active": true,
"import": "i000008" "import": "i000008"
}
}, },
{ {
"name": "Jane Smith",
"itemAttr": {
"handle": "bb2c23b3c42cc", "handle": "bb2c23b3c42cc",
"parent": "f7e2d9f330615", "parent": "f7e2d9f330615",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Jane Smith",
"type": "FILE", "type": "FILE",
"class": "CHARACTER", "class": "CHARACTER",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 55, "charCount": 55,
"wordCount": 9, "wordCount": 9,
"paraCount": 1, "paraCount": 1,
"cursorPos": 25, "cursorPos": 25
},
"nameAttr": {
"active": true,
"import": "i000009" "import": "i000009"
}
}, },
{ {
"name": "Locations",
"itemAttr": {
"handle": "15c4492bd5107", "handle": "15c4492bd5107",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Locations",
"type": "ROOT", "type": "ROOT",
"class": "WORLD", "class": "WORLD"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Earth",
"itemAttr": {
"handle": "b3e74dbc1f584", "handle": "b3e74dbc1f584",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Earth",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 76, "charCount": 76,
"wordCount": 15, "wordCount": 15,
"paraCount": 1, "paraCount": 1,
"cursorPos": 20, "cursorPos": 20
},
"nameAttr": {
"active": true,
"import": "i00000a" "import": "i00000a"
}
}, },
{ {
"name": "Space",
"itemAttr": {
"handle": "f1471bef9f2ae", "handle": "f1471bef9f2ae",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 1, "order": 1,
"heading": "H0",
"label": "Space",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 115, "charCount": 115,
"wordCount": 24, "wordCount": 24,
"paraCount": 1, "paraCount": 1,
"cursorPos": 133, "cursorPos": 133
},
"nameAttr": {
"active": true,
"import": "i000008" "import": "i000008"
}
}, },
{ {
"name": "Mars",
"itemAttr": {
"handle": "5eaea4e8cdee8", "handle": "5eaea4e8cdee8",
"parent": "15c4492bd5107", "parent": "15c4492bd5107",
"root": null, "root": null,
"order": 2, "order": 2,
"heading": "H0",
"label": "Mars",
"type": "FILE", "type": "FILE",
"class": "WORLD", "class": "WORLD",
"active": true, "layout": "NOTE"
"layout": "NOTE", },
"metaAttr": {
"heading": "H0",
"charCount": 28, "charCount": 28,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 45, "cursorPos": 45
},
"nameAttr": {
"active": true,
"import": "i000009" "import": "i000009"
}
}, },
{ {
"name": "Archive",
"itemAttr": {
"handle": "6827118336ac1", "handle": "6827118336ac1",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 3, "order": 3,
"heading": "H0",
"label": "Archive",
"type": "ROOT", "type": "ROOT",
"class": "ARCHIVE", "class": "ARCHIVE"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "Scenes",
"itemAttr": {
"handle": "ae9bf3c3ea159", "handle": "ae9bf3c3ea159",
"parent": "6827118336ac1", "parent": "6827118336ac1",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Scenes",
"type": "FOLDER", "type": "FOLDER",
"class": "ARCHIVE", "class": "ARCHIVE"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"status": "s000000" "status": "s000000"
}
}, },
{ {
"name": "Old File",
"itemAttr": {
"handle": "8a5deb88c0e97", "handle": "8a5deb88c0e97",
"parent": "ae9bf3c3ea159", "parent": "ae9bf3c3ea159",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Old File",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 314, "charCount": 314,
"wordCount": 55, "wordCount": 55,
"paraCount": 1, "paraCount": 1,
"cursorPos": 322, "cursorPos": 322
},
"nameAttr": {
"active": true,
"status": "s000003" "status": "s000003"
}
}, },
{ {
"name": "Trash",
"itemAttr": {
"handle": "98acd8c76c93a", "handle": "98acd8c76c93a",
"parent": null, "parent": null,
"root": null, "root": null,
"order": 4, "order": 4,
"heading": "H0",
"label": "Trash",
"type": "ROOT", "type": "ROOT",
"class": "TRASH", "class": "TRASH"
"expanded": true, },
"metaAttr": {
"heading": "H0",
"expanded": true
},
"nameAttr": {
"import": null "import": null
}
}, },
{ {
"name": "Delete Me!",
"itemAttr": {
"handle": "b8136a5a774a0", "handle": "b8136a5a774a0",
"parent": "98acd8c76c93a", "parent": "98acd8c76c93a",
"root": null, "root": null,
"order": 0, "order": 0,
"heading": "H0",
"label": "Delete Me!",
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"active": true, "layout": "DOCUMENT"
"layout": "DOCUMENT", },
"metaAttr": {
"heading": "H0",
"charCount": 30, "charCount": 30,
"wordCount": 6, "wordCount": 6,
"paraCount": 1, "paraCount": 1,
"cursorPos": 36, "cursorPos": 36
},
"nameAttr": {
"active": true,
"status": "s000000" "status": "s000000"
} }
}
] ]
+27 -9
View File
@@ -509,7 +509,8 @@ def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd):
# File # File
theItem = NWItem(theProject) theItem = NWItem(theProject)
assert theItem.unpack({ assert theItem.unpack({
"label": "A File", "name": "A File",
"itemAttr": {
"handle": "0000000000003", "handle": "0000000000003",
"parent": "0000000000002", "parent": "0000000000002",
"root": "0000000000001", "root": "0000000000001",
@@ -517,15 +518,20 @@ def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd):
"type": "FILE", "type": "FILE",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT",
},
"metaAttr": {
"expanded": True, "expanded": True,
"status": None,
"import": None,
"heading": "H1", "heading": "H1",
"charCount": 100, "charCount": 100,
"wordCount": 20, "wordCount": 20,
"paraCount": 2, "paraCount": 2,
"cursorPos": 50, "cursorPos": 50,
},
"nameAttr": {
"status": None,
"import": None,
"active": False, "active": False,
},
}) is True }) is True
assert theItem.itemName == "A File" assert theItem.itemName == "A File"
@@ -575,7 +581,8 @@ def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd):
# Folder # Folder
theItem = NWItem(theProject) theItem = NWItem(theProject)
assert theItem.unpack({ assert theItem.unpack({
"label": "A Folder", "name": "A Folder",
"itemAttr": {
"handle": "0000000000003", "handle": "0000000000003",
"parent": "0000000000002", "parent": "0000000000002",
"root": "0000000000001", "root": "0000000000001",
@@ -583,15 +590,20 @@ def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd):
"type": "FOLDER", "type": "FOLDER",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT",
},
"metaAttr": {
"expanded": True, "expanded": True,
"status": "",
"import": "",
"heading": "H1", "heading": "H1",
"charCount": 100, "charCount": 100,
"wordCount": 20, "wordCount": 20,
"paraCount": 2, "paraCount": 2,
"cursorPos": 50, "cursorPos": 50,
},
"nameAttr": {
"status": "",
"import": "",
"active": True, "active": True,
}
}) is True }) is True
assert theItem.itemName == "A Folder" assert theItem.itemName == "A Folder"
@@ -634,7 +646,8 @@ def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd):
# Root # Root
theItem = NWItem(theProject) theItem = NWItem(theProject)
assert theItem.unpack({ assert theItem.unpack({
"label": "A Novel", "name": "A Novel",
"itemAttr": {
"handle": "0000000000003", "handle": "0000000000003",
"parent": "0000000000002", "parent": "0000000000002",
"root": "0000000000001", "root": "0000000000001",
@@ -642,15 +655,20 @@ def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd):
"type": "ROOT", "type": "ROOT",
"class": "NOVEL", "class": "NOVEL",
"layout": "DOCUMENT", "layout": "DOCUMENT",
},
"metaAttr": {
"expanded": True, "expanded": True,
"status": None,
"import": None,
"heading": "H1", "heading": "H1",
"charCount": 100, "charCount": 100,
"wordCount": 20, "wordCount": 20,
"paraCount": 2, "paraCount": 2,
"cursorPos": 50, "cursorPos": 50,
},
"nameAttr": {
"status": None,
"import": None,
"active": True, "active": True,
},
}) is True }) is True
assert theItem.itemName == "A Novel" assert theItem.itemName == "A Novel"
+22 -12
View File
@@ -19,11 +19,11 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
import json
import os import os
import json
import pytest import pytest
import shutil
from shutil import copyfile
from datetime import datetime from datetime import datetime
from mock import causeOSError from mock import causeOSError
@@ -47,6 +47,7 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, filesDir, fncDir, outDir, refDir
xmlFile = os.path.join(fncDir, "nwProject-1.4.nwx") xmlFile = os.path.join(fncDir, "nwProject-1.4.nwx")
bakFile = os.path.join(fncDir, "nwProject-1.4.bak") bakFile = os.path.join(fncDir, "nwProject-1.4.bak")
outFile = os.path.join(fncDir, "nwProject.nwx") outFile = os.path.join(fncDir, "nwProject.nwx")
tstFile = os.path.join(outDir, "ProjectXML_ReadCurrent.nwx")
xmlReader = ProjectXMLReader(xmlFile) xmlReader = ProjectXMLReader(xmlFile)
assert xmlReader.state == XMLReadState.NO_ACTION assert xmlReader.state == XMLReadState.NO_ACTION
@@ -125,7 +126,7 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, filesDir, fncDir, outDir, refDir
content = [] content = []
# Parse a valid, complete file # Parse a valid, complete file
shutil.copy(refFile, xmlFile) copyfile(refFile, xmlFile)
assert xmlReader.read(data, content) is True assert xmlReader.read(data, content) is True
assert xmlReader.state == XMLReadState.PARSED_OK assert xmlReader.state == XMLReadState.PARSED_OK
assert xmlReader.xmlRoot == "novelWriterXML" assert xmlReader.xmlRoot == "novelWriterXML"
@@ -231,7 +232,8 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, filesDir, fncDir, outDir, refDir
# Successful save (should be twice) # Successful save (should be twice)
assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True
assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True
assert cmpFiles(outFile, xmlFile) copyfile(outFile, tstFile)
assert cmpFiles(tstFile, xmlFile)
# END Test testCoreProjectXML_ReadCurrent # END Test testCoreProjectXML_ReadCurrent
@@ -243,7 +245,7 @@ def testCoreProjectXML_ReadLegacy10(filesDir, fncDir, outDir, refDir, mockRnd):
refFile = os.path.join(filesDir, "nwProject-1.0.nwx") refFile = os.path.join(filesDir, "nwProject-1.0.nwx")
xmlFile = os.path.join(fncDir, "nwProject-1.0.nwx") xmlFile = os.path.join(fncDir, "nwProject-1.0.nwx")
outFile = os.path.join(fncDir, "nwProject.nwx") outFile = os.path.join(fncDir, "nwProject.nwx")
shutil.copy(refFile, xmlFile) copyfile(refFile, xmlFile)
xmlReader = ProjectXMLReader(xmlFile) xmlReader = ProjectXMLReader(xmlFile)
assert xmlReader.state == XMLReadState.NO_ACTION assert xmlReader.state == XMLReadState.NO_ACTION
@@ -369,8 +371,10 @@ def testCoreProjectXML_ReadLegacy10(filesDir, fncDir, outDir, refDir, mockRnd):
timeStamp = int(datetime.fromisoformat(xmlReader.timeStamp).timestamp()) timeStamp = int(datetime.fromisoformat(xmlReader.timeStamp).timestamp())
xmlWriter = ProjectXMLWriter(fncDir) xmlWriter = ProjectXMLWriter(fncDir)
assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True
testFile = os.path.join(outDir, "projectXML_ReadLegacy10.nwx")
compFile = os.path.join(refDir, "projectXML_ReadLegacy10.nwx") compFile = os.path.join(refDir, "projectXML_ReadLegacy10.nwx")
assert cmpFiles(outFile, compFile) copyfile(outFile, testFile)
assert cmpFiles(testFile, compFile)
# END Test testCoreProjectXML_ReadLegacy10 # END Test testCoreProjectXML_ReadLegacy10
@@ -382,7 +386,7 @@ def testCoreProjectXML_ReadLegacy11(filesDir, fncDir, outDir, refDir, mockRnd):
refFile = os.path.join(filesDir, "nwProject-1.1.nwx") refFile = os.path.join(filesDir, "nwProject-1.1.nwx")
xmlFile = os.path.join(fncDir, "nwProject-1.1.nwx") xmlFile = os.path.join(fncDir, "nwProject-1.1.nwx")
outFile = os.path.join(fncDir, "nwProject.nwx") outFile = os.path.join(fncDir, "nwProject.nwx")
shutil.copy(refFile, xmlFile) copyfile(refFile, xmlFile)
xmlReader = ProjectXMLReader(xmlFile) xmlReader = ProjectXMLReader(xmlFile)
assert xmlReader.state == XMLReadState.NO_ACTION assert xmlReader.state == XMLReadState.NO_ACTION
@@ -508,8 +512,10 @@ def testCoreProjectXML_ReadLegacy11(filesDir, fncDir, outDir, refDir, mockRnd):
timeStamp = int(datetime.fromisoformat(xmlReader.timeStamp).timestamp()) timeStamp = int(datetime.fromisoformat(xmlReader.timeStamp).timestamp())
xmlWriter = ProjectXMLWriter(fncDir) xmlWriter = ProjectXMLWriter(fncDir)
assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True
testFile = os.path.join(outDir, "projectXML_ReadLegacy11.nwx")
compFile = os.path.join(refDir, "projectXML_ReadLegacy11.nwx") compFile = os.path.join(refDir, "projectXML_ReadLegacy11.nwx")
assert cmpFiles(outFile, compFile) copyfile(outFile, testFile)
assert cmpFiles(testFile, compFile)
# END Test testCoreProjectXML_ReadLegacy11 # END Test testCoreProjectXML_ReadLegacy11
@@ -521,7 +527,7 @@ def testCoreProjectXML_ReadLegacy12(filesDir, fncDir, outDir, refDir, mockRnd):
refFile = os.path.join(filesDir, "nwProject-1.2.nwx") refFile = os.path.join(filesDir, "nwProject-1.2.nwx")
xmlFile = os.path.join(fncDir, "nwProject-1.2.nwx") xmlFile = os.path.join(fncDir, "nwProject-1.2.nwx")
outFile = os.path.join(fncDir, "nwProject.nwx") outFile = os.path.join(fncDir, "nwProject.nwx")
shutil.copy(refFile, xmlFile) copyfile(refFile, xmlFile)
xmlReader = ProjectXMLReader(xmlFile) xmlReader = ProjectXMLReader(xmlFile)
assert xmlReader.state == XMLReadState.NO_ACTION assert xmlReader.state == XMLReadState.NO_ACTION
@@ -650,8 +656,10 @@ def testCoreProjectXML_ReadLegacy12(filesDir, fncDir, outDir, refDir, mockRnd):
timeStamp = int(datetime.fromisoformat(xmlReader.timeStamp).timestamp()) timeStamp = int(datetime.fromisoformat(xmlReader.timeStamp).timestamp())
xmlWriter = ProjectXMLWriter(fncDir) xmlWriter = ProjectXMLWriter(fncDir)
assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True
testFile = os.path.join(outDir, "projectXML_ReadLegacy12.nwx")
compFile = os.path.join(refDir, "projectXML_ReadLegacy12.nwx") compFile = os.path.join(refDir, "projectXML_ReadLegacy12.nwx")
assert cmpFiles(outFile, compFile) copyfile(outFile, testFile)
assert cmpFiles(testFile, compFile)
# END Test testCoreProjectXML_ReadLegacy12 # END Test testCoreProjectXML_ReadLegacy12
@@ -663,7 +671,7 @@ def testCoreProjectXML_ReadLegacy13(filesDir, fncDir, outDir, refDir, mockRnd):
refFile = os.path.join(filesDir, "nwProject-1.3.nwx") refFile = os.path.join(filesDir, "nwProject-1.3.nwx")
xmlFile = os.path.join(fncDir, "nwProject-1.3.nwx") xmlFile = os.path.join(fncDir, "nwProject-1.3.nwx")
outFile = os.path.join(fncDir, "nwProject.nwx") outFile = os.path.join(fncDir, "nwProject.nwx")
shutil.copy(refFile, xmlFile) copyfile(refFile, xmlFile)
xmlReader = ProjectXMLReader(xmlFile) xmlReader = ProjectXMLReader(xmlFile)
assert xmlReader.state == XMLReadState.NO_ACTION assert xmlReader.state == XMLReadState.NO_ACTION
@@ -792,7 +800,9 @@ def testCoreProjectXML_ReadLegacy13(filesDir, fncDir, outDir, refDir, mockRnd):
timeStamp = int(datetime.fromisoformat(xmlReader.timeStamp).timestamp()) timeStamp = int(datetime.fromisoformat(xmlReader.timeStamp).timestamp())
xmlWriter = ProjectXMLWriter(fncDir) xmlWriter = ProjectXMLWriter(fncDir)
assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True assert xmlWriter.write(data, packedContent, timeStamp, 1000) is True
testFile = os.path.join(outDir, "projectXML_ReadLegacy13.nwx")
compFile = os.path.join(refDir, "projectXML_ReadLegacy13.nwx") compFile = os.path.join(refDir, "projectXML_ReadLegacy13.nwx")
assert cmpFiles(outFile, compFile) copyfile(outFile, testFile)
assert cmpFiles(testFile, compFile)
# END Test testCoreProjectXML_ReadLegacy13 # END Test testCoreProjectXML_ReadLegacy13