Implement project file format 1.4 (#993)

* Update the item class with more compact item storage format
* Bump version and file version
* Update tests
* Add explicit test coverage for format conversions for item class
* Update the documentation
This commit is contained in:
Veronica Berglyd Olsen
2022-02-20 22:05:31 +01:00
committed by GitHub
parent be703c1f46
commit 045a595537
17 changed files with 666 additions and 1389 deletions
+78 -238
View File
@@ -1,13 +1,13 @@
<?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.6" hexVersion="0x010600f0" fileVersion="1.3" timeStamp="2022-02-20 19:44:43">
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:55:50">
<project>
<name>Sample Project</name>
<title>Sample Project</title>
<author>Jane Smith</author>
<author>Jay Doh</author>
<saveCount>1299</saveCount>
<saveCount>1303</saveCount>
<autoCount>199</autoCount>
<editTime>64923</editTime>
<editTime>64457</editTime>
</project>
<settings>
<doBackup>False</doBackup>
@@ -49,265 +49,105 @@
</importance>
</settings>
<content count="25">
<item handle="7031beac91f75" order="0" parent="None">
<name>Novel</name>
<type>ROOT</type>
<class>NOVEL</class>
<status>Started</status>
<expanded>True</expanded>
<item handle="7031beac91f75" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="True"/>
<name status="Started">Novel</name>
</item>
<item handle="53b69b83cdafc" order="0" parent="7031beac91f75">
<name>Title Page</name>
<type>FILE</type>
<class>NOVEL</class>
<status>Started</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>93</charCount>
<wordCount>19</wordCount>
<paraCount>2</paraCount>
<cursorPos>2</cursorPos>
<item handle="53b69b83cdafc" parent="7031beac91f75" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="93" wordCount="19" paraCount="2" cursorPos="2"/>
<name status="Started" exported="True">Title Page</name>
</item>
<item handle="974e400180a99" order="1" parent="7031beac91f75">
<name>Page</name>
<type>FILE</type>
<class>NOVEL</class>
<status>New</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>186</charCount>
<wordCount>39</wordCount>
<paraCount>2</paraCount>
<cursorPos>212</cursorPos>
<item handle="974e400180a99" parent="7031beac91f75" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="186" wordCount="39" paraCount="2" cursorPos="212"/>
<name status="New" exported="True">Page</name>
</item>
<item handle="edca4be2fcaf8" order="2" parent="7031beac91f75">
<name>Part One</name>
<type>FILE</type>
<class>NOVEL</class>
<status>New</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>26</charCount>
<wordCount>6</wordCount>
<paraCount>1</paraCount>
<cursorPos>33</cursorPos>
<item handle="edca4be2fcaf8" parent="7031beac91f75" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="26" wordCount="6" paraCount="1" cursorPos="33"/>
<name status="New" exported="True">Part One</name>
</item>
<item handle="e7ded148d6e4a" order="3" parent="7031beac91f75">
<name>A Folder</name>
<type>FOLDER</type>
<class>NOVEL</class>
<status>1st Draft</status>
<expanded>True</expanded>
<item handle="e7ded148d6e4a" parent="7031beac91f75" order="3" type="FOLDER" class="NOVEL">
<meta expanded="True"/>
<name status="1st Draft">A Folder</name>
</item>
<item handle="6a2d6d5f4f401" order="0" parent="e7ded148d6e4a">
<name>Chapter One</name>
<type>FILE</type>
<class>NOVEL</class>
<status>Notes</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>75</charCount>
<wordCount>14</wordCount>
<paraCount>1</paraCount>
<cursorPos>279</cursorPos>
<item handle="6a2d6d5f4f401" parent="e7ded148d6e4a" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="75" wordCount="14" paraCount="1" cursorPos="279"/>
<name status="Notes" exported="True">Chapter One</name>
</item>
<item handle="636b6aa9b697b" order="1" parent="e7ded148d6e4a">
<name>Making a Scene</name>
<type>FILE</type>
<class>NOVEL</class>
<status>1st Draft</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>2429</charCount>
<wordCount>432</wordCount>
<paraCount>14</paraCount>
<cursorPos>219</cursorPos>
<item handle="636b6aa9b697b" parent="e7ded148d6e4a" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="2429" wordCount="432" paraCount="14" cursorPos="219"/>
<name status="1st Draft" exported="True">Making a Scene</name>
</item>
<item handle="bc0cbd2a407f3" order="2" parent="e7ded148d6e4a">
<name>Another Scene</name>
<type>FILE</type>
<class>NOVEL</class>
<status>1st Draft</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>476</charCount>
<wordCount>93</wordCount>
<paraCount>3</paraCount>
<cursorPos>577</cursorPos>
<item handle="bc0cbd2a407f3" parent="e7ded148d6e4a" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="476" wordCount="93" paraCount="3" cursorPos="577"/>
<name status="1st Draft" exported="True">Another Scene</name>
</item>
<item handle="ba8a28a246524" order="3" parent="e7ded148d6e4a">
<name>Interlude</name>
<type>FILE</type>
<class>NOVEL</class>
<status>New</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>617</charCount>
<wordCount>101</wordCount>
<paraCount>3</paraCount>
<cursorPos>4</cursorPos>
<item handle="ba8a28a246524" parent="e7ded148d6e4a" order="3" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="617" wordCount="101" paraCount="3" cursorPos="4"/>
<name status="New" exported="True">Interlude</name>
</item>
<item handle="96b68994dfa3d" order="4" parent="e7ded148d6e4a">
<name>A Note on Structure</name>
<type>FILE</type>
<class>NOVEL</class>
<status>2nd Draft</status>
<exported>False</exported>
<layout>NOTE</layout>
<charCount>1692</charCount>
<wordCount>313</wordCount>
<paraCount>6</paraCount>
<cursorPos>1110</cursorPos>
<item handle="96b68994dfa3d" parent="e7ded148d6e4a" order="4" type="FILE" class="NOVEL" layout="NOTE">
<meta charCount="1692" wordCount="313" paraCount="6" cursorPos="1110"/>
<name status="2nd Draft" exported="False">A Note on Structure</name>
</item>
<item handle="88706ddc78b1b" order="5" parent="e7ded148d6e4a">
<name>Chapter Two</name>
<type>FILE</type>
<class>NOVEL</class>
<status>1st Draft</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>139</charCount>
<wordCount>28</wordCount>
<paraCount>1</paraCount>
<cursorPos>343</cursorPos>
<item handle="88706ddc78b1b" parent="e7ded148d6e4a" order="5" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="139" wordCount="28" paraCount="1" cursorPos="343"/>
<name status="1st Draft" exported="True">Chapter Two</name>
</item>
<item handle="ae7339df26ded" order="6" parent="e7ded148d6e4a">
<name>We Found John!</name>
<type>FILE</type>
<class>NOVEL</class>
<status>1st Draft</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>189</charCount>
<wordCount>37</wordCount>
<paraCount>1</paraCount>
<cursorPos>224</cursorPos>
<item handle="ae7339df26ded" parent="e7ded148d6e4a" order="6" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="189" wordCount="37" paraCount="1" cursorPos="224"/>
<name status="1st Draft" exported="True">We Found John!</name>
</item>
<item handle="f6622b4617424" order="1" parent="None">
<name>Characters</name>
<type>ROOT</type>
<class>CHARACTER</class>
<status>None</status>
<expanded>True</expanded>
<item handle="f6622b4617424" parent="None" order="1" type="ROOT" class="CHARACTER">
<meta expanded="True"/>
<name status="None">Characters</name>
</item>
<item handle="f7e2d9f330615" order="0" parent="f6622b4617424">
<name>Main Characters</name>
<type>FOLDER</type>
<class>CHARACTER</class>
<status>None</status>
<expanded>True</expanded>
<item handle="f7e2d9f330615" parent="f6622b4617424" order="0" type="FOLDER" class="CHARACTER">
<meta expanded="True"/>
<name status="None">Main Characters</name>
</item>
<item handle="14298de4d9524" order="0" parent="f7e2d9f330615">
<name>John Smith</name>
<type>FILE</type>
<class>CHARACTER</class>
<status>Minor</status>
<exported>True</exported>
<layout>NOTE</layout>
<charCount>49</charCount>
<wordCount>9</wordCount>
<paraCount>1</paraCount>
<cursorPos>24</cursorPos>
<item handle="14298de4d9524" parent="f7e2d9f330615" order="0" type="FILE" class="CHARACTER" layout="NOTE">
<meta charCount="49" wordCount="9" paraCount="1" cursorPos="24"/>
<name status="Minor" exported="True">John Smith</name>
</item>
<item handle="bb2c23b3c42cc" order="1" parent="f7e2d9f330615">
<name>Jane Smith</name>
<type>FILE</type>
<class>CHARACTER</class>
<status>Major</status>
<exported>True</exported>
<layout>NOTE</layout>
<charCount>55</charCount>
<wordCount>9</wordCount>
<paraCount>1</paraCount>
<cursorPos>25</cursorPos>
<item handle="bb2c23b3c42cc" parent="f7e2d9f330615" order="1" type="FILE" class="CHARACTER" layout="NOTE">
<meta charCount="55" wordCount="9" paraCount="1" cursorPos="25"/>
<name status="Major" exported="True">Jane Smith</name>
</item>
<item handle="15c4492bd5107" order="2" parent="None">
<name>Locations</name>
<type>ROOT</type>
<class>WORLD</class>
<status>None</status>
<expanded>True</expanded>
<item handle="15c4492bd5107" parent="None" order="2" type="ROOT" class="WORLD">
<meta expanded="True"/>
<name status="None">Locations</name>
</item>
<item handle="b3e74dbc1f584" order="0" parent="15c4492bd5107">
<name>Earth</name>
<type>FILE</type>
<class>WORLD</class>
<status>Main</status>
<exported>True</exported>
<layout>NOTE</layout>
<charCount>76</charCount>
<wordCount>15</wordCount>
<paraCount>1</paraCount>
<cursorPos>20</cursorPos>
<item handle="b3e74dbc1f584" parent="15c4492bd5107" order="0" type="FILE" class="WORLD" layout="NOTE">
<meta charCount="76" wordCount="15" paraCount="1" cursorPos="20"/>
<name status="Main" exported="True">Earth</name>
</item>
<item handle="f1471bef9f2ae" order="1" parent="15c4492bd5107">
<name>Space</name>
<type>FILE</type>
<class>WORLD</class>
<status>Minor</status>
<exported>True</exported>
<layout>NOTE</layout>
<charCount>115</charCount>
<wordCount>24</wordCount>
<paraCount>1</paraCount>
<cursorPos>133</cursorPos>
<item handle="f1471bef9f2ae" parent="15c4492bd5107" order="1" type="FILE" class="WORLD" layout="NOTE">
<meta charCount="115" wordCount="24" paraCount="1" cursorPos="133"/>
<name status="Minor" exported="True">Space</name>
</item>
<item handle="5eaea4e8cdee8" order="2" parent="15c4492bd5107">
<name>Mars</name>
<type>FILE</type>
<class>WORLD</class>
<status>Major</status>
<exported>True</exported>
<layout>NOTE</layout>
<charCount>28</charCount>
<wordCount>6</wordCount>
<paraCount>1</paraCount>
<cursorPos>45</cursorPos>
<item handle="5eaea4e8cdee8" parent="15c4492bd5107" order="2" type="FILE" class="WORLD" layout="NOTE">
<meta charCount="28" wordCount="6" paraCount="1" cursorPos="45"/>
<name status="Major" exported="True">Mars</name>
</item>
<item handle="6827118336ac1" order="3" parent="None">
<name>Archive</name>
<type>ROOT</type>
<class>ARCHIVE</class>
<status>New</status>
<expanded>True</expanded>
<item handle="6827118336ac1" parent="None" order="3" type="ROOT" class="ARCHIVE">
<meta expanded="True"/>
<name status="New">Archive</name>
</item>
<item handle="ae9bf3c3ea159" order="0" parent="6827118336ac1">
<name>Scenes</name>
<type>FOLDER</type>
<class>ARCHIVE</class>
<status>New</status>
<expanded>True</expanded>
<item handle="ae9bf3c3ea159" parent="6827118336ac1" order="0" type="FOLDER" class="ARCHIVE">
<meta expanded="True"/>
<name status="New">Scenes</name>
</item>
<item handle="8a5deb88c0e97" order="0" parent="ae9bf3c3ea159">
<name>Old File</name>
<type>FILE</type>
<class>NOVEL</class>
<status>1st Draft</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>315</charCount>
<wordCount>55</wordCount>
<paraCount>1</paraCount>
<cursorPos>322</cursorPos>
<item handle="8a5deb88c0e97" parent="ae9bf3c3ea159" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="315" wordCount="55" paraCount="1" cursorPos="322"/>
<name status="1st Draft" exported="True">Old File</name>
</item>
<item handle="98acd8c76c93a" order="4" parent="None">
<name>Trash</name>
<type>TRASH</type>
<class>TRASH</class>
<status>None</status>
<expanded>True</expanded>
<item handle="98acd8c76c93a" parent="None" order="4" type="TRASH" class="TRASH">
<meta expanded="True"/>
<name status="None">Trash</name>
</item>
<item handle="b8136a5a774a0" order="0" parent="98acd8c76c93a">
<name>Delete Me!</name>
<type>FILE</type>
<class>NOVEL</class>
<status>New</status>
<exported>True</exported>
<layout>DOCUMENT</layout>
<charCount>30</charCount>
<wordCount>6</wordCount>
<paraCount>1</paraCount>
<cursorPos>36</cursorPos>
<item handle="b8136a5a774a0" parent="98acd8c76c93a" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="30" wordCount="6" paraCount="1" cursorPos="36"/>
<name status="New" exported="True">Delete Me!</name>
</item>
</content>
</novelWriterXML>