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.
@@ -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', unshift(
79
- [html('span', { class: 'figindex' })],
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, jn = 0n; j < cells.length; jn = BigInt(++j)) {
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
- ? ~(~0n << BigInt(colSpan)) << jn
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) + +!!(lHighlight | rHighlight) * 2 + +!!(tHighlights & m) * 4]));
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>&lt;a&gt;</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>&lt;small&gt;</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">&lt;script&gt;alert<span class="paren">()</span>&lt;/script&gt;</span>'], '']);
13
13
  assert.deepStrictEqual(inspect(parser('<script src="\\""></script>')), undefined);
14
- assert.deepStrictEqual(inspect(parser('<small onclick="alert()">')), undefined);
15
- assert.deepStrictEqual(inspect(parser('<small onclick="alert()"></small>')), undefined);
16
- assert.deepStrictEqual(inspect(parser('<small onclick="alert()">a</small>')), [['<span class="invalid">&lt;small onclick="alert()"&gt;a&lt;/small&gt;</span>'], '']);
17
- assert.deepStrictEqual(inspect(parser('<small><small onclick="alert()">a</small></small>')), [['<small><span class="invalid">&lt;small onclick="alert()"&gt;a&lt;/small&gt;</span></small>'], '']);
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">&lt;bdi onclick="alert()"&gt;a&lt;/bdi&gt;</span>'], '']);
17
+ assert.deepStrictEqual(inspect(parser('<bdi><bdi onclick="alert()">a</bdi></bdi>')), [['<bdi><span class="invalid">&lt;bdi onclick="alert()"&gt;a&lt;/bdi&gt;</span></bdi>'], '']);
18
18
  assert.deepStrictEqual(inspect(parser('<bdo dir="rtl\\"><">a</bdo>')), [['<span class="invalid">&lt;bdo dir="rtl\\"&gt;&lt;"&gt;a&lt;/bdo&gt;</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('<small>z')), undefined);
29
- assert.deepStrictEqual(inspect(parser('<small></small>')), undefined);
30
- assert.deepStrictEqual(inspect(parser('<small> </small>')), undefined);
31
- assert.deepStrictEqual(inspect(parser('<small>\\ </small>')), undefined);
32
- assert.deepStrictEqual(inspect(parser('<small>&Tab;</small>')), undefined);
33
- assert.deepStrictEqual(inspect(parser('<small><wbr></small>')), undefined);
34
- assert.deepStrictEqual(inspect(parser('<small>\n</small>')), undefined);
35
- assert.deepStrictEqual(inspect(parser('<small>\na</small>')), undefined);
36
- assert.deepStrictEqual(inspect(parser('<small>\\\na</small>')), undefined);
37
- assert.deepStrictEqual(inspect(parser('<small>a')), undefined);
38
- assert.deepStrictEqual(inspect(parser('<small>a</BDO>')), undefined);
39
- assert.deepStrictEqual(inspect(parser('<SMALL>a</SMALL>')), undefined);
40
- assert.deepStrictEqual(inspect(parser('<SMALL>a</bdo>')), undefined);
41
- assert.deepStrictEqual(inspect(parser('</small>')), undefined);
42
- assert.deepStrictEqual(inspect(parser('<small/>')), undefined);
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>&Tab;</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">&lt;b&gt;<span class="invalid">&lt;b&gt;<span class="invalid">&lt;b&gt;a&lt;/b&gt;</span>&lt;/b&gt;</span>&lt;/b&gt;</span>'], '']);
44
- assert.deepStrictEqual(inspect(parser('<small><small><small>a</small></small></small>')), [['<small><small><small>a</small></small></small>'], '']);
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('<small a="*b*"')), undefined);
49
- assert.deepStrictEqual(inspect(parser('<small a="*b*">')), undefined);
50
- assert.deepStrictEqual(inspect(parser('<small a="*b*">c')), undefined);
51
- assert.deepStrictEqual(inspect(parser('<small a b="*" *c*')), undefined);
52
- assert.deepStrictEqual(inspect(parser('<small a b="*" *c*>')), undefined);
53
- assert.deepStrictEqual(inspect(parser('<small a b="*" *c*>d</small>')), undefined);
54
- assert.deepStrictEqual(inspect(parser('<small a b="*" *>*c*')), undefined);
55
- assert.deepStrictEqual(inspect(parser('<small a b="*" *>*c*</small>')), undefined);
56
- assert.deepStrictEqual(inspect(parser(' <small>a</small>')), undefined);
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('<small> a</small>')), [['<small> a</small>'], '']);
61
- assert.deepStrictEqual(inspect(parser('<small> a </small>')), [['<small> a </small>'], '']);
62
- assert.deepStrictEqual(inspect(parser('<small> a </small>')), [['<small> a </small>'], '']);
63
- assert.deepStrictEqual(inspect(parser('<small>\\ a</small>')), [['<small> a</small>'], '']);
64
- assert.deepStrictEqual(inspect(parser('<small><wbr>a</small>')), [['<small><wbr>a</small>'], '']);
65
- assert.deepStrictEqual(inspect(parser('<small>a</small>')), [['<small>a</small>'], '']);
66
- assert.deepStrictEqual(inspect(parser('<small>a</small>a')), [['<small>a</small>'], 'a']);
67
- assert.deepStrictEqual(inspect(parser('<small>a </small>')), [['<small>a </small>'], '']);
68
- assert.deepStrictEqual(inspect(parser('<small>a \n </small>')), [['<small>a </small>'], '']);
69
- assert.deepStrictEqual(inspect(parser('<small>a\n</small>')), [['<small>a</small>'], '']);
70
- assert.deepStrictEqual(inspect(parser('<small>a\n </small>')), [['<small>a </small>'], '']);
71
- assert.deepStrictEqual(inspect(parser('<small>a\n<wbr></small>')), [['<small>a<wbr></small>'], '']);
72
- assert.deepStrictEqual(inspect(parser('<small>a\nb</small>')), [['<small>a<br>b</small>'], '']);
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('<small><small>a</small></small>')), [['<small><small>a</small></small>'], '']);
78
- assert.deepStrictEqual(inspect(parser('<small>a<small>b</small>c</small>')), [['<small>a<small>b</small>c</small>'], '']);
79
- assert.deepStrictEqual(inspect(parser('<small>`a`</small>')), [['<small><code data-src="`a`">a</code></small>'], '']);
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('<small><a>a</a></small>')), [['<small><span class="invalid">&lt;a&gt;a&lt;/a&gt;</span></small>'], '']);
85
- assert.deepStrictEqual(inspect(parser('<small>a<a>b</a>c</small>')), [['<small>a<span class="invalid">&lt;a&gt;b&lt;/a&gt;</span>c</small>'], '']);
84
+ assert.deepStrictEqual(inspect(parser('<bdi><a>a</a></bdi>')), [['<bdi><span class="invalid">&lt;a&gt;a&lt;/a&gt;</span></bdi>'], '']);
85
+ assert.deepStrictEqual(inspect(parser('<bdi>a<a>b</a>c</bdi>')), [['<bdi>a<span class="invalid">&lt;a&gt;b&lt;/a&gt;</span>c</bdi>'], '']);
86
86
  assert.deepStrictEqual(inspect(parser('<img>')), [['<img'], '>']);
87
- assert.deepStrictEqual(inspect(parser('<small><img></small>')), [['<small>&lt;img&gt;</small>'], '']);
87
+ assert.deepStrictEqual(inspect(parser('<bdi><img></bdi>')), [['<bdi>&lt;img&gt;</bdi>'], '']);
88
88
  assert.deepStrictEqual(inspect(parser('<img />')), [['<img'], ' />']);
89
- assert.deepStrictEqual(inspect(parser('<small><img /></small>')), [['<small>&lt;img /&gt;</small>'], '']);
89
+ assert.deepStrictEqual(inspect(parser('<bdi><img /></bdi>')), [['<bdi>&lt;img /&gt;</bdi>'], '']);
90
90
  });
91
91
 
92
92
  it('attribute', () => {
93
- assert.deepStrictEqual(inspect(parser('<small\n>a</small>')), undefined);
94
- assert.deepStrictEqual(inspect(parser('<small >a</small>')), [['<small>a</small>'], '']);
95
- assert.deepStrictEqual(inspect(parser('<small \n>a</small>')), undefined);
96
- assert.deepStrictEqual(inspect(parser('<small >a</small>')), [['<small>a</small>'], '']);
97
- assert.deepStrictEqual(inspect(parser('<small __proto__>a</small>')), undefined);
98
- assert.deepStrictEqual(inspect(parser('<small constructor>a</small>')), [['<span class="invalid">&lt;small constructor&gt;a&lt;/small&gt;</span>'], '']);
99
- assert.deepStrictEqual(inspect(parser('<small toString>a</small>')), undefined);
100
- assert.deepStrictEqual(inspect(parser('<small X>a</small>')), undefined);
101
- assert.deepStrictEqual(inspect(parser('<small x>a</small>')), [['<span class="invalid">&lt;small x&gt;a&lt;/small&gt;</span>'], '']);
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">&lt;bdi constructor&gt;a&lt;/bdi&gt;</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">&lt;bdi x&gt;a&lt;/bdi&gt;</span>'], '']);
102
102
  assert.deepStrictEqual(inspect(parser('<bdo>a</bdo>')), [['<span class="invalid">&lt;bdo&gt;a&lt;/bdo&gt;</span>'], '']);
103
103
  assert.deepStrictEqual(inspect(parser('<bdo >a</bdo>')), [['<span class="invalid">&lt;bdo &gt;a&lt;/bdo&gt;</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(['sup', 'sub', 'small', 'bdo', 'bdi']);
13
- const attrspec = {
12
+ const tags = Object.freeze(['bdo', 'bdi']);
13
+ const attrspecs = {
14
14
  bdo: {
15
- dir: Object.freeze(['ltr', 'rtl'] as const),
15
+ dir: Object.freeze(['ltr', 'rtl']),
16
16
  },
17
17
  } as const;
18
- Object.setPrototypeOf(attrspec, null);
19
- Object.values(attrspec).forEach(o => Object.setPrototypeOf(o, null));
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
- /^<(sup|sub|small|bdo|bdi)(?=[^\S\n]|>)/,
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]) => tags.indexOf(tag), [])),
41
+ ([, tag]) => TAGS.indexOf(tag), [])),
42
42
  match(
43
- /^<([a-z]+)(?=[^\S\n]|>)/,
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', [], attrspec[tag], as.slice(1, -1));
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 && !spec[name] && name in spec) continue;
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;