extwee 2.0.5 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/.eslintrc.json +25 -25
  2. package/.github/FUNDING.yml +3 -0
  3. package/.github/dependabot.yml +11 -0
  4. package/.github/workflows/nodejs.yml +25 -24
  5. package/.travis.yml +13 -13
  6. package/CODE_OF_CONDUCT.md +82 -82
  7. package/LICENSE +21 -21
  8. package/README.md +173 -36
  9. package/SECURITY.md +12 -12
  10. package/babel.config.json +18 -22
  11. package/build/extwee +0 -0
  12. package/build/extwee.exe +0 -0
  13. package/build/extwee.web.min.js +2 -0
  14. package/build/extwee.web.min.js.LICENSE.txt +1 -0
  15. package/docs/.nojekyll +0 -0
  16. package/docs/README.md +167 -0
  17. package/docs/_sidebar.md +19 -0
  18. package/docs/examples/dynamicPassages.md +28 -0
  19. package/docs/examples/jsonToTwee.md +23 -0
  20. package/docs/examples/twsToTwee.md +25 -0
  21. package/docs/formats/json.md +17 -0
  22. package/docs/formats/twee.md +13 -0
  23. package/docs/formats/twine1HTML.md +13 -0
  24. package/docs/formats/twine2ArchiveHTML.md +13 -0
  25. package/docs/formats/twine2HTML.md +13 -0
  26. package/docs/formats/tws.md +9 -0
  27. package/docs/index.html +26 -0
  28. package/docs/install/binaries.md +9 -0
  29. package/docs/install/npm.md +20 -0
  30. package/docs/install/npx.md +9 -0
  31. package/docs/objects/passage.md +47 -0
  32. package/docs/objects/story.md +70 -0
  33. package/docs/objects/storyformat.md +27 -0
  34. package/index.html +22 -0
  35. package/index.js +29 -31
  36. package/package.json +65 -58
  37. package/src/JSON/parse.js +128 -0
  38. package/src/Passage.js +298 -202
  39. package/src/Story.js +650 -489
  40. package/src/StoryFormat/parse.js +134 -0
  41. package/src/StoryFormat.js +259 -300
  42. package/src/TWS/parse.js +86 -0
  43. package/src/Twee/parse.js +157 -0
  44. package/src/Twine1HTML/compile.js +58 -0
  45. package/src/Twine1HTML/parse.js +134 -0
  46. package/src/Twine2ArchiveHTML/compile.js +36 -0
  47. package/src/Twine2ArchiveHTML/parse.js +49 -0
  48. package/src/Twine2HTML/compile.js +35 -0
  49. package/src/Twine2HTML/parse.js +348 -0
  50. package/src/extwee.js +206 -0
  51. package/test/CLI/CLI.test.js +49 -0
  52. package/test/CLI/files/example.json +1 -0
  53. package/test/CLI/files/example6.twee +22 -0
  54. package/test/{Roundtrip → CLI/files}/harlowe.js +2 -2
  55. package/test/CLI/{input.html → files/input.html} +47 -47
  56. package/test/CLI/files/output/test.twee +0 -0
  57. package/test/CLI/{tweeExample.twee → files/tweeExample.twee} +17 -17
  58. package/test/CLI/files/twine1/LICENSE.txt +32 -0
  59. package/test/CLI/files/twine1/code.js +5 -0
  60. package/test/CLI/files/twine1/engine.js +43 -0
  61. package/test/CLI/files/twine1/header.html +325 -0
  62. package/test/CLI/files/twine1Test.html +371 -0
  63. package/test/{HTMLParser → CLI/files}/twineExample.html +16 -15
  64. package/test/JSON/JSON.Parse.test.js +316 -0
  65. package/test/Passage.test.js +175 -104
  66. package/test/Roundtrip/{Example1.html → Files/Example1.html} +63 -63
  67. package/test/Roundtrip/Files/LICENSE +19 -0
  68. package/test/Roundtrip/Files/example1.twee +10 -0
  69. package/test/Roundtrip/{example2.twee → Files/example2.twee} +27 -18
  70. package/test/Roundtrip/Files/example4.twee +27 -0
  71. package/test/{StoryFormatParser → Roundtrip/Files}/harlowe.js +2 -2
  72. package/test/Roundtrip/{round.html → Files/round.html} +6 -7
  73. package/test/Roundtrip/Roundtrip.test.js +54 -0
  74. package/test/Story.test.js +624 -355
  75. package/test/StoryFormat/StoryFormat.Parse.test.js +91 -0
  76. package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/example.js +3 -3
  77. package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/example2.js +3 -3
  78. package/test/{CLI → StoryFormat/StoryFormatParser}/harlowe.js +2 -2
  79. package/test/StoryFormat.test.js +152 -152
  80. package/test/TWS/Parse.test.js +78 -0
  81. package/test/TWS/TWSParser/Example1.tws +150 -0
  82. package/test/TWS/TWSParser/Example5.tws +414 -0
  83. package/test/TWS/TWSParser/noscale.tws +0 -0
  84. package/test/TWS/TWSParser/nostory.tws +0 -0
  85. package/test/Twee/Twee.Parse.test.js +76 -0
  86. package/test/{TweeParser → Twee/TweeParser}/emptytags.twee +2 -2
  87. package/test/{TweeParser → Twee/TweeParser}/example.twee +32 -32
  88. package/test/{TweeParser → Twee/TweeParser}/missing.twee +19 -19
  89. package/test/{TweeParser → Twee/TweeParser}/multipleScriptPassages.twee +19 -19
  90. package/test/{TweeParser → Twee/TweeParser}/multipleStyleTag.twee +19 -19
  91. package/test/{TweeParser → Twee/TweeParser}/multipletags.twee +10 -10
  92. package/test/{TweeParser → Twee/TweeParser}/noTitle.twee +2 -2
  93. package/test/{TweeParser → Twee/TweeParser}/notes.twee +16 -16
  94. package/test/{TweeParser → Twee/TweeParser}/pasagemetadataerror.twee +2 -2
  95. package/test/{TweeParser → Twee/TweeParser}/scriptPassage.twee +16 -16
  96. package/test/{TweeParser → Twee/TweeParser}/singletag.twee +13 -13
  97. package/test/{TweeParser → Twee/TweeParser}/startMetadata.twee +14 -14
  98. package/test/{TweeParser → Twee/TweeParser}/storydataerror.twee +25 -25
  99. package/test/{TweeParser → Twee/TweeParser}/stylePassage.twee +16 -16
  100. package/test/{Story → Twee/TweeParser}/test.twee +25 -25
  101. package/test/Twine1HTML/Twine1HTML.Compile.test.js +180 -0
  102. package/test/Twine1HTML/Twine1HTML.Parse.test.js +183 -0
  103. package/test/Twine1HTML/Twine1HTMLCompiler/Twine1/LICENSE +674 -0
  104. package/test/Twine1HTML/Twine1HTMLCompiler/Twine1/engine.js +43 -0
  105. package/test/Twine1HTML/Twine1HTMLCompiler/Twine1/jquery.js +4 -0
  106. package/test/Twine1HTML/Twine1HTMLCompiler/Twine1/modernizr.js +4 -0
  107. package/test/Twine1HTML/Twine1HTMLCompiler/engineTest.html +1 -0
  108. package/test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/LICENSE +32 -0
  109. package/test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/code.js +4 -0
  110. package/test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/header.html +327 -0
  111. package/test/Twine1HTML/Twine1HTMLCompiler/test.html +0 -0
  112. package/test/Twine1HTML/Twine1HTMLCompiler/test1.html +6 -0
  113. package/test/Twine1HTML/Twine1HTMLCompiler/test2.html +6 -0
  114. package/test/Twine1HTML/Twine1HTMLCompiler/test3.html +43 -0
  115. package/test/Twine1HTML/Twine1HTMLCompiler/test4.html +372 -0
  116. package/test/Twine1HTML/Twine1HTMLCompiler/test5.html +372 -0
  117. package/test/Twine2ArchiveHTML/Twine2ArchiveHTML.Compile.test.js +35 -0
  118. package/test/Twine2ArchiveHTML/Twine2ArchiveHTML.Parse.test.js +25 -0
  119. package/test/Twine2ArchiveHTML/Twine2ArchiveHTMLCompiler/test1.html +6 -0
  120. package/test/Twine2ArchiveHTML/Twine2ArchiveHTMLParser/test1.html +3 -0
  121. package/test/Twine2HTML/Twine2HTML.Compile.test.js +224 -0
  122. package/test/Twine2HTML/Twine2HTML.Parse.test.js +172 -0
  123. package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/creator.html +4 -5
  124. package/test/{CLI → Twine2HTML/Twine2HTMLCompiler}/example6.twee +15 -15
  125. package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/missingStoryTitle.twee +29 -29
  126. package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/test11.html +1 -3
  127. package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/test2.html +10 -11
  128. package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/test3.html +1 -2
  129. package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/test4.html +4 -5
  130. package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/test6.html +1 -2
  131. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/Example1.html +52 -52
  132. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/Tags.html +15 -15
  133. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/lyingStartnode.html +15 -15
  134. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/lyingTagColors.html +48 -48
  135. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingCreator.html +11 -11
  136. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingCreatorVersion.html +11 -11
  137. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingFormat.html +11 -11
  138. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingFormatVersion.html +11 -11
  139. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingIFID.html +11 -11
  140. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingName.html +33 -33
  141. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingPID.html +15 -15
  142. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingPassageName.html +15 -15
  143. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingPassageTags.html +15 -15
  144. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingPosition.html +15 -15
  145. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingScript.html +14 -14
  146. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingSize.html +35 -35
  147. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingStartnode.html +11 -11
  148. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingStyle.html +14 -14
  149. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingZoom.html +11 -11
  150. package/test/Twine2HTML/Twine2HTMLParser/twineExample.html +23 -0
  151. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/twineExample2.html +15 -15
  152. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/twineExample3.html +15 -15
  153. package/web-index.js +29 -0
  154. package/webpack.config.js +12 -0
  155. package/bin/extwee.js +0 -47
  156. package/src/FileReader.js +0 -33
  157. package/src/HTMLParser.js +0 -343
  158. package/src/HTMLWriter.js +0 -231
  159. package/src/StoryFormatParser.js +0 -142
  160. package/src/TweeParser.js +0 -161
  161. package/src/TweeWriter.js +0 -98
  162. package/story-formats/chapbook-1.2.0/format.js +0 -1
  163. package/story-formats/chapbook-1.2.0/logo.svg +0 -1
  164. package/story-formats/harlowe-1.2.4/format.js +0 -1
  165. package/story-formats/harlowe-1.2.4/icon.svg +0 -78
  166. package/story-formats/harlowe-2.1.0/format.js +0 -2
  167. package/story-formats/harlowe-2.1.0/icon.svg +0 -78
  168. package/story-formats/harlowe-3.1.0/format.js +0 -3
  169. package/story-formats/harlowe-3.1.0/icon.svg +0 -78
  170. package/story-formats/paperthin-1.0.0/format.js +0 -1
  171. package/story-formats/paperthin-1.0.0/icon.svg +0 -5
  172. package/story-formats/snowman-1.4.0/format.js +0 -1
  173. package/story-formats/snowman-1.4.0/icon.svg +0 -436
  174. package/story-formats/snowman-2.0.2/format.js +0 -1
  175. package/story-formats/snowman-2.0.2/icon.svg +0 -436
  176. package/story-formats/sugarcube-1.0.35/LICENSE +0 -23
  177. package/story-formats/sugarcube-1.0.35/format.js +0 -1
  178. package/story-formats/sugarcube-1.0.35/icon.svg +0 -56
  179. package/story-formats/sugarcube-2.31.1/LICENSE +0 -22
  180. package/story-formats/sugarcube-2.31.1/format.js +0 -1
  181. package/story-formats/sugarcube-2.31.1/icon.svg +0 -56
  182. package/test/CLI/test2.html +0 -47
  183. package/test/CLI/twineExample.html +0 -15
  184. package/test/CLI.test.js +0 -30
  185. package/test/FileReader/t1.txt +0 -1
  186. package/test/FileReader.test.js +0 -14
  187. package/test/HTMLParser.test.js +0 -177
  188. package/test/HTMLWriter/example6.twee +0 -16
  189. package/test/HTMLWriter.test.js +0 -289
  190. package/test/Roundtrip/example1.twee +0 -21
  191. package/test/Roundtrip.test.js +0 -48
  192. package/test/Story/startmeta.twee +0 -29
  193. package/test/StoryFormatParser.test.js +0 -91
  194. package/test/TweeParser/test.twee +0 -25
  195. package/test/TweeParser.test.js +0 -79
  196. package/test/TweeWriter/test1.twee +0 -18
  197. package/test/TweeWriter/test3.twee +0 -12
  198. package/test/TweeWriter/test4.twee +0 -14
  199. package/test/TweeWriter/test5.twee +0 -20
  200. package/test/TweeWriter.test.js +0 -85
  201. /package/test/CLI/{test.twee → files/test.twee} +0 -0
  202. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/format.js +0 -0
  203. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/format_doublename.js +0 -0
  204. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingAuthor.js +0 -0
  205. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingDescription.js +0 -0
  206. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingImage.js +0 -0
  207. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingLicense.js +0 -0
  208. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingName.js +0 -0
  209. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingProofing.js +0 -0
  210. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingSource.js +0 -0
  211. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingURL.js +0 -0
  212. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingVersion.js +0 -0
  213. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/versionWrong.js +0 -0
  214. /package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/TestTags.html +0 -0
  215. /package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/tagColors.html +0 -0
@@ -0,0 +1,316 @@
1
+ import Story from '../../src/Story.js';
2
+ import Passage from '../../src/Passage.js';
3
+ import { parse as parseJSON } from '../../src/JSON/parse.js';
4
+
5
+ describe('JSON', () => {
6
+ describe('parse()', function () {
7
+ it('Should throw error if JSON is invalid', function () {
8
+ expect(() => { parseJSON('{'); }).toThrow();
9
+ });
10
+
11
+ it('Should roundtrip default Story values using toJSON() and fromJSON()', function () {
12
+ // Create Story.
13
+ const r = new Story();
14
+
15
+ // Convert to JSON and back.
16
+ const s = parseJSON(r.toJSON());
17
+
18
+ // Check all properties.
19
+ expect(s.name).toBe('');
20
+ expect(Object.keys(s.tagColors).length).toBe(0);
21
+ expect(s.IFID).toBe('');
22
+ expect(s.start).toBe('');
23
+ expect(s.formatVersion).toBe('');
24
+ expect(s.format).toBe('');
25
+ expect(s.creator).toBe('extwee');
26
+ expect(s.creatorVersion).toBe('2.2.0');
27
+ expect(s.zoom).toBe(0);
28
+ expect(Object.keys(s.metadata).length).toBe(0);
29
+ });
30
+
31
+ it('Should parse passage data', function () {
32
+ // Create passage.
33
+ const p = new Passage('Test', 'Default');
34
+
35
+ // Create Story.
36
+ const s = new Story();
37
+
38
+ // Add a passage.
39
+ s.addPassage(p);
40
+
41
+ // Convert to JSON.
42
+ const js = s.toJSON(s);
43
+
44
+ // Convert back to Story.
45
+ const result = parseJSON(js);
46
+
47
+ // Should have a single passage.
48
+ expect(result.size()).toBe(1);
49
+ });
50
+
51
+ describe('Partial Story Processing', function () {
52
+ it('Should parse everything but name', function () {
53
+ const s = '{"tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Start","tags":["tag1"],"metadata":{},"text":"Word"}]}';
54
+ const r = parseJSON(s);
55
+ expect(r.name).toBe('');
56
+ expect(Object.keys(r.tagColors).length).toBe(1);
57
+ expect(r.IFID).toBe('DD');
58
+ expect(r.start).toBe('Start');
59
+ expect(r.formatVersion).toBe('1.0');
60
+ expect(Object.keys(r.metadata).length).toBe(1);
61
+ expect(r.format).toBe('Snowman');
62
+ expect(r.creator).toBe('extwee');
63
+ expect(r.creatorVersion).toBe('2.2.0');
64
+ expect(r.zoom).toBe(1);
65
+ expect(r.size()).toBe(1);
66
+ });
67
+
68
+ it('Should parse everything but tagColors', function () {
69
+ const s = '{"name":"Test","ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Start","tags":["tag1"],"metadata":{},"text":"Word"}]}';
70
+ const r = parseJSON(s);
71
+ expect(r.name).toBe('Test');
72
+ expect(Object.keys(r.tagColors).length).toBe(0);
73
+ expect(r.IFID).toBe('DD');
74
+ expect(r.start).toBe('Start');
75
+ expect(r.formatVersion).toBe('1.0');
76
+ expect(Object.keys(r.metadata).length).toBe(1);
77
+ expect(r.format).toBe('Snowman');
78
+ expect(r.creator).toBe('extwee');
79
+ expect(r.creatorVersion).toBe('2.2.0');
80
+ expect(r.zoom).toBe(1);
81
+ expect(r.size()).toBe(1);
82
+ });
83
+
84
+ it('Should parse everything but ifid', function () {
85
+ const s = '{"name":"Test","tagColors":{"r":"red"},"start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Start","tags":["tag1"],"metadata":{},"text":"Word"}]}';
86
+ const r = parseJSON(s);
87
+ expect(r.name).toBe('Test');
88
+ expect(Object.keys(r.tagColors).length).toBe(1);
89
+ expect(r.IFID).toBe('');
90
+ expect(r.start).toBe('Start');
91
+ expect(r.formatVersion).toBe('1.0');
92
+ expect(Object.keys(r.metadata).length).toBe(1);
93
+ expect(r.format).toBe('Snowman');
94
+ expect(r.creator).toBe('extwee');
95
+ expect(r.creatorVersion).toBe('2.2.0');
96
+ expect(r.zoom).toBe(1);
97
+ expect(r.size()).toBe(1);
98
+ });
99
+
100
+ it('Should parse everything but start', function () {
101
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Star","tags":["tag1"],"metadata":{},"text":"Word"}]}';
102
+ const r = parseJSON(s);
103
+ expect(r.name).toBe('Test');
104
+ expect(Object.keys(r.tagColors).length).toBe(1);
105
+ expect(r.IFID).toBe('DD');
106
+ expect(r.start).toBe('');
107
+ expect(r.formatVersion).toBe('1.0');
108
+ expect(Object.keys(r.metadata).length).toBe(1);
109
+ expect(r.format).toBe('Snowman');
110
+ expect(r.creator).toBe('extwee');
111
+ expect(r.creatorVersion).toBe('2.2.0');
112
+ expect(r.zoom).toBe(1);
113
+ expect(r.size()).toBe(1);
114
+ });
115
+
116
+ it('Should parse everything but formatVersion', function () {
117
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Start","tags":["tag1"],"metadata":{},"text":"Word"}]}';
118
+ const r = parseJSON(s);
119
+ expect(r.name).toBe('Test');
120
+ expect(Object.keys(r.tagColors).length).toBe(1);
121
+ expect(r.IFID).toBe('DD');
122
+ expect(r.start).toBe('Start');
123
+ expect(r.formatVersion).toBe('');
124
+ expect(Object.keys(r.metadata).length).toBe(1);
125
+ expect(r.format).toBe('Snowman');
126
+ expect(r.creator).toBe('extwee');
127
+ expect(r.creatorVersion).toBe('2.2.0');
128
+ expect(r.zoom).toBe(1);
129
+ expect(r.size()).toBe(1);
130
+ });
131
+
132
+ it('Should parse everything but format', function () {
133
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Start","tags":["tag1"],"metadata":{},"text":"Word"}]}';
134
+ const r = parseJSON(s);
135
+ expect(r.name).toBe('Test');
136
+ expect(Object.keys(r.tagColors).length).toBe(1);
137
+ expect(r.IFID).toBe('DD');
138
+ expect(r.start).toBe('Start');
139
+ expect(r.formatVersion).toBe('1.0');
140
+ expect(Object.keys(r.metadata).length).toBe(1);
141
+ expect(r.format).toBe('');
142
+ expect(r.creator).toBe('extwee');
143
+ expect(r.creatorVersion).toBe('2.2.0');
144
+ expect(r.zoom).toBe(1);
145
+ expect(r.size()).toBe(1);
146
+ });
147
+
148
+ it('Should parse everything but creator', function () {
149
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Start","tags":["tag1"],"metadata":{},"text":"Word"}]}';
150
+ const r = parseJSON(s);
151
+ expect(r.name).toBe('Test');
152
+ expect(Object.keys(r.tagColors).length).toBe(1);
153
+ expect(r.IFID).toBe('DD');
154
+ expect(r.start).toBe('Start');
155
+ expect(r.formatVersion).toBe('1.0');
156
+ expect(Object.keys(r.metadata).length).toBe(1);
157
+ expect(r.format).toBe('Snowman');
158
+ expect(r.creator).toBe('extwee');
159
+ expect(r.creatorVersion).toBe('2.2.0');
160
+ expect(r.zoom).toBe(1);
161
+ expect(r.size()).toBe(1);
162
+ });
163
+
164
+ it('Should parse everything but creator version', function () {
165
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","zoom":1,"passages":[{"name":"Start","tags":["tag1"],"metadata":{},"text":"Word"}]}';
166
+ const r = parseJSON(s);
167
+ expect(r.name).toBe('Test');
168
+ expect(Object.keys(r.tagColors).length).toBe(1);
169
+ expect(r.IFID).toBe('DD');
170
+ expect(r.start).toBe('Start');
171
+ expect(r.formatVersion).toBe('1.0');
172
+ expect(Object.keys(r.metadata).length).toBe(1);
173
+ expect(r.format).toBe('Snowman');
174
+ expect(r.creator).toBe('extwee');
175
+ expect(r.creatorVersion).toBe('2.2.0');
176
+ expect(r.zoom).toBe(1);
177
+ expect(r.size()).toBe(1);
178
+ });
179
+
180
+ it('Should parse everything but zoom', function () {
181
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","passages":[{"name":"Start","tags":["tag1"],"metadata":{},"text":"Word"}]}';
182
+ const r = parseJSON(s);
183
+ expect(r.name).toBe('Test');
184
+ expect(Object.keys(r.tagColors).length).toBe(1);
185
+ expect(r.IFID).toBe('DD');
186
+ expect(r.start).toBe('Start');
187
+ expect(r.formatVersion).toBe('1.0');
188
+ expect(Object.keys(r.metadata).length).toBe(1);
189
+ expect(r.format).toBe('Snowman');
190
+ expect(r.creator).toBe('extwee');
191
+ expect(r.creatorVersion).toBe('2.2.0');
192
+ expect(r.zoom).toBe(0);
193
+ expect(r.size()).toBe(1);
194
+ });
195
+
196
+ it('Should parse everything but metadata', function () {
197
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Start","tags":["tag1"],"metadata":{},"text":"Word"}]}';
198
+ const r = parseJSON(s);
199
+ expect(r.name).toBe('Test');
200
+ expect(Object.keys(r.tagColors).length).toBe(1);
201
+ expect(r.IFID).toBe('DD');
202
+ expect(r.start).toBe('Start');
203
+ expect(r.formatVersion).toBe('1.0');
204
+ expect(Object.keys(r.metadata).length).toBe(0);
205
+ expect(r.format).toBe('Snowman');
206
+ expect(r.creator).toBe('extwee');
207
+ expect(r.creatorVersion).toBe('2.2.0');
208
+ expect(r.zoom).toBe(1);
209
+ expect(r.size()).toBe(1);
210
+ });
211
+
212
+ it('Should parse everything but passages', function () {
213
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1}';
214
+ const r = parseJSON(s);
215
+ expect(r.name).toBe('Test');
216
+ expect(Object.keys(r.tagColors).length).toBe(1);
217
+ expect(r.IFID).toBe('DD');
218
+ expect(r.start).toBe('Start');
219
+ expect(r.formatVersion).toBe('1.0');
220
+ expect(Object.keys(r.metadata).length).toBe(1);
221
+ expect(r.format).toBe('Snowman');
222
+ expect(r.creator).toBe('extwee');
223
+ expect(r.creatorVersion).toBe('2.2.0');
224
+ expect(r.zoom).toBe(1);
225
+ expect(r.size()).toBe(0);
226
+ });
227
+
228
+ it('Should ignore non-arrays for passages', function () {
229
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":{}}';
230
+ const r = parseJSON(s);
231
+ expect(r.name).toBe('Test');
232
+ expect(Object.keys(r.tagColors).length).toBe(1);
233
+ expect(r.IFID).toBe('DD');
234
+ expect(r.start).toBe('Start');
235
+ expect(r.formatVersion).toBe('1.0');
236
+ expect(Object.keys(r.metadata).length).toBe(1);
237
+ expect(r.format).toBe('Snowman');
238
+ expect(r.creator).toBe('extwee');
239
+ expect(r.creatorVersion).toBe('2.2.0');
240
+ expect(r.zoom).toBe(1);
241
+ expect(r.size()).toBe(0);
242
+ });
243
+
244
+ it('Should parse everything but passage name', function () {
245
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"tags":["tag1"],"metadata":{},"text":"Word"}]}';
246
+ const r = parseJSON(s);
247
+ expect(r.name).toBe('Test');
248
+ expect(Object.keys(r.tagColors).length).toBe(1);
249
+ expect(r.IFID).toBe('DD');
250
+ expect(r.start).toBe('Start');
251
+ expect(r.formatVersion).toBe('1.0');
252
+ expect(Object.keys(r.metadata).length).toBe(1);
253
+ expect(r.format).toBe('Snowman');
254
+ expect(r.creator).toBe('extwee');
255
+ expect(r.creatorVersion).toBe('2.2.0');
256
+ expect(r.zoom).toBe(1);
257
+ expect(r.size()).toBe(1);
258
+ expect(r.getPassageByName('').name).toBe('');
259
+ });
260
+
261
+ it('Should parse everything but passage tags', function () {
262
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Start","metadata":{"s":"e"},"text":"Word"}]}';
263
+ const r = parseJSON(s);
264
+ expect(r.name).toBe('Test');
265
+ expect(Object.keys(r.tagColors).length).toBe(1);
266
+ expect(r.IFID).toBe('DD');
267
+ expect(r.start).toBe('Start');
268
+ expect(r.formatVersion).toBe('1.0');
269
+ expect(Object.keys(r.metadata).length).toBe(1);
270
+ expect(r.format).toBe('Snowman');
271
+ expect(r.creator).toBe('extwee');
272
+ expect(r.creatorVersion).toBe('2.2.0');
273
+ expect(r.zoom).toBe(1);
274
+ expect(r.size()).toBe(1);
275
+ expect(r.getPassageByName('Start').metadata.s).toBe('e');
276
+ expect(r.getPassageByName('Start').tags.length).toBe(0);
277
+ });
278
+
279
+ it('Should parse everything but passage text', function () {
280
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Start","tags":["tag1"],"metadata":{"s":"e"}}]}';
281
+ const r = parseJSON(s);
282
+ expect(r.name).toBe('Test');
283
+ expect(Object.keys(r.tagColors).length).toBe(1);
284
+ expect(r.IFID).toBe('DD');
285
+ expect(r.start).toBe('Start');
286
+ expect(r.formatVersion).toBe('1.0');
287
+ expect(Object.keys(r.metadata).length).toBe(1);
288
+ expect(r.format).toBe('Snowman');
289
+ expect(r.creator).toBe('extwee');
290
+ expect(r.creatorVersion).toBe('2.2.0');
291
+ expect(r.zoom).toBe(1);
292
+ expect(r.size()).toBe(1);
293
+ expect(r.getPassageByName('Start').metadata.s).toBe('e');
294
+ expect(r.getPassageByName('Start').text).toBe('');
295
+ });
296
+
297
+ it('Parse everything but passage metadata', function () {
298
+ const s = '{"name":"Test","tagColors":{"r":"red"},"ifid":"dd","start":"Start","formatVersion":"1.0","metadata":{"some":"thing"},"format":"Snowman","creator":"extwee","creatorVersion":"2.2.0","zoom":1,"passages":[{"name":"Start","tags":["tag1"],"text":"Word"}]}';
299
+ const r = parseJSON(s);
300
+ expect(r.name).toBe('Test');
301
+ expect(Object.keys(r.tagColors).length).toBe(1);
302
+ expect(r.IFID).toBe('DD');
303
+ expect(r.start).toBe('Start');
304
+ expect(r.formatVersion).toBe('1.0');
305
+ expect(Object.keys(r.metadata).length).toBe(1);
306
+ expect(r.format).toBe('Snowman');
307
+ expect(r.creator).toBe('extwee');
308
+ expect(r.creatorVersion).toBe('2.2.0');
309
+ expect(r.zoom).toBe(1);
310
+ expect(r.size()).toBe(1);
311
+ expect(Object.prototype.hasOwnProperty.call(r.getPassageByName('Start').metadata, 's')).toBe(false);
312
+ expect(r.getPassageByName('Start').text).toBe('Word');
313
+ });
314
+ });
315
+ });
316
+ });
@@ -1,104 +1,175 @@
1
- import Passage from '../src/Passage.js';
2
-
3
- describe('Passage', () => {
4
- describe('#constructor()', () => {
5
- test('Set default values', () => {
6
- const p = new Passage();
7
- expect(p.name).toBe('');
8
- expect(p.tags).toHaveLength(0);
9
- expect(p.text).toBe('');
10
- expect(typeof p.metadata).toBe('object');
11
- expect(p.pid).toBe(-1);
12
- });
13
- });
14
-
15
- describe('name', () => {
16
- test('Set name', () => {
17
- const p = new Passage();
18
- p.name = 'New';
19
- expect(p.name).toBe('New');
20
- });
21
-
22
- test('Throw error if name is not String', () => {
23
- const p = new Passage();
24
- expect(() => {
25
- p.name = 1;
26
- }).toThrow();
27
- });
28
- });
29
-
30
- describe('tags', () => {
31
- test('Set tags', () => {
32
- const p = new Passage();
33
- p.tags = ['tag'];
34
- expect(p.tags).toHaveLength(1);
35
- });
36
-
37
- test('Throw error if tags is not Array', () => {
38
- const p = new Passage();
39
- expect(() => {
40
- p.tags = 1;
41
- }).toThrow();
42
- });
43
- });
44
-
45
- describe('metadata', () => {
46
- test('Set metadata', () => {
47
- const p = new Passage();
48
- p.metadata = { position: '100,100' };
49
- expect(p.metadata).toEqual({ position: '100,100' });
50
- });
51
-
52
- test('Throw error if metadata is not an Object', () => {
53
- const p = new Passage();
54
- expect(() => {
55
- p.metadata = 1;
56
- }).toThrow();
57
- });
58
- });
59
-
60
- describe('text', () => {
61
- test('Set text', () => {
62
- const p = new Passage();
63
- p.text = 'New';
64
- expect(p.text).toBe('New');
65
- });
66
-
67
- test('Throw error if text is not a String', () => {
68
- const p = new Passage();
69
- expect(() => {
70
- p.text = 1;
71
- }).toThrow();
72
- });
73
- });
74
-
75
- describe('pid', () => {
76
- test('Set PID', () => {
77
- const p = new Passage();
78
- p.pid = 12;
79
- expect(p.pid).toBe(12);
80
- });
81
-
82
- test('Throw error if pid is not a Number', () => {
83
- const p = new Passage();
84
- expect(() => {
85
- p.pid = [];
86
- }).toThrow();
87
- });
88
- });
89
-
90
- describe('toString()', () => {
91
- test('Create name string', () => {
92
- const p = new Passage('Name', 'Test');
93
- expect(p.toString()).toBe(':: Name\nTest\n\n');
94
- });
95
- test('Create tags string', () => {
96
- const p = new Passage('Name', 'Test', ['tags', 'another']);
97
- expect(p.toString()).toBe(':: Name [tags another]\nTest\n\n');
98
- });
99
- test('Create metadata string', () => {
100
- const p = new Passage('Name', 'Test', ['tags', 'another'], { position: '100,100' });
101
- expect(p.toString()).toBe(':: Name [tags another] {"position":"100,100"}\nTest\n\n');
102
- });
103
- });
104
- });
1
+ import Passage from '../src/Passage.js';
2
+
3
+ describe('Passage', () => {
4
+ describe('constructor()', () => {
5
+ it('Set default values', () => {
6
+ const p = new Passage();
7
+ expect(p.name).toBe('');
8
+ expect(p.tags).toHaveLength(0);
9
+ expect(p.text).toBe('');
10
+ expect(typeof p.metadata).toBe('object');
11
+ });
12
+ });
13
+
14
+ describe('name', () => {
15
+ it('Set name', () => {
16
+ const p = new Passage();
17
+ p.name = 'New';
18
+ expect(p.name).toBe('New');
19
+ });
20
+
21
+ it('Throw error if name is not String', () => {
22
+ const p = new Passage();
23
+ expect(() => {
24
+ p.name = 1;
25
+ }).toThrow();
26
+ });
27
+ });
28
+
29
+ describe('tags', () => {
30
+ it('Set tags', () => {
31
+ const p = new Passage();
32
+ p.tags = ['tag'];
33
+ expect(p.tags).toHaveLength(1);
34
+ });
35
+
36
+ it('Throw error if tags is not Array', () => {
37
+ const p = new Passage();
38
+ expect(() => {
39
+ p.tags = 1;
40
+ }).toThrow();
41
+ });
42
+ });
43
+
44
+ describe('metadata', () => {
45
+ it('Set metadata', () => {
46
+ const p = new Passage();
47
+ p.metadata = { position: '100,100' };
48
+ expect(p.metadata).toEqual({ position: '100,100' });
49
+ });
50
+
51
+ it('Throw error if metadata is not an Object', () => {
52
+ const p = new Passage();
53
+ expect(() => {
54
+ p.metadata = 1;
55
+ }).toThrow();
56
+ });
57
+ });
58
+
59
+ describe('text', () => {
60
+ it('Set text', () => {
61
+ const p = new Passage();
62
+ p.text = 'New';
63
+ expect(p.text).toBe('New');
64
+ });
65
+
66
+ it('Throw error if text is not a String', () => {
67
+ const p = new Passage();
68
+ expect(() => {
69
+ p.text = 1;
70
+ }).toThrow();
71
+ });
72
+ });
73
+
74
+ describe('toTwee()', () => {
75
+ it('Create name string', () => {
76
+ const p = new Passage('Name', 'Test');
77
+ expect(p.toTwee()).toBe(':: Name\nTest\n\n');
78
+ });
79
+ it('Create tags string', () => {
80
+ const p = new Passage('Name', 'Test', ['tags', 'another']);
81
+ expect(p.toTwee()).toBe(':: Name [tags another]\nTest\n\n');
82
+ });
83
+ it('Create metadata string', () => {
84
+ const p = new Passage('Name', 'Test', ['tags', 'another'], { position: '100,100' });
85
+ expect(p.toTwee()).toBe(':: Name [tags another] {"position":"100,100"}\nTest\n\n');
86
+ });
87
+ });
88
+
89
+ describe('toJSON()', function () {
90
+ it('Should hold default values', function () {
91
+ const p = new Passage();
92
+ const r = JSON.parse(p.toJSON());
93
+ expect(r.name).toBe('');
94
+ expect(r.text).toBe('');
95
+ expect(r.tags.length).toBe(0);
96
+ expect(Object.keys(r.metadata).length).toBe(0);
97
+ });
98
+ });
99
+
100
+ describe('toTwine2HTML()', function () {
101
+ let p = null;
102
+ let result = null;
103
+
104
+ beforeEach(() => {
105
+ p = new Passage('Test', 'Word', ['tag1'], { some: 'thing' });
106
+ result = p.toTwine2HTML();
107
+ });
108
+
109
+ it('Should contain default PID', function () {
110
+ expect(result.includes('pid="1"')).toBe(true);
111
+ });
112
+
113
+ it('Should include name', function () {
114
+ expect(result.includes('name="Test"')).toBe(true);
115
+ });
116
+
117
+ it('Should include single tag', function () {
118
+ expect(result.includes('tags="tag1"')).toBe(true);
119
+ });
120
+
121
+ it('Should include multiple tags', function () {
122
+ p.tags = ['tag1', 'tag2'];
123
+ result = p.toTwine2HTML();
124
+ expect(result.includes('tags="tag1 tag2"')).toBe(true);
125
+ });
126
+
127
+ it('Should include position, if it exists', function () {
128
+ p.metadata = { position: '102,99' };
129
+ result = p.toTwine2HTML();
130
+ expect(result.includes('position="102,99"')).toBe(true);
131
+ });
132
+
133
+ it('Should include size, if it exists', function () {
134
+ p.metadata = { size: '100,100' };
135
+ result = p.toTwine2HTML();
136
+ expect(result.includes('size="100,100"')).toBe(true);
137
+ });
138
+ });
139
+
140
+ describe('toTwine1HTML()', function () {
141
+ let p = null;
142
+ let result = null;
143
+
144
+ beforeEach(() => {
145
+ p = new Passage('Test', 'Word', ['tag1'], { position: '12, 12' });
146
+ result = p.toTwine1HTML();
147
+ });
148
+
149
+ it('Should include tiddler', function () {
150
+ expect(result.includes('tiddler="Test"')).toBe(true);
151
+ });
152
+
153
+ it('Should include single tag', function () {
154
+ expect(result.includes('tags="tag1"')).toBe(true);
155
+ });
156
+
157
+ it('Should include multiple tags', function () {
158
+ p.tags = ['tag1', 'tag2'];
159
+ result = p.toTwine1HTML();
160
+ expect(result.includes('tags="tag1 tag2"')).toBe(true);
161
+ });
162
+
163
+ it('Should include position, if it exists', function () {
164
+ p.metadata = { position: '102,99' };
165
+ result = p.toTwine1HTML();
166
+ expect(result.includes('position="102,99"')).toBe(true);
167
+ });
168
+
169
+ it('Should use default position', function () {
170
+ p.metadata = {};
171
+ result = p.toTwine1HTML();
172
+ expect(result.includes('position="10,10"')).toBe(true);
173
+ });
174
+ });
175
+ });