securemark 0.253.2 → 0.254.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/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/design.md +6 -0
- package/dist/index.js +39 -28
- package/markdown.d.ts +2 -2
- package/package.json +1 -1
- package/src/parser/api/bind.test.ts +20 -20
- package/src/parser/api/parse.test.ts +4 -6
- 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 +23 -23
- package/src/parser/block/extension/figure.test.ts +36 -36
- package/src/parser/block/extension/figure.ts +4 -4
- package/src/parser/block/extension/table.ts +5 -8
- package/src/parser/inline/annotation.test.ts +0 -1
- package/src/parser/inline/emphasis.test.ts +0 -1
- package/src/parser/inline/html.test.ts +58 -58
- package/src/parser/inline/html.ts +153 -10
- package/src/parser/inline/media.test.ts +3 -3
- package/src/parser/inline/media.ts +4 -0
- package/src/parser/inline/reference.test.ts +0 -1
- package/src/parser/inline/strong.test.ts +0 -1
- package/src/parser/inline.test.ts +2 -5
- package/src/parser/processor/figure.test.ts +33 -33
- package/src/parser/processor/footnote.test.ts +2 -2
- package/src/parser/processor/footnote.ts +10 -10
- package/src/parser/source/text.ts +1 -1
- package/src/renderer/render/media/video.ts +4 -1
|
@@ -23,52 +23,52 @@ describe('Unit: parser/block/extension/figure', () => {
|
|
|
23
23
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]a\nhttps://host\n~~~')), [['<pre class="invalid" translate="no">~~~figure [$group-name]a\nhttps://host\n~~~</pre>'], '']);
|
|
24
24
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]a\n!https://host\n~~~')), [['<pre class="invalid" translate="no">~~~figure [$group-name]a\n!https://host\n~~~</pre>'], '']);
|
|
25
25
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name] a\nhttps://host\n~~~')), [['<pre class="invalid" translate="no">~~~figure [$group-name] a\nhttps://host\n~~~</pre>'], '']);
|
|
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>'], '']);
|
|
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><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
27
27
|
assert.deepStrictEqual(inspect(parser('~~~figure a[$group-name]\n!https://host\n~~~')), [['<pre class="invalid" translate="no">~~~figure a[$group-name]\n!https://host\n~~~</pre>'], '']);
|
|
28
28
|
assert.deepStrictEqual(inspect(parser('~~~figure a [$group-name]\n!https://host\n~~~')), [['<pre class="invalid" translate="no">~~~figure a [$group-name]\n!https://host\n~~~</pre>'], '']);
|
|
29
29
|
assert.deepStrictEqual(inspect(parser('~~~ [$group-name]\n!https://host\n~~~')), undefined);
|
|
30
30
|
assert.deepStrictEqual(inspect(parser('~~~ $group-name\n!https://host\n~~~')), undefined);
|
|
31
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>'], '']);
|
|
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><span class="figtext"></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><span class="figtext"></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><span class="figtext"></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><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
|
|
36
36
|
assert.deepStrictEqual(inspect(parser(`~~~figure [$group-name]\n0${'\n'.repeat(301)}~~~`), '>'), [['<pre class="invalid" translate="no">'], '']);
|
|
37
37
|
assert.deepStrictEqual(inspect(parser(`~~~figure [$group-name]\n~~~\n0${'\n'.repeat(301)}~~~\n~~~`), '>'), [['<pre class="invalid" translate="no">'], `${'\n'.repeat(300)}~~~\n~~~`]);
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
it('valid', () => {
|
|
41
|
-
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>'], '']);
|
|
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~~~')), [['<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\\\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>'], '']);
|
|
46
|
-
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>'], '']);
|
|
47
|
-
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>'], '']);
|
|
48
|
-
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>'], '']);
|
|
49
|
-
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>'], '']);
|
|
50
|
-
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"></pre></div></figure>'], '']);
|
|
51
|
-
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">~~~</pre></div></figure>'], '']);
|
|
52
|
-
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"></pre></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~~~')), [['<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>'], '']);
|
|
55
|
-
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>'], '']);
|
|
56
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n~~~\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="references"></ol></section></aside></div></figure>'], '']);
|
|
57
|
-
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="references"></ol></section></aside></div></figure>'], '']);
|
|
58
|
-
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>'], '']);
|
|
59
|
-
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>'], '']);
|
|
60
|
-
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>'], '']);
|
|
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('~~~~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>'], '']);
|
|
63
|
-
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>'], '']);
|
|
64
|
-
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>'], '']);
|
|
65
|
-
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>'], '']);
|
|
66
|
-
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>'], '']);
|
|
67
|
-
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>'], '']);
|
|
68
|
-
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>'], '']);
|
|
69
|
-
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>'], '']);
|
|
70
|
-
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>'], '']);
|
|
71
|
-
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>'], '']);
|
|
41
|
+
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><span class="figtext"></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><span class="figtext"></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~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></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><span class="figtext"></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\\\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">\\</span></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!https://host\n\n!https://caption\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">!<a href="https://caption" target="_blank">https://caption</a></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
47
|
+
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><span class="figtext"></span></figcaption><div><ul><li>a</li></ul></div></figure>'], '']);
|
|
48
|
+
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><span class="figtext"></span></figcaption><div><ol><li>a</li></ol></div></figure>'], '']);
|
|
49
|
+
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><span class="figtext"></span></figcaption><div><table><thead><tr></tr></thead><tbody><tr></tr></tbody></table></div></figure>'], '']);
|
|
50
|
+
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><span class="figtext"></span></figcaption><div><pre class="text"></pre></div></figure>'], '']);
|
|
51
|
+
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><span class="figtext"></span></figcaption><div><pre class="text">~~~</pre></div></figure>'], '']);
|
|
52
|
+
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><span class="figtext">caption</span></figcaption><div><pre class="text"></pre></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><span class="figtext"></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~~~')), [['<figure data-type="math" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><div class="math" translate="no">$$\n~~~\n$$</div></div></figure>'], '']);
|
|
55
|
+
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><span class="figtext">caption</span></figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
|
|
56
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n~~~\n~~~\n\ncaption\n~~~')), [['<figure data-type="example" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">caption</span></figcaption><div><aside class="example" data-type="markdown"><pre translate="no"></pre><hr><section><ol class="references"></ol></section></aside></div></figure>'], '']);
|
|
57
|
+
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><span class="figtext">caption</span></figcaption><div><aside class="example" data-type="markdown"><pre translate="no"></pre><hr><section><ol class="references"></ol></section></aside></div></figure>'], '']);
|
|
58
|
+
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><span class="figtext">caption</span></figcaption><div><table></table></div></figure>'], '']);
|
|
59
|
+
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><span class="figtext"></span></figcaption><div><blockquote><pre><br>~~~</pre></blockquote></div></figure>'], '']);
|
|
60
|
+
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><span class="figtext">caption</span></figcaption><div><blockquote><pre><br>~~~</pre></blockquote></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><span class="figtext"></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('~~~~figure [$group-name]\n!https://host\n~~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></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('~~~figure $group-name\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></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('~~~[$group-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
65
|
+
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><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
66
|
+
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><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
|
|
67
|
+
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><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
|
|
68
|
+
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><span class="figtext"></span></figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
|
|
69
|
+
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><span class="figtext"></span></figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
|
|
70
|
+
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><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
71
|
+
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><span class="figtext">caption</span></figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
|
|
72
72
|
assert.deepStrictEqual(inspect(parser(`~~~figure [$group-name]\n${'>\n'.repeat(500)}\n~~~`), '>'), [['<figure data-type="quote" data-label="group-name" data-group="group">'], '']);
|
|
73
73
|
assert.deepStrictEqual(inspect(parser(`~~~figure [$group-name]\n~~~\n0${'\n'.repeat(300)}~~~\n~~~`), '>'), [['<figure data-type="example" data-label="group-name" data-group="group">'], '']);
|
|
74
74
|
});
|
|
@@ -17,7 +17,6 @@ import { localize } from '../../locale';
|
|
|
17
17
|
import { visualize, trimBlank } from '../../util';
|
|
18
18
|
import { html, defrag } from 'typed-dom/dom';
|
|
19
19
|
import { memoize } from 'spica/memoize';
|
|
20
|
-
import { unshift } from 'spica/array';
|
|
21
20
|
|
|
22
21
|
import FigureParser = ExtensionParser.FigureParser;
|
|
23
22
|
|
|
@@ -75,9 +74,10 @@ export const figure: FigureParser = block(fallback(rewrite(segment, fmap(
|
|
|
75
74
|
html('figure',
|
|
76
75
|
attributes(label.getAttribute('data-label')!, param, content, caption),
|
|
77
76
|
[
|
|
78
|
-
html('figcaption',
|
|
79
|
-
|
|
80
|
-
defrag(caption))
|
|
77
|
+
html('figcaption', [
|
|
78
|
+
html('span', { class: 'figindex' }),
|
|
79
|
+
html('span', { class: 'figtext' }, defrag(caption)),
|
|
80
|
+
]),
|
|
81
81
|
html('div', [content]),
|
|
82
82
|
])
|
|
83
83
|
])),
|
|
@@ -220,7 +220,8 @@ function format(rows: Tree<RowParser>[]): HTMLTableSectionElement[] {
|
|
|
220
220
|
let hasDataCell = false;
|
|
221
221
|
let lHeadCellIdx: bigint;
|
|
222
222
|
let rHeadCellIdx: bigint;
|
|
223
|
-
for (let j = 0
|
|
223
|
+
for (let j = 0; j < cells.length; ++j) {
|
|
224
|
+
const jn = BigInt(j);
|
|
224
225
|
const isVirtual = !!ranges[i]?.[j];
|
|
225
226
|
const cell = isVirtual
|
|
226
227
|
? splice(cells, j, 0, undefined) && ranges[i][j]
|
|
@@ -248,12 +249,8 @@ function format(rows: Tree<RowParser>[]): HTMLTableSectionElement[] {
|
|
|
248
249
|
assert(colSpan > 0);
|
|
249
250
|
if (colSpan > 1) {
|
|
250
251
|
splice(cells, j + 1, 0, ...Array(colSpan - 1));
|
|
251
|
-
heads |= heads & 1n << jn
|
|
252
|
-
|
|
253
|
-
: 0n;
|
|
254
|
-
highlights |= highlights & 1n << jn
|
|
255
|
-
? ~(~0n << BigInt(colSpan)) << jn
|
|
256
|
-
: 0n;
|
|
252
|
+
heads |= heads & 1n << jn && ~(~0n << BigInt(colSpan)) << jn;
|
|
253
|
+
highlights |= highlights & 1n << jn && ~(~0n << BigInt(colSpan)) << jn;
|
|
257
254
|
j += colSpan - 1;
|
|
258
255
|
}
|
|
259
256
|
if (target === thead) {
|
|
@@ -315,7 +312,7 @@ function format(rows: Tree<RowParser>[]): HTMLTableSectionElement[] {
|
|
|
315
312
|
'v c',
|
|
316
313
|
'v h',
|
|
317
314
|
'v h c',
|
|
318
|
-
][+!!(highlights & m)
|
|
315
|
+
][+!!(highlights & m) | +!!(lHighlight | rHighlight) << 1 | +!!(tHighlights & m) << 2]));
|
|
319
316
|
}
|
|
320
317
|
continue;
|
|
321
318
|
case tfoot:
|
|
@@ -46,7 +46,6 @@ describe('Unit: parser/inline/annotation', () => {
|
|
|
46
46
|
assert.deepStrictEqual(inspect(parser('((@a))')), [['<sup class="annotation"><span><a href="/@a" class="account">@a</a></span></sup>'], '']);
|
|
47
47
|
assert.deepStrictEqual(inspect(parser('((http://host))')), [['<sup class="annotation"><span><a href="http://host" target="_blank">http://host</a></span></sup>'], '']);
|
|
48
48
|
assert.deepStrictEqual(inspect(parser('((![]{a}))')), [['<sup class="annotation"><span>!<a href="a">a</a></span></sup>'], '']);
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('((<a>))')), [['<sup class="annotation"><span><a></span></sup>'], '']);
|
|
50
49
|
assert.deepStrictEqual(inspect(parser('(((a)))')), [['<sup class="annotation"><span>(a)</span></sup>'], '']);
|
|
51
50
|
assert.deepStrictEqual(inspect(parser('((((a))))')), [['<sup class="annotation"><span><span class="paren">((a))</span></span></sup>'], '']);
|
|
52
51
|
assert.deepStrictEqual(inspect(parser('(([[a]]))')), [['<sup class="annotation"><span><sup class="reference"><span>a</span></sup></span></sup>'], '']);
|
|
@@ -46,7 +46,6 @@ describe('Unit: parser/inline/emphasis', () => {
|
|
|
46
46
|
assert.deepStrictEqual(inspect(parser('*a**b**c*')), [['<em>a<strong>b</strong>c</em>'], '']);
|
|
47
47
|
assert.deepStrictEqual(inspect(parser('*a**b**c*d')), [['<em>a<strong>b</strong>c</em>'], 'd']);
|
|
48
48
|
assert.deepStrictEqual(inspect(parser('*`a`*')), [['<em><code data-src="`a`">a</code></em>'], '']);
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('*<small>*')), [['<em><small></em>'], '']);
|
|
50
49
|
assert.deepStrictEqual(inspect(parser('*(*a*)*')), [['<em><span class="paren">(<em>a</em>)</span></em>'], '']);
|
|
51
50
|
assert.deepStrictEqual(inspect(parser('*(**a**)*')), [['<em><span class="paren">(<strong>a</strong>)</span></em>'], '']);
|
|
52
51
|
});
|
|
@@ -11,10 +11,10 @@ describe('Unit: parser/inline/html', () => {
|
|
|
11
11
|
assert.deepStrictEqual(inspect(parser('<script>alert()<script>')), undefined);
|
|
12
12
|
assert.deepStrictEqual(inspect(parser('<script>alert()</script>')), [['<span class="invalid"><script>alert<span class="paren">()</span></script></span>'], '']);
|
|
13
13
|
assert.deepStrictEqual(inspect(parser('<script src="\\""></script>')), undefined);
|
|
14
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
15
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
16
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
17
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
14
|
+
assert.deepStrictEqual(inspect(parser('<bdi onclick="alert()">')), undefined);
|
|
15
|
+
assert.deepStrictEqual(inspect(parser('<bdi onclick="alert()"></bdi>')), undefined);
|
|
16
|
+
assert.deepStrictEqual(inspect(parser('<bdi onclick="alert()">a</bdi>')), [['<span class="invalid"><bdi onclick="alert()">a</bdi></span>'], '']);
|
|
17
|
+
assert.deepStrictEqual(inspect(parser('<bdi><bdi onclick="alert()">a</bdi></bdi>')), [['<bdi><span class="invalid"><bdi onclick="alert()">a</bdi></span></bdi>'], '']);
|
|
18
18
|
assert.deepStrictEqual(inspect(parser('<bdo dir="rtl\\"><">a</bdo>')), [['<span class="invalid"><bdo dir="rtl\\"><">a</bdo></span>'], '']);
|
|
19
19
|
});
|
|
20
20
|
|
|
@@ -25,80 +25,80 @@ describe('Unit: parser/inline/html', () => {
|
|
|
25
25
|
assert.deepStrictEqual(inspect(parser('<a,b>')), undefined);
|
|
26
26
|
assert.deepStrictEqual(inspect(parser('<a, b>')), undefined);
|
|
27
27
|
assert.deepStrictEqual(inspect(parser('<T>')), undefined);
|
|
28
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
29
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
30
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
31
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
33
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
35
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
36
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
37
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
38
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
39
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('</
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
28
|
+
assert.deepStrictEqual(inspect(parser('<bdi>z')), undefined);
|
|
29
|
+
assert.deepStrictEqual(inspect(parser('<bdi></bdi>')), undefined);
|
|
30
|
+
assert.deepStrictEqual(inspect(parser('<bdi> </bdi>')), undefined);
|
|
31
|
+
assert.deepStrictEqual(inspect(parser('<bdi>\\ </bdi>')), undefined);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser('<bdi>	</bdi>')), undefined);
|
|
33
|
+
assert.deepStrictEqual(inspect(parser('<bdi><wbr></bdi>')), undefined);
|
|
34
|
+
assert.deepStrictEqual(inspect(parser('<bdi>\n</bdi>')), undefined);
|
|
35
|
+
assert.deepStrictEqual(inspect(parser('<bdi>\na</bdi>')), undefined);
|
|
36
|
+
assert.deepStrictEqual(inspect(parser('<bdi>\\\na</bdi>')), undefined);
|
|
37
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a')), undefined);
|
|
38
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a</BDO>')), undefined);
|
|
39
|
+
assert.deepStrictEqual(inspect(parser('<BDI>a</BDI>')), undefined);
|
|
40
|
+
assert.deepStrictEqual(inspect(parser('<BDI>a</bdo>')), undefined);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser('</bdi>')), undefined);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('<bdi/>')), undefined);
|
|
43
43
|
assert.deepStrictEqual(inspect(parser('<b><b><b>a</b></b></b>')), [['<span class="invalid"><b><span class="invalid"><b><span class="invalid"><b>a</b></span></b></span></b></span>'], '']);
|
|
44
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
44
|
+
assert.deepStrictEqual(inspect(parser('<bdi><bdi><bdi>a</bdi></bdi></bdi>')), [['<bdi><bdi><bdi>a</bdi></bdi></bdi>'], '']);
|
|
45
45
|
assert.deepStrictEqual(inspect(parser('<x a="*b*"')), undefined);
|
|
46
46
|
assert.deepStrictEqual(inspect(parser('<x a="*b*">')), undefined);
|
|
47
47
|
assert.deepStrictEqual(inspect(parser('<x a="*b*">c')), undefined);
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
50
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
51
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
52
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
53
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
54
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
55
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
56
|
-
assert.deepStrictEqual(inspect(parser(' <
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('<bdi a="*b*"')), undefined);
|
|
49
|
+
assert.deepStrictEqual(inspect(parser('<bdi a="*b*">')), undefined);
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('<bdi a="*b*">c')), undefined);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser('<bdi a b="*" *c*')), undefined);
|
|
52
|
+
assert.deepStrictEqual(inspect(parser('<bdi a b="*" *c*>')), undefined);
|
|
53
|
+
assert.deepStrictEqual(inspect(parser('<bdi a b="*" *c*>d</bdi>')), undefined);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser('<bdi a b="*" *>*c*')), undefined);
|
|
55
|
+
assert.deepStrictEqual(inspect(parser('<bdi a b="*" *>*c*</bdi>')), undefined);
|
|
56
|
+
assert.deepStrictEqual(inspect(parser(' <bdi>a</bdi>')), undefined);
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
it('basic', () => {
|
|
60
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
61
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
62
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
63
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
64
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
65
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
66
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
67
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
68
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
69
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
70
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
71
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
72
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
60
|
+
assert.deepStrictEqual(inspect(parser('<bdi> a</bdi>')), [['<bdi> a</bdi>'], '']);
|
|
61
|
+
assert.deepStrictEqual(inspect(parser('<bdi> a </bdi>')), [['<bdi> a </bdi>'], '']);
|
|
62
|
+
assert.deepStrictEqual(inspect(parser('<bdi> a </bdi>')), [['<bdi> a </bdi>'], '']);
|
|
63
|
+
assert.deepStrictEqual(inspect(parser('<bdi>\\ a</bdi>')), [['<bdi> a</bdi>'], '']);
|
|
64
|
+
assert.deepStrictEqual(inspect(parser('<bdi><wbr>a</bdi>')), [['<bdi><wbr>a</bdi>'], '']);
|
|
65
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a</bdi>')), [['<bdi>a</bdi>'], '']);
|
|
66
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a</bdi>a')), [['<bdi>a</bdi>'], 'a']);
|
|
67
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a </bdi>')), [['<bdi>a </bdi>'], '']);
|
|
68
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a \n </bdi>')), [['<bdi>a </bdi>'], '']);
|
|
69
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a\n</bdi>')), [['<bdi>a</bdi>'], '']);
|
|
70
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a\n </bdi>')), [['<bdi>a </bdi>'], '']);
|
|
71
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a\n<wbr></bdi>')), [['<bdi>a<wbr></bdi>'], '']);
|
|
72
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a\nb</bdi>')), [['<bdi>a<br>b</bdi>'], '']);
|
|
73
73
|
assert.deepStrictEqual(inspect(parser('<wbr>a')), [['<wbr>'], 'a']);
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
it('nest', () => {
|
|
77
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
78
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
79
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
77
|
+
assert.deepStrictEqual(inspect(parser('<bdi><bdi>a</bdi></bdi>')), [['<bdi><bdi>a</bdi></bdi>'], '']);
|
|
78
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a<bdi>b</bdi>c</bdi>')), [['<bdi>a<bdi>b</bdi>c</bdi>'], '']);
|
|
79
|
+
assert.deepStrictEqual(inspect(parser('<bdi>`a`</bdi>')), [['<bdi><code data-src="`a`">a</code></bdi>'], '']);
|
|
80
80
|
});
|
|
81
81
|
|
|
82
82
|
it('escape', () => {
|
|
83
83
|
assert.deepStrictEqual(inspect(parser('<a>')), undefined);
|
|
84
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
85
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
84
|
+
assert.deepStrictEqual(inspect(parser('<bdi><a>a</a></bdi>')), [['<bdi><span class="invalid"><a>a</a></span></bdi>'], '']);
|
|
85
|
+
assert.deepStrictEqual(inspect(parser('<bdi>a<a>b</a>c</bdi>')), [['<bdi>a<span class="invalid"><a>b</a></span>c</bdi>'], '']);
|
|
86
86
|
assert.deepStrictEqual(inspect(parser('<img>')), [['<img'], '>']);
|
|
87
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
87
|
+
assert.deepStrictEqual(inspect(parser('<bdi><img></bdi>')), [['<bdi><img></bdi>'], '']);
|
|
88
88
|
assert.deepStrictEqual(inspect(parser('<img />')), [['<img'], ' />']);
|
|
89
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
89
|
+
assert.deepStrictEqual(inspect(parser('<bdi><img /></bdi>')), [['<bdi><img /></bdi>'], '']);
|
|
90
90
|
});
|
|
91
91
|
|
|
92
92
|
it('attribute', () => {
|
|
93
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
94
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
95
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
96
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
97
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
98
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
99
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
100
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
101
|
-
assert.deepStrictEqual(inspect(parser('<
|
|
93
|
+
assert.deepStrictEqual(inspect(parser('<bdi\n>a</bdi>')), undefined);
|
|
94
|
+
assert.deepStrictEqual(inspect(parser('<bdi >a</bdi>')), [['<bdi>a</bdi>'], '']);
|
|
95
|
+
assert.deepStrictEqual(inspect(parser('<bdi \n>a</bdi>')), undefined);
|
|
96
|
+
assert.deepStrictEqual(inspect(parser('<bdi >a</bdi>')), [['<bdi>a</bdi>'], '']);
|
|
97
|
+
assert.deepStrictEqual(inspect(parser('<bdi __proto__>a</bdi>')), undefined);
|
|
98
|
+
assert.deepStrictEqual(inspect(parser('<bdi constructor>a</bdi>')), [['<span class="invalid"><bdi constructor>a</bdi></span>'], '']);
|
|
99
|
+
assert.deepStrictEqual(inspect(parser('<bdi toString>a</bdi>')), undefined);
|
|
100
|
+
assert.deepStrictEqual(inspect(parser('<bdi X>a</bdi>')), undefined);
|
|
101
|
+
assert.deepStrictEqual(inspect(parser('<bdi x>a</bdi>')), [['<span class="invalid"><bdi x>a</bdi></span>'], '']);
|
|
102
102
|
assert.deepStrictEqual(inspect(parser('<bdo>a</bdo>')), [['<span class="invalid"><bdo>a</bdo></span>'], '']);
|
|
103
103
|
assert.deepStrictEqual(inspect(parser('<bdo >a</bdo>')), [['<span class="invalid"><bdo >a</bdo></span>'], '']);
|
|
104
104
|
assert.deepStrictEqual(inspect(parser('<bdo __proto__>a</bdo>')), undefined);
|
|
@@ -9,14 +9,14 @@ import { memoize } from 'spica/memoize';
|
|
|
9
9
|
import { Cache } from 'spica/cache';
|
|
10
10
|
import { unshift, push, splice } from 'spica/array';
|
|
11
11
|
|
|
12
|
-
const tags = Object.freeze(['
|
|
13
|
-
const
|
|
12
|
+
const tags = Object.freeze(['bdo', 'bdi']);
|
|
13
|
+
const attrspecs = {
|
|
14
14
|
bdo: {
|
|
15
|
-
dir: Object.freeze(['ltr', 'rtl']
|
|
15
|
+
dir: Object.freeze(['ltr', 'rtl']),
|
|
16
16
|
},
|
|
17
17
|
} as const;
|
|
18
|
-
Object.setPrototypeOf(
|
|
19
|
-
Object.values(
|
|
18
|
+
Object.setPrototypeOf(attrspecs, null);
|
|
19
|
+
Object.values(attrspecs).forEach(o => Object.setPrototypeOf(o, null));
|
|
20
20
|
|
|
21
21
|
export const html: HTMLParser = lazy(() => creator(validate('<', validate(/^<[a-z]+(?=[^\S\n]|>)/, union([
|
|
22
22
|
focus(
|
|
@@ -27,7 +27,7 @@ export const html: HTMLParser = lazy(() => creator(validate('<', validate(/^<[a-
|
|
|
27
27
|
/^<(?:area|base|br|col|embed|hr|img|input|link|meta|source|track|wbr)(?=[^\S\n]|>)/,
|
|
28
28
|
source => [[source], '']),
|
|
29
29
|
match(
|
|
30
|
-
|
|
30
|
+
new RegExp(String.raw`^<(${TAGS.join('|')})(?=[^\S\n]|>)`),
|
|
31
31
|
memoize(
|
|
32
32
|
([, tag]) =>
|
|
33
33
|
surround<HTMLParser.TagParser, string>(surround(
|
|
@@ -38,9 +38,9 @@ export const html: HTMLParser = lazy(() => creator(validate('<', validate(/^<[a-
|
|
|
38
38
|
str(`</${tag}>`), false,
|
|
39
39
|
([as, bs, cs], rest) =>
|
|
40
40
|
[[elem(tag, as, bs, cs)], rest]),
|
|
41
|
-
([, tag]) =>
|
|
41
|
+
([, tag]) => TAGS.indexOf(tag), [])),
|
|
42
42
|
match(
|
|
43
|
-
|
|
43
|
+
new RegExp(String.raw`^<(?!${TAGS.join('|')}\b)([a-z]+)(?=[^\S\n]|>)`),
|
|
44
44
|
memoize(
|
|
45
45
|
([, tag]) =>
|
|
46
46
|
surround<HTMLParser.TagParser, string>(surround(
|
|
@@ -59,16 +59,159 @@ export const attribute: HTMLParser.TagParser.AttributeParser = union([
|
|
|
59
59
|
str(/^[^\S\n]+[a-z]+(?:-[a-z]+)*(?:="(?:\\[^\n]|[^\\\n"])*")?(?=[^\S\n]|>)/),
|
|
60
60
|
]);
|
|
61
61
|
|
|
62
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element
|
|
63
|
+
// [...document.querySelectorAll('tbody > tr > td:first-child')].map(el => el.textContent.slice(1, -1))
|
|
64
|
+
const TAGS = Object.freeze([
|
|
65
|
+
"html",
|
|
66
|
+
"base",
|
|
67
|
+
"head",
|
|
68
|
+
"link",
|
|
69
|
+
"meta",
|
|
70
|
+
"style",
|
|
71
|
+
"title",
|
|
72
|
+
"body",
|
|
73
|
+
"address",
|
|
74
|
+
"article",
|
|
75
|
+
"aside",
|
|
76
|
+
"footer",
|
|
77
|
+
"header",
|
|
78
|
+
"h1", "h2", "h3", "h4", "h5", "h6",
|
|
79
|
+
"main",
|
|
80
|
+
"nav",
|
|
81
|
+
"section",
|
|
82
|
+
"blockquote",
|
|
83
|
+
"dd",
|
|
84
|
+
"div",
|
|
85
|
+
"dl",
|
|
86
|
+
"dt",
|
|
87
|
+
"figcaption",
|
|
88
|
+
"figure",
|
|
89
|
+
"hr",
|
|
90
|
+
"li",
|
|
91
|
+
"menu",
|
|
92
|
+
"ol",
|
|
93
|
+
"p",
|
|
94
|
+
"pre",
|
|
95
|
+
"ul",
|
|
96
|
+
"a",
|
|
97
|
+
"abbr",
|
|
98
|
+
"b",
|
|
99
|
+
"bdi",
|
|
100
|
+
"bdo",
|
|
101
|
+
"br",
|
|
102
|
+
"cite",
|
|
103
|
+
"code",
|
|
104
|
+
"data",
|
|
105
|
+
"dfn",
|
|
106
|
+
"em",
|
|
107
|
+
"i",
|
|
108
|
+
"kbd",
|
|
109
|
+
"mark",
|
|
110
|
+
"q",
|
|
111
|
+
"rp",
|
|
112
|
+
"rt",
|
|
113
|
+
"ruby",
|
|
114
|
+
"s",
|
|
115
|
+
"samp",
|
|
116
|
+
"small",
|
|
117
|
+
"span",
|
|
118
|
+
"strong",
|
|
119
|
+
"sub",
|
|
120
|
+
"sup",
|
|
121
|
+
"time",
|
|
122
|
+
"u",
|
|
123
|
+
"var",
|
|
124
|
+
"wbr",
|
|
125
|
+
"area",
|
|
126
|
+
"audio",
|
|
127
|
+
"img",
|
|
128
|
+
"map",
|
|
129
|
+
"track",
|
|
130
|
+
"video",
|
|
131
|
+
"embed",
|
|
132
|
+
"iframe",
|
|
133
|
+
"object",
|
|
134
|
+
"picture",
|
|
135
|
+
"portal",
|
|
136
|
+
"source",
|
|
137
|
+
"svg",
|
|
138
|
+
"math",
|
|
139
|
+
"canvas",
|
|
140
|
+
"noscript",
|
|
141
|
+
"script",
|
|
142
|
+
"del",
|
|
143
|
+
"ins",
|
|
144
|
+
"caption",
|
|
145
|
+
"col",
|
|
146
|
+
"colgroup",
|
|
147
|
+
"table",
|
|
148
|
+
"tbody",
|
|
149
|
+
"td",
|
|
150
|
+
"tfoot",
|
|
151
|
+
"th",
|
|
152
|
+
"thead",
|
|
153
|
+
"tr",
|
|
154
|
+
"button",
|
|
155
|
+
"datalist",
|
|
156
|
+
"fieldset",
|
|
157
|
+
"form",
|
|
158
|
+
"input",
|
|
159
|
+
"label",
|
|
160
|
+
"legend",
|
|
161
|
+
"meter",
|
|
162
|
+
"optgroup",
|
|
163
|
+
"option",
|
|
164
|
+
"output",
|
|
165
|
+
"progress",
|
|
166
|
+
"select",
|
|
167
|
+
"textarea",
|
|
168
|
+
"details",
|
|
169
|
+
"dialog",
|
|
170
|
+
"summary",
|
|
171
|
+
"slot",
|
|
172
|
+
"template",
|
|
173
|
+
"acronym",
|
|
174
|
+
"applet",
|
|
175
|
+
"basefont",
|
|
176
|
+
"bgsound",
|
|
177
|
+
"big",
|
|
178
|
+
"blink",
|
|
179
|
+
"center",
|
|
180
|
+
"content",
|
|
181
|
+
"dir",
|
|
182
|
+
"font",
|
|
183
|
+
"frame",
|
|
184
|
+
"frameset",
|
|
185
|
+
"hgroup",
|
|
186
|
+
"image",
|
|
187
|
+
"keygen",
|
|
188
|
+
"marquee",
|
|
189
|
+
"menuitem",
|
|
190
|
+
"nobr",
|
|
191
|
+
"noembed",
|
|
192
|
+
"noframes",
|
|
193
|
+
"param",
|
|
194
|
+
"plaintext",
|
|
195
|
+
"rb",
|
|
196
|
+
"rtc",
|
|
197
|
+
"shadow",
|
|
198
|
+
"spacer",
|
|
199
|
+
"strike",
|
|
200
|
+
"tt",
|
|
201
|
+
"xmp",
|
|
202
|
+
]);
|
|
203
|
+
|
|
62
204
|
function elem(tag: string, as: string[], bs: (HTMLElement | string)[], cs: string[]): HTMLElement {
|
|
63
205
|
assert(as.length > 0);
|
|
64
206
|
assert(as[0][0] === '<' && as[as.length - 1].slice(-1) === '>');
|
|
65
207
|
assert(cs.length === 1);
|
|
66
208
|
if (!tags.includes(tag)) return invalid('tag', `Invalid HTML tag <${tag}>`, as, bs, cs);
|
|
67
|
-
const attrs = attributes('html', [],
|
|
209
|
+
const attrs = attributes('html', [], attrspecs[tag], as.slice(1, -1));
|
|
68
210
|
return 'data-invalid-syntax' in attrs
|
|
69
211
|
? invalid('attribute', 'Invalid HTML attribute', as, bs, cs)
|
|
70
212
|
: h(tag as 'span', attrs, defrag(bs));
|
|
71
213
|
}
|
|
214
|
+
|
|
72
215
|
function invalid(type: string, message: string, as: (HTMLElement | string)[], bs: (HTMLElement | string)[], cs: (HTMLElement | string)[]): HTMLElement {
|
|
73
216
|
return h('span', {
|
|
74
217
|
class: 'invalid',
|
|
@@ -101,7 +244,7 @@ export function attributes(
|
|
|
101
244
|
? param.slice(name.length + 2, -1).replace(/\\(.?)/g, '$1')
|
|
102
245
|
: undefined;
|
|
103
246
|
invalid ||= !spec || name in attrs;
|
|
104
|
-
if (spec &&
|
|
247
|
+
if (spec && name in spec && !spec[name]) continue;
|
|
105
248
|
spec?.[name]?.includes(value) || value !== undefined && spec?.[name]?.length === 0
|
|
106
249
|
? attrs[name] = value ?? ''
|
|
107
250
|
: invalid ||= !!spec;
|