extwee 2.0.6 → 2.2.1

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 (233) 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 +20 -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 +68 -58
  37. package/src/JSON/parse.js +128 -0
  38. package/src/Passage.js +279 -202
  39. package/src/Story.js +653 -523
  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 +349 -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/CLI/{twineExample.html → files/twineExample.html} +16 -15
  64. package/test/JSON/JSON.Parse.test.js +316 -0
  65. package/test/Passage.test.js +244 -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/{example4.twee → Files/example4.twee} +27 -27
  71. package/test/{StoryFormatParser → Roundtrip/Files}/harlowe.js +2 -2
  72. package/test/Roundtrip/{round.html → Files/round.html} +6 -4
  73. package/test/Roundtrip/Roundtrip.test.js +54 -0
  74. package/test/Story.test.js +677 -423
  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 +173 -0
  123. package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/creator.html +4 -4
  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}/test2.html +10 -8
  127. package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/test3.html +1 -1
  128. package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/test4.html +4 -4
  129. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/Example1.html +52 -52
  130. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/Tags.html +15 -15
  131. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/lyingStartnode.html +15 -15
  132. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/lyingTagColors.html +48 -48
  133. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingCreator.html +11 -11
  134. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingCreatorVersion.html +11 -11
  135. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingFormat.html +11 -11
  136. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingFormatVersion.html +11 -11
  137. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingIFID.html +11 -11
  138. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingName.html +33 -33
  139. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingPID.html +15 -15
  140. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingPassageName.html +15 -15
  141. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingPassageTags.html +15 -15
  142. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingPosition.html +15 -15
  143. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingScript.html +14 -14
  144. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingSize.html +35 -35
  145. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingStartnode.html +11 -11
  146. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingStyle.html +14 -14
  147. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/missingZoom.html +11 -11
  148. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/twineExample.html +23 -23
  149. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/twineExample2.html +15 -15
  150. package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/twineExample3.html +15 -15
  151. package/test/Twine2HTML/Twine2HTMLParser/unescaping.html +33 -0
  152. package/tsconfig.json +21 -0
  153. package/types/index.d.ts +14 -0
  154. package/types/src/JSON/parse.d.ts +8 -0
  155. package/types/src/Passage.d.ts +72 -0
  156. package/types/src/Story.d.ts +161 -0
  157. package/types/src/StoryFormat/parse.d.ts +7 -0
  158. package/types/src/StoryFormat.d.ts +97 -0
  159. package/types/src/TWS/parse.d.ts +10 -0
  160. package/types/src/Twee/parse.d.ts +10 -0
  161. package/types/src/Twine1HTML/compile.d.ts +17 -0
  162. package/types/src/Twine1HTML/parse.d.ts +10 -0
  163. package/types/src/Twine2ArchiveHTML/compile.d.ts +6 -0
  164. package/types/src/Twine2ArchiveHTML/parse.d.ts +6 -0
  165. package/types/src/Twine2HTML/compile.d.ts +9 -0
  166. package/types/src/Twine2HTML/parse.d.ts +17 -0
  167. package/types/src/extwee.d.ts +2 -0
  168. package/web-index.js +29 -0
  169. package/webpack.config.js +12 -0
  170. package/bin/extwee.js +0 -47
  171. package/src/FileReader.js +0 -33
  172. package/src/HTMLParser.js +0 -345
  173. package/src/HTMLWriter.js +0 -231
  174. package/src/StoryFormatParser.js +0 -142
  175. package/src/TweeParser.js +0 -161
  176. package/src/TweeWriter.js +0 -121
  177. package/story-formats/chapbook-1.2.0/format.js +0 -1
  178. package/story-formats/chapbook-1.2.0/logo.svg +0 -1
  179. package/story-formats/harlowe-1.2.4/format.js +0 -1
  180. package/story-formats/harlowe-1.2.4/icon.svg +0 -78
  181. package/story-formats/harlowe-2.1.0/format.js +0 -2
  182. package/story-formats/harlowe-2.1.0/icon.svg +0 -78
  183. package/story-formats/harlowe-3.1.0/format.js +0 -3
  184. package/story-formats/harlowe-3.1.0/icon.svg +0 -78
  185. package/story-formats/paperthin-1.0.0/format.js +0 -1
  186. package/story-formats/paperthin-1.0.0/icon.svg +0 -5
  187. package/story-formats/snowman-1.4.0/format.js +0 -1
  188. package/story-formats/snowman-1.4.0/icon.svg +0 -436
  189. package/story-formats/snowman-2.0.2/format.js +0 -1
  190. package/story-formats/snowman-2.0.2/icon.svg +0 -436
  191. package/story-formats/sugarcube-1.0.35/LICENSE +0 -23
  192. package/story-formats/sugarcube-1.0.35/format.js +0 -1
  193. package/story-formats/sugarcube-1.0.35/icon.svg +0 -56
  194. package/story-formats/sugarcube-2.31.1/LICENSE +0 -22
  195. package/story-formats/sugarcube-2.31.1/format.js +0 -1
  196. package/story-formats/sugarcube-2.31.1/icon.svg +0 -56
  197. package/test/CLI/test2.html +0 -45
  198. package/test/CLI.test.js +0 -30
  199. package/test/FileReader/t1.txt +0 -1
  200. package/test/FileReader.test.js +0 -14
  201. package/test/HTMLParser.test.js +0 -177
  202. package/test/HTMLWriter/example6.twee +0 -16
  203. package/test/HTMLWriter.test.js +0 -287
  204. package/test/Roundtrip/example1.twee +0 -21
  205. package/test/Roundtrip.test.js +0 -48
  206. package/test/Story/startmeta.twee +0 -29
  207. package/test/StoryFormatParser.test.js +0 -91
  208. package/test/TweeParser/test.twee +0 -25
  209. package/test/TweeParser.test.js +0 -79
  210. package/test/TweeWriter/test1.twee +0 -18
  211. package/test/TweeWriter/test3.twee +0 -12
  212. package/test/TweeWriter/test4.twee +0 -14
  213. package/test/TweeWriter/test5.twee +0 -20
  214. package/test/TweeWriter/test6.twee +0 -15
  215. package/test/TweeWriter/test7.twee +0 -15
  216. package/test/TweeWriter.test.js +0 -107
  217. /package/test/CLI/{test.twee → files/test.twee} +0 -0
  218. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/format.js +0 -0
  219. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/format_doublename.js +0 -0
  220. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingAuthor.js +0 -0
  221. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingDescription.js +0 -0
  222. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingImage.js +0 -0
  223. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingLicense.js +0 -0
  224. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingName.js +0 -0
  225. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingProofing.js +0 -0
  226. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingSource.js +0 -0
  227. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingURL.js +0 -0
  228. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/missingVersion.js +0 -0
  229. /package/test/{StoryFormatParser → StoryFormat/StoryFormatParser}/versionWrong.js +0 -0
  230. /package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/TestTags.html +0 -0
  231. /package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/test11.html +0 -0
  232. /package/test/{HTMLWriter → Twine2HTML/Twine2HTMLCompiler}/test6.html +0 -0
  233. /package/test/{HTMLParser → Twine2HTML/Twine2HTMLParser}/tagColors.html +0 -0
@@ -1,16 +1,16 @@
1
- /**
2
- These are some notes at the top of the file
3
- */
4
- :: StoryTitle
5
- twineExample
6
-
7
- :: Start {"position":"102,104","size":"100,100"}
8
- Start passage
9
-
10
- :: StoryData
11
- {
12
- "ifid": "2B68ECD6-348F-4CF5-96F8-549A512A8128",
13
- "format": "Harlowe",
14
- "formatVersion": "2.1.0",
15
- "zoom": "1"
16
- }
1
+ /**
2
+ These are some notes at the top of the file
3
+ */
4
+ :: StoryTitle
5
+ twineExample
6
+
7
+ :: Start {"position":"102,104","size":"100,100"}
8
+ Start passage
9
+
10
+ :: StoryData
11
+ {
12
+ "ifid": "2B68ECD6-348F-4CF5-96F8-549A512A8128",
13
+ "format": "Harlowe",
14
+ "formatVersion": "2.1.0",
15
+ "zoom": "1"
16
+ }
@@ -1,2 +1,2 @@
1
- :: Start {"position}
2
- Some content
1
+ :: Start {"position}
2
+ Some content
@@ -1,16 +1,16 @@
1
- :: Start
2
- Content
3
-
4
- :: StoryTitle
5
- Title
6
-
7
- :: UserScript [script]
8
- window.example = {}
9
-
10
- :: StoryData
11
- {
12
- "ifid": "2B68ECD6-348F-4CF5-96F8-549A512A8128",
13
- "format": "Harlowe",
14
- "formatVersion": "2.1.0",
15
- "zoom": "1"
16
- }
1
+ :: Start
2
+ Content
3
+
4
+ :: StoryTitle
5
+ Title
6
+
7
+ :: UserScript [script]
8
+ window.example = {}
9
+
10
+ :: StoryData
11
+ {
12
+ "ifid": "2B68ECD6-348F-4CF5-96F8-549A512A8128",
13
+ "format": "Harlowe",
14
+ "formatVersion": "2.1.0",
15
+ "zoom": "1"
16
+ }
@@ -1,13 +1,13 @@
1
- :: Start [tag]
2
- Content
3
-
4
- :: StoryTitle
5
- Title
6
-
7
- :: StoryData
8
- {
9
- "ifid": "2B68ECD6-348F-4CF5-96F8-549A512A8128",
10
- "format": "Harlowe",
11
- "formatVersion": "2.1.0",
12
- "zoom": "1"
13
- }
1
+ :: Start [tag]
2
+ Content
3
+
4
+ :: StoryTitle
5
+ Title
6
+
7
+ :: StoryData
8
+ {
9
+ "ifid": "2B68ECD6-348F-4CF5-96F8-549A512A8128",
10
+ "format": "Harlowe",
11
+ "formatVersion": "2.1.0",
12
+ "zoom": "1"
13
+ }
@@ -1,14 +1,14 @@
1
- :: StoryTitle
2
- Example
3
-
4
- :: StoryData
5
- {
6
- "ifid": "A74F654F-3F85-44DE-8A87-9845AECD04B0",
7
- "format": "Harlowe",
8
- "formatVersion": "3.2.1",
9
- "zoom": "1",
10
- "start": "Untitled Passage"
11
- }
12
-
13
- :: Untitled Passage {"position":"100,99","size":"100,100"}
14
- Double-click this passage to edit it.
1
+ :: StoryTitle
2
+ Example
3
+
4
+ :: StoryData
5
+ {
6
+ "ifid": "A74F654F-3F85-44DE-8A87-9845AECD04B0",
7
+ "format": "Harlowe",
8
+ "formatVersion": "3.2.1",
9
+ "zoom": "1",
10
+ "start": "Untitled Passage"
11
+ }
12
+
13
+ :: Untitled Passage {"position":"100,99","size":"100,100"}
14
+ Double-click this passage to edit it.
@@ -1,25 +1,25 @@
1
- :: StoryTitle
2
- twineExample
3
-
4
- :: Start
5
- Some content.
6
-
7
- :: StoryData
8
- {
9
- "ifid": 2B68ECD6-348F-4CF5-96F8-549A512A8128",
10
- "format": "Harlowe",
11
- "formatVersion": "2.1.0",
12
- "zoom": "1"
13
- }
14
-
15
- :: Script1 [script]
16
- // Some code
17
-
18
- :: Script2 [script]
19
- //More code here!
20
-
21
- :: Style1 [stylesheet]
22
- body {font-size: 1.2em}
23
-
24
- :: Style2 [stylesheet]
25
- p {font-style: italic;}
1
+ :: StoryTitle
2
+ twineExample
3
+
4
+ :: Start
5
+ Some content.
6
+
7
+ :: StoryData
8
+ {
9
+ "ifid": 2B68ECD6-348F-4CF5-96F8-549A512A8128",
10
+ "format": "Harlowe",
11
+ "formatVersion": "2.1.0",
12
+ "zoom": "1"
13
+ }
14
+
15
+ :: Script1 [script]
16
+ // Some code
17
+
18
+ :: Script2 [script]
19
+ //More code here!
20
+
21
+ :: Style1 [stylesheet]
22
+ body {font-size: 1.2em}
23
+
24
+ :: Style2 [stylesheet]
25
+ p {font-style: italic;}
@@ -1,16 +1,16 @@
1
- :: Start
2
- Content
3
-
4
- :: StoryTitle
5
- Title
6
-
7
- :: UserStylesheet [stylesheet]
8
- 1
9
-
10
- :: StoryData
11
- {
12
- "ifid": "2B68ECD6-348F-4CF5-96F8-549A512A8128",
13
- "format": "Harlowe",
14
- "formatVersion": "2.1.0",
15
- "zoom": "1"
16
- }
1
+ :: Start
2
+ Content
3
+
4
+ :: StoryTitle
5
+ Title
6
+
7
+ :: UserStylesheet [stylesheet]
8
+ 1
9
+
10
+ :: StoryData
11
+ {
12
+ "ifid": "2B68ECD6-348F-4CF5-96F8-549A512A8128",
13
+ "format": "Harlowe",
14
+ "formatVersion": "2.1.0",
15
+ "zoom": "1"
16
+ }
@@ -1,25 +1,25 @@
1
- :: StoryTitle
2
- twineExample
3
-
4
- :: Start
5
- Some content.
6
-
7
- :: StoryData
8
- {
9
- "ifid": "2B68ECD6-348F-4CF5-96F8-549A512A8128",
10
- "format": "Harlowe",
11
- "formatVersion": "2.1.0",
12
- "zoom": "1"
13
- }
14
-
15
- :: Script1 [script]
16
- // Some code
17
-
18
- :: Script2 [script]
19
- //More code here!
20
-
21
- :: Style1 [stylesheet]
22
- body {font-size: 1.2em}
23
-
24
- :: Style2 [stylesheet]
25
- p {font-style: italic;}
1
+ :: StoryTitle
2
+ twineExample
3
+
4
+ :: Start
5
+ Some content.
6
+
7
+ :: StoryData
8
+ {
9
+ "ifid": "2B68ECD6-348F-4CF5-96F8-549A512A8128",
10
+ "format": "Harlowe",
11
+ "formatVersion": "2.1.0",
12
+ "zoom": "1"
13
+ }
14
+
15
+ :: Script1 [script]
16
+ // Some code
17
+
18
+ :: Script2 [script]
19
+ //More code here!
20
+
21
+ :: Style1 [stylesheet]
22
+ body {font-size: 1.2em}
23
+
24
+ :: Style2 [stylesheet]
25
+ p {font-style: italic;}
@@ -0,0 +1,180 @@
1
+ import { compile as compileTwine1HTML } from '../../src/Twine1HTML/compile.js';
2
+ import { Story } from '../../src/Story.js';
3
+ import { readFileSync } from 'fs';
4
+ import Passage from '../../src/Passage.js';
5
+
6
+ describe('Twine1HTMLCompiler', () => {
7
+ describe('compile()', () => {
8
+ it('story should be instanceof Story', () => {
9
+ expect(() => { compileTwine1HTML({}); }).toThrow();
10
+ });
11
+
12
+ it('Should create an empty file without valid header.html', function () {
13
+ // Create story.
14
+ const s = new Story();
15
+
16
+ // Compile Twine 1.
17
+ const t1 = compileTwine1HTML(s);
18
+
19
+ // Test.
20
+ expect(t1.length).toBe(0);
21
+ });
22
+
23
+ it('Should replace "VERSION" and "TIME" in mock header.html file', function () {
24
+ // Create story.
25
+ const s = new Story();
26
+
27
+ // Set creator.
28
+ s.creator = 'Test1';
29
+
30
+ // Read mock header.html
31
+ const header = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/test1.html', 'utf-8');
32
+
33
+ // Read engine code.
34
+ const engine = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/Twine1/engine.js', 'utf-8');
35
+
36
+ // Compile file.
37
+ const result = compileTwine1HTML(s, engine, header);
38
+
39
+ // Test for creator.
40
+ expect(result.includes('Test1')).toBe(true);
41
+
42
+ // Test for time.
43
+ expect(result.includes(new Date().getFullYear().toString())).toBe(true);
44
+ });
45
+
46
+ it('Should include Twine engine code', function () {
47
+ // Create story.
48
+ const s = new Story();
49
+
50
+ // Read mock header.html
51
+ const header = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/engineTest.html', 'utf-8');
52
+
53
+ // Read engine code.
54
+ const engine = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/Twine1/engine.js', 'utf-8');
55
+
56
+ // Compile file.
57
+ compileTwine1HTML(s, engine, header);
58
+
59
+ // Read file.
60
+ const result = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/test3.html', 'utf-8');
61
+
62
+ // Test for engine.
63
+ expect(result.includes('function clone(a)')).toBe(true);
64
+ });
65
+
66
+ it('Should include story format based on name', function () {
67
+ // Create story.
68
+ const s = new Story();
69
+
70
+ // Add passage.
71
+ s.addPassage(new Passage('Start', 'Work'));
72
+
73
+ // Set story start.
74
+ s.start = 'Start';
75
+
76
+ // Read header.html.
77
+ const header = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/header.html', 'utf-8');
78
+
79
+ // Read code.js.
80
+ const codeJS = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/code.js', 'utf-8');
81
+
82
+ // Read engine code.
83
+ const engine = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/Twine1/engine.js', 'utf-8');
84
+
85
+ // Compile file.
86
+ const result = compileTwine1HTML(s, engine, header, 'jonah', codeJS);
87
+
88
+ // Test for code.js.
89
+ expect(result.includes('Tale.prototype.canBookmark')).toBe(true);
90
+
91
+ // Test for passage.
92
+ expect(result.includes('tiddler="Start"')).toBe(true);
93
+
94
+ // Test for story size.
95
+ expect(result.includes('data-size="1"')).toBe(true);
96
+ });
97
+
98
+ it('Should include story format based on name with jQuery and Modernizr', function () {
99
+ // Create story.
100
+ const s = new Story();
101
+
102
+ // Add passage.
103
+ s.addPassage(new Passage('Start', 'Work'));
104
+
105
+ // Set story start.
106
+ s.start = 'Start';
107
+
108
+ // Read header.html.
109
+ const header = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/header.html', 'utf-8');
110
+
111
+ // Read code.js.
112
+ const codeJS = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/code.js', 'utf-8');
113
+
114
+ // Read engine code.
115
+ const engine = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/Twine1/engine.js', 'utf-8');
116
+
117
+ // Read Modernizr.
118
+ const Modernizr = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/Twine1/modernizr.js');
119
+
120
+ // Read jQuery.
121
+ const jQuery = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/Twine1/jquery.js');
122
+
123
+ // Compile file.
124
+ const result = compileTwine1HTML(s, engine, header, 'jonah', codeJS, { jquery: jQuery, modernizr: Modernizr });
125
+
126
+ // Test for code.js.
127
+ expect(result.includes('Tale.prototype.canBookmark')).toBe(true);
128
+
129
+ // Test for passage.
130
+ expect(result.includes('tiddler="Start"')).toBe(true);
131
+
132
+ // Test for story size.
133
+ expect(result.includes('data-size="1"')).toBe(true);
134
+
135
+ // Test for jQuery.
136
+ expect(result.includes('jQuery v1.11.0')).toBe(true);
137
+
138
+ // Test for Modernizr.
139
+ expect(result.includes('Modernizr 2.6.2')).toBe(true);
140
+ });
141
+
142
+ it('Should include story format based on name without jQuery and Modernizr', function () {
143
+ // Create story.
144
+ const s = new Story();
145
+
146
+ // Add passage.
147
+ s.addPassage(new Passage('Start', 'Work'));
148
+
149
+ // Set story start.
150
+ s.start = 'Start';
151
+
152
+ // Read header.html.
153
+ const header = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/header.html', 'utf-8');
154
+
155
+ // Read code.js.
156
+ const codeJS = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/jonah-1.4.2/code.js', 'utf-8');
157
+
158
+ // Read engine code.
159
+ const engine = readFileSync('test/Twine1HTML/Twine1HTMLCompiler/Twine1/engine.js', 'utf-8');
160
+
161
+ // Compile file.
162
+ const result = compileTwine1HTML(s, engine, header, 'jonah', codeJS, {});
163
+
164
+ // Test for code.js.
165
+ expect(result.includes('Tale.prototype.canBookmark')).toBe(true);
166
+
167
+ // Test for passage.
168
+ expect(result.includes('tiddler="Start"')).toBe(true);
169
+
170
+ // Test for story size.
171
+ expect(result.includes('data-size="1"')).toBe(true);
172
+
173
+ // Test for jQuery
174
+ expect(result.includes('jQuery v1.11.0')).not.toBe(true);
175
+
176
+ // Test for Modernizr
177
+ expect(result.includes('Modernizr 2.6.2')).not.toBe(true);
178
+ });
179
+ });
180
+ });
@@ -0,0 +1,183 @@
1
+ import { parse as parseTwine1HTML } from '../../src/Twine1HTML/parse.js';
2
+
3
+ describe('Twine1HTML', function () {
4
+ describe('parse()', function () {
5
+ it('Should throw error if elements cannot be found', function () {
6
+ expect(() => { parseTwine1HTML('{'); }).toThrow();
7
+ });
8
+
9
+ it('Should parse a single passage - storeArea', function () {
10
+ const el = '<div id="storeArea"><div tiddler="Untitled Passage 4" tags="" created="202309031439" modifier="twee" twine-position="401,10">dd</div></div>';
11
+
12
+ // Parse Twine 1 HTML.
13
+ const s = parseTwine1HTML(el);
14
+
15
+ // Expect a single passage.
16
+ expect(s.size()).toBe(1);
17
+
18
+ // Expect creator
19
+ expect(s.creator).toBe('twee');
20
+
21
+ // Look for the passage.
22
+ const p = s.getPassageByName('Untitled Passage 4');
23
+
24
+ // Expect passage name.
25
+ expect(p.name).toBe('Untitled Passage 4');
26
+
27
+ // Expect no tags.
28
+ expect(p.tags.length).toBe(0);
29
+
30
+ // Expect position
31
+ expect(p.metadata.position).toBe('401,10');
32
+
33
+ // Expect text
34
+ expect(p.text).toBe('dd');
35
+ });
36
+
37
+ it('Should parse a single passage - store-area', function () {
38
+ const el = '<div id="store-area"><div tiddler="Untitled Passage 4" tags="" created="202309031439" modifier="twee" twine-position="401,10">dd</div></div>';
39
+
40
+ // Parse Twine 1 HTML.
41
+ const s = parseTwine1HTML(el);
42
+
43
+ // Expect a single passage.
44
+ expect(s.size()).toBe(1);
45
+
46
+ // Expect creator
47
+ expect(s.creator).toBe('twee');
48
+
49
+ // Look for the passage.
50
+ const p = s.getPassageByName('Untitled Passage 4');
51
+
52
+ // Expect passage name.
53
+ expect(p.name).toBe('Untitled Passage 4');
54
+
55
+ // Expect no tags.
56
+ expect(p.tags.length).toBe(0);
57
+
58
+ // Expect position
59
+ expect(p.metadata.position).toBe('401,10');
60
+
61
+ // Expect text
62
+ expect(p.text).toBe('dd');
63
+ });
64
+
65
+ it('Should override name with StoryTitle', function () {
66
+ const el = '<div id="storeArea"><div tiddler="StoryTitle" tags="" created="202309031438" modifier="twee" twine-position="10,150">Untitled Story</div></div>';
67
+ const s = parseTwine1HTML(el);
68
+ expect(s.name).toBe('Untitled Story');
69
+ });
70
+
71
+ it('Should parse a single passage with multiple tags', function () {
72
+ const el = '<div id="storeArea"><div tiddler="Untitled Passage 1" tags="tag1, tag2, tag3" created="202309031439" modifier="twee" twine-position="262,10">[[Untitled Passage 2]]</div></div>';
73
+
74
+ // Parse Twine 1 HTML.
75
+ const s = parseTwine1HTML(el);
76
+
77
+ // Expect a single passage.
78
+ expect(s.size()).toBe(1);
79
+
80
+ // Expect creator
81
+ expect(s.creator).toBe('twee');
82
+
83
+ // Look for the passage.
84
+ const p = s.getPassageByName('Untitled Passage 1');
85
+
86
+ // Expect passage name.
87
+ expect(p.name).toBe('Untitled Passage 1');
88
+
89
+ // Expect no tags.
90
+ expect(p.tags.length).toBe(3);
91
+
92
+ // Expect position
93
+ expect(p.metadata.position).toBe('262,10');
94
+
95
+ // Expect text
96
+ expect(p.text).toBe('[[Untitled Passage 2]]');
97
+ });
98
+
99
+ it('Should parse a single passage without twine-position', function () {
100
+ const el = '<div id="storeArea"><div tiddler="Untitled Passage 1" tags="tag1, tag2, tag3" created="202309031439" modifier="twee">[[Untitled Passage 2]]</div></div>';
101
+
102
+ // Parse Twine 1 HTML.
103
+ const s = parseTwine1HTML(el);
104
+
105
+ // Expect a single passage.
106
+ expect(s.size()).toBe(1);
107
+
108
+ // Expect creator
109
+ expect(s.creator).toBe('twee');
110
+
111
+ // Look for the passage.
112
+ const p = s.getPassageByName('Untitled Passage 1');
113
+
114
+ // Expect passage name.
115
+ expect(p.name).toBe('Untitled Passage 1');
116
+
117
+ // Expect no tags.
118
+ expect(p.tags.length).toBe(3);
119
+
120
+ // Expect position to not exist.
121
+ expect(Object.prototype.hasOwnProperty.call(p.metadata, 'position')).toBe(false);
122
+
123
+ // Expect text.
124
+ expect(p.text).toBe('[[Untitled Passage 2]]');
125
+ });
126
+
127
+ it('Should parse a single passage without tags', function () {
128
+ const el = '<div id="storeArea"><div tiddler="Untitled Passage 1" created="202309031439" modifier="twee">[[Untitled Passage 2]]</div></div>';
129
+
130
+ // Parse Twine 1 HTML.
131
+ const s = parseTwine1HTML(el);
132
+
133
+ // Expect a single passage.
134
+ expect(s.size()).toBe(1);
135
+
136
+ // Expect creator
137
+ expect(s.creator).toBe('twee');
138
+
139
+ // Look for the passage.
140
+ const p = s.getPassageByName('Untitled Passage 1');
141
+
142
+ // Expect passage name.
143
+ expect(p.name).toBe('Untitled Passage 1');
144
+
145
+ // Expect no tags.
146
+ expect(p.tags.length).toBe(0);
147
+
148
+ // Expect position to not exist.
149
+ expect(Object.prototype.hasOwnProperty.call(p.metadata, 'position')).toBe(false);
150
+
151
+ // Expect text.
152
+ expect(p.text).toBe('[[Untitled Passage 2]]');
153
+ });
154
+
155
+ it('Should parse a single passage without modifier', function () {
156
+ const el = '<div id="storeArea"><div tiddler="Untitled Passage 1" tags="tag1, tag2, tag3" created="202309031439">[[Untitled Passage 2]]</div></div>';
157
+
158
+ // Parse Twine 1 HTML.
159
+ const s = parseTwine1HTML(el);
160
+
161
+ // Expect a single passage.
162
+ expect(s.size()).toBe(1);
163
+
164
+ // Expect default creator
165
+ expect(s.creator).toBe('extwee');
166
+
167
+ // Look for the passage.
168
+ const p = s.getPassageByName('Untitled Passage 1');
169
+
170
+ // Expect passage name.
171
+ expect(p.name).toBe('Untitled Passage 1');
172
+
173
+ // Expect no tags.
174
+ expect(p.tags.length).toBe(3);
175
+
176
+ // Expect position to not exist.
177
+ expect(Object.prototype.hasOwnProperty.call(p.metadata, 'position')).toBe(false);
178
+
179
+ // Expect text.
180
+ expect(p.text).toBe('[[Untitled Passage 2]]');
181
+ });
182
+ });
183
+ });