securemark 0.232.1 → 0.233.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/design.md +4 -0
  3. package/dist/securemark.js +81 -108
  4. package/markdown.d.ts +13 -22
  5. package/package-lock.json +259 -245
  6. package/package.json +5 -5
  7. package/src/combinator/control/manipulation/indent.test.ts +12 -12
  8. package/src/combinator/control/manipulation/surround.ts +4 -3
  9. package/src/parser/api/parse.test.ts +6 -6
  10. package/src/parser/block/blockquote.test.ts +1 -1
  11. package/src/parser/block/extension/aside.test.ts +1 -1
  12. package/src/parser/block/extension/aside.ts +3 -3
  13. package/src/parser/block/extension/example.test.ts +2 -2
  14. package/src/parser/block/extension/table.ts +3 -3
  15. package/src/parser/block/paragraph.test.ts +7 -6
  16. package/src/parser/block/reply/cite.ts +1 -1
  17. package/src/parser/inline/annotation.test.ts +2 -4
  18. package/src/parser/inline/comment.test.ts +39 -38
  19. package/src/parser/inline/comment.ts +21 -28
  20. package/src/parser/inline/deletion.test.ts +1 -2
  21. package/src/parser/inline/emphasis.test.ts +0 -3
  22. package/src/parser/inline/extension/index.test.ts +4 -3
  23. package/src/parser/inline/extension/index.ts +2 -2
  24. package/src/parser/inline/extension/indexee.ts +22 -19
  25. package/src/parser/inline/extension/placeholder.test.ts +7 -7
  26. package/src/parser/inline/insertion.test.ts +1 -2
  27. package/src/parser/inline/link.test.ts +0 -1
  28. package/src/parser/inline/mark.test.ts +1 -4
  29. package/src/parser/inline/media.ts +9 -9
  30. package/src/parser/inline/reference.test.ts +19 -21
  31. package/src/parser/inline/reference.ts +1 -1
  32. package/src/parser/inline/strong.test.ts +0 -3
  33. package/src/parser/inline/template.test.ts +1 -1
  34. package/src/parser/inline.ts +3 -3
  35. package/src/parser/processor/figure.test.ts +25 -25
  36. package/src/parser/processor/figure.ts +1 -1
  37. package/src/parser/processor/footnote.ts +3 -2
  38. package/src/parser/util.ts +2 -17
  39. package/src/parser/util.test.ts +0 -14
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.232.1",
3
+ "version": "0.233.1",
4
4
  "description": "Secure markdown renderer working on browsers for user input data.",
5
5
  "private": false,
6
6
  "homepage": "https://github.com/falsandtru/securemark",
@@ -51,17 +51,17 @@
51
51
  "gulp-rename": "^2.0.0",
52
52
  "gulp-unassert": "^2.0.0",
53
53
  "karma": "^6.3.17",
54
- "karma-chrome-launcher": "^3.1.0",
54
+ "karma-chrome-launcher": "^3.1.1",
55
55
  "karma-coverage-istanbul-instrumenter": "^1.0.4",
56
56
  "karma-coverage-istanbul-reporter": "^3.0.3",
57
57
  "karma-espower-preprocessor": "^1.2.0",
58
58
  "karma-firefox-launcher": "^2.1.2",
59
59
  "karma-mocha": "^2.0.1",
60
- "mocha": "^9.2.1",
61
- "npm-check-updates": "^12.5.2",
60
+ "mocha": "^9.2.2",
61
+ "npm-check-updates": "^12.5.4",
62
62
  "power-assert": "^1.6.1",
63
63
  "semver": "^7.3.5",
64
- "spica": "0.0.511",
64
+ "spica": "0.0.515",
65
65
  "tsify": "^5.0.4",
66
66
  "typed-dom": "0.0.249",
67
67
  "typescript": "4.6.2",
@@ -4,18 +4,18 @@ import { inspect } from '../../../debug.test';
4
4
  describe('Unit: combinator/indent', () => {
5
5
  describe('indent', () => {
6
6
  it('valid', () => {
7
- const parser = indent(s => [[s], '']);
8
- assert.deepStrictEqual(inspect(parser('')), undefined);
9
- assert.deepStrictEqual(inspect(parser(' ')), undefined);
10
- assert.deepStrictEqual(inspect(parser(' ')), undefined);
11
- assert.deepStrictEqual(inspect(parser('a ')), undefined);
12
- assert.deepStrictEqual(inspect(parser(' a ')), [['a '], '']);
13
- assert.deepStrictEqual(inspect(parser(' a ')), [['a '], '']);
14
- assert.deepStrictEqual(inspect(parser(' a\n a')), [['a\na'], '']);
15
- assert.deepStrictEqual(inspect(parser(' a\n a')), [['a\n a'], '']);
16
- assert.deepStrictEqual(inspect(parser(' a\n a')), [['a'], ' a']);
17
- assert.deepStrictEqual(inspect(parser(' \ta')), [['\ta'], '']);
18
- assert.deepStrictEqual(inspect(parser('\ta')), [['a'], '']);
7
+ const parser = indent((s, _) => [[s], '']);
8
+ assert.deepStrictEqual(inspect(parser('', {})), undefined);
9
+ assert.deepStrictEqual(inspect(parser(' ', {})), undefined);
10
+ assert.deepStrictEqual(inspect(parser(' ', {})), undefined);
11
+ assert.deepStrictEqual(inspect(parser('a ', {})), undefined);
12
+ assert.deepStrictEqual(inspect(parser(' a ', {})), [['a '], '']);
13
+ assert.deepStrictEqual(inspect(parser(' a ', {})), [['a '], '']);
14
+ assert.deepStrictEqual(inspect(parser(' a\n a', {})), [['a\na'], '']);
15
+ assert.deepStrictEqual(inspect(parser(' a\n a', {})), [['a\n a'], '']);
16
+ assert.deepStrictEqual(inspect(parser(' a\n a', {})), [['a'], ' a']);
17
+ assert.deepStrictEqual(inspect(parser(' \ta', {})), [['\ta'], '']);
18
+ assert.deepStrictEqual(inspect(parser('\ta', {})), [['a'], '']);
19
19
  });
20
20
 
21
21
  });
@@ -1,6 +1,7 @@
1
1
  import { undefined } from 'spica/global';
2
2
  import { Parser, Result, Ctx, Tree, Context, SubParsers, SubTree, IntermediateParser, eval, exec, check } from '../../data/parser';
3
3
  import { fmap } from '../monad/fmap';
4
+ import { creator } from './resource';
4
5
  import { unshift, push } from 'spica/array';
5
6
 
6
7
  export function surround<P extends Parser<unknown>, S = string>(
@@ -68,14 +69,14 @@ export function surround<T>(
68
69
  function match(pattern: string | RegExp): (source: string, context: Ctx) => [never[], string] | undefined {
69
70
  switch (typeof pattern) {
70
71
  case 'string':
71
- return source => source.slice(0, pattern.length) === pattern ? [[], source.slice(pattern.length)] : undefined;
72
+ return creator(source => source.slice(0, pattern.length) === pattern ? [[], source.slice(pattern.length)] : undefined);
72
73
  case 'object':
73
- return source => {
74
+ return creator(source => {
74
75
  const m = source.match(pattern);
75
76
  return m
76
77
  ? [[], source.slice(m[0].length)]
77
78
  : undefined;
78
- };
79
+ });
79
80
  }
80
81
  }
81
82
 
@@ -53,10 +53,10 @@ describe('Unit: parser/api/parse', () => {
53
53
  ['<p>&lt;wbr&gt;<br>a</p>']);
54
54
  assert.deepStrictEqual(
55
55
  [...parse('[#\n<wbr>\n#]').children].map(el => el.outerHTML),
56
- ['<p>[#<br>&lt;wbr&gt;<br>#]</p>']);
56
+ ['<p><span class="comment">[# &lt;wbr&gt; #]</span></p>']);
57
57
  assert.deepStrictEqual(
58
58
  [...parse('[#\n<wbr>\n#]\na').children].map(el => el.outerHTML),
59
- ['<p>[#<br>&lt;wbr&gt;<br>#]<br>a</p>']);
59
+ ['<p><span class="comment">[# &lt;wbr&gt; #]</span><br>a</p>']);
60
60
  });
61
61
 
62
62
  it('linebreak', () => {
@@ -199,17 +199,17 @@ describe('Unit: parser/api/parse', () => {
199
199
  it('footnote', () => {
200
200
  const footnotes = { annotations: html('ol'), references: html('ol') };
201
201
  assert.deepStrictEqual(
202
- [...parse('$-a\n$$\n$$\n\n(($-a[[b]][[c]]))', { footnotes }).children].map(el => el.outerHTML),
202
+ [...parse('$-a\n$$\n$$\n\n(($-a[[b]][[c*d*]]))', { footnotes }).children].map(el => el.outerHTML),
203
203
  [
204
204
  '<figure data-label="$-a" data-group="$" data-number="1" id="label:$-a"><div class="figcontent"><div class="math" translate="no">$$\n$$</div></div><span class="figindex">(1)</span><figcaption></figcaption></figure>',
205
- '<p><sup class="annotation" id="annotation:ref:1" title="(1)[1][2]"><span hidden=""><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference:ref:1" title="b"><span hidden="">b</span><a href="#reference:def:1">[1]</a></sup><sup class="reference" id="reference:ref:2" title="c"><span hidden="">c</span><a href="#reference:def:2">[2]</a></sup></span><a href="#annotation:def:1">*1</a></sup></p>',
205
+ '<p><sup class="annotation" id="annotation:ref:1" title="(1)[1][2]"><span hidden=""><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference:ref:1" title="b"><span hidden="">b</span><a href="#reference:def:1">[1]</a></sup><sup class="reference" id="reference:ref:2" title="cd"><span hidden="">c<em>d</em></span><a href="#reference:def:2">[2]</a></sup></span><a href="#annotation:def:1">*1</a></sup></p>',
206
206
  ]);
207
207
  assert.deepStrictEqual(
208
208
  footnotes.annotations.outerHTML,
209
- '<ol><li id="annotation:def:1"><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference:ref:1" title="b"><span hidden="">b</span><a href="#reference:def:1">[1]</a></sup><sup class="reference" id="reference:ref:2" title="c"><span hidden="">c</span><a href="#reference:def:2">[2]</a></sup><sup><a href="#annotation:ref:1">^1</a></sup></li></ol>');
209
+ '<ol><li id="annotation:def:1"><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference:ref:1" title="b"><span hidden="">b</span><a href="#reference:def:1">[1]</a></sup><sup class="reference" id="reference:ref:2" title="cd"><span hidden="">c<em>d</em></span><a href="#reference:def:2">[2]</a></sup><sup><a href="#annotation:ref:1">^1</a></sup></li></ol>');
210
210
  assert.deepStrictEqual(
211
211
  footnotes.references.outerHTML,
212
- '<ol><li id="reference:def:1">b<sup><a href="#reference:ref:1">^1</a></sup></li><li id="reference:def:2">c<sup><a href="#reference:ref:2">^2</a></sup></li></ol>');
212
+ '<ol><li id="reference:def:1">b<sup><a href="#reference:ref:1">^1</a></sup></li><li id="reference:def:2">c<em>d</em><sup><a href="#reference:ref:2">^2</a></sup></li></ol>');
213
213
  });
214
214
 
215
215
  it('normalize', () => {
@@ -95,7 +95,7 @@ describe('Unit: parser/block/blockquote', () => {
95
95
  assert.deepStrictEqual(inspect(parser('!>\n> a')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
96
96
  assert.deepStrictEqual(inspect(parser('!>> ## a\n> ## a')), [['<blockquote><blockquote><section><h2>a</h2><ol class="annotations"></ol><ol class="references"></ol></section></blockquote><section><h2>a</h2><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
97
97
  assert.deepStrictEqual(inspect(parser('!>> ~ a\n> ~ a')), [['<blockquote><blockquote><section><dl><dt>a</dt><dd></dd></dl><ol class="annotations"></ol><ol class="references"></ol></section></blockquote><section><dl><dt>a</dt><dd></dd></dl><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
98
- assert.deepStrictEqual(inspect(parser('!>> ~~~figure $fig-a\n>> > \n>>\n~~~\n> ~~~figure $fig-a\n> > \n>\n[#a]\n~~~')), [['<blockquote><blockquote><section><figure data-label="fig-a" data-group="fig" data-number="1"><div class="figcontent"><blockquote></blockquote></div><span class="figindex">Fig. 1: </span><figcaption></figcaption></figure><ol class="annotations"></ol><ol class="references"></ol></section></blockquote><section><figure data-label="fig-a" data-group="fig" data-number="1"><div class="figcontent"><blockquote></blockquote></div><span class="figindex">Fig. 1: </span><figcaption><a class="index">a</a></figcaption></figure><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
98
+ assert.deepStrictEqual(inspect(parser('!>> ~~~figure $fig-a\n>> > \n>>\n~~~\n> ~~~figure $fig-a\n> > \n>\n[#a]\n~~~')), [['<blockquote><blockquote><section><figure data-label="fig-a" data-group="fig" data-number="1"><div class="figcontent"><blockquote></blockquote></div><span class="figindex">Fig. 1. </span><figcaption></figcaption></figure><ol class="annotations"></ol><ol class="references"></ol></section></blockquote><section><figure data-label="fig-a" data-group="fig" data-number="1"><div class="figcontent"><blockquote></blockquote></div><span class="figindex">Fig. 1. </span><figcaption><a class="index">a</a></figcaption></figure><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
99
99
  assert.deepStrictEqual(inspect(parser('!>> ((a))\n> ((a))')), [['<blockquote><blockquote><section><p><sup class="annotation disabled" title="a"><span hidden="">a</span><a>*1</a></sup></p><ol class="annotations"><li>a<sup><a>^1</a></sup></li></ol><ol class="references"></ol></section></blockquote><section><p><sup class="annotation disabled" title="a"><span hidden="">a</span><a>*1</a></sup></p><ol class="annotations"><li>a<sup><a>^1</a></sup></li></ol><ol class="references"></ol></section></blockquote>'], '']);
100
100
  });
101
101
 
@@ -16,7 +16,7 @@ describe('Unit: parser/block/extension/aside', () => {
16
16
  it('valid', () => {
17
17
  assert.deepStrictEqual(inspect(parser('~~~aside\n# 0\n~~~')), [['<aside id="index:0" class="aside"><h1>0</h1><ol class="annotations"></ol><ol class="references"></ol></aside>'], '']);
18
18
  assert.deepStrictEqual(inspect(parser('~~~aside\n## 0\n~~~')), [['<aside id="index:0" class="aside"><h2>0</h2><ol class="annotations"></ol><ol class="references"></ol></aside>'], '']);
19
- assert.deepStrictEqual(inspect(parser('~~~aside\n# 0\n\n$-0.0\n\n## 1\n\n$fig-a\n> \n~~~')), [['<aside id="index:0" class="aside"><h1>0</h1><figure data-label="$-0.0" data-group="$" hidden="" data-number="0.0"></figure><h2>1</h2><figure data-label="fig-a" data-group="fig" data-number="1.1"><div class="figcontent"><blockquote></blockquote></div><span class="figindex">Fig. 1.1: </span><figcaption></figcaption></figure><ol class="annotations"></ol><ol class="references"></ol></aside>'], '']);
19
+ assert.deepStrictEqual(inspect(parser('~~~aside\n# 0\n\n$-0.0\n\n## 1\n\n$fig-a\n> \n~~~')), [['<aside id="index:0" class="aside"><h1>0</h1><figure data-label="$-0.0" data-group="$" hidden="" data-number="0.0"></figure><h2>1</h2><figure data-label="fig-a" data-group="fig" data-number="1.1"><div class="figcontent"><blockquote></blockquote></div><span class="figindex">Fig. 1.1. </span><figcaption></figcaption></figure><ol class="annotations"></ol><ol class="references"></ol></aside>'], '']);
20
20
  });
21
21
 
22
22
  });
@@ -1,6 +1,6 @@
1
1
  import { ExtensionParser } from '../../block';
2
2
  import { block, validate, fence, creator, fmap } from '../../../combinator';
3
- import { identity } from '../../inline/extension/indexee';
3
+ import { identity, text } from '../../inline/extension/indexee';
4
4
  import { parse } from '../../api/parse';
5
5
  import { html } from 'typed-dom';
6
6
 
@@ -35,9 +35,9 @@ export const aside: ExtensionParser.AsideParser = creator(100, block(validate('~
35
35
  'data-invalid-type': 'content',
36
36
  'data-invalid-description': 'Missing the title at the first line.',
37
37
  }, `${opener}${body}${closer}`)];
38
- assert(identity(heading));
38
+ assert(identity(text(heading)));
39
39
  return [
40
- html('aside', { id: identity(heading), class: 'aside' }, [
40
+ html('aside', { id: identity(text(heading)), class: 'aside' }, [
41
41
  document,
42
42
  annotations,
43
43
  references,
@@ -19,8 +19,8 @@ describe('Unit: parser/block/extension/example', () => {
19
19
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\n\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no"></pre><hr><section><ol class="annotations"></ol><ol class="references"></ol></section></aside>'], '']);
20
20
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\na\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">a</pre><hr><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></aside>'], '']);
21
21
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\n*a\nb*\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">*a\nb*</pre><hr><section><p><em>a<br>b</em></p><ol class="annotations"></ol><ol class="references"></ol></section></aside>'], '']);
22
- assert.deepStrictEqual(inspect(parser('~~~example/markdown\n$fig-a\n!https://host\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">$fig-a\n!https://host</pre><hr><section><figure data-label="fig-a" data-group="fig" data-number="1"><div class="figcontent"><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div><span class="figindex">Fig. 1: </span><figcaption></figcaption></figure><ol class="annotations"></ol><ol class="references"></ol></section></aside>'], '']);
23
- assert.deepStrictEqual(inspect(parser('~~~example/markdown\n[$fig-a]\n!https://host\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">[$fig-a]\n!https://host</pre><hr><section><figure data-label="fig-a" data-group="fig" data-number="1"><div class="figcontent"><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div><span class="figindex">Fig. 1: </span><figcaption></figcaption></figure><ol class="annotations"></ol><ol class="references"></ol></section></aside>'], '']);
22
+ assert.deepStrictEqual(inspect(parser('~~~example/markdown\n$fig-a\n!https://host\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">$fig-a\n!https://host</pre><hr><section><figure data-label="fig-a" data-group="fig" data-number="1"><div class="figcontent"><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div><span class="figindex">Fig. 1. </span><figcaption></figcaption></figure><ol class="annotations"></ol><ol class="references"></ol></section></aside>'], '']);
23
+ assert.deepStrictEqual(inspect(parser('~~~example/markdown\n[$fig-a]\n!https://host\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">[$fig-a]\n!https://host</pre><hr><section><figure data-label="fig-a" data-group="fig" data-number="1"><div class="figcontent"><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div><span class="figindex">Fig. 1. </span><figcaption></figcaption></figure><ol class="annotations"></ol><ol class="references"></ol></section></aside>'], '']);
24
24
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\n## a\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">## a</pre><hr><section><h2>a</h2><ol class="annotations"></ol><ol class="references"></ol></section></aside>'], '']);
25
25
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\n~ a\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">~ a</pre><hr><section><dl><dt>a</dt><dd></dd></dl><ol class="annotations"></ol><ol class="references"></ol></section></aside>'], '']);
26
26
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\n((a))[[b]]\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">((a))[[b]]</pre><hr><section><p><sup class="annotation disabled" title="a"><span hidden="">a</span><a>*1</a></sup><sup class="reference disabled" title="b"><span hidden="">b</span><a>[1]</a></sup></p><ol class="annotations"><li>a<sup><a>^1</a></sup></li></ol><ol class="references"><li>b<sup><a>^1</a></sup></li></ol></section></aside>'], '']);
@@ -113,9 +113,9 @@ function attributes(source: string) {
113
113
  assert(colspan?.[0] !== '0');
114
114
  rowspan === '1' ? rowspan = undefined : undefined;
115
115
  colspan === '1' ? colspan = undefined : undefined;
116
- rowspan &&= max(0, min(+rowspan, 65534)) + '';
117
- colspan &&= max(0, min(+colspan, 1000)) + '';
118
- highlight &&= highlight.length > 0 ? highlight.length + '' : undefined;
116
+ rowspan &&= `${max(0, min(+rowspan, 65534))}`;
117
+ colspan &&= `${max(0, min(+colspan, 1000))}`;
118
+ highlight &&= highlight.length > 0 ? `${highlight.length}` : undefined;
119
119
  const valid = !highlight
120
120
  || source[0] === '#' && +highlight <= 1
121
121
  || source[0] === ':' && +highlight <= 6;
@@ -47,12 +47,13 @@ describe('Unit: parser/block/paragraph', () => {
47
47
  });
48
48
 
49
49
  it('comment', () => {
50
- assert.deepStrictEqual(inspect(parser('[# a #]')), [['<p>[# a #]</p>'], '']);
51
- assert.deepStrictEqual(inspect(parser('[# a #]b')), [['<p><sup class="comment" title="a"></sup>b</p>'], '']);
52
- assert.deepStrictEqual(inspect(parser('[# a #]\nb')), [['<p>[# a #]<br>b</p>'], '']);
53
- assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]')), [['<p>[#<br>&lt;wbr&gt;<br>#]</p>'], '']);
54
- assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]a')), [['<p><sup class="comment" title="<wbr>"></sup>a</p>'], '']);
55
- assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]\na')), [['<p>[#<br>&lt;wbr&gt;<br>#]<br>a</p>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('[# a #]')), [['<p><span class="comment">[# a #]</span></p>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('[# a #]b')), [['<p><span class="comment">[# a #]</span>b</p>'], '']);
52
+ assert.deepStrictEqual(inspect(parser('[# a #]\nb')), [['<p><span class="comment">[# a #]</span><br>b</p>'], '']);
53
+ assert.deepStrictEqual(inspect(parser('[## a ##]')), [['<p><span class="comment">[## a ##]</span></p>'], '']);
54
+ assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]')), [['<p><span class="comment">[# &lt;wbr&gt; #]</span></p>'], '']);
55
+ assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]a')), [['<p><span class="comment">[# &lt;wbr&gt; #]</span>a</p>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]\na')), [['<p><span class="comment">[# &lt;wbr&gt; #]</span><br>a</p>'], '']);
56
57
  });
57
58
 
58
59
  it('template', () => {
@@ -12,7 +12,7 @@ export const cite: ReplyParser.CiteParser = creator(line(fmap(validate(
12
12
  ]))),
13
13
  ([el, quotes = '']: [HTMLElement, string?]) => [
14
14
  html('span', { class: 'cite' }, defrag([
15
- quotes + '>',
15
+ `${quotes}>`,
16
16
  define(el, { 'data-depth': `${quotes.length + 1}` }, el.innerText.slice(1)),
17
17
  ])),
18
18
  html('br'),
@@ -18,15 +18,14 @@ describe('Unit: parser/inline/annotation', () => {
18
18
  assert.deepStrictEqual(inspect(parser('((\na))')), undefined);
19
19
  assert.deepStrictEqual(inspect(parser('((\\ a))')), undefined);
20
20
  assert.deepStrictEqual(inspect(parser('((\\\na))')), undefined);
21
+ assert.deepStrictEqual(inspect(parser('((<wbr>a))')), undefined);
21
22
  assert.deepStrictEqual(inspect(parser('((a\n))')), undefined);
22
23
  assert.deepStrictEqual(inspect(parser('((a\\\n))')), undefined);
23
24
  assert.deepStrictEqual(inspect(parser('((a\nb))')), undefined);
24
25
  assert.deepStrictEqual(inspect(parser('((a\\\nb))')), undefined);
25
- assert.deepStrictEqual(inspect(parser('((<wbr>a))')), undefined);
26
- assert.deepStrictEqual(inspect(parser('(([# a #]b))')), undefined);
27
- assert.deepStrictEqual(inspect(parser('((a)b))')), undefined);
28
26
  assert.deepStrictEqual(inspect(parser('((*a\nb*))')), undefined);
29
27
  assert.deepStrictEqual(inspect(parser('((\\))')), undefined);
28
+ assert.deepStrictEqual(inspect(parser('((a)b))')), undefined);
30
29
  assert.deepStrictEqual(inspect(parser('(((a))')), undefined);
31
30
  assert.deepStrictEqual(inspect(parser(' ((a))')), undefined);
32
31
  });
@@ -39,7 +38,6 @@ describe('Unit: parser/inline/annotation', () => {
39
38
  assert.deepStrictEqual(inspect(parser('((a ))')), [['<sup class="annotation">a</sup>'], '']);
40
39
  assert.deepStrictEqual(inspect(parser('((a &nbsp;))')), [['<sup class="annotation">a</sup>'], '']);
41
40
  assert.deepStrictEqual(inspect(parser('((a <wbr>))')), [['<sup class="annotation">a</sup>'], '']);
42
- assert.deepStrictEqual(inspect(parser('((a [# b #]))')), [['<sup class="annotation">a <sup class="comment" title="b"></sup></sup>'], '']);
43
41
  assert.deepStrictEqual(inspect(parser('((ab))')), [['<sup class="annotation">ab</sup>'], '']);
44
42
  });
45
43
 
@@ -10,52 +10,53 @@ describe('Unit: parser/inline/comment', () => {
10
10
  assert.deepStrictEqual(inspect(parser('')), undefined);
11
11
  assert.deepStrictEqual(inspect(parser('<')), undefined);
12
12
  assert.deepStrictEqual(inspect(parser('[#')), undefined);
13
- assert.deepStrictEqual(inspect(parser('[##]')), undefined);
14
- assert.deepStrictEqual(inspect(parser('[# #]')), undefined);
15
- assert.deepStrictEqual(inspect(parser('[# #]')), undefined);
16
- assert.deepStrictEqual(inspect(parser('[# #]')), undefined);
17
- assert.deepStrictEqual(inspect(parser('[# #] #]')), undefined);
18
- assert.deepStrictEqual(inspect(parser('[# #] #]')), undefined);
19
- assert.deepStrictEqual(inspect(parser('[# [#')), undefined);
20
13
  assert.deepStrictEqual(inspect(parser('[#[#')), undefined);
21
- assert.deepStrictEqual(inspect(parser('[# [# ')), undefined);
22
- assert.deepStrictEqual(inspect(parser('[# [# a')), undefined);
23
- assert.deepStrictEqual(inspect(parser('[# a[#')), [['<sup class="comment invalid">[# a</sup>'], '[#']);
24
- assert.deepStrictEqual(inspect(parser('[# a [#')), [['<sup class="comment invalid">[# a </sup>'], '[#']);
25
- assert.deepStrictEqual(inspect(parser('[# a [# ')), [['<sup class="comment invalid">[# a </sup>'], '[# ']);
26
- assert.deepStrictEqual(inspect(parser('[# a [#\n')), [['<sup class="comment invalid">[# a </sup>'], '[#\n']);
27
- assert.deepStrictEqual(inspect(parser('[# a [#b')), undefined);
28
- assert.deepStrictEqual(inspect(parser('[# a [# b')), [['<sup class="comment invalid">[# a </sup>'], '[# b']);
29
- assert.deepStrictEqual(inspect(parser('[# a [## b')), undefined);
30
- assert.deepStrictEqual(inspect(parser('[## a [# b')), undefined);
31
14
  assert.deepStrictEqual(inspect(parser('[#a#]')), undefined);
32
15
  assert.deepStrictEqual(inspect(parser('[#a b#]')), undefined);
16
+ assert.deepStrictEqual(inspect(parser('[# ')), [['[', '#', ' '], '']);
17
+ assert.deepStrictEqual(inspect(parser('[# \n a')), [['[', '#', '<br>', ' ', 'a'], '']);
18
+ assert.deepStrictEqual(inspect(parser('[##]')), undefined);
19
+ assert.deepStrictEqual(inspect(parser('[# #]')), undefined);
20
+ assert.deepStrictEqual(inspect(parser('[# #] #]')), undefined);
21
+ assert.deepStrictEqual(inspect(parser('[# [#')), [['[', '#', ' ', '[', '#'], '']);
22
+ assert.deepStrictEqual(inspect(parser('[# [# ')), [['[', '#', ' ', '[', '#', ' '], '']);
23
+ assert.deepStrictEqual(inspect(parser('[# [# a')), [['[', '#', ' ', '[', '#', ' ', 'a'], '']);
24
+ assert.deepStrictEqual(inspect(parser('[# [# a #]')), [['[', '#', ' ', '<span class="comment">[# a #]</span>'], '']);
25
+ assert.deepStrictEqual(inspect(parser('[# a[#')), [['[', '#', ' ', 'a', '[', '#'], '']);
26
+ assert.deepStrictEqual(inspect(parser('[# a [#')), [['[', '#', ' ', 'a', ' ', '[', '#'], '']);
27
+ assert.deepStrictEqual(inspect(parser('[# a [# ')), [['[', '#', ' ', 'a', ' ', '[', '#', ' '], '']);
28
+ assert.deepStrictEqual(inspect(parser('[# a [# b')), [['[', '#', ' ', 'a', ' ', '[', '#', ' ', 'b'], '']);
29
+ assert.deepStrictEqual(inspect(parser('[# a [## b')), [['[', '#', ' ', 'a', ' ', '[', '#', '#', ' ', 'b'], '']);
30
+ assert.deepStrictEqual(inspect(parser('[## a [# b')), [['[', '#', '#', ' ', 'a', ' ', '[', '#', ' ', 'b'], '']);
33
31
  assert.deepStrictEqual(inspect(parser('[#\\ a #]')), undefined);
34
- assert.deepStrictEqual(inspect(parser('[# a#]')), undefined);
35
- assert.deepStrictEqual(inspect(parser('[# a##]')), undefined);
36
- assert.deepStrictEqual(inspect(parser('[# a ##]')), undefined);
37
- assert.deepStrictEqual(inspect(parser('[## a #]')), undefined);
38
- assert.deepStrictEqual(inspect(parser('[# &a; #]')), [['<sup class="comment invalid">[# &amp;a; #]</sup>'], '']);
32
+ assert.deepStrictEqual(inspect(parser('[# a\\ #]')), [['[', '#', ' ', 'a', ' ', '#', ']'], '']);
33
+ assert.deepStrictEqual(inspect(parser('[# a#]')), [['[', '#', ' ', 'a#', ']'], '']);
34
+ assert.deepStrictEqual(inspect(parser('[# a ##]')), [['[', '#', ' ', 'a', ' ', '##', ']'], '']);
35
+ assert.deepStrictEqual(inspect(parser('[# [## #]')), [['[', '#', ' ', '[', '#', '#', ' ', '#', ']'], '']);
36
+ assert.deepStrictEqual(inspect(parser('[## [# ##]')), [['[', '#', '#', ' ', '[', '#', ' ', '##', ']'], '']);
37
+ assert.deepStrictEqual(inspect(parser('[## a #]')), [['[', '#', '#', ' ', 'a', ' ', '#', ']'], '']);
39
38
  assert.deepStrictEqual(inspect(parser(' [# a #]')), undefined);
40
39
  });
41
40
 
42
41
  it('basic', () => {
43
- assert.deepStrictEqual(inspect(parser('[# a #]')), [['<sup class="comment" title="a"></sup>'], '']);
44
- assert.deepStrictEqual(inspect(parser('[# a b #]')), [['<sup class="comment" title="a b"></sup>'], '']);
45
- assert.deepStrictEqual(inspect(parser('[# a\nb #]')), [['<sup class="comment" title="a\nb"></sup>'], '']);
46
- assert.deepStrictEqual(inspect(parser('[# a\\ #]')), [['<sup class="comment" title="a\\"></sup>'], '']);
47
- assert.deepStrictEqual(inspect(parser('[# a #] #]')), [['<sup class="comment" title="a"></sup>'], ' #]']);
48
- assert.deepStrictEqual(inspect(parser('[# ##] #]')), [['<sup class="comment" title="##]"></sup>'], '']);
49
- assert.deepStrictEqual(inspect(parser('[# [## #]')), [['<sup class="comment" title="[##"></sup>'], '']);
50
- assert.deepStrictEqual(inspect(parser('[# [## a ##] #]')), [['<sup class="comment" title="[## a ##]"></sup>'], '']);
51
- assert.deepStrictEqual(inspect(parser('[## a ##]')), [['<sup class="comment" title="a"></sup>'], '']);
52
- assert.deepStrictEqual(inspect(parser('[## #] ##]')), [['<sup class="comment" title="#]"></sup>'], '']);
53
- assert.deepStrictEqual(inspect(parser('[## [# ##]')), [['<sup class="comment" title="[#"></sup>'], '']);
54
- assert.deepStrictEqual(inspect(parser('[## [# a #] ##]')), [['<sup class="comment" title="[# a #]"></sup>'], '']);
55
- assert.deepStrictEqual(inspect(parser('[# a #]b')), [['<sup class="comment" title="a"></sup>'], 'b']);
56
- assert.deepStrictEqual(inspect(parser('[#\na\n#]')), [['<sup class="comment" title="a"></sup>'], '']);
57
- assert.deepStrictEqual(inspect(parser('[# &copy; #]')), [['<sup class="comment" title="©"></sup>'], '']);
58
- assert.deepStrictEqual(inspect(parser('[# &amp;copy; #]')), [['<sup class="comment" title="&amp;copy;"></sup>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('[# #]')), [['<span class="comment">[# #]</span>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('[# #]')), [['<span class="comment">[# #]</span>'], '']);
44
+ assert.deepStrictEqual(inspect(parser('[# a #]')), [['<span class="comment">[# a #]</span>'], '']);
45
+ assert.deepStrictEqual(inspect(parser('[# a b #]')), [['<span class="comment">[# a b #]</span>'], '']);
46
+ assert.deepStrictEqual(inspect(parser('[# a\nb #]')), [['<span class="comment">[# a<br>b #]</span>'], '']);
47
+ assert.deepStrictEqual(inspect(parser('[# a #] #]')), [['<span class="comment">[# a #]</span>'], ' #]']);
48
+ assert.deepStrictEqual(inspect(parser('[# ##] #]')), [['<span class="comment">[# ##] #]</span>'], '']);
49
+ assert.deepStrictEqual(inspect(parser('[# [# a #] #]')), [['<span class="comment">[# <span class="comment">[# a #]</span> #]</span>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('[# [## a ##] #]')), [['<span class="comment">[# <span class="comment">[## a ##]</span> #]</span>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('[## a ##]')), [['<span class="comment">[## a ##]</span>'], '']);
52
+ assert.deepStrictEqual(inspect(parser('[## #] ##]')), [['<span class="comment">[## #] ##]</span>'], '']);
53
+ assert.deepStrictEqual(inspect(parser('[## [# a #] ##]')), [['<span class="comment">[## <span class="comment">[# a #]</span> ##]</span>'], '']);
54
+ assert.deepStrictEqual(inspect(parser('[# a #]b')), [['<span class="comment">[# a #]</span>'], 'b']);
55
+ assert.deepStrictEqual(inspect(parser('[#\na\n#]')), [['<span class="comment">[# a #]</span>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('[# &a; #]')), [['<span class="comment">[# <span class="invalid">&amp;a;</span> #]</span>'], '']);
57
+ assert.deepStrictEqual(inspect(parser('[# &copy; #]')), [['<span class="comment">[# © #]</span>'], '']);
58
+ assert.deepStrictEqual(inspect(parser('[# &amp;copy; #]')), [['<span class="comment">[# &amp;copy; #]</span>'], '']);
59
+ assert.deepStrictEqual(inspect(parser('[# \\ a #]')), [['<span class="comment">[# a #]</span>'], '']);
59
60
  });
60
61
 
61
62
  });
@@ -1,31 +1,24 @@
1
1
  import { CommentParser } from '../inline';
2
- import { union, some, validate, creator, match } from '../../combinator';
3
2
  import { eval } from '../../combinator/data/parser';
4
- import { unsafehtmlentity } from './htmlentity';
5
- import { unescsource } from '../source';
6
- import { html } from 'typed-dom';
3
+ import { union, some, validate, creator, surround, match, lazy } from '../../combinator';
4
+ import { inline } from '../inline';
5
+ import { text, str } from '../source';
6
+ import { html, defrag } from 'typed-dom';
7
+ import { memoize } from 'spica/memoize';
8
+ import { unshift, push, pop } from 'spica/array';
7
9
 
8
- export const comment: CommentParser = creator(validate('[#', match(
9
- /^\[(#+)(?!\S|\s+\1\]|\s*\[\1(?:$|\s))((?:\s+\S+)+?)(?:\s+(\1\])|\s*(?=\[\1(?:$|\s)))/,
10
- ([whole, , body, closer]) => (rest, context) => {
11
- [whole, body] = `${whole}\0${body.trimStart()}`.replace(/\x1B/g, '').split('\0', 2);
12
- if (!closer) return [[html('sup', {
13
- class: 'comment invalid',
14
- 'data-invalid-syntax': 'comment',
15
- 'data-invalid-type': 'content',
16
- 'data-invalid-description': 'Comment syntax using the same level cannot start in another comment syntax.',
17
- }, whole)], rest];
18
- const title = eval(some(text)(body, context), []).join('').trim();
19
- if (title.includes('\0')) return [[html('sup', {
20
- class: 'comment invalid',
21
- 'data-invalid-syntax': 'comment',
22
- 'data-invalid-type': 'content',
23
- 'data-invalid-description': `Invalid HTML entitiy "${title.match(/\0&[0-9A-Za-z]+;/)![0].slice(1)}".`,
24
- }, whole)], rest];
25
- return [[html('sup', { class: 'comment', title })], rest];
26
- })));
27
-
28
- const text: CommentParser.TextParser = union([
29
- unsafehtmlentity,
30
- unescsource,
31
- ]);
10
+ export const comment: CommentParser = lazy(() => creator(validate('[#', match(
11
+ /^(?=\[(#+)\s)/,
12
+ memoize(
13
+ ([, fence], closer = new RegExp(String.raw`^\s+${fence}\]`)) =>
14
+ surround(
15
+ str(/^\[(\S+)\s+(?!\1\])/),
16
+ union([some(inline, closer)]),
17
+ str(closer), true,
18
+ ([, bs = []], rest) => [[
19
+ html('span',
20
+ { class: 'comment' },
21
+ defrag(push(unshift([`[${fence} `], bs), [` ${fence}]`]))),
22
+ ], rest],
23
+ ([as, bs = []], rest, context) => [unshift(pop(eval(some(text)(`${as[0]}!`, context))!)[0], bs), rest]),
24
+ ([, fence]) => fence)))));
@@ -17,7 +17,7 @@ describe('Unit: parser/inline/deletion', () => {
17
17
 
18
18
  it('basic', () => {
19
19
  assert.deepStrictEqual(inspect(parser('~~a~~')), [['<del>a</del>'], '']);
20
- assert.deepStrictEqual(inspect(parser('~~ab~~')), [['<del>ab</del>'], '']);
20
+ assert.deepStrictEqual(inspect(parser('~~a~b~~')), [['<del>a~b</del>'], '']);
21
21
  assert.deepStrictEqual(inspect(parser('~~a ~~')), [['<del>a </del>'], '']);
22
22
  assert.deepStrictEqual(inspect(parser('~~ ~~')), [['<del> </del>'], '']);
23
23
  assert.deepStrictEqual(inspect(parser('~~ a~~')), [['<del> a</del>'], '']);
@@ -26,7 +26,6 @@ describe('Unit: parser/inline/deletion', () => {
26
26
  assert.deepStrictEqual(inspect(parser('~~\na~~')), [['<del><br>a</del>'], '']);
27
27
  assert.deepStrictEqual(inspect(parser('~~\\\na~~')), [['<del><span class="linebreak"> </span>a</del>'], '']);
28
28
  assert.deepStrictEqual(inspect(parser('~~<wbr>a~~')), [['<del><wbr>a</del>'], '']);
29
- assert.deepStrictEqual(inspect(parser('~~[# a #]b~~')), [['<del><sup class="comment" title="a"></sup>b</del>'], '']);
30
29
  assert.deepStrictEqual(inspect(parser('~~a\n~~')), [['<del>a</del>'], '']);
31
30
  assert.deepStrictEqual(inspect(parser('~~a\nb~~')), [['<del>a<br>b</del>'], '']);
32
31
  assert.deepStrictEqual(inspect(parser('~~a\\\nb~~')), [['<del>a<span class="linebreak"> </span>b</del>'], '']);
@@ -15,7 +15,6 @@ describe('Unit: parser/inline/emphasis', () => {
15
15
  assert.deepStrictEqual(inspect(parser('*a\\\n*')), [['*', 'a', '<span class="linebreak"> </span>'], '*']);
16
16
  assert.deepStrictEqual(inspect(parser('*a**b')), [['*', 'a', '**', 'b'], '']);
17
17
  assert.deepStrictEqual(inspect(parser('*a**b*')), [['*', 'a', '**', 'b', '*'], '']);
18
- assert.deepStrictEqual(inspect(parser('*a [# b #]*')), [['*', 'a', ' ', '<sup class="comment" title="b"></sup>'], '*']);
19
18
  assert.deepStrictEqual(inspect(parser('* *')), undefined);
20
19
  assert.deepStrictEqual(inspect(parser('* a*')), undefined);
21
20
  assert.deepStrictEqual(inspect(parser('* a *')), undefined);
@@ -24,7 +23,6 @@ describe('Unit: parser/inline/emphasis', () => {
24
23
  assert.deepStrictEqual(inspect(parser('*\\ a*')), undefined);
25
24
  assert.deepStrictEqual(inspect(parser('*\\\na*')), undefined);
26
25
  assert.deepStrictEqual(inspect(parser('*<wbr>a*')), undefined);
27
- assert.deepStrictEqual(inspect(parser('*[# a #]b*')), undefined);
28
26
  assert.deepStrictEqual(inspect(parser('**a**')), undefined);
29
27
  assert.deepStrictEqual(inspect(parser('***a***')), undefined);
30
28
  assert.deepStrictEqual(inspect(parser(' *a*')), undefined);
@@ -41,7 +39,6 @@ describe('Unit: parser/inline/emphasis', () => {
41
39
  it('nest', () => {
42
40
  assert.deepStrictEqual(inspect(parser('*a**b**c*')), [['<em>a<strong>b</strong>c</em>'], '']);
43
41
  assert.deepStrictEqual(inspect(parser('*a**b**c*d')), [['<em>a<strong>b</strong>c</em>'], 'd']);
44
- assert.deepStrictEqual(inspect(parser('*a[# b #]*')), [['<em>a<sup class="comment" title="b"></sup></em>'], '']);
45
42
  assert.deepStrictEqual(inspect(parser('*`a`*')), [['<em><code data-src="`a`">a</code></em>'], '']);
46
43
  assert.deepStrictEqual(inspect(parser('*<small>*')), [['<em>&lt;small&gt;</em>'], '']);
47
44
  assert.deepStrictEqual(inspect(parser('*(*a*)*')), [['<em><span class="paren">(<em>a</em>)</span></em>'], '']);
@@ -19,7 +19,6 @@ describe('Unit: parser/inline/extension/index', () => {
19
19
  assert.deepStrictEqual(inspect(parser('[#\\\n]')), undefined);
20
20
  assert.deepStrictEqual(inspect(parser('[#\\]')), undefined);
21
21
  assert.deepStrictEqual(inspect(parser('[#a')), undefined);
22
- assert.deepStrictEqual(inspect(parser('[#[# a #]]')), undefined);
23
22
  assert.deepStrictEqual(inspect(parser('[#*a\nb*]')), undefined);
24
23
  assert.deepStrictEqual(inspect(parser('[#a|#\n]')), undefined);
25
24
  assert.deepStrictEqual(inspect(parser('[#a|#\\\n]')), undefined);
@@ -39,7 +38,7 @@ describe('Unit: parser/inline/extension/index', () => {
39
38
  assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
40
39
  assert.deepStrictEqual(inspect(parser('[#a &nbsp;]')), [['<a class="index" href="#index:a">a</a>'], '']);
41
40
  assert.deepStrictEqual(inspect(parser('[#a <wbr>]')), [['<a class="index" href="#index:a">a</a>'], '']);
42
- assert.deepStrictEqual(inspect(parser('[#a [# b #]]')), [['<a class="index" href="#index:a">a <sup class="comment" title="b"></sup></a>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('[#a [# b #]]')), [['<a class="index" href="#index:a">a <span class="comment">[# b #]</span></a>'], '']);
43
42
  assert.deepStrictEqual(inspect(parser('[#a\\ ]')), [['<a class="index" href="#index:a">a</a>'], '']);
44
43
  assert.deepStrictEqual(inspect(parser('[#a\\ b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
45
44
  assert.deepStrictEqual(inspect(parser('[#[]]')), [['<a class="index" href="#index:[]">[]</a>'], '']);
@@ -55,6 +54,8 @@ describe('Unit: parser/inline/extension/index', () => {
55
54
  assert.deepStrictEqual(inspect(parser('[#@a]')), [['<a class="index" href="#index:@a">@a</a>'], '']);
56
55
  assert.deepStrictEqual(inspect(parser('[#http://host]')), [['<a class="index" href="#index:http://host">http://host</a>'], '']);
57
56
  assert.deepStrictEqual(inspect(parser('[#!http://host]')), [['<a class="index" href="#index:!http://host">!http://host</a>'], '']);
57
+ assert.deepStrictEqual(inspect(parser('[#[# #]]')), [['<a class="index"><span class="comment">[# #]</span></a>'], '']);
58
+ assert.deepStrictEqual(inspect(parser('[#[# a #]]')), [['<a class="index"><span class="comment">[# a #]</span></a>'], '']);
58
59
  assert.deepStrictEqual(inspect(parser('[#a((b))]')), [['<a class="index" href="#index:a((b))">a<span class="paren">((b))</span></a>'], '']);
59
60
  assert.deepStrictEqual(inspect(parser('[#a[[b]]]')), [['<a class="index" href="#index:a[[b]]">a[[b]]</a>'], '']);
60
61
  });
@@ -82,7 +83,7 @@ describe('Unit: parser/inline/extension/index', () => {
82
83
  assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
83
84
  assert.deepStrictEqual(inspect(parser('[#a &nbsp;|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
84
85
  assert.deepStrictEqual(inspect(parser('[#a <wbr>|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
85
- assert.deepStrictEqual(inspect(parser('[#a [# b #]|#b]')), [['<a class="index" href="#index:b">a <sup class="comment" title="b"></sup><span class="indexer" data-index="b"></span></a>'], '']);
86
+ assert.deepStrictEqual(inspect(parser('[#a [# b #]|#b]')), [['<a class="index" href="#index:b">a <span class="comment">[# b #]</span><span class="indexer" data-index="b"></span></a>'], '']);
86
87
  });
87
88
 
88
89
  });
@@ -2,7 +2,7 @@ import { undefined } from 'spica/global';
2
2
  import { ExtensionParser } from '../../inline';
3
3
  import { union, some, validate, guard, context, creator, surround, open, lazy, fmap } from '../../../combinator';
4
4
  import { inline } from '../../inline';
5
- import { indexee, identify } from './indexee';
5
+ import { indexee, identity } from './indexee';
6
6
  import { txt, str } from '../../source';
7
7
  import { startTight, trimNodeEnd } from '../../util';
8
8
  import { html, define, defrag } from 'typed-dom';
@@ -44,7 +44,7 @@ const signature: IndexParser.SignatureParser = lazy(() => creator(fmap(open(
44
44
  '|#',
45
45
  startTight(some(union([bracket, txt]), ']', /^\\?\n/))),
46
46
  ns => [
47
- html('span', { class: 'indexer', 'data-index': identify(join(ns).trim()).slice(6) }),
47
+ html('span', { class: 'indexer', 'data-index': identity(join(ns)).slice(6) }),
48
48
  ])));
49
49
 
50
50
  const bracket: IndexParser.SignatureParser.BracketParser = lazy(() => creator(union([