securemark 0.263.1 → 0.265.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 (59) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/index.js +1218 -3058
  3. package/markdown.d.ts +1 -1
  4. package/package.json +18 -18
  5. package/src/combinator/data/parser/context.ts +3 -2
  6. package/src/combinator/data/parser/some.ts +2 -1
  7. package/src/parser/api/bind.test.ts +1 -1
  8. package/src/parser/api/normalize.ts +1 -1
  9. package/src/parser/api/parse.test.ts +3 -3
  10. package/src/parser/block/blockquote.test.ts +3 -3
  11. package/src/parser/block/blockquote.ts +1 -1
  12. package/src/parser/block/dlist.ts +2 -3
  13. package/src/parser/block/extension/aside.ts +0 -2
  14. package/src/parser/block/extension/example.test.ts +1 -1
  15. package/src/parser/block/extension/fig.ts +2 -1
  16. package/src/parser/block/extension/figure.test.ts +2 -2
  17. package/src/parser/block/extension/figure.ts +2 -3
  18. package/src/parser/block/extension/table.ts +2 -3
  19. package/src/parser/block/heading.test.ts +1 -1
  20. package/src/parser/block/olist.test.ts +27 -25
  21. package/src/parser/block/paragraph.test.ts +1 -1
  22. package/src/parser/block/paragraph.ts +2 -3
  23. package/src/parser/block/reply.ts +2 -3
  24. package/src/parser/block/sidefence.ts +1 -1
  25. package/src/parser/block/ulist.test.ts +23 -23
  26. package/src/parser/context.ts +15 -19
  27. package/src/parser/inline/annotation.ts +1 -1
  28. package/src/parser/inline/bracket.test.ts +1 -1
  29. package/src/parser/inline/bracket.ts +1 -1
  30. package/src/parser/inline/deletion.test.ts +2 -2
  31. package/src/parser/inline/emphasis.test.ts +2 -2
  32. package/src/parser/inline/emphasis.ts +2 -2
  33. package/src/parser/inline/extension/index.test.ts +28 -32
  34. package/src/parser/inline/extension/index.ts +1 -1
  35. package/src/parser/inline/extension/indexee.ts +23 -15
  36. package/src/parser/inline/extension/placeholder.test.ts +10 -12
  37. package/src/parser/inline/extension/placeholder.ts +7 -7
  38. package/src/parser/inline/html.test.ts +1 -1
  39. package/src/parser/inline/html.ts +2 -2
  40. package/src/parser/inline/insertion.test.ts +2 -2
  41. package/src/parser/inline/link.test.ts +32 -27
  42. package/src/parser/inline/link.ts +52 -56
  43. package/src/parser/inline/mark.test.ts +11 -11
  44. package/src/parser/inline/mark.ts +12 -6
  45. package/src/parser/inline/strong.test.ts +2 -2
  46. package/src/parser/inline/strong.ts +2 -2
  47. package/src/parser/inline.test.ts +11 -9
  48. package/src/parser/processor/figure.ts +0 -2
  49. package/src/parser/processor/footnote.ts +0 -4
  50. package/src/parser/source/escapable.test.ts +1 -1
  51. package/src/parser/source/escapable.ts +7 -1
  52. package/src/parser/source/text.test.ts +24 -35
  53. package/src/parser/source/text.ts +2 -15
  54. package/src/parser/visibility.ts +1 -6
  55. package/src/util/toc.ts +0 -2
  56. package/src/parser/locale/ja.test.ts +0 -14
  57. package/src/parser/locale/ja.ts +0 -3
  58. package/src/parser/locale.test.ts +0 -26
  59. package/src/parser/locale.ts +0 -61
@@ -28,51 +28,51 @@ describe('Unit: parser/block/ulist', () => {
28
28
  // filled
29
29
  assert.deepStrictEqual(inspect(parser('- \\')), [['<ul><li></li></ul>'], '']);
30
30
  assert.deepStrictEqual(inspect(parser('- \\\n')), [['<ul><li></li></ul>'], '']);
31
- assert.deepStrictEqual(inspect(parser('- -')), [['<ul><li>-</li></ul>'], '']);
32
- assert.deepStrictEqual(inspect(parser('- -\n')), [['<ul><li>-</li></ul>'], '']);
31
+ assert.deepStrictEqual(inspect(parser('- -')), [['<ul><li id="index:-">-</li></ul>'], '']);
32
+ assert.deepStrictEqual(inspect(parser('- -\n')), [['<ul><li id="index:-">-</li></ul>'], '']);
33
33
  });
34
34
 
35
35
  it('multiple', () => {
36
36
  // pending
37
37
  assert.deepStrictEqual(inspect(parser('-\n-')), [['<ul><li></li><li></li></ul>'], '']);
38
38
  // filled
39
- assert.deepStrictEqual(inspect(parser('- 1\n- 2')), [['<ul><li>1</li><li>2</li></ul>'], '']);
40
- assert.deepStrictEqual(inspect(parser('- 1\n- 2\n- 3')), [['<ul><li>1</li><li>2</li><li>3</li></ul>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('- 1\n- 2')), [['<ul><li id="index:1">1</li><li id="index:2">2</li></ul>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('- 1\n- 2\n- 3')), [['<ul><li id="index:1">1</li><li id="index:2">2</li><li id="index:3">3</li></ul>'], '']);
41
41
  // invalid
42
- assert.deepStrictEqual(inspect(parser('-\n+')), [['<ul><li></li><li><span class="invalid">+</span></li></ul>'], '']);
43
- assert.deepStrictEqual(inspect(parser('-\n0')), [['<ul><li></li><li><span class="invalid">0</span></li></ul>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('-\n+')), [['<ul><li></li><li id="index:+"><span class="invalid">+</span></li></ul>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('-\n0')), [['<ul><li></li><li id="index:0"><span class="invalid">0</span></li></ul>'], '']);
44
44
  });
45
45
 
46
46
  it('nest', () => {
47
47
  assert.deepStrictEqual(inspect(parser('-\n -')), [['<ul><li><br><ul><li></li></ul></li></ul>'], '']);
48
- assert.deepStrictEqual(inspect(parser('- 1\n - 2')), [['<ul><li>1<ul><li>2</li></ul></li></ul>'], '']);
49
- assert.deepStrictEqual(inspect(parser('- 1\n - 2\n- 3')), [['<ul><li>1<ul><li>2</li></ul></li><li>3</li></ul>'], '']);
50
- assert.deepStrictEqual(inspect(parser('- 1\n - 2\n - 3')), [['<ul><li>1<ul><li>2</li><li>3</li></ul></li></ul>'], '']);
51
- assert.deepStrictEqual(inspect(parser('- 1\n - 2\n - 3')), [['<ul><li>1<ul><li>2<ul><li>3</li></ul></li></ul></li></ul>'], '']);
52
- assert.deepStrictEqual(inspect(parser('- 1\n - 2\n - 3')), [['<ul><li>1<ul><li>2</li></ul></li><li><span class="invalid"> - 3</span></li></ul>'], '']);
53
- assert.deepStrictEqual(inspect(parser('-\n -\n +\n -\n +\n+')), [['<ul><li><br><ul><li></li><li><span class="invalid">+</span></li><li></li><li><span class="invalid">+</span></li></ul></li><li><span class="invalid">+</span></li></ul>'], '']);
54
- assert.deepStrictEqual(inspect(parser('- 1\n + 2')), [['<ul><li>1<ul class="invalid"><li>2</li></ul></li></ul>'], '']);
55
- assert.deepStrictEqual(inspect(parser('- 1\n 0')), [['<ul><li>1<ol><li></li></ol></li></ul>'], '']);
56
- assert.deepStrictEqual(inspect(parser('- 1\n 0.')), [['<ul><li>1<ol><li></li></ol></li></ul>'], '']);
57
- assert.deepStrictEqual(inspect(parser('- 1\n 0. ')), [['<ul><li>1<ol><li></li></ol></li></ul>'], '']);
58
- assert.deepStrictEqual(inspect(parser('- 1\n 0. 2')), [['<ul><li>1<ol><li>2</li></ol></li></ul>'], '']);
59
- assert.deepStrictEqual(inspect(parser('- !http://host')), [['<ul><li>!<a class="url" href="http://host" target="_blank">http://host</a></li></ul>'], '']);
48
+ assert.deepStrictEqual(inspect(parser('- 1\n - 2')), [['<ul><li id="index:1">1<ul><li id="index:2">2</li></ul></li></ul>'], '']);
49
+ assert.deepStrictEqual(inspect(parser('- 1\n - 2\n- 3')), [['<ul><li id="index:1">1<ul><li id="index:2">2</li></ul></li><li id="index:3">3</li></ul>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('- 1\n - 2\n - 3')), [['<ul><li id="index:1">1<ul><li id="index:2">2</li><li id="index:3">3</li></ul></li></ul>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('- 1\n - 2\n - 3')), [['<ul><li id="index:1">1<ul><li id="index:2">2<ul><li id="index:3">3</li></ul></li></ul></li></ul>'], '']);
52
+ assert.deepStrictEqual(inspect(parser('- 1\n - 2\n - 3')), [['<ul><li id="index:1">1<ul><li id="index:2">2</li></ul></li><li id="index:-_3"><span class="invalid"> - 3</span></li></ul>'], '']);
53
+ assert.deepStrictEqual(inspect(parser('-\n -\n +\n -\n +\n+')), [['<ul><li><br><ul><li></li><li id="index:+"><span class="invalid">+</span></li><li></li><li id="index:+"><span class="invalid">+</span></li></ul></li><li id="index:+"><span class="invalid">+</span></li></ul>'], '']);
54
+ assert.deepStrictEqual(inspect(parser('- 1\n + 2')), [['<ul><li id="index:1">1<ul class="invalid"><li>2</li></ul></li></ul>'], '']);
55
+ assert.deepStrictEqual(inspect(parser('- 1\n 0')), [['<ul><li id="index:1">1<ol><li></li></ol></li></ul>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('- 1\n 0.')), [['<ul><li id="index:1">1<ol><li></li></ol></li></ul>'], '']);
57
+ assert.deepStrictEqual(inspect(parser('- 1\n 0. ')), [['<ul><li id="index:1">1<ol><li></li></ol></li></ul>'], '']);
58
+ assert.deepStrictEqual(inspect(parser('- 1\n 0. 2')), [['<ul><li id="index:1">1<ol><li id="index:2">2</li></ol></li></ul>'], '']);
59
+ assert.deepStrictEqual(inspect(parser('- !http://host')), [['<ul><li id="index:!http://host">!<a class="url" href="http://host" target="_blank">http://host</a></li></ul>'], '']);
60
60
  });
61
61
 
62
62
  it('checkbox', () => {
63
63
  assert.deepStrictEqual(inspect(parser('- [ ]')), [['<ul class="checklist"><li><span class="checkbox">☐</span></li></ul>'], '']);
64
64
  assert.deepStrictEqual(inspect(parser('- [x]')), [['<ul class="checklist"><li><span class="checkbox">☑</span></li></ul>'], '']);
65
65
  assert.deepStrictEqual(inspect(parser('- [X]')), [['<ul class="checklist"><li><span class="checkbox">☑</span></li></ul>'], '']);
66
- assert.deepStrictEqual(inspect(parser('- [X] 1')), [['<ul class="checklist"><li><span class="checkbox">☑</span>1</li></ul>'], '']);
66
+ assert.deepStrictEqual(inspect(parser('- [X] 1')), [['<ul class="checklist"><li id="index:1"><span class="checkbox">☑</span>1</li></ul>'], '']);
67
67
  });
68
68
 
69
69
  it('indexer', () => {
70
- assert.deepStrictEqual(inspect(parser('- [#a]')), [['<ul><li><a class="index" href="#index:a">a</a></li></ul>'], '']);
71
- assert.deepStrictEqual(inspect(parser('- a [#]')), [['<ul><li id="index:a">a<span class="indexer" data-index=""></span></li></ul>'], '']);
70
+ assert.deepStrictEqual(inspect(parser('- [#a]')), [['<ul><li id="index:a"><a class="index" href="#index:a">a</a></li></ul>'], '']);
71
+ assert.deepStrictEqual(inspect(parser('- a [#]')), [['<ul><li>a<span class="indexer" data-index=""></span></li></ul>'], '']);
72
72
  assert.deepStrictEqual(inspect(parser('- a [#b]')), [['<ul><li id="index:b">a<span class="indexer" data-index="b"></span></li></ul>'], '']);
73
- assert.deepStrictEqual(inspect(parser('- [ ] [#a]')), [['<ul class="checklist"><li><span class="checkbox">☐</span><a class="index" href="#index:a">a</a></li></ul>'], '']);
73
+ assert.deepStrictEqual(inspect(parser('- [ ] [#a]')), [['<ul class="checklist"><li id="index:a"><span class="checkbox">☐</span><a class="index" href="#index:a">a</a></li></ul>'], '']);
74
74
  assert.deepStrictEqual(inspect(parser('- [ ] a [#b]')), [['<ul class="checklist"><li id="index:b"><span class="checkbox">☐</span>a<span class="indexer" data-index="b"></span></li></ul>'], '']);
75
- assert.deepStrictEqual(inspect(parser('- a [#]\n - c [#d]')), [['<ul><li id="index:a">a<span class="indexer" data-index=""></span><ul><li id="index:d">c<span class="indexer" data-index="d"></span></li></ul></li></ul>'], '']);
75
+ assert.deepStrictEqual(inspect(parser('- a [#]\n - c [#d]')), [['<ul><li>a<span class="indexer" data-index=""></span><ul><li id="index:d">c<span class="indexer" data-index="d"></span></li></ul></li></ul>'], '']);
76
76
  assert.deepStrictEqual(inspect(parser('- a [#b]\n - c [#d]')), [['<ul><li id="index:b">a<span class="indexer" data-index="b"></span><ul><li id="index:d">c<span class="indexer" data-index="d"></span></li></ul></li></ul>'], '']);
77
77
  });
78
78
 
@@ -1,28 +1,23 @@
1
1
  export const enum Syntax {
2
- reference = 1 << 13,
3
- comment = 1 << 12,
4
- index = 1 << 11,
5
- placeholder = 1 << 10,
6
- ruby = 1 << 9,
7
- link = 1 << 8,
8
- bracket = 1 << 7,
9
- media = 1 << 6,
10
- annotation = 1 << 5,
11
- mathbracket = 1 << 4,
12
- html = 1 << 3,
13
- math = 1 << 2,
2
+ reference = 1 << 8,
3
+ index = 1 << 7,
4
+ placeholder = 1 << 6,
5
+ ruby = 1 << 5,
6
+ link = 1 << 4,
7
+ bracket = 1 << 3,
8
+ media = 1 << 2,
14
9
  autolink = 1 << 1,
15
- quote = 1 << 0,
16
10
  none = 0,
17
11
  }
18
12
 
19
13
  export const enum State {
20
- annotation = 1 << 7,
21
- reference = 1 << 6,
22
- index = 1 << 5,
23
- label = 1 << 4,
24
- link = 1 << 3,
25
- media = 1 << 2,
14
+ annotation = 1 << 8,
15
+ reference = 1 << 7,
16
+ index = 1 << 6,
17
+ label = 1 << 5,
18
+ link = 1 << 4,
19
+ media = 1 << 3,
20
+ mark = 1 << 2,
26
21
  autolink = 1 << 1,
27
22
  shortcut = 1 << 0,
28
23
  none = 0,
@@ -33,6 +28,7 @@ export const enum State {
33
28
  | State.index
34
29
  | State.label
35
30
  | State.link
31
+ | State.mark
36
32
  | State.autolink,
37
33
  backtrackers = 0
38
34
  | State.annotation
@@ -8,7 +8,7 @@ import { html, defrag } from 'typed-dom/dom';
8
8
  export const annotation: AnnotationParser = lazy(() => surround(
9
9
  '((',
10
10
  constraint(State.annotation, false,
11
- syntax(Syntax.annotation, 6, 1, State.annotation | State.media,
11
+ syntax(Syntax.none, 6, 1, State.annotation | State.media,
12
12
  startLoose(
13
13
  context({ delimiters: undefined },
14
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
  });
@@ -24,7 +24,7 @@ export const bracket: BracketParser = lazy(() => union([
24
24
  undefined,
25
25
  ([as, bs = []], rest) => [unshift(as, bs), rest]),
26
26
  // Control media blinking in editing rather than control confusion of pairs of quote marks.
27
- 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,
28
28
  undefined,
29
29
  ([as, bs = []], rest) => [unshift(as, bs), rest]),
30
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
  });
@@ -32,7 +32,7 @@ export const index: IndexParser = lazy(() => validate('[#', fmap(indexee(surroun
32
32
  ])));
33
33
 
34
34
  const signature: IndexParser.SignatureParser = lazy(() => creation(fmap(open(
35
- '|#',
35
+ '|',
36
36
  startTight(some(union([bracket, txt]), ']'))),
37
37
  ns => [
38
38
  html('span', { class: 'indexer', 'data-index': identity(ns.join('')).slice(6) }),
@@ -8,33 +8,43 @@ export function indexee(parser: Parser<HTMLElement, MarkdownParser.Context>, opt
8
8
  return fmap(parser, ([el], _, { id }) => [define(el, { id: id !== '' && identity(text(el, optional)) || undefined })]);
9
9
  }
10
10
 
11
- export function identity(text: string): string {
11
+ export function identity(text: string, name: 'index' | 'mark' = 'index'): string {
12
12
  assert(!text.includes('\n'));
13
- text &&= text.trim();
14
- 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
+ }
15
21
  }
16
- assert(identity('0'.repeat(100)).slice(6) === '0'.repeat(100));
17
- assert(identity('0'.repeat(101)).slice(6) === '0'.repeat(97) + '...');
18
- 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);
19
28
 
20
29
  export function text(source: HTMLElement | DocumentFragment, optional = false): string {
21
30
  assert(source instanceof DocumentFragment || !source.matches('.indexer'));
22
31
  assert(source.querySelectorAll(':scope > .indexer').length <= 1);
23
32
  const indexer = source.querySelector(':scope > .indexer');
24
- if (!indexer && optional) return '';
25
33
  const index = indexer?.getAttribute('data-index');
26
34
  if (index) return index;
27
- assert(!source.querySelector('.annotation, br'));
35
+ if (index === '' && optional) return '';
36
+ assert(!navigator.userAgent.includes('Chrome') || !source.querySelector('br:not(:has(+ :is(ul, ol)))'));
28
37
  const target = source.cloneNode(true) as typeof source;
29
- 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'),
30
39
  len = es.length, i = 0; i < len; ++i) {
31
40
  const el = es[i];
32
41
  switch (el.tagName) {
33
42
  case 'CODE':
34
- define(el, el.getAttribute('data-src')!);
43
+ el.replaceWith(el.getAttribute('data-src')!);
35
44
  continue;
36
45
  case 'RT':
37
46
  case 'RP':
47
+ case 'BR':
38
48
  case 'UL':
39
49
  case 'OL':
40
50
  el.remove();
@@ -42,15 +52,13 @@ export function text(source: HTMLElement | DocumentFragment, optional = false):
42
52
  }
43
53
  switch (el.className) {
44
54
  case 'math':
45
- define(el, el.getAttribute('data-src')!);
55
+ el.replaceWith(el.getAttribute('data-src')!);
46
56
  continue;
47
57
  case 'comment':
48
58
  case 'checkbox':
49
- el.remove();
50
- continue;
59
+ case 'annotation':
51
60
  case 'reference':
52
- assert(el.firstElementChild?.hasAttribute('hidden'));
53
- el.firstChild!.remove();
61
+ el.remove();
54
62
  continue;
55
63
  }
56
64
  }
@@ -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>'], '']);
@@ -5,7 +5,7 @@ import { str } from '../source';
5
5
  import { Syntax, State } from '../context';
6
6
  import { isStartLooseNodes, blankWith } from '../visibility';
7
7
  import { memoize } from 'spica/memoize';
8
- import { Cache } from 'spica/cache';
8
+ import { Clock } from 'spica/clock';
9
9
  import { unshift, push, splice } from 'spica/array';
10
10
  import { html as h, defrag } from 'typed-dom/dom';
11
11
 
@@ -59,7 +59,7 @@ export const html: HTMLParser = lazy(() => validate('<', validate(/^<[a-z]+(?=[^
59
59
  ([as, bs = []], rest) =>
60
60
  [[elem(tag, as, bs, [])], rest]),
61
61
  ([, tag]) => tag,
62
- new Cache(10000))),
62
+ new Clock(10000))),
63
63
  ])))));
64
64
 
65
65
  export const attribute: HTMLParser.AttributeParser = union([
@@ -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
  });