securemark 0.237.2 → 0.240.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/securemark.js +153 -92
- package/markdown.d.ts +6 -4
- package/package-lock.json +53 -53
- package/package.json +1 -1
- package/src/combinator/data/parser/subsequence.ts +5 -9
- package/src/combinator/data/parser/tails.ts +1 -1
- package/src/combinator/data/parser/union.ts +1 -1
- package/src/debug.test.ts +1 -1
- package/src/parser/api/header.test.ts +1 -1
- package/src/parser/api/header.ts +3 -3
- package/src/parser/api/parse.test.ts +7 -7
- package/src/parser/block/blockquote.test.ts +1 -1
- package/src/parser/block/extension/aside.test.ts +1 -1
- package/src/parser/block/extension/example.test.ts +2 -2
- package/src/parser/block/extension/fig.test.ts +22 -22
- package/src/parser/block/extension/fig.ts +1 -1
- package/src/parser/block/extension/figure.test.ts +39 -33
- package/src/parser/block/extension/figure.ts +51 -25
- package/src/parser/block/olist.test.ts +2 -0
- package/src/parser/block/ulist.test.ts +2 -0
- package/src/parser/block.ts +2 -2
- package/src/parser/header.test.ts +4 -4
- package/src/parser/header.ts +7 -5
- package/src/parser/inline/extension/index.test.ts +19 -13
- package/src/parser/inline/extension/index.ts +4 -3
- package/src/parser/inline/extension/indexee.ts +7 -3
- package/src/parser/inline/extension/indexer.test.ts +2 -1
- package/src/parser/inline/extension/indexer.ts +6 -3
- package/src/parser/inline/htmlentity.ts +2 -2
- package/src/parser/inline/media.ts +2 -2
- package/src/parser/inline/reference.test.ts +7 -7
- package/src/parser/inline/reference.ts +1 -1
- package/src/parser/inline/ruby.ts +2 -2
- package/src/parser/processor/figure.test.ts +79 -77
- package/src/parser/processor/figure.ts +32 -19
- package/src/parser/segment.test.ts +2 -2
- package/src/parser/segment.ts +2 -2
- package/src/parser/source/str.ts +23 -4
- package/src/parser/source/text.ts +3 -0
- package/src/parser/source.ts +1 -1
- package/src/parser/util.ts +2 -2
|
@@ -8,7 +8,7 @@ describe('Unit: parser/block/extension/figure', () => {
|
|
|
8
8
|
|
|
9
9
|
it('invalid', () => {
|
|
10
10
|
assert.deepStrictEqual(inspect(parser('~~~figure\n!https://host\n~~~')), undefined);
|
|
11
|
-
assert.deepStrictEqual(inspect(parser('~~~figure $group-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group" class="invalid"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
11
|
+
assert.deepStrictEqual(inspect(parser('~~~figure $group-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
12
12
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name\n!https://host\n~~~')), undefined);
|
|
13
13
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\nhttps://host\n~~~')), undefined);
|
|
14
14
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\\\n~~~')), undefined);
|
|
@@ -21,46 +21,52 @@ describe('Unit: parser/block/extension/figure', () => {
|
|
|
21
21
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n~~~~')), undefined);
|
|
22
22
|
assert.deepStrictEqual(inspect(parser('~~~~figure [$group-name]\n!https://host\n~~~')), undefined);
|
|
23
23
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]a\nhttps://host\n~~~')), undefined);
|
|
24
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]a\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group" class="invalid"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
24
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]a\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
25
25
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name] a\nhttps://host\n~~~')), undefined);
|
|
26
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name] a\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group" class="invalid"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
26
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name] a\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
27
|
+
assert.deepStrictEqual(inspect(parser('~~~figure a[$group-name]\n!https://host\n~~~')), undefined);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser('~~~figure a [$group-name]\n!https://host\n~~~')), undefined);
|
|
27
29
|
assert.deepStrictEqual(inspect(parser('~~~ [$group-name]\n!https://host\n~~~')), undefined);
|
|
28
30
|
assert.deepStrictEqual(inspect(parser('~~~ $group-name\n!https://host\n~~~')), undefined);
|
|
29
31
|
assert.deepStrictEqual(inspect(parser(' ~~~figure [$group-name]\n!https://host\n~~~')), undefined);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="$-name" data-group="$" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
33
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$fig-name]\n> \n\n~~~')), [['<figure data-type="quote" data-label="fig-name" data-group="fig" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
|
|
34
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$figure-name]\n> \n\n~~~')), [['<figure data-type="quote" data-label="figure-name" data-group="figure" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
|
|
35
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$table-name]\n> \n\n~~~')), [['<figure data-type="quote" data-label="table-name" data-group="table" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
|
|
30
36
|
assert(!parser('~~~figure [$group-name]\n```\n0' + '\n'.repeat(301) + '```\n~~~'));
|
|
31
37
|
});
|
|
32
38
|
|
|
33
39
|
it('valid', () => {
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
35
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n~~~\n')), [['<figure data-type="media" data-label="group-name" data-group="group"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
36
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
37
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
38
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\\\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
39
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n!https://caption\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n- a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><div><ul><li>a</li></ul></div
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n1. a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><div><ol><li>a</li></ol></div
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n|\n|-\n|\n~~~')), [['<figure data-type="table" data-label="group-name" data-group="group"><div><table><thead><tr></tr></thead><tbody><tr></tr></tbody></table></div
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n\n```\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><div><pre class="text" translate="no"></pre></div
|
|
44
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n~~~\n```\n\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><div><pre class="text" translate="no">~~~</pre></div
|
|
45
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n```\n\ncaption\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><div><pre class="text" translate="no"></pre></div
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n$$\n\n$$\n~~~')), [['<figure data-type="math" data-label="group-name" data-group="group"><div><div class="math" translate="no">$$\n\n$$</div></div
|
|
47
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n$$\n~~~\n$$\n~~~')), [['<figure data-type="math" data-label="group-name" data-group="group"><div><div class="math" translate="no">$$\n~~~\n$$</div></div
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n$$\n\n$$\n\ncaption\n~~~')), [['<figure data-type="math" data-label="group-name" data-group="group"><div><div class="math" translate="no">$$\n\n$$</div></div
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n~~~example/markdown\n~~~\n\ncaption\n~~~')), [['<figure data-type="example" data-label="group-name" data-group="group"><div><aside class="example" data-type="markdown"><pre translate="no"></pre><hr><section><ol class="annotations"></ol><ol class="references"></ol></section></aside></div
|
|
50
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n~~~table\n~~~\n\ncaption\n~~~')), [['<figure data-type="table" data-label="group-name" data-group="group"><
|
|
51
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n> \n~~~\n\n~~~')), [['<figure data-type="quote" data-label="group-name" data-group="group"><div><blockquote><pre><br>~~~</pre></blockquote></div
|
|
52
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n> \n~~~\n\ncaption\n~~~')), [['<figure data-type="quote" data-label="group-name" data-group="group"><
|
|
53
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n![]{https://host}\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
54
|
-
assert.deepStrictEqual(inspect(parser('~~~~figure [$group-name]\n!https://host\n~~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
55
|
-
assert.deepStrictEqual(inspect(parser('~~~figure $group-name\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
56
|
-
assert.deepStrictEqual(inspect(parser('~~~[$group-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
57
|
-
assert.deepStrictEqual(inspect(parser('~~~$group-name\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
58
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-0]\n> \n\n~~~')), [['<figure data-type="quote" data-label="group-0" data-group="group" class="invalid"><
|
|
59
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-0.0]\n> \n\n~~~')), [['<figure data-type="quote" data-label="group-0.0" data-group="group" class="invalid"><
|
|
60
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$-0]\n$$\n\n$$\n~~~')), [['<figure data-type="math" data-label="$-0" data-group="$" class="invalid"><div><div class="math" translate="no">$$\n\n$$</div></div
|
|
61
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$-0.0]\n$$\n\n$$\n~~~')), [['<figure data-type="math" data-label="$-0.0" data-group="$" class="invalid"><div><div class="math" translate="no">$$\n\n$$</div></div
|
|
62
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="$-name" data-group="$" class="invalid"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div
|
|
63
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$-name]\n$$\n\n$$\n\ncaption\n~~~')), [['<figure data-type="math" data-label="$-name" data-group="$" class="invalid"><div><div class="math" translate="no">$$\n\n$$</div></div
|
|
40
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n~~~\n')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
44
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\\\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span>\\</figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n!https://caption\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span>!<a href="https://caption" target="_blank">https://caption</a></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
46
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n- a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><ul><li>a</li></ul></div></figure>'], '']);
|
|
47
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n1. a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><ol><li>a</li></ol></div></figure>'], '']);
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n|\n|-\n|\n~~~')), [['<figure data-type="table" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><table><thead><tr></tr></thead><tbody><tr></tr></tbody></table></div></figure>'], '']);
|
|
49
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n\n```\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><pre class="text" translate="no"></pre></div></figure>'], '']);
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n~~~\n```\n\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><pre class="text" translate="no">~~~</pre></div></figure>'], '']);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n```\n\ncaption\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span>caption</figcaption><div><pre class="text" translate="no"></pre></div></figure>'], '']);
|
|
52
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n$$\n\n$$\n~~~')), [['<figure data-type="math" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
|
|
53
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n$$\n~~~\n$$\n~~~')), [['<figure data-type="math" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><div class="math" translate="no">$$\n~~~\n$$</div></div></figure>'], '']);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n$$\n\n$$\n\ncaption\n~~~')), [['<figure data-type="math" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span>caption</figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
|
|
55
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n~~~example/markdown\n~~~\n\ncaption\n~~~')), [['<figure data-type="example" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span>caption</figcaption><div><aside class="example" data-type="markdown"><pre translate="no"></pre><hr><section><ol class="annotations"></ol><ol class="references"></ol></section></aside></div></figure>'], '']);
|
|
56
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n~~~table\n~~~\n\ncaption\n~~~')), [['<figure data-type="table" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span>caption</figcaption><div><table></table></div></figure>'], '']);
|
|
57
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n> \n~~~\n\n~~~')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><blockquote><pre><br>~~~</pre></blockquote></div></figure>'], '']);
|
|
58
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n> \n~~~\n\ncaption\n~~~')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span>caption</figcaption><div><blockquote><pre><br>~~~</pre></blockquote></div></figure>'], '']);
|
|
59
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n![]{https://host}\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
60
|
+
assert.deepStrictEqual(inspect(parser('~~~~figure [$group-name]\n!https://host\n~~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
61
|
+
assert.deepStrictEqual(inspect(parser('~~~figure $group-name\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
62
|
+
assert.deepStrictEqual(inspect(parser('~~~[$group-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
63
|
+
assert.deepStrictEqual(inspect(parser('~~~$group-name\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
64
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-0]\n> \n\n~~~')), [['<figure data-type="quote" data-label="group-0" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
|
|
65
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-0.0]\n> \n\n~~~')), [['<figure data-type="quote" data-label="group-0.0" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
|
|
66
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$-0]\n$$\n\n$$\n~~~')), [['<figure data-type="math" data-label="$-0" data-group="$" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
|
|
67
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$-0.0]\n$$\n\n$$\n~~~')), [['<figure data-type="math" data-label="$-0.0" data-group="$" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
|
|
68
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="$-name" data-group="$" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
69
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$-name]\n$$\n\n$$\n\ncaption\n~~~')), [['<figure data-type="math" data-label="$-name" data-group="$" class="invalid"><figcaption><span class="figindex"></span>caption</figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
|
|
64
70
|
assert(parser('~~~figure [$group-name]\n```\n0' + '\n'.repeat(300) + '```\n~~~'));
|
|
65
71
|
assert(parser('~~~figure [$group-name]\n' + '>\n'.repeat(500) + '\n~~~'));
|
|
66
72
|
});
|
|
@@ -2,7 +2,7 @@ import { undefined } from 'spica/global';
|
|
|
2
2
|
import { ExtensionParser } from '../../block';
|
|
3
3
|
import { union, inits, sequence, some, block, line, rewrite, context, close, match, convert, trim, fmap } from '../../../combinator';
|
|
4
4
|
import { str, contentline, emptyline } from '../../source';
|
|
5
|
-
import { label
|
|
5
|
+
import { label } from '../../inline/extension/label';
|
|
6
6
|
import { ulist } from '../ulist';
|
|
7
7
|
import { olist } from '../olist';
|
|
8
8
|
import { table as styled_table } from '../table';
|
|
@@ -27,7 +27,7 @@ export const segment: FigureParser.SegmentParser = block(match(
|
|
|
27
27
|
([, fence], closer = new RegExp(String.raw`^${fence}[^\S\n]*(?:$|\n)`)) =>
|
|
28
28
|
close(
|
|
29
29
|
sequence([
|
|
30
|
-
|
|
30
|
+
contentline,
|
|
31
31
|
inits([
|
|
32
32
|
// All parsers which can include closing terms.
|
|
33
33
|
union([
|
|
@@ -76,23 +76,20 @@ export const figure: FigureParser = block(rewrite(segment, fmap(
|
|
|
76
76
|
html('figure',
|
|
77
77
|
attributes(label.getAttribute('data-label')!, param, content, caption),
|
|
78
78
|
[
|
|
79
|
-
html('div', [content]),
|
|
80
79
|
html('figcaption', unshift(
|
|
81
80
|
[html('span', { class: 'figindex' })],
|
|
82
81
|
defrag(caption))),
|
|
82
|
+
html('div', [content]),
|
|
83
83
|
])
|
|
84
84
|
])));
|
|
85
85
|
|
|
86
86
|
function attributes(label: string, param: string, content: HTMLElement, caption: readonly HTMLElement[]): Record<string, string | undefined> {
|
|
87
87
|
const group = label.split('-', 1)[0];
|
|
88
|
-
const invalidLabel = /^[^-]+-(?:[0-9]+\.)*0$/.test(label);
|
|
89
|
-
const invalidParam = param.trimStart() !== '';
|
|
90
|
-
const invalidContent = group === '$' && (!content.classList.contains('math') || caption.length > 0);
|
|
91
|
-
const invalid = invalidLabel || invalidParam || invalidContent || undefined;
|
|
92
88
|
let type: string = content.className.split(/\s/)[0];
|
|
93
89
|
switch (type || content.tagName) {
|
|
94
90
|
case 'UL':
|
|
95
91
|
case 'OL':
|
|
92
|
+
case 'checklist':
|
|
96
93
|
type = 'list';
|
|
97
94
|
break;
|
|
98
95
|
case 'TABLE':
|
|
@@ -113,27 +110,56 @@ function attributes(label: string, param: string, content: HTMLElement, caption:
|
|
|
113
110
|
default:
|
|
114
111
|
assert(false);
|
|
115
112
|
}
|
|
113
|
+
const invalid =
|
|
114
|
+
/^[^-]+-(?:[0-9]+\.)*0$/.test(label) && {
|
|
115
|
+
'data-invalid-type': 'label',
|
|
116
|
+
'data-invalid-message': 'The last part of the fixed label numbers must not be 0',
|
|
117
|
+
} ||
|
|
118
|
+
param.trimStart() !== '' && {
|
|
119
|
+
'data-invalid-type': 'argument',
|
|
120
|
+
'data-invalid-message': 'Invalid argument',
|
|
121
|
+
} ||
|
|
122
|
+
group === '$' && (type !== 'math' || caption.length > 0) && {
|
|
123
|
+
'data-invalid-type': 'content',
|
|
124
|
+
'data-invalid-message': '`$` label group can only be used with a math formula with no caption',
|
|
125
|
+
} ||
|
|
126
|
+
['fig', 'figure'].includes(group) && type !== 'media' && {
|
|
127
|
+
'data-invalid-type': 'content',
|
|
128
|
+
'data-invalid-message': '`fig` and `figure` label groups can only be used with media',
|
|
129
|
+
} ||
|
|
130
|
+
group === 'table' && type !== group && {
|
|
131
|
+
'data-invalid-type': 'content',
|
|
132
|
+
'data-invalid-message': '`table` label group can only be used with a table',
|
|
133
|
+
} ||
|
|
134
|
+
group === 'list' && type !== group && {
|
|
135
|
+
'data-invalid-type': 'content',
|
|
136
|
+
'data-invalid-message': '`list` label group can only be used with a list',
|
|
137
|
+
} ||
|
|
138
|
+
group === 'quote' && type !== group && {
|
|
139
|
+
'data-invalid-type': 'content',
|
|
140
|
+
'data-invalid-message': '`quote` label group can only be used with a blockquote',
|
|
141
|
+
} ||
|
|
142
|
+
group === 'text' && type !== group && {
|
|
143
|
+
'data-invalid-type': 'content',
|
|
144
|
+
'data-invalid-message': '`text` label group can only be used with a codeblock with no language',
|
|
145
|
+
} ||
|
|
146
|
+
group === 'code' && type !== group && {
|
|
147
|
+
'data-invalid-type': 'content',
|
|
148
|
+
'data-invalid-message': '`code` label group can only be used with a codeblock',
|
|
149
|
+
} ||
|
|
150
|
+
group === 'example' && type !== group && {
|
|
151
|
+
'data-invalid-type': 'content',
|
|
152
|
+
'data-invalid-message': '`example` label group can only be used with an example',
|
|
153
|
+
} ||
|
|
154
|
+
undefined;
|
|
116
155
|
return {
|
|
117
156
|
'data-type': type,
|
|
118
157
|
'data-label': label,
|
|
119
158
|
'data-group': group,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
'data-invalid-message': 'The last part of the fixed label numbers must not be 0',
|
|
126
|
-
} ||
|
|
127
|
-
invalidParam && {
|
|
128
|
-
'data-invalid-syntax': 'figure',
|
|
129
|
-
'data-invalid-type': 'argument',
|
|
130
|
-
'data-invalid-message': 'Invalid argument',
|
|
131
|
-
} ||
|
|
132
|
-
invalidContent && {
|
|
133
|
-
'data-invalid-syntax': 'figure',
|
|
134
|
-
'data-invalid-type': 'content',
|
|
135
|
-
'data-invalid-message': 'A figure labeled to define a formula number can contain only a math formula and no caption',
|
|
136
|
-
} ||
|
|
137
|
-
undefined,
|
|
159
|
+
...invalid && {
|
|
160
|
+
class: 'invalid',
|
|
161
|
+
'data-invalid-syntax': 'figure',
|
|
162
|
+
...invalid,
|
|
163
|
+
},
|
|
138
164
|
};
|
|
139
165
|
}
|
|
@@ -126,9 +126,11 @@ describe('Unit: parser/block/olist', () => {
|
|
|
126
126
|
|
|
127
127
|
it('indexer', () => {
|
|
128
128
|
assert.deepStrictEqual(inspect(parser('1. [#a]')), [['<ol><li><a class="index" href="#index:a">a</a></li></ol>'], '']);
|
|
129
|
+
assert.deepStrictEqual(inspect(parser('1. a [#]')), [['<ol><li id="index:a">a<span class="indexer" data-index=""></span></li></ol>'], '']);
|
|
129
130
|
assert.deepStrictEqual(inspect(parser('1. a [#b]')), [['<ol><li id="index:b">a<span class="indexer" data-index="b"></span></li></ol>'], '']);
|
|
130
131
|
assert.deepStrictEqual(inspect(parser('1. [ ] [#a]')), [['<ol class="checklist"><li><span class="checkbox">☐</span><a class="index" href="#index:a">a</a></li></ol>'], '']);
|
|
131
132
|
assert.deepStrictEqual(inspect(parser('1. [ ] a [#b]')), [['<ol class="checklist"><li id="index:b"><span class="checkbox">☐</span>a<span class="indexer" data-index="b"></span></li></ol>'], '']);
|
|
133
|
+
assert.deepStrictEqual(inspect(parser('1. a [#]\n 1. c [#d]')), [['<ol><li id="index:a">a<span class="indexer" data-index=""></span><ol><li id="index:d">c<span class="indexer" data-index="d"></span></li></ol></li></ol>'], '']);
|
|
132
134
|
assert.deepStrictEqual(inspect(parser('1. a [#b]\n 1. c [#d]')), [['<ol><li id="index:b">a<span class="indexer" data-index="b"></span><ol><li id="index:d">c<span class="indexer" data-index="d"></span></li></ol></li></ol>'], '']);
|
|
133
135
|
});
|
|
134
136
|
|
|
@@ -68,9 +68,11 @@ describe('Unit: parser/block/ulist', () => {
|
|
|
68
68
|
|
|
69
69
|
it('indexer', () => {
|
|
70
70
|
assert.deepStrictEqual(inspect(parser('- [#a]')), [['<ul><li><a class="index" href="#index:a">a</a></li></ul>'], '']);
|
|
71
|
+
assert.deepStrictEqual(inspect(parser('- a [#]')), [['<ul><li id="index:a">a<span class="indexer" data-index=""></span></li></ul>'], '']);
|
|
71
72
|
assert.deepStrictEqual(inspect(parser('- a [#b]')), [['<ul><li id="index:b">a<span class="indexer" data-index="b"></span></li></ul>'], '']);
|
|
72
73
|
assert.deepStrictEqual(inspect(parser('- [ ] [#a]')), [['<ul class="checklist"><li><span class="checkbox">☐</span><a class="index" href="#index:a">a</a></li></ul>'], '']);
|
|
73
74
|
assert.deepStrictEqual(inspect(parser('- [ ] a [#b]')), [['<ul class="checklist"><li id="index:b"><span class="checkbox">☐</span>a<span class="indexer" data-index="b"></span></li></ul>'], '']);
|
|
75
|
+
assert.deepStrictEqual(inspect(parser('- a [#]\n - c [#d]')), [['<ul><li id="index:a">a<span class="indexer" data-index=""></span><ul><li id="index:d">c<span class="indexer" data-index="d"></span></li></ul></li></ul>'], '']);
|
|
74
76
|
assert.deepStrictEqual(inspect(parser('- a [#b]\n - c [#d]')), [['<ul><li id="index:b">a<span class="indexer" data-index="b"></span><ul><li id="index:d">c<span class="indexer" data-index="d"></span></li></ul></li></ul>'], '']);
|
|
75
77
|
});
|
|
76
78
|
|
package/src/parser/block.ts
CHANGED
|
@@ -54,7 +54,7 @@ export const block: BlockParser = creator(error(
|
|
|
54
54
|
|
|
55
55
|
function error(parser: BlockParser): BlockParser {
|
|
56
56
|
return recover<BlockParser>(fallback(
|
|
57
|
-
open('\
|
|
57
|
+
open('\x07', source => { throw new Error(source.split('\n', 1)[0]); }),
|
|
58
58
|
parser),
|
|
59
59
|
(source, { id }, reason) => [[
|
|
60
60
|
html('h1',
|
|
@@ -71,7 +71,7 @@ function error(parser: BlockParser): BlockParser {
|
|
|
71
71
|
translate: 'no',
|
|
72
72
|
},
|
|
73
73
|
source
|
|
74
|
-
.replace(/^\
|
|
74
|
+
.replace(/^\x07.*\n/, '')
|
|
75
75
|
.slice(0, 1001)
|
|
76
76
|
.replace(/^(.{997}).{4}$/s, '$1...') || undefined),
|
|
77
77
|
], '']);
|
|
@@ -24,10 +24,10 @@ describe('Unit: parser/header', () => {
|
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
it('basic', () => {
|
|
27
|
-
assert.deepStrictEqual(inspect(parser('---\na: b\n---')), [['<
|
|
28
|
-
assert.deepStrictEqual(inspect(parser('---\na: b\n---\n')), [['<
|
|
29
|
-
assert.deepStrictEqual(inspect(parser('---\na: b\nC:
|
|
30
|
-
assert.deepStrictEqual(inspect(parser('--- \r\na: b \r\n--- \r\n \r\n \r\na')), [['<
|
|
27
|
+
assert.deepStrictEqual(inspect(parser('---\na: b\n---')), [['<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="a" data-value="b"><span class="field-name">a</span>: <span class="field-value">b</span>\n</span></details></aside>'], '']);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser('---\na: b\n---\n')), [['<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="a" data-value="b"><span class="field-name">a</span>: <span class="field-value">b</span>\n</span></details></aside>'], '']);
|
|
29
|
+
assert.deepStrictEqual(inspect(parser('---\na: b\nC: D e\n---\n')), [['<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="a" data-value="b"><span class="field-name">a</span>: <span class="field-value">b</span>\n</span><span class="field" data-name="c" data-value="D e"><span class="field-name">C</span>: <span class="field-value">D e</span>\n</span></details></aside>'], '']);
|
|
30
|
+
assert.deepStrictEqual(inspect(parser('--- \r\na: b \r\n--- \r\n \r\n \r\na')), [['<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="a" data-value="b"><span class="field-name">a</span>: <span class="field-value">b</span>\n</span></details></aside>'], ' \r\na']);
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
});
|
package/src/parser/header.ts
CHANGED
|
@@ -20,10 +20,12 @@ export const header: MarkdownParser.HeaderParser = lazy(() => validate(
|
|
|
20
20
|
fmap(
|
|
21
21
|
some(union([field])),
|
|
22
22
|
es => [
|
|
23
|
-
html('
|
|
24
|
-
html('
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
html('aside', { class: 'header' }, [
|
|
24
|
+
html('details', { open: '' }, defrag([
|
|
25
|
+
html('summary', 'Header'),
|
|
26
|
+
...es,
|
|
27
|
+
])),
|
|
28
|
+
]),
|
|
27
29
|
])))),
|
|
28
30
|
source => [[
|
|
29
31
|
html('pre', {
|
|
@@ -42,7 +44,7 @@ const field: MarkdownParser.HeaderParser.FieldParser = line(source => {
|
|
|
42
44
|
const name = source.slice(0, source.indexOf(':'));
|
|
43
45
|
const value = source.slice(name.length + 1).trim();
|
|
44
46
|
return [[
|
|
45
|
-
html('span', { class: 'field', 'data-name': name, 'data-value': value }, [
|
|
47
|
+
html('span', { class: 'field', 'data-name': name.toLowerCase(), 'data-value': value }, [
|
|
46
48
|
html('span', { class: 'field-name' }, name),
|
|
47
49
|
': ',
|
|
48
50
|
html('span', { class: 'field-value' }, value),
|
|
@@ -42,6 +42,7 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
42
42
|
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
43
43
|
assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
|
|
44
44
|
assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser('[#a \\ ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
45
46
|
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
46
47
|
assert.deepStrictEqual(inspect(parser('[#a <wbr>]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
47
48
|
assert.deepStrictEqual(inspect(parser('[#a [# b #]]')), [['<a class="index" href="#index:a">a <span class="comment"><input type="checkbox"><span>[# b #]</span></span></a>'], '']);
|
|
@@ -70,21 +71,26 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
70
71
|
assert.deepStrictEqual(inspect(parser('[#|]')), [['<a class="index" href="#index:|">|</a>'], '']);
|
|
71
72
|
assert.deepStrictEqual(inspect(parser('[#|#]')), [['<a class="index" href="#index:|#">|#</a>'], '']);
|
|
72
73
|
assert.deepStrictEqual(inspect(parser('[#|#b]')), [['<a class="index" href="#index:|#b">|#b</a>'], '']);
|
|
73
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
74
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
75
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
76
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
77
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
74
|
+
assert.deepStrictEqual(inspect(parser('[#a|]')), [['<a class="index" href="#index:a|">a|</a>'], '']);
|
|
75
|
+
assert.deepStrictEqual(inspect(parser('[#a|#]')), [['<a class="index" href="#index:a|#">a|#</a>'], '']);
|
|
76
|
+
assert.deepStrictEqual(inspect(parser('[#a|# ]')), [['<a class="index" href="#index:a|#">a|#</a>'], '']);
|
|
77
|
+
assert.deepStrictEqual(inspect(parser('[#a|#\\ ]')), [['<a class="index" href="#index:a|#">a|#</a>'], '']);
|
|
78
|
+
assert.deepStrictEqual(inspect(parser('[#a|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
79
|
+
assert.deepStrictEqual(inspect(parser('[#a|#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
80
|
+
assert.deepStrictEqual(inspect(parser('[#a|#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
81
|
+
assert.deepStrictEqual(inspect(parser('[#a|#\\b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
82
|
+
assert.deepStrictEqual(inspect(parser('[#a|#*b*]')), [['<a class="index" href="#index:*b*">a<span class="indexer" data-index="*b*"></span></a>'], '']);
|
|
83
|
+
assert.deepStrictEqual(inspect(parser('[#a|#b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
|
|
84
|
+
assert.deepStrictEqual(inspect(parser('[#a|#b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
|
|
85
|
+
assert.deepStrictEqual(inspect(parser('[#a|#[]]')), [['<a class="index" href="#index:[]">a<span class="indexer" data-index="[]"></span></a>'], '']);
|
|
86
|
+
assert.deepStrictEqual(inspect(parser('[#a|#©]')), [['<a class="index" href="#index:&copy;">a<span class="indexer" data-index="&copy;"></span></a>'], '']);
|
|
78
87
|
assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
79
|
-
assert.deepStrictEqual(inspect(parser('[#a |#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
80
|
-
assert.deepStrictEqual(inspect(parser('[#a |#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
81
|
-
assert.deepStrictEqual(inspect(parser('[#a |#\\b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
82
|
-
assert.deepStrictEqual(inspect(parser('[#a |#*b*]')), [['<a class="index" href="#index:*b*">a<span class="indexer" data-index="*b*"></span></a>'], '']);
|
|
83
|
-
assert.deepStrictEqual(inspect(parser('[#a |#b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
|
|
84
|
-
assert.deepStrictEqual(inspect(parser('[#a |#b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
|
|
85
|
-
assert.deepStrictEqual(inspect(parser('[#a |#[]]')), [['<a class="index" href="#index:[]">a<span class="indexer" data-index="[]"></span></a>'], '']);
|
|
86
|
-
assert.deepStrictEqual(inspect(parser('[#a |#©]')), [['<a class="index" href="#index:&copy;">a<span class="indexer" data-index="&copy;"></span></a>'], '']);
|
|
87
88
|
assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
89
|
+
assert.deepStrictEqual(inspect(parser('[#a \\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
90
|
+
assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
91
|
+
assert.deepStrictEqual(inspect(parser('[#a <wbr>|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
92
|
+
assert.deepStrictEqual(inspect(parser('[#a [# b #]|#c]')), [['<a class="index" href="#index:c">a <span class="comment"><input type="checkbox"><span>[# b #]</span></span><span class="indexer" data-index="c"></span></a>'], '']);
|
|
93
|
+
assert.deepStrictEqual(inspect(parser('[#a\\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
88
94
|
});
|
|
89
95
|
|
|
90
96
|
});
|
|
@@ -3,7 +3,7 @@ import { ExtensionParser } from '../../inline';
|
|
|
3
3
|
import { union, some, validate, guard, context, creator, surround, open, lazy, fmap } from '../../../combinator';
|
|
4
4
|
import { inline } from '../../inline';
|
|
5
5
|
import { indexee, identity } from './indexee';
|
|
6
|
-
import { txt, str } from '../../source';
|
|
6
|
+
import { txt, str, stropt } from '../../source';
|
|
7
7
|
import { startTight, trimNodeEnd } from '../../util';
|
|
8
8
|
import { html, define, defrag } from 'typed-dom';
|
|
9
9
|
import { join } from 'spica/array';
|
|
@@ -23,10 +23,11 @@ export const index: IndexParser = lazy(() => creator(validate('[#', ']', '\n', f
|
|
|
23
23
|
media: false,
|
|
24
24
|
autolink: false,
|
|
25
25
|
}}},
|
|
26
|
+
open(stropt('|'),
|
|
26
27
|
some(union([
|
|
27
28
|
signature,
|
|
28
29
|
inline,
|
|
29
|
-
]), ']', /^\\?\n/)))),
|
|
30
|
+
]), ']', /^\\?\n/), true)))),
|
|
30
31
|
']'),
|
|
31
32
|
ns => [html('a', trimNodeEnd(defrag(ns)))])),
|
|
32
33
|
([el]: [HTMLAnchorElement]) => [
|
|
@@ -40,7 +41,7 @@ export const index: IndexParser = lazy(() => creator(validate('[#', ']', '\n', f
|
|
|
40
41
|
]))));
|
|
41
42
|
|
|
42
43
|
const signature: IndexParser.SignatureParser = lazy(() => creator(fmap(open(
|
|
43
|
-
|
|
44
|
+
'|#',
|
|
44
45
|
startTight(some(union([bracket, txt]), ']'))),
|
|
45
46
|
ns => [
|
|
46
47
|
html('span', { class: 'indexer', 'data-index': identity(join(ns)).slice(6) }),
|
|
@@ -22,12 +22,13 @@ export function text(source: HTMLElement | DocumentFragment, optional = false):
|
|
|
22
22
|
assert(source instanceof DocumentFragment || !source.matches('.indexer'));
|
|
23
23
|
assert(source.querySelectorAll(':scope > .indexer').length <= 1);
|
|
24
24
|
const indexer = source.querySelector(':scope > .indexer');
|
|
25
|
-
if (indexer) return
|
|
26
|
-
|
|
25
|
+
if (!indexer && optional) return '';
|
|
26
|
+
const index = indexer?.getAttribute('data-index');
|
|
27
|
+
if (index) return index;
|
|
27
28
|
assert(!source.querySelector('.annotation, br'));
|
|
28
29
|
const target = source.cloneNode(true) as typeof source;
|
|
29
30
|
for (
|
|
30
|
-
let es = target.querySelectorAll('code[data-src], .math[data-src], .comment, rt, rp, .reference'),
|
|
31
|
+
let es = target.querySelectorAll('code[data-src], .math[data-src], .comment, rt, rp, .reference, .checkbox, ul, ol'),
|
|
31
32
|
i = 0, len = es.length; i < len; ++i) {
|
|
32
33
|
const el = es[i];
|
|
33
34
|
switch (el.tagName) {
|
|
@@ -36,6 +37,8 @@ export function text(source: HTMLElement | DocumentFragment, optional = false):
|
|
|
36
37
|
continue;
|
|
37
38
|
case 'RT':
|
|
38
39
|
case 'RP':
|
|
40
|
+
case 'UL':
|
|
41
|
+
case 'OL':
|
|
39
42
|
el.remove();
|
|
40
43
|
continue;
|
|
41
44
|
}
|
|
@@ -44,6 +47,7 @@ export function text(source: HTMLElement | DocumentFragment, optional = false):
|
|
|
44
47
|
define(el, el.getAttribute('data-src')!);
|
|
45
48
|
continue;
|
|
46
49
|
case 'comment':
|
|
50
|
+
case 'checkbox':
|
|
47
51
|
el.remove();
|
|
48
52
|
continue;
|
|
49
53
|
case 'reference':
|
|
@@ -12,13 +12,14 @@ describe('Unit: parser/inline/extension/indexer', () => {
|
|
|
12
12
|
assert.deepStrictEqual(inspect(parser(' ')), undefined);
|
|
13
13
|
assert.deepStrictEqual(inspect(parser(' #')), undefined);
|
|
14
14
|
assert.deepStrictEqual(inspect(parser(' #a')), undefined);
|
|
15
|
-
assert.deepStrictEqual(inspect(parser(' [#]')), undefined);
|
|
15
|
+
assert.deepStrictEqual(inspect(parser(' [# ]')), undefined);
|
|
16
16
|
assert.deepStrictEqual(inspect(parser(' [#]]')), undefined);
|
|
17
17
|
assert.deepStrictEqual(inspect(parser(' [#a]]')), undefined);
|
|
18
18
|
assert.deepStrictEqual(inspect(parser(' [#&a;]')), undefined);
|
|
19
19
|
});
|
|
20
20
|
|
|
21
21
|
it('valid', () => {
|
|
22
|
+
assert.deepStrictEqual(inspect(parser(' [#]')), [['<span class="indexer" data-index=""></span>'], '']);
|
|
22
23
|
assert.deepStrictEqual(inspect(parser(' [#a]')), [['<span class="indexer" data-index="a"></span>'], '']);
|
|
23
24
|
assert.deepStrictEqual(inspect(parser(' [#a] ')), [['<span class="indexer" data-index="a"></span>'], '']);
|
|
24
25
|
assert.deepStrictEqual(inspect(parser(' [#a ]')), [['<span class="indexer" data-index="a"></span>'], '']);
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { ExtensionParser } from '../../inline';
|
|
2
|
-
import { union, verify, creator, context, surround, fmap } from '../../../combinator';
|
|
2
|
+
import { union, verify, focus, creator, context, surround, fmap } from '../../../combinator';
|
|
3
3
|
import { index } from './index';
|
|
4
4
|
import { html } from 'typed-dom';
|
|
5
5
|
|
|
6
6
|
export const indexer: ExtensionParser.IndexerParser = creator(fmap(verify(surround(
|
|
7
|
-
/^\s+(?=\[
|
|
7
|
+
/^\s+(?=\[#\S)/,
|
|
8
8
|
context({ syntax: { inline: {
|
|
9
9
|
index: true,
|
|
10
10
|
}}},
|
|
11
|
-
union([
|
|
11
|
+
union([
|
|
12
|
+
focus('[#]', () => [[html('a', { href: '#' })], '']),
|
|
13
|
+
index,
|
|
14
|
+
])),
|
|
12
15
|
/^\s*$/),
|
|
13
16
|
// Indexer is invisible but invalids must be visible.
|
|
14
17
|
([el]) => el.getElementsByClassName('invalid').length === 0),
|
|
@@ -6,12 +6,12 @@ import { reduce } from 'spica/memoize';
|
|
|
6
6
|
|
|
7
7
|
export const unsafehtmlentity: UnsafeHTMLEntityParser = creator(validate('&', focus(
|
|
8
8
|
/^&[0-9A-Za-z]+;/,
|
|
9
|
-
entity => [[parse(entity) ?? `\
|
|
9
|
+
entity => [[parse(entity) ?? `\x1B${entity}`], ''])));
|
|
10
10
|
|
|
11
11
|
export const htmlentity: HTMLEntityParser = fmap(
|
|
12
12
|
union([unsafehtmlentity]),
|
|
13
13
|
([test]) => [
|
|
14
|
-
test[0] === '\
|
|
14
|
+
test[0] === '\x1B'
|
|
15
15
|
? html('span', {
|
|
16
16
|
class: 'invalid',
|
|
17
17
|
'data-invalid-syntax': 'htmlentity',
|
|
@@ -95,13 +95,13 @@ function sanitize(target: HTMLElement, uri: ReadonlyURL, alt: string): boolean {
|
|
|
95
95
|
});
|
|
96
96
|
return false;
|
|
97
97
|
}
|
|
98
|
-
if (alt.includes('\
|
|
98
|
+
if (alt.includes('\x1B')) {
|
|
99
99
|
define(target, {
|
|
100
100
|
class: void target.classList.add('invalid'),
|
|
101
101
|
'data-invalid-syntax': 'media',
|
|
102
102
|
'data-invalid-type': 'content',
|
|
103
103
|
'data-invalid-message': `Cannot use invalid HTML entitiy "${alt.match(/&[0-9A-Za-z]+;/)![0]}"`,
|
|
104
|
-
alt: target.getAttribute('alt')?.replace(/\
|
|
104
|
+
alt: target.getAttribute('alt')?.replace(/\x1B/g, ''),
|
|
105
105
|
});
|
|
106
106
|
return false;
|
|
107
107
|
}
|
|
@@ -64,16 +64,16 @@ describe('Unit: parser/inline/reference', () => {
|
|
|
64
64
|
assert.deepStrictEqual(inspect(parser('[[^a|]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
|
|
65
65
|
assert.deepStrictEqual(inspect(parser('[[^a,|]]')), [['<sup class="reference" data-abbr="a,"></sup>'], '']);
|
|
66
66
|
assert.deepStrictEqual(inspect(parser('[[^a |]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
|
|
67
|
-
assert.deepStrictEqual(inspect(parser('[[^a|b]]')), [['<sup class="
|
|
67
|
+
assert.deepStrictEqual(inspect(parser('[[^a|b]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
68
|
+
assert.deepStrictEqual(inspect(parser('[[^a|b]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
69
|
+
assert.deepStrictEqual(inspect(parser('[[^a|b ]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
70
|
+
assert.deepStrictEqual(inspect(parser('[[^a|b ]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
71
|
+
assert.deepStrictEqual(inspect(parser('[[^a|<wbr>]]')), [['<sup class="invalid">^a|</sup>'], '']);
|
|
72
|
+
assert.deepStrictEqual(inspect(parser('[[^a|<wbr>b]]')), [['<sup class="invalid">^a|<wbr>b</sup>'], '']);
|
|
73
|
+
assert.deepStrictEqual(inspect(parser('[[^a|^b]]')), [['<sup class="reference" data-abbr="a">^b</sup>'], '']);
|
|
68
74
|
assert.deepStrictEqual(inspect(parser('[[^a| ]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
|
|
69
75
|
assert.deepStrictEqual(inspect(parser('[[^a| b]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
70
|
-
assert.deepStrictEqual(inspect(parser('[[^a| b ]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
71
|
-
assert.deepStrictEqual(inspect(parser('[[^a| b ]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
72
76
|
assert.deepStrictEqual(inspect(parser('[[^a| ]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
|
|
73
|
-
assert.deepStrictEqual(inspect(parser('[[^a| b]]')), [['<sup class="reference" data-abbr="a">b</sup>'], '']);
|
|
74
|
-
assert.deepStrictEqual(inspect(parser('[[^a| <wbr>]]')), [['<sup class="invalid">^a|</sup>'], '']);
|
|
75
|
-
assert.deepStrictEqual(inspect(parser('[[^a| <wbr>b]]')), [['<sup class="invalid">^a| <wbr>b</sup>'], '']);
|
|
76
|
-
assert.deepStrictEqual(inspect(parser('[[^a| ^b]]')), [['<sup class="reference" data-abbr="a">^b</sup>'], '']);
|
|
77
77
|
assert.deepStrictEqual(inspect(parser('[[^1]]')), [['<sup class="invalid">^1</sup>'], '']);
|
|
78
78
|
assert.deepStrictEqual(inspect(parser('[[^1a]]')), [['<sup class="reference" data-abbr="1a"></sup>'], '']);
|
|
79
79
|
assert.deepStrictEqual(inspect(parser('[[^1 ]]')), [['<sup class="invalid">^1</sup>'], '']);
|