securemark 0.263.0 → 0.264.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/index.js +1483 -3326
  3. package/index.ts +0 -1
  4. package/markdown.d.ts +1 -1
  5. package/package.json +19 -19
  6. package/src/combinator/control/constraint/block.ts +1 -2
  7. package/src/combinator/control/constraint/contract.ts +3 -3
  8. package/src/combinator/control/constraint/line.ts +1 -2
  9. package/src/combinator/control/manipulation/indent.ts +0 -1
  10. package/src/combinator/control/manipulation/match.ts +1 -2
  11. package/src/combinator/control/manipulation/scope.ts +3 -4
  12. package/src/combinator/control/manipulation/surround.ts +1 -2
  13. package/src/combinator/control/monad/bind.ts +2 -3
  14. package/src/combinator/data/parser/context.ts +3 -3
  15. package/src/combinator/data/parser/inits.ts +1 -2
  16. package/src/combinator/data/parser/sequence.ts +1 -2
  17. package/src/combinator/data/parser/some.ts +1 -2
  18. package/src/combinator/data/parser/union.ts +4 -12
  19. package/src/parser/api/bind.test.ts +1 -1
  20. package/src/parser/api/bind.ts +0 -1
  21. package/src/parser/api/parse.test.ts +3 -3
  22. package/src/parser/api/parse.ts +0 -1
  23. package/src/parser/block/blockquote.test.ts +3 -3
  24. package/src/parser/block/codeblock.ts +0 -1
  25. package/src/parser/block/dlist.ts +2 -3
  26. package/src/parser/block/extension/example.test.ts +1 -1
  27. package/src/parser/block/extension/fig.ts +2 -1
  28. package/src/parser/block/extension/figure.ts +2 -4
  29. package/src/parser/block/extension/table.ts +2 -4
  30. package/src/parser/block/heading.test.ts +1 -1
  31. package/src/parser/block/mathblock.ts +0 -1
  32. package/src/parser/block/olist.ts +0 -1
  33. package/src/parser/block/paragraph.test.ts +1 -1
  34. package/src/parser/block/paragraph.ts +2 -3
  35. package/src/parser/block/reply.ts +2 -3
  36. package/src/parser/block.ts +0 -1
  37. package/src/parser/context.ts +15 -19
  38. package/src/parser/inline/annotation.ts +1 -2
  39. package/src/parser/inline/bracket.test.ts +1 -1
  40. package/src/parser/inline/bracket.ts +1 -2
  41. package/src/parser/inline/deletion.test.ts +2 -2
  42. package/src/parser/inline/emphasis.test.ts +2 -2
  43. package/src/parser/inline/emphasis.ts +2 -2
  44. package/src/parser/inline/extension/index.test.ts +28 -32
  45. package/src/parser/inline/extension/index.ts +1 -2
  46. package/src/parser/inline/extension/indexee.ts +22 -13
  47. package/src/parser/inline/extension/label.ts +0 -1
  48. package/src/parser/inline/extension/placeholder.test.ts +10 -12
  49. package/src/parser/inline/extension/placeholder.ts +7 -7
  50. package/src/parser/inline/html.test.ts +1 -1
  51. package/src/parser/inline/html.ts +2 -3
  52. package/src/parser/inline/htmlentity.ts +0 -1
  53. package/src/parser/inline/insertion.test.ts +2 -2
  54. package/src/parser/inline/link.test.ts +6 -5
  55. package/src/parser/inline/link.ts +43 -43
  56. package/src/parser/inline/mark.test.ts +11 -11
  57. package/src/parser/inline/mark.ts +12 -6
  58. package/src/parser/inline/media.ts +0 -1
  59. package/src/parser/inline/reference.ts +0 -1
  60. package/src/parser/inline/ruby.ts +0 -1
  61. package/src/parser/inline/strong.test.ts +2 -2
  62. package/src/parser/inline/strong.ts +2 -2
  63. package/src/parser/inline/template.ts +0 -1
  64. package/src/parser/inline.test.ts +8 -7
  65. package/src/parser/processor/figure.ts +0 -1
  66. package/src/parser/processor/footnote.ts +0 -1
  67. package/src/parser/segment.ts +0 -1
  68. package/src/parser/source/escapable.test.ts +1 -1
  69. package/src/parser/source/escapable.ts +7 -1
  70. package/src/parser/source/line.ts +0 -1
  71. package/src/parser/source/str.ts +0 -1
  72. package/src/parser/source/text.test.ts +24 -35
  73. package/src/parser/source/text.ts +2 -16
  74. package/src/parser/visibility.ts +1 -7
  75. package/src/renderer/render/math.ts +0 -1
  76. package/src/renderer/render/media/image.ts +0 -1
  77. package/src/renderer/render/media/twitter.ts +0 -1
  78. package/src/renderer/render/media/video.ts +0 -1
  79. package/src/renderer/render/media/youtube.ts +0 -1
  80. package/src/renderer/render.ts +0 -1
  81. package/src/util/quote.ts +0 -1
  82. package/src/util/scope.ts +0 -2
  83. package/src/util/toc.ts +0 -1
  84. package/webpack.config.js +1 -1
  85. package/src/parser/locale/ja.test.ts +0 -14
  86. package/src/parser/locale/ja.ts +0 -3
  87. package/src/parser/locale.test.ts +0 -26
  88. package/src/parser/locale.ts +0 -61
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { AnnotationParser } from '../inline';
3
2
  import { union, some, context, syntax, constraint, surround, lazy } from '../../combinator';
4
3
  import { inline } from '../inline';
@@ -9,7 +8,7 @@ import { html, defrag } from 'typed-dom/dom';
9
8
  export const annotation: AnnotationParser = lazy(() => surround(
10
9
  '((',
11
10
  constraint(State.annotation, false,
12
- syntax(Syntax.annotation, 6, 1, State.annotation | State.media,
11
+ syntax(Syntax.none, 6, 1, State.annotation | State.media,
13
12
  startLoose(
14
13
  context({ delimiters: undefined },
15
14
  some(union([inline]), ')', [[/^\\?\n/, 9], [')', 2], ['))', 6]])), ')'))),
@@ -78,7 +78,7 @@ describe('Unit: parser/inline/bracket', () => {
78
78
  assert.deepStrictEqual(inspect(parser('"(("')), [['"', '', '(', '', '(', '"'], '']);
79
79
  assert.deepStrictEqual(inspect(parser('"(\\")"')), [['"', '<span class="paren">(")</span>', '"'], '']);
80
80
  assert.deepStrictEqual(inspect(parser('"(\n)"')), [['"', '<span class="paren">(<br>)</span>', '"'], '']);
81
- assert.deepStrictEqual(inspect(parser('"(\\\n)"')), [['"', '<span class="paren">(<span class="linebreak"> </span>)</span>', '"'], '']);
81
+ assert.deepStrictEqual(inspect(parser('"(\\\n)"')), [['"', '<span class="paren">(<br>)</span>', '"'], '']);
82
82
  });
83
83
 
84
84
  });
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { BracketParser } from '../inline';
3
2
  import { union, some, syntax, surround, lazy } from '../../combinator';
4
3
  import { inline } from '../inline';
@@ -25,7 +24,7 @@ export const bracket: BracketParser = lazy(() => union([
25
24
  undefined,
26
25
  ([as, bs = []], rest) => [unshift(as, bs), rest]),
27
26
  // Control media blinking in editing rather than control confusion of pairs of quote marks.
28
- surround(str('"'), syntax(Syntax.quote, 8, 1, State.none, some(inline, '"', [['"', 8]])), str('"'), true,
27
+ surround(str('"'), syntax(Syntax.none, 8, 1, State.none, some(inline, '"', [['"', 8]])), str('"'), true,
29
28
  undefined,
30
29
  ([as, bs = []], rest) => [unshift(as, bs), rest]),
31
30
  ]));
@@ -23,7 +23,7 @@ describe('Unit: parser/inline/deletion', () => {
23
23
  assert.deepStrictEqual(inspect(parser('~~ a ~~')), [['<del> a </del>'], '']);
24
24
  assert.deepStrictEqual(inspect(parser('~~ a ~~')), [['<del> a </del>'], '']);
25
25
  assert.deepStrictEqual(inspect(parser('~~\na~~')), [['<del><br>a</del>'], '']);
26
- assert.deepStrictEqual(inspect(parser('~~\\\na~~')), [['<del><span class="linebreak"> </span>a</del>'], '']);
26
+ assert.deepStrictEqual(inspect(parser('~~\\\na~~')), [['<del><br>a</del>'], '']);
27
27
  assert.deepStrictEqual(inspect(parser('~~<wbr>a~~')), [['<del><wbr>a</del>'], '']);
28
28
  assert.deepStrictEqual(inspect(parser('~~a ~~')), [['<del>a </del>'], '']);
29
29
  assert.deepStrictEqual(inspect(parser('~~a \n ~~')), [['<del>a </del>'], '']);
@@ -31,7 +31,7 @@ describe('Unit: parser/inline/deletion', () => {
31
31
  assert.deepStrictEqual(inspect(parser('~~a\n ~~')), [['<del>a </del>'], '']);
32
32
  assert.deepStrictEqual(inspect(parser('~~a\n<wbr>~~')), [['<del>a<wbr></del>'], '']);
33
33
  assert.deepStrictEqual(inspect(parser('~~a\nb~~')), [['<del>a<br>b</del>'], '']);
34
- assert.deepStrictEqual(inspect(parser('~~a\\\nb~~')), [['<del>a<span class="linebreak"> </span>b</del>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('~~a\\\nb~~')), [['<del>a<br>b</del>'], '']);
35
35
  assert.deepStrictEqual(inspect(parser('~~\\~~~')), [['<del>~</del>'], '']);
36
36
  assert.deepStrictEqual(inspect(parser('~~a~~~')), [['<del>a</del>'], '~']);
37
37
  });
@@ -12,8 +12,10 @@ describe('Unit: parser/inline/emphasis', () => {
12
12
  assert.deepStrictEqual(inspect(parser('_a _')), [['_', 'a'], ' _']);
13
13
  assert.deepStrictEqual(inspect(parser('_a _')), [['_', 'a', ' '], ' _']);
14
14
  assert.deepStrictEqual(inspect(parser('_a\n_')), [['_', 'a'], '\n_']);
15
+ assert.deepStrictEqual(inspect(parser('_a\nb_')), [['_', 'a'], '\nb_']);
15
16
  assert.deepStrictEqual(inspect(parser('_a\\ _')), [['_', 'a'], '\\ _']);
16
17
  assert.deepStrictEqual(inspect(parser('_a\\\n_')), [['_', 'a'], '\\\n_']);
18
+ assert.deepStrictEqual(inspect(parser('_a\\\nb_')), [['_', 'a'], '\\\nb_']);
17
19
  assert.deepStrictEqual(inspect(parser('_ _')), undefined);
18
20
  assert.deepStrictEqual(inspect(parser('_ a_')), undefined);
19
21
  assert.deepStrictEqual(inspect(parser('_ a _')), undefined);
@@ -28,8 +30,6 @@ describe('Unit: parser/inline/emphasis', () => {
28
30
  it('basic', () => {
29
31
  assert.deepStrictEqual(inspect(parser('_a_')), [['<em>a</em>'], '']);
30
32
  assert.deepStrictEqual(inspect(parser('_ab_')), [['<em>ab</em>'], '']);
31
- assert.deepStrictEqual(inspect(parser('_a\nb_')), [['<em>a<br>b</em>'], '']);
32
- assert.deepStrictEqual(inspect(parser('_a\\\nb_')), [['<em>a<span class="linebreak"> </span>b</em>'], '']);
33
33
  });
34
34
 
35
35
  it('nest', () => {
@@ -11,8 +11,8 @@ export const emphasis: EmphasisParser = lazy(() => surround(
11
11
  str('_', '_'),
12
12
  syntax(Syntax.none, 1, 1, State.none,
13
13
  startTight(some(union([
14
- some(inline, blankWith('_')),
15
- open(some(inline, '_'), emphasis),
14
+ some(inline, blankWith('_'), [[/^\\?\n/, 9]]),
15
+ open(some(inline, '_', [[/^\\?\n/, 9]]), emphasis),
16
16
  ])))),
17
17
  str('_'), false,
18
18
  ([, bs], rest) => [[html('em', defrag(bs))], rest],
@@ -20,19 +20,17 @@ describe('Unit: parser/inline/extension/index', () => {
20
20
  assert.deepStrictEqual(inspect(parser('[#\\]')), undefined);
21
21
  assert.deepStrictEqual(inspect(parser('[#a')), undefined);
22
22
  assert.deepStrictEqual(inspect(parser('[#*a\nb*]')), undefined);
23
- assert.deepStrictEqual(inspect(parser('[#a\n|#b]')), undefined);
24
- assert.deepStrictEqual(inspect(parser('[#a|#\n]')), undefined);
25
- assert.deepStrictEqual(inspect(parser('[#a|#\\\n]')), undefined);
26
- assert.deepStrictEqual(inspect(parser('[#a|#(\n)]')), undefined);
27
- assert.deepStrictEqual(inspect(parser('[#a|#(\\\n)]')), undefined);
23
+ assert.deepStrictEqual(inspect(parser('[#a\n|b]')), undefined);
24
+ assert.deepStrictEqual(inspect(parser('[#a|\n]')), undefined);
25
+ assert.deepStrictEqual(inspect(parser('[#a|\\\n]')), undefined);
26
+ assert.deepStrictEqual(inspect(parser('[#a|(\n)]')), undefined);
27
+ assert.deepStrictEqual(inspect(parser('[#a|(\\\n)]')), undefined);
28
28
  assert.deepStrictEqual(inspect(parser('[# |]')), undefined);
29
- assert.deepStrictEqual(inspect(parser('[# |#]')), undefined);
30
- assert.deepStrictEqual(inspect(parser('[# |#b]')), undefined);
29
+ assert.deepStrictEqual(inspect(parser('[# |b]')), undefined);
31
30
  assert.deepStrictEqual(inspect(parser('[# a|]')), undefined);
32
- assert.deepStrictEqual(inspect(parser('[# a|#]')), undefined);
33
- assert.deepStrictEqual(inspect(parser('[# a|#b]')), undefined);
34
- assert.deepStrictEqual(inspect(parser('[# a|# ]')), undefined);
35
- assert.deepStrictEqual(inspect(parser('[# a|# b]')), undefined);
31
+ assert.deepStrictEqual(inspect(parser('[# a|b]')), undefined);
32
+ assert.deepStrictEqual(inspect(parser('[# a| ]')), undefined);
33
+ assert.deepStrictEqual(inspect(parser('[# a| b]')), undefined);
36
34
  assert.deepStrictEqual(inspect(parser(' [#a]')), undefined);
37
35
  });
38
36
 
@@ -70,28 +68,26 @@ describe('Unit: parser/inline/extension/index', () => {
70
68
 
71
69
  it('indexer', () => {
72
70
  assert.deepStrictEqual(inspect(parser('[#|]')), [['<a class="index" href="#index:|">|</a>'], '']);
73
- assert.deepStrictEqual(inspect(parser('[#|#]')), [['<a class="index" href="#index:|#">|#</a>'], '']);
74
- assert.deepStrictEqual(inspect(parser('[#|#b]')), [['<a class="index" href="#index:|#b">|#b</a>'], '']);
71
+ assert.deepStrictEqual(inspect(parser('[#|b]')), [['<a class="index" href="#index:|b">|b</a>'], '']);
75
72
  assert.deepStrictEqual(inspect(parser('[#a|]')), [['<a class="index" href="#index:a|">a|</a>'], '']);
76
- assert.deepStrictEqual(inspect(parser('[#a|#]')), [['<a class="index" href="#index:a|#">a|#</a>'], '']);
77
- assert.deepStrictEqual(inspect(parser('[#a|# ]')), [['<a class="index" href="#index:a|#">a|#</a>'], '']);
78
- assert.deepStrictEqual(inspect(parser('[#a|#\\ ]')), [['<a class="index" href="#index:a|#">a|#</a>'], '']);
79
- assert.deepStrictEqual(inspect(parser('[#a|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
80
- assert.deepStrictEqual(inspect(parser('[#a|#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
81
- assert.deepStrictEqual(inspect(parser('[#a|#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
82
- assert.deepStrictEqual(inspect(parser('[#a|#\\b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
83
- assert.deepStrictEqual(inspect(parser('[#a|#_b_]')), [['<a class="index" href="#index:_b_">a<span class="indexer" data-index="_b_"></span></a>'], '']);
84
- assert.deepStrictEqual(inspect(parser('[#a|#b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
85
- assert.deepStrictEqual(inspect(parser('[#a|#b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
86
- assert.deepStrictEqual(inspect(parser('[#a|#[]]')), [['<a class="index" href="#index:[]">a<span class="indexer" data-index="[]"></span></a>'], '']);
87
- assert.deepStrictEqual(inspect(parser('[#a|#&copy;]')), [['<a class="index" href="#index:&amp;copy;">a<span class="indexer" data-index="&amp;copy;"></span></a>'], '']);
88
- assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
89
- assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
90
- assert.deepStrictEqual(inspect(parser('[#a \\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
91
- assert.deepStrictEqual(inspect(parser('[#a &nbsp;|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
92
- assert.deepStrictEqual(inspect(parser('[#a <wbr>|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
93
- assert.deepStrictEqual(inspect(parser('[#a [% b %]|#c]')), [['<a class="index" href="#index:c">a <span class="comment"><input type="checkbox"><span>[% b %]</span></span><span class="indexer" data-index="c"></span></a>'], '']);
94
- assert.deepStrictEqual(inspect(parser('[#a\\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
73
+ assert.deepStrictEqual(inspect(parser('[#a| ]')), [['<a class="index" href="#index:a|">a|</a>'], '']);
74
+ assert.deepStrictEqual(inspect(parser('[#a|\\ ]')), [['<a class="index" href="#index:a|">a|</a>'], '']);
75
+ assert.deepStrictEqual(inspect(parser('[#a|b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
76
+ assert.deepStrictEqual(inspect(parser('[#a|b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
77
+ assert.deepStrictEqual(inspect(parser('[#a|b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
78
+ assert.deepStrictEqual(inspect(parser('[#a|\\b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
79
+ assert.deepStrictEqual(inspect(parser('[#a|_b_]')), [['<a class="index" href="#index:_b_">a<span class="indexer" data-index="_b_"></span></a>'], '']);
80
+ assert.deepStrictEqual(inspect(parser('[#a|b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
81
+ assert.deepStrictEqual(inspect(parser('[#a|b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
82
+ assert.deepStrictEqual(inspect(parser('[#a|[]]')), [['<a class="index" href="#index:[]">a<span class="indexer" data-index="[]"></span></a>'], '']);
83
+ assert.deepStrictEqual(inspect(parser('[#a|&copy;]')), [['<a class="index" href="#index:&amp;copy;">a<span class="indexer" data-index="&amp;copy;"></span></a>'], '']);
84
+ assert.deepStrictEqual(inspect(parser('[#a |b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
85
+ assert.deepStrictEqual(inspect(parser('[#a |b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
86
+ assert.deepStrictEqual(inspect(parser('[#a \\ |b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
87
+ assert.deepStrictEqual(inspect(parser('[#a &nbsp;|b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
88
+ assert.deepStrictEqual(inspect(parser('[#a <wbr>|b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
89
+ assert.deepStrictEqual(inspect(parser('[#a [% b %]|c]')), [['<a class="index" href="#index:c">a <span class="comment"><input type="checkbox"><span>[% b %]</span></span><span class="indexer" data-index="c"></span></a>'], '']);
90
+ assert.deepStrictEqual(inspect(parser('[#a\\ |b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
95
91
  });
96
92
 
97
93
  });
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { ExtensionParser } from '../../inline';
3
2
  import { union, some, syntax, creation, precedence, constraint, validate, surround, open, lazy, fmap } from '../../../combinator';
4
3
  import { inline } from '../../inline';
@@ -33,7 +32,7 @@ export const index: IndexParser = lazy(() => validate('[#', fmap(indexee(surroun
33
32
  ])));
34
33
 
35
34
  const signature: IndexParser.SignatureParser = lazy(() => creation(fmap(open(
36
- '|#',
35
+ '|',
37
36
  startTight(some(union([bracket, txt]), ']'))),
38
37
  ns => [
39
38
  html('span', { class: 'indexer', 'data-index': identity(ns.join('')).slice(6) }),
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { MarkdownParser } from '../../../../markdown';
3
2
  import { Parser } from '../../../combinator/data/parser';
4
3
  import { fmap } from '../../../combinator';
@@ -9,14 +8,23 @@ export function indexee(parser: Parser<HTMLElement, MarkdownParser.Context>, opt
9
8
  return fmap(parser, ([el], _, { id }) => [define(el, { id: id !== '' && identity(text(el, optional)) || undefined })]);
10
9
  }
11
10
 
12
- export function identity(text: string): string {
11
+ export function identity(text: string, name: 'index' | 'mark' = 'index'): string {
13
12
  assert(!text.includes('\n'));
14
- text &&= text.trim();
15
- return text && `index:${text.replace(/\s+/g, '_').slice(0, 101).replace(/^(.{97}).{4}$/, '$1...')}`;
13
+ text &&= text.trim().replace(/\s+/g, '_');
14
+ if (text.length <= 100) return text && `${name}:${text}`;
15
+ switch (name) {
16
+ case 'index':
17
+ return `${name}:${text.slice(0, 97)}...`;
18
+ case 'mark':
19
+ return `${name}:${text.slice(0, 50)}...${text.slice(-47)}`;
20
+ }
16
21
  }
17
- assert(identity('0'.repeat(100)).slice(6) === '0'.repeat(100));
18
- assert(identity('0'.repeat(101)).slice(6) === '0'.repeat(97) + '...');
19
- assert(identity('0'.repeat(200)).slice(6) === '0'.repeat(97) + '...');
22
+ assert(identity('0'.repeat(100 - 1) + 1).slice(6) === '0'.repeat(100 - 1) + 1);
23
+ assert(identity('0'.repeat(100) + 1).slice(6) === '0'.repeat(97) + '...');
24
+ assert(identity('0'.repeat(200) + 1).slice(6) === '0'.repeat(97) + '...');
25
+ assert(identity('0'.repeat(100 - 1) + 1, 'mark').slice(5) === '0'.repeat(100 - 1) + 1);
26
+ assert(identity('0'.repeat(100) + 1, 'mark').slice(5) === '0'.repeat(50) + '...' + '0'.repeat(47 - 1) + 1);
27
+ assert(identity('0'.repeat(200) + 1, 'mark').slice(5) === '0'.repeat(50) + '...' + '0'.repeat(47 - 1) + 1);
20
28
 
21
29
  export function text(source: HTMLElement | DocumentFragment, optional = false): string {
22
30
  assert(source instanceof DocumentFragment || !source.matches('.indexer'));
@@ -25,9 +33,9 @@ export function text(source: HTMLElement | DocumentFragment, optional = false):
25
33
  if (!indexer && optional) return '';
26
34
  const index = indexer?.getAttribute('data-index');
27
35
  if (index) return index;
28
- assert(!source.querySelector('.annotation, br'));
36
+ assert(!source.querySelector('br'));
29
37
  const target = source.cloneNode(true) as typeof source;
30
- for (let es = target.querySelectorAll('code[data-src], .math[data-src], .comment, rt, rp, .reference, .checkbox, ul, ol'),
38
+ for (let es = target.querySelectorAll('code[data-src], .math[data-src], .comment, rt, rp, br, .annotation, .reference, .checkbox, ul, ol'),
31
39
  len = es.length, i = 0; i < len; ++i) {
32
40
  const el = es[i];
33
41
  switch (el.tagName) {
@@ -40,6 +48,9 @@ export function text(source: HTMLElement | DocumentFragment, optional = false):
40
48
  case 'OL':
41
49
  el.remove();
42
50
  continue;
51
+ case 'BR':
52
+ el.replaceWith('\n');
53
+ continue;
43
54
  }
44
55
  switch (el.className) {
45
56
  case 'math':
@@ -47,11 +58,9 @@ export function text(source: HTMLElement | DocumentFragment, optional = false):
47
58
  continue;
48
59
  case 'comment':
49
60
  case 'checkbox':
50
- el.remove();
51
- continue;
61
+ case 'annotation':
52
62
  case 'reference':
53
- assert(el.firstElementChild?.hasAttribute('hidden'));
54
- el.firstChild!.remove();
63
+ el.remove();
55
64
  continue;
56
65
  }
57
66
  }
@@ -1,4 +1,3 @@
1
- import { Array } from 'spica/global';
2
1
  import { ExtensionParser } from '../../inline';
3
2
  import { union, constraint, creation, validate, surround, clear, fmap } from '../../../combinator';
4
3
  import { str } from '../../source';
@@ -22,12 +22,6 @@ describe('Unit: parser/inline/extension/placeholder', () => {
22
22
  assert.deepStrictEqual(inspect(parser('[^\\\na]')), undefined);
23
23
  assert.deepStrictEqual(inspect(parser('[^ !http://host]')), undefined);
24
24
  assert.deepStrictEqual(inspect(parser('[^a')), [['[^', 'a'], '']);
25
- assert.deepStrictEqual(inspect(parser('[^a\n]')), [['[^', 'a'], '\n]']);
26
- assert.deepStrictEqual(inspect(parser('[^a\n\n]')), [['[^', 'a'], '\n\n]']);
27
- assert.deepStrictEqual(inspect(parser('[^a\\\n]')), [['[^', 'a'], '\\\n]']);
28
- assert.deepStrictEqual(inspect(parser('[^a\\\n\\\n]')), [['[^', 'a'], '\\\n\\\n]']);
29
- assert.deepStrictEqual(inspect(parser('[^a\nb]')), [['[^', 'a'], '\nb]']);
30
- assert.deepStrictEqual(inspect(parser('[^a\\\nb]')), [['[^', 'a'], '\\\nb]']);
31
25
  assert.deepStrictEqual(inspect(parser('[[]')), undefined);
32
26
  assert.deepStrictEqual(inspect(parser('[]]')), undefined);
33
27
  assert.deepStrictEqual(inspect(parser('[[]]')), undefined);
@@ -39,12 +33,16 @@ describe('Unit: parser/inline/extension/placeholder', () => {
39
33
  it('valid', () => {
40
34
  assert.deepStrictEqual(inspect(parser('[^a]')), [['<span class="invalid">a</span>'], '']);
41
35
  assert.deepStrictEqual(inspect(parser('[^a b]')), [['<span class="invalid">a b</span>'], '']);
42
- assert.deepStrictEqual(inspect(parser('[^a ]')), [['<span class="invalid">a </span>'], '']);
43
- assert.deepStrictEqual(inspect(parser('[^a ]')), [['<span class="invalid">a </span>'], '']);
44
- assert.deepStrictEqual(inspect(parser('[^a\\ ]')), [['<span class="invalid">a </span>'], '']);
45
- assert.deepStrictEqual(inspect(parser('[^a\\ \\ ]')), [['<span class="invalid">a </span>'], '']);
46
- assert.deepStrictEqual(inspect(parser('[^a<wbr>]')), [['<span class="invalid">a<wbr></span>'], '']);
47
- assert.deepStrictEqual(inspect(parser('[^a<wbr><wbr>]')), [['<span class="invalid">a<wbr><wbr></span>'], '']);
36
+ assert.deepStrictEqual(inspect(parser('[^a ]')), [['<span class="invalid">a</span>'], '']);
37
+ assert.deepStrictEqual(inspect(parser('[^a ]')), [['<span class="invalid">a</span>'], '']);
38
+ assert.deepStrictEqual(inspect(parser('[^a\\ ]')), [['<span class="invalid">a</span>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('[^a\\ \\ ]')), [['<span class="invalid">a</span>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('[^a\n]')), [['<span class="invalid">a</span>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('[^a\\\n]')), [['<span class="invalid">a</span>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('[^a\nb]')), [['<span class="invalid">a<br>b</span>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('[^a\\\nb]')), [['<span class="invalid">a<br>b</span>'], '']);
44
+ assert.deepStrictEqual(inspect(parser('[^a<wbr>]')), [['<span class="invalid">a</span>'], '']);
45
+ assert.deepStrictEqual(inspect(parser('[^a<wbr><wbr>]')), [['<span class="invalid">a</span>'], '']);
48
46
  assert.deepStrictEqual(inspect(parser('[^==]')), [['<span class="invalid">==</span>'], '']);
49
47
  assert.deepStrictEqual(inspect(parser('[^a[% b %]]')), [['<span class="invalid">a<span class="comment"><input type="checkbox"><span>[% b %]</span></span></span>'], '']);
50
48
  assert.deepStrictEqual(inspect(parser('[^a[% b %][% c %]]')), [['<span class="invalid">a<span class="comment"><input type="checkbox"><span>[% b %]</span></span><span class="comment"><input type="checkbox"><span>[% c %]</span></span></span>'], '']);
@@ -3,25 +3,25 @@ import { union, some, syntax, validate, surround, lazy } from '../../../combinat
3
3
  import { inline } from '../../inline';
4
4
  import { str } from '../../source';
5
5
  import { Syntax, State } from '../../context';
6
- import { startTight } from '../../visibility';
6
+ import { startTight, trimBlankEnd } from '../../visibility';
7
7
  import { unshift } from 'spica/array';
8
8
  import { html, defrag } from 'typed-dom/dom';
9
9
 
10
- // Don't use the symbols already used: !#$%@&*+~=
10
+ // Don't use the symbols already used: !#$%@&*+~=|
11
11
 
12
12
  // All syntax surrounded by square brackets shouldn't contain line breaks.
13
13
 
14
- export const placeholder: ExtensionParser.PlaceholderParser = lazy(() => validate(['[:', '[^'], surround(
15
- str(/^\[[:^]/),
14
+ export const placeholder: ExtensionParser.PlaceholderParser = lazy(() => validate('[', surround(
15
+ str(/^\[[:^|]/),
16
16
  syntax(Syntax.placeholder, 2, 1, State.none,
17
- startTight(some(union([inline]), ']', [[/^\\?\n/, 9], [']', 2]]))),
17
+ startTight(trimBlankEnd(some(union([inline]), ']', [[']', 2]])))),
18
18
  str(']'), false,
19
- ([as, bs], rest) => [[
19
+ ([, bs], rest) => [[
20
20
  html('span', {
21
21
  class: 'invalid',
22
22
  'data-invalid-syntax': 'extension',
23
23
  'data-invalid-type': 'syntax',
24
- 'data-invalid-message': `Reserved start symbol "${as[0][1]}" cannot be used in "[]"`,
24
+ 'data-invalid-message': `Invalid start symbol or linebreak`,
25
25
  }, defrag(bs)),
26
26
  ], rest],
27
27
  ([as, bs], rest) => [unshift(as, bs), rest])));
@@ -34,7 +34,7 @@ describe('Unit: parser/inline/html', () => {
34
34
  assert.deepStrictEqual(inspect(parser('<bdi><wbr></bdi>')), [['<span class="invalid">&lt;bdi&gt;<wbr>&lt;/bdi&gt;</span>'], '']);
35
35
  assert.deepStrictEqual(inspect(parser('<bdi>\n</bdi>')), [['<span class="invalid">&lt;bdi&gt;<br>&lt;/bdi&gt;</span>'], '']);
36
36
  assert.deepStrictEqual(inspect(parser('<bdi>\na</bdi>')), [['<span class="invalid">&lt;bdi&gt;<br>a&lt;/bdi&gt;</span>'], '']);
37
- assert.deepStrictEqual(inspect(parser('<bdi>\\\na</bdi>')), [['<span class="invalid">&lt;bdi&gt;<span class="linebreak"> </span>a&lt;/bdi&gt;</span>'], '']);
37
+ assert.deepStrictEqual(inspect(parser('<bdi>\\\na</bdi>')), [['<span class="invalid">&lt;bdi&gt;<br>a&lt;/bdi&gt;</span>'], '']);
38
38
  assert.deepStrictEqual(inspect(parser('<bdi>a')), [['<span class="invalid">&lt;bdi&gt;a</span>'], '']);
39
39
  assert.deepStrictEqual(inspect(parser('<bdi>a</BDO>')), [['<span class="invalid">&lt;bdi&gt;a&lt;/BDO&gt;</span>'], '']);
40
40
  assert.deepStrictEqual(inspect(parser('<BDI>a</BDI>')), [['<span class="invalid">&lt;BDI&gt;a&lt;/BDI&gt;</span>'], '']);
@@ -1,4 +1,3 @@
1
- import { undefined, Object } from 'spica/global';
2
1
  import { HTMLParser } from '../inline';
3
2
  import { union, subsequence, some, syntax, validate, focus, surround, open, match, lazy } from '../../combinator';
4
3
  import { inline } from '../inline';
@@ -6,7 +5,7 @@ import { str } from '../source';
6
5
  import { Syntax, State } from '../context';
7
6
  import { isStartLooseNodes, blankWith } from '../visibility';
8
7
  import { memoize } from 'spica/memoize';
9
- import { Cache } from 'spica/cache';
8
+ import { Clock } from 'spica/clock';
10
9
  import { unshift, push, splice } from 'spica/array';
11
10
  import { html as h, defrag } from 'typed-dom/dom';
12
11
 
@@ -60,7 +59,7 @@ export const html: HTMLParser = lazy(() => validate('<', validate(/^<[a-z]+(?=[^
60
59
  ([as, bs = []], rest) =>
61
60
  [[elem(tag, as, bs, [])], rest]),
62
61
  ([, tag]) => tag,
63
- new Cache(10000))),
62
+ new Clock(10000))),
64
63
  ])))));
65
64
 
66
65
  export const attribute: HTMLParser.AttributeParser = union([
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { HTMLEntityParser, UnsafeHTMLEntityParser } from '../inline';
3
2
  import { union, creation, validate, focus, fmap } from '../../combinator';
4
3
  import { html } from 'typed-dom/dom';
@@ -23,7 +23,7 @@ describe('Unit: parser/inline/insertion', () => {
23
23
  assert.deepStrictEqual(inspect(parser('++ a ++')), [['<ins> a </ins>'], '']);
24
24
  assert.deepStrictEqual(inspect(parser('++ a ++')), [['<ins> a </ins>'], '']);
25
25
  assert.deepStrictEqual(inspect(parser('++\na++')), [['<ins><br>a</ins>'], '']);
26
- assert.deepStrictEqual(inspect(parser('++\\\na++')), [['<ins><span class="linebreak"> </span>a</ins>'], '']);
26
+ assert.deepStrictEqual(inspect(parser('++\\\na++')), [['<ins><br>a</ins>'], '']);
27
27
  assert.deepStrictEqual(inspect(parser('++<wbr>a++')), [['<ins><wbr>a</ins>'], '']);
28
28
  assert.deepStrictEqual(inspect(parser('++a ++')), [['<ins>a </ins>'], '']);
29
29
  assert.deepStrictEqual(inspect(parser('++a \n ++')), [['<ins>a </ins>'], '']);
@@ -31,7 +31,7 @@ describe('Unit: parser/inline/insertion', () => {
31
31
  assert.deepStrictEqual(inspect(parser('++a\n ++')), [['<ins>a </ins>'], '']);
32
32
  assert.deepStrictEqual(inspect(parser('++a\n<wbr>++')), [['<ins>a<wbr></ins>'], '']);
33
33
  assert.deepStrictEqual(inspect(parser('++a\nb++')), [['<ins>a<br>b</ins>'], '']);
34
- assert.deepStrictEqual(inspect(parser('++a\\\nb++')), [['<ins>a<span class="linebreak"> </span>b</ins>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('++a\\\nb++')), [['<ins>a<br>b</ins>'], '']);
35
35
  assert.deepStrictEqual(inspect(parser('++\\+++')), [['<ins>+</ins>'], '']);
36
36
  assert.deepStrictEqual(inspect(parser('++a+++')), [['<ins>a</ins>'], '+']);
37
37
  });
@@ -32,11 +32,11 @@ describe('Unit: parser/inline/link', () => {
32
32
  assert.deepStrictEqual(inspect(parser('[mailto:á]{http://evil}')), undefined);
33
33
  assert.deepStrictEqual(inspect(parser('[file:///]{http://evil}')), undefined);
34
34
  assert.deepStrictEqual(inspect(parser('[.http://á]{http://evil}')), undefined);
35
- assert.deepStrictEqual(inspect(parser('[0987654321]{tel:1234567890}')), undefined);
36
- assert.deepStrictEqual(inspect(parser('[1234567890-]{tel:1234567890}')), undefined);
37
- assert.deepStrictEqual(inspect(parser('[-1234567890]{tel:1234567890}')), undefined);
38
- assert.deepStrictEqual(inspect(parser('[123456789a]{tel:1234567890}')), undefined);
39
- assert.deepStrictEqual(inspect(parser('[1234567890]{tel:ttel:1234567890}')), undefined);
35
+ assert.deepStrictEqual(inspect(parser('[0987654321]{tel:1234567890}')), [['<a class="invalid">0987654321</a>'], '']);
36
+ assert.deepStrictEqual(inspect(parser('[1234567890-]{tel:1234567890}')), [['<a class="invalid">1234567890-</a>'], '']);
37
+ assert.deepStrictEqual(inspect(parser('[-1234567890]{tel:1234567890}')), [['<a class="invalid">-1234567890</a>'], '']);
38
+ assert.deepStrictEqual(inspect(parser('[123456789a]{tel:1234567890}')), [['<a class="invalid">123456789a</a>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('[1234567890]{tel:ttel:1234567890}')), [['<a class="invalid">1234567890</a>'], '']);
40
40
  //assert.deepStrictEqual(inspect(parser('[#a]{b}')), undefined);
41
41
  //assert.deepStrictEqual(inspect(parser('[\\#a]{b}')), undefined);
42
42
  //assert.deepStrictEqual(inspect(parser('[c #a]{b}')), undefined);
@@ -145,6 +145,7 @@ describe('Unit: parser/inline/link', () => {
145
145
  assert.deepStrictEqual(inspect(parser('{tel:+1234567890}')), [[`<a class="tel" href="tel:+1234567890">tel:+1234567890</a>`], '']);
146
146
  assert.deepStrictEqual(inspect(parser('{tel:+12-345-67-890}')), [[`<a class="tel" href="tel:+12-345-67-890">tel:+12-345-67-890</a>`], '']);
147
147
  assert.deepStrictEqual(inspect(parser('[1234567890]{tel:1234567890}')), [[`<a class="tel" href="tel:1234567890">1234567890</a>`], '']);
148
+ assert.deepStrictEqual(inspect(parser('[1234567890]{tel:12-3456-7890}')), [[`<a class="tel" href="tel:12-3456-7890">1234567890</a>`], '']);
148
149
  assert.deepStrictEqual(inspect(parser('[12-3456-7890]{tel:1234567890}')), [[`<a class="tel" href="tel:1234567890">12-3456-7890</a>`], '']);
149
150
  assert.deepStrictEqual(inspect(parser('[+12-34567-890]{tel:+12-345-67890}')), [[`<a class="tel" href="tel:+12-345-67890">+12-34567-890</a>`], '']);
150
151
  });
@@ -1,4 +1,3 @@
1
- import { undefined, location, encodeURI, decodeURI, Location } from 'spica/global';
2
1
  import { MarkdownParser } from '../../../markdown';
3
2
  import { LinkParser } from '../inline';
4
3
  import { Result, eval, exec } from '../../combinator/data/parser';
@@ -99,22 +98,6 @@ function parse(
99
98
  const uri = new ReadonlyURL(
100
99
  resolve(INSECURE_URI, context.host ?? location, context.url ?? context.host ?? location),
101
100
  context.host?.href || location.href);
102
- switch (uri.protocol) {
103
- case 'tel:': {
104
- const tel = content.length === 0
105
- ? INSECURE_URI
106
- : content[0];
107
- const pattern = /^(?:tel:)?(?:\+(?!0))?\d+(?:-\d+)*$/i;
108
- if (content.length <= 1 &&
109
- typeof tel === 'string' &&
110
- pattern.test(tel) &&
111
- pattern.test(INSECURE_URI) &&
112
- tel.replace(/[^+\d]/g, '') === INSECURE_URI.replace(/[^+\d]/g, '')) {
113
- break;
114
- }
115
- return;
116
- }
117
- }
118
101
  const el = elem(
119
102
  INSECURE_URI,
120
103
  content,
@@ -136,35 +119,52 @@ function elem(
136
119
  case 'http:':
137
120
  case 'https:':
138
121
  assert(uri.host);
139
- if (INSECURE_URI.slice(0, 2) === '^/' &&
140
- /\/\.\.?(?:\/|$)/.test(INSECURE_URI.slice(0, INSECURE_URI.search(/[?#]|$/)))) {
141
- type = 'argument';
142
- message = 'Dot-segments cannot be used in subresource paths';
143
- break;
122
+ switch (true) {
123
+ case INSECURE_URI.slice(0, 2) === '^/'
124
+ && /\/\.\.?(?:\/|$)/.test(INSECURE_URI.slice(0, INSECURE_URI.search(/[?#]|$/))):
125
+ type = 'argument';
126
+ message = 'Dot-segments cannot be used in subresource paths';
127
+ break;
128
+ default:
129
+ return html('a',
130
+ {
131
+ class: content.length === 0 ? 'url' : 'link',
132
+ href: uri.source,
133
+ target: undefined
134
+ || uri.origin !== origin
135
+ || typeof content[0] === 'object' && content[0].classList.contains('media')
136
+ ? '_blank'
137
+ : undefined,
138
+ },
139
+ content.length === 0
140
+ ? decode(INSECURE_URI)
141
+ : content);
144
142
  }
145
- return html('a',
146
- {
147
- class: content.length === 0 ? 'url' : 'link',
148
- href: uri.source,
149
- target: undefined
150
- || uri.origin !== origin
151
- || typeof content[0] === 'object' && content[0].classList.contains('media')
152
- ? '_blank'
153
- : undefined,
154
- },
155
- content.length === 0
156
- ? decode(INSECURE_URI)
157
- : content);
143
+ break;
158
144
  case 'tel:':
159
145
  assert(content.length <= 1);
160
- return html('a',
161
- {
162
- class: 'tel',
163
- href: uri.source,
164
- },
165
- content.length === 0
166
- ? [INSECURE_URI]
167
- : content);
146
+ const tel = content.length === 0
147
+ ? INSECURE_URI
148
+ : content[0];
149
+ const pattern = /^(?:tel:)?(?:\+(?!0))?\d+(?:-\d+)*$/i;
150
+ switch (true) {
151
+ case content.length <= 1
152
+ && pattern.test(INSECURE_URI)
153
+ && typeof tel === 'string'
154
+ && pattern.test(tel)
155
+ && tel.replace(/[^+\d]/g, '') === INSECURE_URI.replace(/[^+\d]/g, ''):
156
+ return html('a',
157
+ {
158
+ class: 'tel',
159
+ href: uri.source,
160
+ },
161
+ content.length === 0
162
+ ? [INSECURE_URI]
163
+ : content);
164
+ default:
165
+ type = 'content';
166
+ message = 'Invalid content';
167
+ }
168
168
  }
169
169
  return html('a',
170
170
  {
@@ -15,8 +15,10 @@ describe('Unit: parser/inline/mark', () => {
15
15
  assert.deepStrictEqual(inspect(parser('==a ==')), [['==', 'a'], ' ==']);
16
16
  assert.deepStrictEqual(inspect(parser('==a ==')), [['==', 'a', ' '], ' ==']);
17
17
  assert.deepStrictEqual(inspect(parser('==a\n==')), [['==', 'a'], '\n==']);
18
+ assert.deepStrictEqual(inspect(parser('==a\nb==')), [['==', 'a'], '\nb==']);
18
19
  assert.deepStrictEqual(inspect(parser('==a\\ ==')), [['==', 'a'], '\\ ==']);
19
20
  assert.deepStrictEqual(inspect(parser('==a\\\n==')), [['==', 'a'], '\\\n==']);
21
+ assert.deepStrictEqual(inspect(parser('==a\\\nb==')), [['==', 'a'], '\\\nb==']);
20
22
  assert.deepStrictEqual(inspect(parser('== ==')), undefined);
21
23
  assert.deepStrictEqual(inspect(parser('== a==')), undefined);
22
24
  assert.deepStrictEqual(inspect(parser('== a ==')), undefined);
@@ -27,20 +29,18 @@ describe('Unit: parser/inline/mark', () => {
27
29
  });
28
30
 
29
31
  it('basic', () => {
30
- assert.deepStrictEqual(inspect(parser('==a==')), [['<mark>a</mark>'], '']);
31
- assert.deepStrictEqual(inspect(parser('==a=b==')), [['<mark>a=b</mark>'], '']);
32
- assert.deepStrictEqual(inspect(parser('==a\nb==')), [['<mark>a<br>b</mark>'], '']);
33
- assert.deepStrictEqual(inspect(parser('==a\\\nb==')), [['<mark>a<span class="linebreak"> </span>b</mark>'], '']);
34
- assert.deepStrictEqual(inspect(parser('==\\===')), [['<mark>=</mark>'], '']);
35
- assert.deepStrictEqual(inspect(parser('==a===')), [['<mark>a</mark>'], '=']);
32
+ assert.deepStrictEqual(inspect(parser('==a==')), [['<mark id="mark:a">a</mark>', '<a href="#mark:a"></a>'], '']);
33
+ assert.deepStrictEqual(inspect(parser('==a=b==')), [['<mark id="mark:a=b">a=b</mark>', '<a href="#mark:a=b"></a>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('==\\===')), [['<mark id="mark:=">=</mark>', '<a href="#mark:="></a>'], '']);
35
+ assert.deepStrictEqual(inspect(parser('==a===')), [['<mark id="mark:a">a</mark>', '<a href="#mark:a"></a>'], '=']);
36
36
  });
37
37
 
38
38
  it('nest', () => {
39
- assert.deepStrictEqual(inspect(parser('==a ==b====')), [['<mark>a <mark>b</mark></mark>'], '']);
40
- assert.deepStrictEqual(inspect(parser('==a\\ ==b====')), [['<mark>a <mark>b</mark></mark>'], '']);
41
- assert.deepStrictEqual(inspect(parser('==a&Tab;==b====')), [['<mark>a\t<mark>b</mark></mark>'], '']);
42
- assert.deepStrictEqual(inspect(parser('==a<wbr>==b====')), [['<mark>a<wbr><mark>b</mark></mark>'], '']);
43
- assert.deepStrictEqual(inspect(parser('==_==a==_==')), [['<mark><em><mark>a</mark></em></mark>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('==a ==b====')), [['<mark id="mark:a_b">a <mark id="mark:b">b</mark><a href="#mark:b"></a></mark>', '<a href="#mark:a_b"></a>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('==a\\ ==b====')), [['<mark id="mark:a_b">a <mark id="mark:b">b</mark><a href="#mark:b"></a></mark>', '<a href="#mark:a_b"></a>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('==a&Tab;==b====')), [['<mark id="mark:a_b">a\t<mark id="mark:b">b</mark><a href="#mark:b"></a></mark>', '<a href="#mark:a_b"></a>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('==a<wbr>==b====')), [['<mark id="mark:ab">a<wbr><mark id="mark:b">b</mark><a href="#mark:b"></a></mark>', '<a href="#mark:ab"></a>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('==_==a==_==')), [['<mark id="mark:a"><em><mark id="mark:a">a</mark><a href="#mark:a"></a></em></mark>', '<a href="#mark:a"></a>'], '']);
44
44
  });
45
45
 
46
46
  });