extwee 1.6.0 → 2.0.2
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.
- package/.eslintrc.json +25 -0
- package/.github/workflows/nodejs.yml +24 -25
- package/.travis.yml +13 -13
- package/CODE_OF_CONDUCT.md +82 -0
- package/LICENSE +21 -21
- package/README.md +36 -205
- package/SECURITY.md +12 -0
- package/babel.config.json +22 -0
- package/bin/extwee.js +49 -0
- package/index.js +31 -26
- package/package.json +59 -37
- package/src/FileReader.js +33 -36
- package/src/HTMLParser.js +343 -206
- package/src/HTMLWriter.js +227 -177
- package/src/Passage.js +202 -20
- package/src/Story.js +461 -148
- package/src/StoryFormat.js +300 -41
- package/src/StoryFormatParser.js +142 -65
- package/src/TweeParser.js +161 -255
- package/src/TweeWriter.js +98 -111
- package/story-formats/chapbook-1.2.0/format.js +1 -0
- package/story-formats/chapbook-1.2.0/logo.svg +1 -0
- package/story-formats/harlowe-1.2.4/format.js +1 -0
- package/story-formats/harlowe-1.2.4/icon.svg +78 -0
- package/story-formats/harlowe-2.1.0/format.js +2 -0
- package/story-formats/harlowe-2.1.0/icon.svg +78 -0
- package/story-formats/harlowe-3.1.0/format.js +3 -0
- package/story-formats/harlowe-3.1.0/icon.svg +78 -0
- package/story-formats/paperthin-1.0.0/format.js +1 -0
- package/story-formats/paperthin-1.0.0/icon.svg +5 -0
- package/story-formats/snowman-1.4.0/format.js +1 -0
- package/story-formats/snowman-1.4.0/icon.svg +436 -0
- package/story-formats/snowman-2.0.2/format.js +1 -0
- package/story-formats/snowman-2.0.2/icon.svg +436 -0
- package/story-formats/sugarcube-1.0.35/LICENSE +23 -0
- package/story-formats/sugarcube-1.0.35/format.js +1 -0
- package/story-formats/sugarcube-1.0.35/icon.svg +56 -0
- package/story-formats/sugarcube-2.31.1/LICENSE +22 -0
- package/story-formats/sugarcube-2.31.1/format.js +1 -0
- package/story-formats/sugarcube-2.31.1/icon.svg +56 -0
- package/test/{HTMLWriter/example7.twee → CLI/example6.twee} +16 -16
- package/test/CLI/harlowe.js +3 -0
- package/test/CLI/input.html +47 -0
- package/test/CLI/test.twee +18 -0
- package/test/CLI/test2.html +47 -0
- package/test/CLI/tweeExample.twee +17 -0
- package/test/CLI/twineExample.html +15 -0
- package/test/CLI.test.js +30 -0
- package/test/FileReader.test.js +14 -0
- package/test/HTMLParser/Example1.html +53 -0
- package/test/HTMLParser/Tags.html +15 -0
- package/test/HTMLParser/lyingStartnode.html +15 -0
- package/test/HTMLParser/lyingTagColors.html +48 -0
- package/test/HTMLParser/missingCreator.html +11 -0
- package/test/HTMLParser/missingCreatorVersion.html +11 -0
- package/test/HTMLParser/missingFormat.html +11 -0
- package/test/HTMLParser/missingFormatVersion.html +11 -0
- package/test/HTMLParser/missingIFID.html +11 -0
- package/test/HTMLParser/missingName.html +33 -0
- package/test/HTMLParser/missingPID.html +15 -0
- package/test/HTMLParser/missingPassageName.html +15 -0
- package/test/HTMLParser/missingPassageTags.html +15 -0
- package/test/HTMLParser/missingPosition.html +15 -0
- package/test/HTMLParser/missingScript.html +14 -0
- package/test/HTMLParser/missingSize.html +35 -0
- package/test/HTMLParser/missingStartnode.html +11 -0
- package/test/HTMLParser/missingStyle.html +14 -0
- package/test/HTMLParser/missingZoom.html +11 -0
- package/test/HTMLParser/tagColors.html +31 -0
- package/test/HTMLParser/twineExample.html +15 -46
- package/test/HTMLParser/twineExample2.html +15 -0
- package/test/HTMLParser/twineExample3.html +15 -0
- package/test/HTMLParser.test.js +177 -0
- package/test/HTMLWriter/TestTags.html +42 -0
- package/test/HTMLWriter/{test10.html → creator.html} +8 -5
- package/test/HTMLWriter/example6.twee +16 -16
- package/test/HTMLWriter/{example.twee → missingStoryTitle.twee} +29 -29
- package/test/HTMLWriter/test11.html +123 -0
- package/test/HTMLWriter/test2.html +15 -12
- package/test/HTMLWriter/test3.html +7 -13
- package/test/HTMLWriter/test4.html +8 -5
- package/test/HTMLWriter/test6.html +7 -5
- package/test/HTMLWriter.test.js +289 -0
- package/test/Passage.test.js +104 -0
- package/test/Roundtrip/Example1.html +64 -0
- package/test/Roundtrip/example1.twee +21 -0
- package/test/Roundtrip/example2.twee +18 -0
- package/test/Roundtrip/harlowe.js +3 -0
- package/test/Roundtrip/round.html +50 -0
- package/test/Roundtrip.test.js +48 -0
- package/test/Story/startmeta.twee +29 -29
- package/test/Story/test.twee +25 -25
- package/test/Story.test.js +282 -0
- package/test/StoryFormat.test.js +152 -0
- package/test/StoryFormatParser/example.js +3 -0
- package/test/StoryFormatParser/{test2.js → example2.js} +3 -3
- package/test/StoryFormatParser/format_doublename.js +1 -0
- package/test/StoryFormatParser/harlowe.js +2 -2
- package/test/StoryFormatParser/missingAuthor.js +1 -0
- package/test/StoryFormatParser/missingDescription.js +1 -0
- package/test/StoryFormatParser/missingImage.js +1 -0
- package/test/StoryFormatParser/missingLicense.js +1 -0
- package/test/StoryFormatParser/missingName.js +1 -0
- package/test/StoryFormatParser/missingProofing.js +1 -0
- package/test/StoryFormatParser/missingSource.js +1 -0
- package/test/StoryFormatParser/missingURL.js +1 -0
- package/test/StoryFormatParser/missingVersion.js +1 -0
- package/test/StoryFormatParser/versionWrong.js +1 -0
- package/test/StoryFormatParser.test.js +91 -0
- package/test/TweeParser/emptytags.twee +2 -2
- package/test/TweeParser/example.twee +32 -29
- package/test/TweeParser/missing.twee +19 -0
- package/test/{HTMLWriter/example5.twee → TweeParser/multipleScriptPassages.twee} +19 -13
- package/test/{HTMLWriter/example4.twee → TweeParser/multipleStyleTag.twee} +19 -13
- package/test/TweeParser/multipletags.twee +10 -2
- package/test/TweeParser/noTitle.twee +2 -0
- package/test/TweeParser/notes.twee +16 -0
- package/test/TweeParser/pasagemetadataerror.twee +2 -2
- package/test/{HTMLWriter/example2.twee → TweeParser/scriptPassage.twee} +16 -13
- package/test/TweeParser/singletag.twee +13 -2
- package/test/TweeParser/startMetadata.twee +14 -0
- package/test/TweeParser/storydataerror.twee +25 -25
- package/test/{HTMLWriter/example3.twee → TweeParser/stylePassage.twee} +16 -13
- package/test/TweeParser/test.twee +25 -25
- package/test/TweeParser.test.js +79 -0
- package/test/TweeWriter/test1.twee +14 -9
- package/test/TweeWriter/test3.twee +7 -10
- package/test/TweeWriter/test4.twee +14 -0
- package/test/TweeWriter/test5.twee +20 -0
- package/test/TweeWriter.test.js +85 -0
- package/main.js +0 -106
- package/src/DirectoryReader.js +0 -107
- package/src/DirectoryWatcher.js +0 -92
- package/test/DirectoryReader/css/test.css +0 -3
- package/test/DirectoryReader1/js/Site.js +0 -1
- package/test/DirectoryReader2/error.js +0 -1
- package/test/DirectoryReader2/example.css +0 -3
- package/test/DirectoryReader2/index.twee +0 -6
- package/test/DirectoryReader3/twee/index.twee +0 -6
- package/test/DirectoryWatcher/example.txt +0 -0
- package/test/DirectoryWatcher/test.txt +0 -0
- package/test/DirectoryWatcher/test1.txt +0 -0
- package/test/HTMLWriter/test5.html +0 -48
- package/test/HTMLWriter/test7.html +0 -48
- package/test/HTMLWriter/test8.html +0 -48
- package/test/HTMLWriter/test9.html +0 -48
- package/test/StoryFormatParser/test.js +0 -2
- package/test/TweeParser/test.twee3 +0 -11
- package/test/TweeWriter/metatest.twee +0 -12
- package/test/TweeWriter/test2.twee +0 -15
- package/test/test.js +0 -722
package/test/test.js
DELETED
|
@@ -1,722 +0,0 @@
|
|
|
1
|
-
const assert = require('assert');
|
|
2
|
-
const shell = require('shelljs');
|
|
3
|
-
const FileReader = require('../src/FileReader.js');
|
|
4
|
-
const TweeParser = require('../src/TweeParser.js');
|
|
5
|
-
const TweeWriter = require('../src/TweeWriter.js');
|
|
6
|
-
const StoryFormatParser = require('../src/StoryFormatParser.js');
|
|
7
|
-
const StoryFormat = require('../src/StoryFormat.js');
|
|
8
|
-
const HTMLParser = require('../src/HTMLParser.js');
|
|
9
|
-
const HTMLWriter = require('../src/HTMLWriter.js');
|
|
10
|
-
const Story = require('../src/Story.js');
|
|
11
|
-
const Passage = require('../src/Passage.js');
|
|
12
|
-
const DirectoryReader = require('../src/DirectoryReader.js');
|
|
13
|
-
const DirectoryWatcher = require('../src/DirectoryWatcher.js');
|
|
14
|
-
|
|
15
|
-
describe('FileReader', function() {
|
|
16
|
-
|
|
17
|
-
describe('#readFile()', function() {
|
|
18
|
-
|
|
19
|
-
it('Should throw error if file not found', function() {
|
|
20
|
-
|
|
21
|
-
assert.throws( () => new FileReader("test/FileReader/t2.txt"), Error );
|
|
22
|
-
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('Should read the contents of a file', function() {
|
|
26
|
-
|
|
27
|
-
let fr = new FileReader("test/FileReader/t1.txt");
|
|
28
|
-
assert.equal(fr.contents,"Gibberish");
|
|
29
|
-
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
describe('TweeParser', function() {
|
|
37
|
-
|
|
38
|
-
describe('#parse()', function() {
|
|
39
|
-
|
|
40
|
-
it('Should throw error if no passages are present', function() {
|
|
41
|
-
|
|
42
|
-
assert.throws( () => new TweeParser(""), Error );
|
|
43
|
-
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('Should throw error if it detects malformed passage headers', function() {
|
|
47
|
-
|
|
48
|
-
assert.throws( () => new TweeParser("::{}[]\nNo name"), Error );
|
|
49
|
-
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('Should be able to parse Twee file for Story Name', function() {
|
|
53
|
-
|
|
54
|
-
let fr = new FileReader("test/TweeParser/example.twee");
|
|
55
|
-
let tp = new TweeParser(fr.contents);
|
|
56
|
-
assert.equal(tp.story.name,"twineExample");
|
|
57
|
-
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('Should record and erase the StoryTitle and StoryData passages', function() {
|
|
61
|
-
|
|
62
|
-
let fr = new FileReader("test/TweeParser/test.twee");
|
|
63
|
-
let tp = new TweeParser(fr.contents);
|
|
64
|
-
assert.equal(tp.story.passages.length,5);
|
|
65
|
-
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('Should parse empty passage tags', function() {
|
|
69
|
-
|
|
70
|
-
let fr = new FileReader("test/TweeParser/emptytags.twee");
|
|
71
|
-
let tp = new TweeParser(fr.contents);
|
|
72
|
-
assert.equal(tp.story.passages[0].tags.length, 0);
|
|
73
|
-
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('Should parse single passage tag', function() {
|
|
77
|
-
|
|
78
|
-
let fr = new FileReader("test/TweeParser/singletag.twee");
|
|
79
|
-
let tp = new TweeParser(fr.contents);
|
|
80
|
-
assert.equal(tp.story.passages[0].tags.length, 1);
|
|
81
|
-
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('Should parse multiple passage tags', function() {
|
|
85
|
-
|
|
86
|
-
let fr = new FileReader("test/TweeParser/multipletags.twee");
|
|
87
|
-
let tp = new TweeParser(fr.contents);
|
|
88
|
-
assert.equal(tp.story.passages[0].tags.length, 2);
|
|
89
|
-
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('Should record passage metadata error', function() {
|
|
93
|
-
|
|
94
|
-
let fr = new FileReader("test/TweeParser/pasagemetadataerror.twee");
|
|
95
|
-
let tp = new TweeParser(fr.contents);
|
|
96
|
-
assert.equal(tp._passageMetadatError, true);
|
|
97
|
-
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('Should record StoryData error', function() {
|
|
101
|
-
|
|
102
|
-
let fr = new FileReader("test/TweeParser/storydataerror.twee");
|
|
103
|
-
let tp = new TweeParser(fr.contents);
|
|
104
|
-
assert.equal(tp._storydataError, true);
|
|
105
|
-
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
describe('HTMLParser', function() {
|
|
113
|
-
|
|
114
|
-
describe('#parse()', function() {
|
|
115
|
-
|
|
116
|
-
it('Should throw error if content is not Twine-2 style HTML', function() {
|
|
117
|
-
|
|
118
|
-
assert.throws( () => new HTMLParser(""), Error );
|
|
119
|
-
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('Should be able to parse Twine 2 HTML for story name', function() {
|
|
123
|
-
|
|
124
|
-
let fr = new FileReader("test/HTMLParser/twineExample.html");
|
|
125
|
-
let tp = new HTMLParser(fr.contents);
|
|
126
|
-
|
|
127
|
-
assert.equal(tp.story.name, "twineExample");
|
|
128
|
-
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
describe('#_escapeMetacharacters()', function() {
|
|
134
|
-
|
|
135
|
-
it('Should escape metacharacters', function() {
|
|
136
|
-
|
|
137
|
-
let fr = new FileReader("test/HTMLParser/twineExample.html");
|
|
138
|
-
let tp = new HTMLParser(fr.contents);
|
|
139
|
-
assert.equal(tp._escapeMetacharacters('\\\{\\\}\\\[\\\]\\\\'), "\\\\{\\\\}\\\\[\\\\]\\\\");
|
|
140
|
-
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
describe('TweeWriter', function() {
|
|
148
|
-
|
|
149
|
-
describe('#writeFile()', function() {
|
|
150
|
-
|
|
151
|
-
it('Should throw error if object passed is not instanceof Story', function() {
|
|
152
|
-
|
|
153
|
-
assert.throws( () => new TweeWriter({}), Error );
|
|
154
|
-
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('Should throw error if output file invalid', function() {
|
|
158
|
-
|
|
159
|
-
assert.throws( () => new TweeWriter(new Story(), ""), Error );
|
|
160
|
-
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
it('Should write Twee file', function() {
|
|
164
|
-
|
|
165
|
-
let s = new Story();
|
|
166
|
-
let tw = new TweeWriter(s, "test/TweeWriter/test1.twee");
|
|
167
|
-
let fr = new FileReader("test/TweeWriter/test1.twee");
|
|
168
|
-
let tp = new TweeParser(fr.contents);
|
|
169
|
-
assert.equal(tp.story.name, "Unknown");
|
|
170
|
-
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it('Should correctly write Twee file with passage metadata', function() {
|
|
174
|
-
|
|
175
|
-
let s = new Story();
|
|
176
|
-
let p = new Passage("Start", [], {position: "100,100"});
|
|
177
|
-
s.passages = [];
|
|
178
|
-
s.passages.push(p);
|
|
179
|
-
let tw = new TweeWriter(s, "test/TweeWriter/test2.twee");
|
|
180
|
-
let fr = new FileReader("test/TweeWriter/test2.twee");
|
|
181
|
-
let tp = new TweeParser(fr.contents);
|
|
182
|
-
assert.equal(tp.story.passages[0].metadata.position,"100,100");
|
|
183
|
-
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it('Should correctly write Twee file with passage tags', function() {
|
|
187
|
-
|
|
188
|
-
let s = new Story();
|
|
189
|
-
s.name = "TweeWriter";
|
|
190
|
-
let p = new Passage("Start", ["tag", "tags"], {position: "100,100"});
|
|
191
|
-
s.passages.push(p);
|
|
192
|
-
let tw = new TweeWriter(s, "test/TweeWriter/test3.twee");
|
|
193
|
-
let fr = new FileReader("test/TweeWriter/test3.twee");
|
|
194
|
-
let tp = new TweeParser(fr.contents);
|
|
195
|
-
assert.equal(tp.story.passages[0].tags.length, 2);
|
|
196
|
-
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('Should throw error if story.metadata is not an object', function() {
|
|
200
|
-
|
|
201
|
-
let s = new Story();
|
|
202
|
-
s.metadata = 2;
|
|
203
|
-
assert.throws( () => new TweeWriter(s, "test/TweeWriter/test4.twee"), Error );
|
|
204
|
-
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
describe('StoryFormatParser', function() {
|
|
212
|
-
|
|
213
|
-
describe('#parse()', function() {
|
|
214
|
-
|
|
215
|
-
it('Should throw error if JSON missing', function() {
|
|
216
|
-
|
|
217
|
-
assert.throws( () => new StoryFormatParser('test/StoryFormatParser/test.js'), Error );
|
|
218
|
-
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
it('Should throw error if JSON malformed', function() {
|
|
222
|
-
|
|
223
|
-
assert.throws( () => new StoryFormatParser('test/StoryFormatParser/test2.js'), Error );
|
|
224
|
-
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
it('Should correctly parse a StoryFormat name', function() {
|
|
228
|
-
|
|
229
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
230
|
-
assert.equal(sfp.storyformat.name, "Snowman");
|
|
231
|
-
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
it('Should correctly parse Harlowe story format', function() {
|
|
235
|
-
|
|
236
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/harlowe.js');
|
|
237
|
-
assert.equal(sfp.storyformat.name, "Harlowe");
|
|
238
|
-
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
describe('StoryFormat', function() {
|
|
246
|
-
|
|
247
|
-
describe('#constructor()', function() {
|
|
248
|
-
|
|
249
|
-
it('Should throw error on non-JS-object', function() {
|
|
250
|
-
|
|
251
|
-
assert.throws( () => new StoryFormat('testing'), Error );
|
|
252
|
-
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
it('Accept object values', function() {
|
|
256
|
-
|
|
257
|
-
let sf = new StoryFormat({name: "testing"});
|
|
258
|
-
assert.equal(sf.name, "testing");
|
|
259
|
-
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
it('Defaults to null values', function() {
|
|
263
|
-
|
|
264
|
-
let sf = new StoryFormat({});
|
|
265
|
-
assert.equal(sf.name, null);
|
|
266
|
-
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
describe('Passage', function() {
|
|
274
|
-
|
|
275
|
-
describe('#constructor()', function() {
|
|
276
|
-
|
|
277
|
-
it('Should have default values', function() {
|
|
278
|
-
|
|
279
|
-
let p = new Passage();
|
|
280
|
-
assert.equal(p.name, "");
|
|
281
|
-
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
describe('HTMLWriter', function() {
|
|
289
|
-
|
|
290
|
-
describe('#constructor()', function() {
|
|
291
|
-
|
|
292
|
-
it('Should throw error if file writing fails', function() {
|
|
293
|
-
|
|
294
|
-
let fr = new FileReader("test/HTMLWriter/example.twee");
|
|
295
|
-
let tp = new TweeParser(fr.contents);
|
|
296
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
297
|
-
assert.throws( () => new HTMLWriter("", tp.story, sfp.storyformat), Error );
|
|
298
|
-
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
it('story should be instanceof Story', function() {
|
|
302
|
-
|
|
303
|
-
assert.throws( () => new HTMLWriter("test/HTMLWriter/test.html", {}), Error );
|
|
304
|
-
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
it('storyFormat should be instanceof StoryFormat', function() {
|
|
308
|
-
|
|
309
|
-
let s = new Story();
|
|
310
|
-
assert.throws( () => new HTMLWriter("test/HTMLWriter/test.html", s, {}), Error );
|
|
311
|
-
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it('Should produce HTML readable by HTMLParser and find story name of "twineExample"', function() {
|
|
315
|
-
|
|
316
|
-
let fr = new FileReader("test/HTMLWriter/example.twee");
|
|
317
|
-
let tp = new TweeParser(fr.contents);
|
|
318
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
319
|
-
let hw = new HTMLWriter("test/HTMLWriter/test2.html", tp.story, sfp.storyformat);
|
|
320
|
-
let frh = new FileReader("test/HTMLWriter/test2.html");
|
|
321
|
-
let hp = new HTMLParser(frh.contents);
|
|
322
|
-
|
|
323
|
-
assert.equal(hp.story.name, "twineExample");
|
|
324
|
-
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
it('Should correctly write default values for "position" and "size"', function() {
|
|
328
|
-
|
|
329
|
-
let fr = new FileReader("test/HTMLWriter/example.twee");
|
|
330
|
-
let tp = new TweeParser(fr.contents);
|
|
331
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
332
|
-
let hw = new HTMLWriter("test/HTMLWriter/test3.html", tp.story, sfp.storyformat);
|
|
333
|
-
let frh = new FileReader("test/HTMLWriter/test3.html");
|
|
334
|
-
let hp = new HTMLParser(frh.contents);
|
|
335
|
-
assert.equal(hp.story.passages[1].metadata.position, "100,100");
|
|
336
|
-
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
it('Should correctly write defined values for "position"', function() {
|
|
340
|
-
|
|
341
|
-
let fr = new FileReader("test/HTMLWriter/example2.twee");
|
|
342
|
-
let tp = new TweeParser(fr.contents);
|
|
343
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
344
|
-
let hw = new HTMLWriter("test/HTMLWriter/test4.html", tp.story, sfp.storyformat);
|
|
345
|
-
let frh = new FileReader("test/HTMLWriter/test4.html");
|
|
346
|
-
let hp = new HTMLParser(frh.contents);
|
|
347
|
-
assert.equal(hp.story.passages[1].metadata.position, "200,200");
|
|
348
|
-
|
|
349
|
-
});
|
|
350
|
-
|
|
351
|
-
it('Should correctly write single "tag"', function() {
|
|
352
|
-
|
|
353
|
-
let fr = new FileReader("test/HTMLWriter/example3.twee");
|
|
354
|
-
let tp = new TweeParser(fr.contents);
|
|
355
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
356
|
-
let hw = new HTMLWriter("test/HTMLWriter/test5.html", tp.story, sfp.storyformat);
|
|
357
|
-
let frh = new FileReader("test/HTMLWriter/test5.html");
|
|
358
|
-
let hp = new HTMLParser(frh.contents);
|
|
359
|
-
assert.equal(hp.story.passages[1].tags.includes("tag"), true);
|
|
360
|
-
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
it('Should correctly write defined values for "size"', function() {
|
|
364
|
-
|
|
365
|
-
let fr = new FileReader("test/HTMLWriter/example4.twee");
|
|
366
|
-
let tp = new TweeParser(fr.contents);
|
|
367
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
368
|
-
let hw = new HTMLWriter("test/HTMLWriter/test6.html", tp.story, sfp.storyformat);
|
|
369
|
-
let frh = new FileReader("test/HTMLWriter/test6.html");
|
|
370
|
-
let hp = new HTMLParser(frh.contents);
|
|
371
|
-
assert.equal(hp.story.passages[1].metadata.size, "100,100");
|
|
372
|
-
|
|
373
|
-
});
|
|
374
|
-
|
|
375
|
-
it('Should correctly write multiple tags', function() {
|
|
376
|
-
|
|
377
|
-
let fr = new FileReader("test/HTMLWriter/example5.twee");
|
|
378
|
-
let tp = new TweeParser(fr.contents);
|
|
379
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
380
|
-
let hw = new HTMLWriter("test/HTMLWriter/test6.html", tp.story, sfp.storyformat);
|
|
381
|
-
let frh = new FileReader("test/HTMLWriter/test6.html");
|
|
382
|
-
let hp = new HTMLParser(frh.contents);
|
|
383
|
-
assert.equal(hp.story.passages[1].tags.length, 2);
|
|
384
|
-
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
it('Should correctly write stylesheet-tagged passages', function() {
|
|
388
|
-
|
|
389
|
-
let fr = new FileReader("test/HTMLWriter/example6.twee");
|
|
390
|
-
let tp = new TweeParser(fr.contents);
|
|
391
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
392
|
-
let hw = new HTMLWriter("test/HTMLWriter/test7.html", tp.story, sfp.storyformat);
|
|
393
|
-
let frh = new FileReader("test/HTMLWriter/test7.html");
|
|
394
|
-
let hp = new HTMLParser(frh.contents);
|
|
395
|
-
assert.equal(hp.story.getStylePassages().length, 1);
|
|
396
|
-
|
|
397
|
-
});
|
|
398
|
-
|
|
399
|
-
it('Should correctly write script-tagged passages', function() {
|
|
400
|
-
|
|
401
|
-
let fr = new FileReader("test/HTMLWriter/example7.twee");
|
|
402
|
-
let tp = new TweeParser(fr.contents);
|
|
403
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
404
|
-
let hw = new HTMLWriter("test/HTMLWriter/test8.html", tp.story, sfp.storyformat);
|
|
405
|
-
let frh = new FileReader("test/HTMLWriter/test8.html");
|
|
406
|
-
let hp = new HTMLParser(frh.contents);
|
|
407
|
-
assert.equal(hp.story.getScriptPassages().length, 1);
|
|
408
|
-
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
it('Should correctly write extra CSS code', function() {
|
|
412
|
-
|
|
413
|
-
let fr = new FileReader("test/HTMLWriter/example7.twee");
|
|
414
|
-
let tp = new TweeParser(fr.contents);
|
|
415
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
416
|
-
let hw = new HTMLWriter("test/HTMLWriter/test9.html", tp.story, sfp.storyformat, "body{background:grey}");
|
|
417
|
-
let frh = new FileReader("test/HTMLWriter/test9.html");
|
|
418
|
-
let hp = new HTMLParser(frh.contents);
|
|
419
|
-
assert.equal(hp.story.getStylePassages()[0].text.includes("body{background:grey}"), true);
|
|
420
|
-
|
|
421
|
-
});
|
|
422
|
-
|
|
423
|
-
it('Should correctly write extra JS code', function() {
|
|
424
|
-
|
|
425
|
-
let fr = new FileReader("test/HTMLWriter/example6.twee");
|
|
426
|
-
let tp = new TweeParser(fr.contents);
|
|
427
|
-
let sfp = new StoryFormatParser('test/StoryFormatParser/format.js');
|
|
428
|
-
let hw = new HTMLWriter("test/HTMLWriter/test10.html", tp.story, sfp.storyformat, "", "console.log('Test!')");
|
|
429
|
-
let frh = new FileReader("test/HTMLWriter/test10.html");
|
|
430
|
-
let hp = new HTMLParser(frh.contents);
|
|
431
|
-
assert.equal(hp.story.getScriptPassages()[0].text.includes("console.log('Test!')"), true);
|
|
432
|
-
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
});
|
|
438
|
-
|
|
439
|
-
describe('Story', function() {
|
|
440
|
-
|
|
441
|
-
describe('#constructor()', function() {
|
|
442
|
-
|
|
443
|
-
it('Should have default values', function() {
|
|
444
|
-
|
|
445
|
-
let s = new Story();
|
|
446
|
-
assert.equal(s.name, "Unknown");
|
|
447
|
-
|
|
448
|
-
});
|
|
449
|
-
|
|
450
|
-
});
|
|
451
|
-
|
|
452
|
-
describe('#getStylePassages()', function() {
|
|
453
|
-
|
|
454
|
-
it('Should return empty array when no stylesheet-tagged passages are present', function() {
|
|
455
|
-
|
|
456
|
-
let s = new Story();
|
|
457
|
-
assert.equal(s.getStylePassages().length, 0);
|
|
458
|
-
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
it('Should return correct number of stylesheet-tagged passages', function() {
|
|
462
|
-
|
|
463
|
-
let fr = new FileReader("test/Story/test.twee");
|
|
464
|
-
let tp = new TweeParser(fr.contents);
|
|
465
|
-
assert.equal(tp.story.getStylePassages().length, 2);
|
|
466
|
-
|
|
467
|
-
});
|
|
468
|
-
|
|
469
|
-
});
|
|
470
|
-
|
|
471
|
-
describe('#getScriptPassages()', function() {
|
|
472
|
-
|
|
473
|
-
it('Should return empty array when no script-tagged passages are present', function() {
|
|
474
|
-
|
|
475
|
-
let s = new Story();
|
|
476
|
-
assert.equal(s.getScriptPassages().length, 0);
|
|
477
|
-
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
it('Should return correct number of script-tagged passages', function() {
|
|
481
|
-
|
|
482
|
-
let fr = new FileReader("test/Story/test.twee");
|
|
483
|
-
let tp = new TweeParser(fr.contents);
|
|
484
|
-
assert.equal(tp.story.getScriptPassages().length, 2);
|
|
485
|
-
|
|
486
|
-
});
|
|
487
|
-
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
describe('#deleteAllByTag()', function() {
|
|
491
|
-
|
|
492
|
-
it('Should do nothing if internal passages array is empty', function() {
|
|
493
|
-
|
|
494
|
-
let s = new Story();
|
|
495
|
-
s.passages = [];
|
|
496
|
-
s.deleteAllByTag();
|
|
497
|
-
assert.equal(s.passages.length, 0);
|
|
498
|
-
|
|
499
|
-
});
|
|
500
|
-
|
|
501
|
-
it('Should remove passages based on tag', function() {
|
|
502
|
-
|
|
503
|
-
let fr = new FileReader("test/Story/test.twee");
|
|
504
|
-
let tp = new TweeParser(fr.contents);
|
|
505
|
-
tp.story.deleteAllByTag("script");
|
|
506
|
-
assert.equal(tp.story.getScriptPassages().length, 0);
|
|
507
|
-
|
|
508
|
-
});
|
|
509
|
-
|
|
510
|
-
});
|
|
511
|
-
|
|
512
|
-
describe('#getStartingPassage()', function() {
|
|
513
|
-
|
|
514
|
-
it('Should throw error if no passages exist', function() {
|
|
515
|
-
|
|
516
|
-
let s = new Story();
|
|
517
|
-
assert.throws( () => s.getStartingPassage(), Error );
|
|
518
|
-
|
|
519
|
-
});
|
|
520
|
-
|
|
521
|
-
it('Should return correct PID of Start passage (skipping numbering of StoryTitle and StoryData passages)', function() {
|
|
522
|
-
|
|
523
|
-
let fr = new FileReader("test/Story/test.twee");
|
|
524
|
-
let tp = new TweeParser(fr.contents);
|
|
525
|
-
assert.equal(tp.story.getStartingPassage(), 1);
|
|
526
|
-
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
it('Should return correct PID of Start metadata passage (skipping numbering of StoryTitle and StoryData passages)', function() {
|
|
530
|
-
|
|
531
|
-
let fr = new FileReader("test/Story/startmeta.twee");
|
|
532
|
-
let tp = new TweeParser(fr.contents);
|
|
533
|
-
assert.equal(tp.story.getStartingPassage(), 1);
|
|
534
|
-
|
|
535
|
-
});
|
|
536
|
-
|
|
537
|
-
});
|
|
538
|
-
|
|
539
|
-
});
|
|
540
|
-
|
|
541
|
-
describe('DirectoryReader', function() {
|
|
542
|
-
|
|
543
|
-
describe('#constructor()', function() {
|
|
544
|
-
|
|
545
|
-
it("Should throw error if not a real path", function() {
|
|
546
|
-
|
|
547
|
-
assert.throws( () => new DirectoryReader("#"), Error );
|
|
548
|
-
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
it("Should throw error if directory does not exist", function() {
|
|
552
|
-
|
|
553
|
-
assert.throws( () => new DirectoryReader("test/DirectoryReader/error/"), Error );
|
|
554
|
-
|
|
555
|
-
});
|
|
556
|
-
|
|
557
|
-
});
|
|
558
|
-
|
|
559
|
-
describe('#processJS()', function() {
|
|
560
|
-
|
|
561
|
-
it("Should process JS", async () => {
|
|
562
|
-
|
|
563
|
-
let dr = new DirectoryReader("test/DirectoryReader1/");
|
|
564
|
-
let content = await dr.processJS();
|
|
565
|
-
assert(content.length > 0);
|
|
566
|
-
});
|
|
567
|
-
|
|
568
|
-
});
|
|
569
|
-
|
|
570
|
-
describe('#processCSS()', function() {
|
|
571
|
-
|
|
572
|
-
it("Should process CSS", async () => {
|
|
573
|
-
|
|
574
|
-
let dr = new DirectoryReader("test/DirectoryReader/");
|
|
575
|
-
let content = await dr.processCSS();
|
|
576
|
-
assert(content.length > 0);
|
|
577
|
-
});
|
|
578
|
-
|
|
579
|
-
});
|
|
580
|
-
|
|
581
|
-
describe('#processTwee()', function() {
|
|
582
|
-
|
|
583
|
-
it("Should process Twee", async () => {
|
|
584
|
-
|
|
585
|
-
let dr = new DirectoryReader("test/DirectoryReader3/");
|
|
586
|
-
let content = await dr.processTwee();
|
|
587
|
-
assert(content.length > 0);
|
|
588
|
-
});
|
|
589
|
-
|
|
590
|
-
});
|
|
591
|
-
|
|
592
|
-
describe('#watch()', function() {
|
|
593
|
-
|
|
594
|
-
it("Should process Twee + CSS + JS", function() {
|
|
595
|
-
|
|
596
|
-
let dr = new DirectoryReader("test/DirectoryReader2/");
|
|
597
|
-
dr.watch();
|
|
598
|
-
assert(
|
|
599
|
-
dr.CSScontents.length > 0 &&
|
|
600
|
-
dr.JScontents.length > 0 &&
|
|
601
|
-
dr.tweeContents.length > 0);
|
|
602
|
-
});
|
|
603
|
-
|
|
604
|
-
});
|
|
605
|
-
|
|
606
|
-
});
|
|
607
|
-
|
|
608
|
-
describe('DirectoryWatcher', function() {
|
|
609
|
-
|
|
610
|
-
describe('#constructor()', function() {
|
|
611
|
-
|
|
612
|
-
it("Should throw error if not a real path", function() {
|
|
613
|
-
|
|
614
|
-
assert.throws( () => new DirectoryWatcher("#", function(){}), Error );
|
|
615
|
-
|
|
616
|
-
});
|
|
617
|
-
|
|
618
|
-
it("Should throw error if callback not a function", function() {
|
|
619
|
-
|
|
620
|
-
assert.throws( () => new DirectoryWatcher("test/DirectoryWatcher/", 2), Error );
|
|
621
|
-
|
|
622
|
-
});
|
|
623
|
-
|
|
624
|
-
});
|
|
625
|
-
|
|
626
|
-
describe('#watch() - ready', function() {
|
|
627
|
-
|
|
628
|
-
let dw = new DirectoryWatcher("test/DirectoryWatcher/", (event) => {
|
|
629
|
-
|
|
630
|
-
if(event == 'ready') {
|
|
631
|
-
assert(dw.directory.length > 0);
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
});
|
|
635
|
-
|
|
636
|
-
before(function() {
|
|
637
|
-
|
|
638
|
-
shell.touch("test/DirectoryWatcher/test.txt");
|
|
639
|
-
|
|
640
|
-
});
|
|
641
|
-
|
|
642
|
-
it("Should report ready", function() {
|
|
643
|
-
|
|
644
|
-
dw.watch();
|
|
645
|
-
|
|
646
|
-
});
|
|
647
|
-
|
|
648
|
-
after(function() {
|
|
649
|
-
dw.stopWatching();
|
|
650
|
-
});
|
|
651
|
-
|
|
652
|
-
});
|
|
653
|
-
|
|
654
|
-
describe('#watch() - add', function() {
|
|
655
|
-
|
|
656
|
-
let dw = new DirectoryWatcher("test/DirectoryWatcher/", (event) => {
|
|
657
|
-
|
|
658
|
-
if(event == 'add') {
|
|
659
|
-
shell.rm("test/DirectoryWatcher/test.txt");
|
|
660
|
-
assert(dw.directory.length > 0);
|
|
661
|
-
}
|
|
662
|
-
|
|
663
|
-
shell.touch("test/DirectoryWatcher/test.txt");
|
|
664
|
-
|
|
665
|
-
});
|
|
666
|
-
|
|
667
|
-
it("Should detect add", function() {
|
|
668
|
-
|
|
669
|
-
dw.watch();
|
|
670
|
-
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
after(function() {
|
|
674
|
-
dw.stopWatching();
|
|
675
|
-
});
|
|
676
|
-
|
|
677
|
-
});
|
|
678
|
-
|
|
679
|
-
describe('#watch() - change', function() {
|
|
680
|
-
|
|
681
|
-
let dw = new DirectoryWatcher("test/DirectoryWatcher/", (event) => {
|
|
682
|
-
|
|
683
|
-
if(event == 'change') {
|
|
684
|
-
shell.rm("test/DirectoryWatcher/test1.txt");
|
|
685
|
-
assert(dw.directory.length > 0);
|
|
686
|
-
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
shell.cat('Example').toEnd('test/DirectoryWatcher/test1.txt');
|
|
690
|
-
|
|
691
|
-
});
|
|
692
|
-
|
|
693
|
-
before(function() {
|
|
694
|
-
shell.touch("test/DirectoryWatcher/test1.txt");
|
|
695
|
-
});
|
|
696
|
-
|
|
697
|
-
it("Should detect change", function() {
|
|
698
|
-
|
|
699
|
-
dw.watch();
|
|
700
|
-
|
|
701
|
-
});
|
|
702
|
-
|
|
703
|
-
after(function(){
|
|
704
|
-
dw.stopWatching();
|
|
705
|
-
});
|
|
706
|
-
|
|
707
|
-
});
|
|
708
|
-
|
|
709
|
-
describe('#stopWatching()', function() {
|
|
710
|
-
|
|
711
|
-
it("Should throw error if watcher null", function() {
|
|
712
|
-
|
|
713
|
-
let dw = new DirectoryWatcher("test/DirectoryWatcher/", () => {
|
|
714
|
-
});
|
|
715
|
-
|
|
716
|
-
assert.throws( () => {dw.stopWatching()}, Error);
|
|
717
|
-
|
|
718
|
-
});
|
|
719
|
-
|
|
720
|
-
});
|
|
721
|
-
|
|
722
|
-
});
|