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,300 +1,259 @@
1
- /**
2
- * @class StoryFormat
3
- * @module StoryFormat
4
- */
5
- export default class StoryFormat {
6
- /**
7
- * Internal name
8
- *
9
- * @private
10
- */
11
- #_name = '';
12
-
13
- /**
14
- * Internal version
15
- *
16
- * @private
17
- */
18
- #_version = '';
19
-
20
- /**
21
- * Internal description
22
- *
23
- * @private
24
- */
25
- #_description = '';
26
-
27
- /**
28
- * Internal author
29
- *
30
- * @private
31
- */
32
- #_author = '';
33
-
34
- /**
35
- * Internal image
36
- *
37
- * @private
38
- */
39
- #_image = '';
40
-
41
- /**
42
- * Internal URL
43
- *
44
- * @private
45
- */
46
- #_url = '';
47
-
48
- /**
49
- * Internal license
50
- *
51
- * @private
52
- */
53
- #_license = '';
54
-
55
- /**
56
- * Internal proofing
57
- *
58
- * @private
59
- */
60
- #_proofing = '';
61
-
62
- /**
63
- * Internal source
64
- *
65
- * @private
66
- */
67
- #_source = '';
68
-
69
- /**
70
- * @class
71
- * @function StoryFormat
72
- * @param {string} name - Name
73
- * @param {string} version - Version
74
- * @param {string} description - Description
75
- * @param {string} author - Author
76
- * @param {string} image - Image
77
- * @param {string} url - URL
78
- * @param {string} license - License
79
- * @param {boolean} proofing - If proofing or not
80
- * @param {string} source - Source
81
- */
82
- constructor (
83
- name = '',
84
- version = '',
85
- description = '',
86
- author = '',
87
- image = '',
88
- url = '',
89
- license = '',
90
- proofing = false,
91
- source = ''
92
- ) {
93
- // Set name
94
- this.name = name;
95
-
96
- // Set version
97
- this.version = version;
98
-
99
- // Set description
100
- this.description = description;
101
-
102
- // Set author
103
- this.author = author;
104
-
105
- // Set image
106
- this.image = image;
107
-
108
- // Set URL
109
- this.url = url;
110
-
111
- // Set license
112
- this.license = license;
113
-
114
- // Set proofing
115
- this.proofing = proofing;
116
-
117
- // Set source
118
- this.source = source;
119
- }
120
-
121
- /**
122
- * Name
123
- *
124
- * @public
125
- * @memberof StoryFormat
126
- * @returns {string} Name
127
- */
128
- get name () { return this.#_name; }
129
-
130
- /**
131
- * @param {string} n - Replacement name
132
- */
133
- set name (n) {
134
- if (typeof n === 'string') {
135
- this.#_name = n;
136
- } else {
137
- throw new Error('Name must be a string!');
138
- }
139
- }
140
-
141
- /**
142
- * Version
143
- *
144
- * @public
145
- * @memberof StoryFormat
146
- * @returns {string} Version
147
- */
148
- get version () { return this.#_version; }
149
-
150
- /**
151
- * @param {string} n - Replacement version
152
- */
153
- set version (n) {
154
- if (typeof n === 'string') {
155
- this.#_version = n;
156
- } else {
157
- throw new Error('Version must be a string!');
158
- }
159
- }
160
-
161
- /**
162
- * Description
163
- *
164
- * @public
165
- * @memberof StoryFormat
166
- * @returns {string} Description
167
- */
168
- get description () { return this.#_description; }
169
-
170
- /**
171
- * @param {string} d - Replacement description
172
- */
173
- set description (d) {
174
- if (typeof d === 'string') {
175
- this.#_description = d;
176
- } else {
177
- throw new Error('Description must be a string!');
178
- }
179
- }
180
-
181
- /**
182
- * Author
183
- *
184
- * @public
185
- * @memberof StoryFormat
186
- * @returns {string} Author
187
- */
188
- get author () { return this.#_author; }
189
-
190
- /**
191
- * @param {string} a - Replacement author
192
- */
193
- set author (a) {
194
- if (typeof a === 'string') {
195
- this.#_author = a;
196
- } else {
197
- throw new Error('Author must be a string!');
198
- }
199
- }
200
-
201
- /**
202
- * Image
203
- *
204
- * @public
205
- * @memberof StoryFormat
206
- * @returns {string} Image
207
- */
208
- get image () { return this.#_image; }
209
-
210
- /**
211
- * @param {string} i - Replacement image
212
- */
213
- set image (i) {
214
- if (typeof i === 'string') {
215
- this.#_image = i;
216
- } else {
217
- throw new Error('Image must be a string!');
218
- }
219
- }
220
-
221
- /**
222
- * URL
223
- *
224
- * @public
225
- * @memberof StoryFormat
226
- * @returns {string} URL
227
- */
228
- get url () { return this.#_url; }
229
-
230
- /**
231
- * @param {string} u - Replacement URL
232
- */
233
- set url (u) {
234
- if (typeof u === 'string') {
235
- this.#_url = u;
236
- } else {
237
- throw new Error('URL must be a string!');
238
- }
239
- }
240
-
241
- /**
242
- * License
243
- *
244
- * @public
245
- * @memberof StoryFormat
246
- * @returns {string} License
247
- */
248
- get license () { return this.#_license; }
249
-
250
- /**
251
- * @param {string} l - Replacement license
252
- */
253
- set license (l) {
254
- if (typeof l === 'string') {
255
- this.#_license = l;
256
- } else {
257
- throw new Error('License must be a string!');
258
- }
259
- }
260
-
261
- /**
262
- * Proofing
263
- *
264
- * @public
265
- * @memberof StoryFormat
266
- * @returns {boolean} Proofing
267
- */
268
- get proofing () { return this.#_proofing; }
269
-
270
- /**
271
- * @param {boolean} p - Replacement proofing
272
- */
273
- set proofing (p) {
274
- if (typeof p === 'boolean') {
275
- this.#_proofing = p;
276
- } else {
277
- throw new Error('Proofing must be a Boolean!');
278
- }
279
- }
280
-
281
- /**
282
- * Source
283
- *
284
- * @public
285
- * @memberof StoryFormat
286
- * @returns {string} Source
287
- */
288
- get source () { return this.#_source; }
289
-
290
- /**
291
- * @param {string} s - Replacement source
292
- */
293
- set source (s) {
294
- if (typeof s === 'string') {
295
- this.#_source = s;
296
- } else {
297
- throw new Error('Source must be a String!');
298
- }
299
- }
300
- }
1
+ export default class StoryFormat {
2
+ /**
3
+ * Internal name.
4
+ * @private
5
+ */
6
+ #_name = '';
7
+
8
+ /**
9
+ * Internal version.
10
+ * @private
11
+ */
12
+ #_version = '';
13
+
14
+ /**
15
+ * Internal description.
16
+ * @private
17
+ */
18
+ #_description = '';
19
+
20
+ /**
21
+ * Internal author.
22
+ * @private
23
+ */
24
+ #_author = '';
25
+
26
+ /**
27
+ * Internal image.
28
+ * @private
29
+ */
30
+ #_image = '';
31
+
32
+ /**
33
+ * Internal URL.
34
+ * @private
35
+ */
36
+ #_url = '';
37
+
38
+ /**
39
+ * Internal license.
40
+ * @private
41
+ */
42
+ #_license = '';
43
+
44
+ /**
45
+ * Internal proofing.
46
+ * @private
47
+ */
48
+ #_proofing = '';
49
+
50
+ /**
51
+ * Internal source.
52
+ * @private
53
+ */
54
+ #_source = '';
55
+
56
+ /**
57
+ * Create a story format.
58
+ * @param {string} name - Name
59
+ * @param {string} version - Version
60
+ * @param {string} description - Description
61
+ * @param {string} author - Author
62
+ * @param {string} image - Image
63
+ * @param {string} url - URL
64
+ * @param {string} license - License
65
+ * @param {boolean} proofing - If proofing or not
66
+ * @param {string} source - Source
67
+ */
68
+ constructor (
69
+ name = 'Untitled Story Format',
70
+ version = '',
71
+ description = '',
72
+ author = '',
73
+ image = '',
74
+ url = '',
75
+ license = '',
76
+ proofing = false,
77
+ source = ''
78
+ ) {
79
+ // Set name
80
+ this.name = name;
81
+
82
+ // Set version
83
+ this.version = version;
84
+
85
+ // Set description
86
+ this.description = description;
87
+
88
+ // Set author
89
+ this.author = author;
90
+
91
+ // Set image
92
+ this.image = image;
93
+
94
+ // Set URL
95
+ this.url = url;
96
+
97
+ // Set license
98
+ this.license = license;
99
+
100
+ // Set proofing
101
+ this.proofing = proofing;
102
+
103
+ // Set source
104
+ this.source = source;
105
+ }
106
+
107
+ /**
108
+ * Name
109
+ * @returns {string} Name
110
+ */
111
+ get name () { return this.#_name; }
112
+
113
+ /**
114
+ * @param {string} n - Replacement name
115
+ */
116
+ set name (n) {
117
+ if (typeof n === 'string') {
118
+ this.#_name = n;
119
+ } else {
120
+ throw new Error('Name must be a string!');
121
+ }
122
+ }
123
+
124
+ /**
125
+ * Version
126
+ * @returns {string} Version
127
+ */
128
+ get version () { return this.#_version; }
129
+
130
+ /**
131
+ * @param {string} n - Replacement version
132
+ */
133
+ set version (n) {
134
+ if (typeof n === 'string') {
135
+ this.#_version = n;
136
+ } else {
137
+ throw new Error('Version must be a string!');
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Description
143
+ * @returns {string} Description
144
+ */
145
+ get description () { return this.#_description; }
146
+
147
+ /**
148
+ * @param {string} d - Replacement description
149
+ */
150
+ set description (d) {
151
+ if (typeof d === 'string') {
152
+ this.#_description = d;
153
+ } else {
154
+ throw new Error('Description must be a string!');
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Author
160
+ * @returns {string} Author
161
+ */
162
+ get author () { return this.#_author; }
163
+
164
+ /**
165
+ * @param {string} a - Replacement author
166
+ */
167
+ set author (a) {
168
+ if (typeof a === 'string') {
169
+ this.#_author = a;
170
+ } else {
171
+ throw new Error('Author must be a string!');
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Image
177
+ * @returns {string} Image
178
+ */
179
+ get image () { return this.#_image; }
180
+
181
+ /**
182
+ * @param {string} i - Replacement image
183
+ */
184
+ set image (i) {
185
+ if (typeof i === 'string') {
186
+ this.#_image = i;
187
+ } else {
188
+ throw new Error('Image must be a string!');
189
+ }
190
+ }
191
+
192
+ /**
193
+ * URL
194
+ * @returns {string} URL
195
+ */
196
+ get url () { return this.#_url; }
197
+
198
+ /**
199
+ * @param {string} u - Replacement URL
200
+ */
201
+ set url (u) {
202
+ if (typeof u === 'string') {
203
+ this.#_url = u;
204
+ } else {
205
+ throw new Error('URL must be a string!');
206
+ }
207
+ }
208
+
209
+ /**
210
+ * License
211
+ * @returns {string} License
212
+ */
213
+ get license () { return this.#_license; }
214
+
215
+ /**
216
+ * @param {string} l - Replacement license
217
+ */
218
+ set license (l) {
219
+ if (typeof l === 'string') {
220
+ this.#_license = l;
221
+ } else {
222
+ throw new Error('License must be a string!');
223
+ }
224
+ }
225
+
226
+ /**
227
+ * Proofing
228
+ * @returns {boolean} Proofing
229
+ */
230
+ get proofing () { return this.#_proofing; }
231
+
232
+ /**
233
+ * @param {boolean} p - Replacement proofing
234
+ */
235
+ set proofing (p) {
236
+ if (typeof p === 'boolean') {
237
+ this.#_proofing = p;
238
+ } else {
239
+ throw new Error('Proofing must be a Boolean!');
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Source
245
+ * @returns {string} Source
246
+ */
247
+ get source () { return this.#_source; }
248
+
249
+ /**
250
+ * @param {string} s - Replacement source
251
+ */
252
+ set source (s) {
253
+ if (typeof s === 'string') {
254
+ this.#_source = s;
255
+ } else {
256
+ throw new Error('Source must be a String!');
257
+ }
258
+ }
259
+ }
@@ -0,0 +1,86 @@
1
+ import { Story } from '../Story.js';
2
+ import Passage from '../Passage.js';
3
+ import { Parser } from 'pickleparser';
4
+
5
+ /**
6
+ * Parse TWS file (as Buffer) into Story.
7
+ * Unless it throws an error, it will return a Story object.
8
+ *
9
+ * See: Twine 1 TWS Documentation [Approval Pending]
10
+ * @param {Buffer} binaryFileContents - File contents to parse as Buffer.
11
+ * @returns {Story} Story object.
12
+ */
13
+ function parse (binaryFileContents) {
14
+ // Is this Buffer?
15
+ if (!Buffer.isBuffer(binaryFileContents)) {
16
+ // Throw an error. We cannot proceed.
17
+ throw new Error('Only parsing of Buffer is allowed!');
18
+ }
19
+
20
+ // Create a new PickleParser.
21
+ const parser = new Parser();
22
+
23
+ // Set default value.
24
+ let pythonObject = null;
25
+
26
+ // Does the Buffer contain pickle data?
27
+ try {
28
+ // Try to parse the pickle data, assuming it is pickle data.
29
+ pythonObject = parser.parse(binaryFileContents);
30
+ } catch (error) {
31
+ // This is a Buffer, but not pickle data.
32
+ throw new Error('Buffer does not contain Python pickle data!');
33
+ }
34
+
35
+ // Create Story object.
36
+ const result = new Story();
37
+
38
+ // Does 'storyPanel' exist?
39
+ // (While Twine 1 will always generate it, we must verify.)
40
+ if (Object.prototype.hasOwnProperty.call(pythonObject, 'storyPanel')) {
41
+ // Check and possibly override Zoom level.
42
+ if (Object.prototype.hasOwnProperty.call(pythonObject.storyPanel, 'scale')) {
43
+ // Save Zoom level from TWS.
44
+ result.zoom = pythonObject.storyPanel.scale;
45
+ }
46
+
47
+ // Parse storyPanel.widgets.
48
+ if (Object.prototype.hasOwnProperty.call(pythonObject.storyPanel, 'widgets')) {
49
+ // Parse `widgets` for passages.
50
+ for (const widget of pythonObject.storyPanel.widgets) {
51
+ // Create a passage.
52
+ const passage = new Passage();
53
+
54
+ // Get title.
55
+ passage.name = widget.passage.title;
56
+
57
+ // Get position.
58
+ // passage.attributes.position = `${widget.pos[0]},${widget.pos[1]}`;
59
+
60
+ // Get tags.
61
+ passage.tags = widget.passage.tags;
62
+
63
+ // Get source.
64
+ passage.text = widget.passage.text;
65
+
66
+ // Set startingPassage (if found).
67
+ if (passage.name === 'Start') {
68
+ result.start = passage.name;
69
+ }
70
+
71
+ // Set the story name (if found).
72
+ if (passage.name === 'StoryTitle') {
73
+ result.name = passage.text;
74
+ }
75
+
76
+ // Add the passage.
77
+ result.addPassage(passage);
78
+ }
79
+ }
80
+ }
81
+
82
+ // Return Story object.
83
+ return result;
84
+ }
85
+
86
+ export { parse };