securemark 0.276.4 → 0.277.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 (36) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +12 -12
  3. package/design.md +4 -0
  4. package/dist/index.js +80 -46
  5. package/markdown.d.ts +25 -8
  6. package/package.json +3 -3
  7. package/src/parser/api/parse.test.ts +2 -2
  8. package/src/parser/block/dlist.test.ts +1 -1
  9. package/src/parser/block/extension/fig.test.ts +1 -1
  10. package/src/parser/block/heading.test.ts +2 -2
  11. package/src/parser/block/paragraph.test.ts +12 -9
  12. package/src/parser/inline/autolink/email.test.ts +0 -3
  13. package/src/parser/inline/autolink/hashnum.test.ts +4 -4
  14. package/src/parser/inline/autolink/hashnum.ts +1 -1
  15. package/src/parser/inline/autolink/hashtag.test.ts +8 -7
  16. package/src/parser/inline/autolink/hashtag.ts +2 -2
  17. package/src/parser/inline/autolink.ts +5 -12
  18. package/src/parser/inline/deletion.test.ts +2 -2
  19. package/src/parser/inline/emphasis.test.ts +35 -26
  20. package/src/parser/inline/emphasis.ts +11 -4
  21. package/src/parser/inline/emstrong.ts +62 -0
  22. package/src/parser/inline/extension/index.test.ts +6 -6
  23. package/src/parser/inline/extension/indexee.ts +4 -4
  24. package/src/parser/inline/extension/placeholder.test.ts +4 -4
  25. package/src/parser/inline/insertion.test.ts +2 -2
  26. package/src/parser/inline/link.test.ts +1 -1
  27. package/src/parser/inline/mark.test.ts +1 -1
  28. package/src/parser/inline/{comment.test.ts → remark.test.ts} +26 -26
  29. package/src/parser/inline/{comment.ts → remark.ts} +3 -3
  30. package/src/parser/inline/strong.test.ts +32 -25
  31. package/src/parser/inline/strong.ts +8 -4
  32. package/src/parser/inline.test.ts +102 -22
  33. package/src/parser/inline.ts +6 -3
  34. package/src/parser/processor/note.ts +7 -9
  35. package/src/parser/source/text.test.ts +0 -1
  36. package/src/parser/source/text.ts +0 -1
@@ -7,37 +7,44 @@ describe('Unit: parser/inline/strong', () => {
7
7
  const parser = (source: string) => some(strong)({ source, context: {} });
8
8
 
9
9
  it('invalid', () => {
10
- assert.deepStrictEqual(inspect(parser('*')), undefined);
11
- assert.deepStrictEqual(inspect(parser('*a')), [['*', 'a'], '']);
12
- assert.deepStrictEqual(inspect(parser('*a *')), [['*', 'a'], ' *']);
13
- assert.deepStrictEqual(inspect(parser('*a *')), [['*', 'a', ' '], ' *']);
14
- assert.deepStrictEqual(inspect(parser('*a\n*')), [['*', 'a'], '\n*']);
15
- assert.deepStrictEqual(inspect(parser('*a\nb*')), [['*', 'a'], '\nb*']);
16
- assert.deepStrictEqual(inspect(parser('*a\\ *')), [['*', 'a'], '\\ *']);
17
- assert.deepStrictEqual(inspect(parser('*a\\\n*')), [['*', 'a'], '\\\n*']);
18
- assert.deepStrictEqual(inspect(parser('*a\\\nb*')), [['*', 'a'], '\\\nb*']);
19
- assert.deepStrictEqual(inspect(parser('* *')), undefined);
20
- assert.deepStrictEqual(inspect(parser('* a*')), undefined);
21
- assert.deepStrictEqual(inspect(parser('* a *')), undefined);
22
- assert.deepStrictEqual(inspect(parser('*\n*')), undefined);
23
- assert.deepStrictEqual(inspect(parser('*\na*')), undefined);
24
- assert.deepStrictEqual(inspect(parser('*\\ a*')), undefined);
25
- assert.deepStrictEqual(inspect(parser('*\\\na*')), undefined);
26
- assert.deepStrictEqual(inspect(parser('*<wbr>a*')), undefined);
27
- assert.deepStrictEqual(inspect(parser(' *a*')), undefined);
10
+ assert.deepStrictEqual(inspect(parser('**')), undefined);
11
+ assert.deepStrictEqual(inspect(parser('**a')), [['**', 'a'], '']);
12
+ assert.deepStrictEqual(inspect(parser('**a **')), [['**', 'a'], ' **']);
13
+ assert.deepStrictEqual(inspect(parser('**a **')), [['**', 'a', ' '], ' **']);
14
+ assert.deepStrictEqual(inspect(parser('**a\n**')), [['**', 'a'], '\n**']);
15
+ assert.deepStrictEqual(inspect(parser('**a\nb**')), [['**', 'a'], '\nb**']);
16
+ assert.deepStrictEqual(inspect(parser('**a\\ **')), [['**', 'a'], '\\ **']);
17
+ assert.deepStrictEqual(inspect(parser('**a\\\n**')), [['**', 'a'], '\\\n**']);
18
+ assert.deepStrictEqual(inspect(parser('**a\\\nb**')), [['**', 'a'], '\\\nb**']);
19
+ assert.deepStrictEqual(inspect(parser('**a*')), [['**', 'a', '*'], '']);
20
+ assert.deepStrictEqual(inspect(parser('**a*b**')), [['**', 'a', '<em>b</em>', '*'], '']);
21
+ assert.deepStrictEqual(inspect(parser('** **')), undefined);
22
+ assert.deepStrictEqual(inspect(parser('** a**')), undefined);
23
+ assert.deepStrictEqual(inspect(parser('** a **')), undefined);
24
+ assert.deepStrictEqual(inspect(parser('**\n**')), undefined);
25
+ assert.deepStrictEqual(inspect(parser('**\na**')), undefined);
26
+ assert.deepStrictEqual(inspect(parser('**\\ a**')), undefined);
27
+ assert.deepStrictEqual(inspect(parser('**\\\na**')), undefined);
28
+ assert.deepStrictEqual(inspect(parser('**<wbr>a**')), undefined);
29
+ assert.deepStrictEqual(inspect(parser('***a***')), undefined);
30
+ assert.deepStrictEqual(inspect(parser(' **a**')), undefined);
28
31
  });
29
32
 
30
33
  it('basic', () => {
31
- assert.deepStrictEqual(inspect(parser('*a*')), [['<strong>a</strong>'], '']);
32
- assert.deepStrictEqual(inspect(parser('*ab*')), [['<strong>ab</strong>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('**a**')), [['<strong>a</strong>'], '']);
35
+ assert.deepStrictEqual(inspect(parser('**ab**')), [['<strong>ab</strong>'], '']);
33
36
  });
34
37
 
35
38
  it('nest', () => {
36
- assert.deepStrictEqual(inspect(parser('*a _b_*')), [['<strong>a <em>b</em></strong>'], '']);
37
- assert.deepStrictEqual(inspect(parser('*a *b**')), [['<strong>a <strong>b</strong></strong>'], '']);
38
- assert.deepStrictEqual(inspect(parser('*a&Tab;*b**')), [['<strong>a\t<strong>b</strong></strong>'], '']);
39
- assert.deepStrictEqual(inspect(parser('*a<wbr>*b**')), [['<strong>a<wbr><strong>b</strong></strong>'], '']);
40
- assert.deepStrictEqual(inspect(parser('*(*a*)*')), [['<strong><span class="paren">(<strong>a</strong>)</span></strong>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('**a *b***')), [['<strong>a <em>b</em></strong>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('**a **b****')), [['<strong>a <strong>b</strong></strong>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('**a&Tab;**b****')), [['<strong>a\t<strong>b</strong></strong>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('**a<wbr>**b****')), [['<strong>a<wbr><strong>b</strong></strong>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('**a*b*c**')), [['<strong>a<em>b</em>c</strong>'], '']);
44
+ assert.deepStrictEqual(inspect(parser('**a*b*c**d')), [['<strong>a<em>b</em>c</strong>'], 'd']);
45
+ assert.deepStrictEqual(inspect(parser('**`a`**')), [['<strong><code data-src="`a`">a</code></strong>'], '']);
46
+ assert.deepStrictEqual(inspect(parser('**(*a*)**')), [['<strong><span class="paren">(<em>a</em>)</span></strong>'], '']);
47
+ assert.deepStrictEqual(inspect(parser('**(**a**)**')), [['<strong><span class="paren">(<strong>a</strong>)</span></strong>'], '']);
41
48
  });
42
49
 
43
50
  });
@@ -1,6 +1,7 @@
1
1
  import { StrongParser } from '../inline';
2
2
  import { union, some, syntax, surround, open, lazy } from '../../combinator';
3
3
  import { inline } from '../inline';
4
+ import { emstrong } from './emstrong';
4
5
  import { str } from '../source';
5
6
  import { Syntax, State } from '../context';
6
7
  import { startTight, blankWith } from '../visibility';
@@ -8,12 +9,15 @@ import { unshift } from 'spica/array';
8
9
  import { html, defrag } from 'typed-dom/dom';
9
10
 
10
11
  export const strong: StrongParser = lazy(() => surround(
11
- str('*', '*'),
12
+ str('**', '*'),
12
13
  syntax(Syntax.none, 1, 1, State.none,
13
14
  startTight(some(union([
14
- some(inline, blankWith('*'), [[/^\\?\n/, 9]]),
15
- open(some(inline, '*', [[/^\\?\n/, 9]]), strong),
15
+ some(inline, blankWith('**'), [[/^\\?\n/, 9]]),
16
+ open(some(inline, '*', [[/^\\?\n/, 9]]), union([
17
+ emstrong,
18
+ strong,
19
+ ])),
16
20
  ])))),
17
- str('*'), false,
21
+ str('**'), false,
18
22
  ([, bs], rest) => [[html('strong', defrag(bs))], rest],
19
23
  ([as, bs], rest) => [unshift(as, bs), rest]));
@@ -21,14 +21,91 @@ describe('Unit: parser/inline', () => {
21
21
  assert.deepStrictEqual(inspect(parser('+++a+++')), [['+++', 'a', '+++'], '']);
22
22
  assert.deepStrictEqual(inspect(parser('~~~a~~~')), [['~~~', 'a', '~~~'], '']);
23
23
  assert.deepStrictEqual(inspect(parser('===a===')), [['===', 'a', '==='], '']);
24
- assert.deepStrictEqual(inspect(parser('__a__')), [['__', 'a', '__'], '']);
25
- assert.deepStrictEqual(inspect(parser('___a___')), [['___', 'a', '___'], '']);
26
- assert.deepStrictEqual(inspect(parser('a_b_c')), [['a', '<em>b</em>', 'c'], '']);
27
- assert.deepStrictEqual(inspect(parser('**a**')), [['**', 'a', '**'], '']);
28
- assert.deepStrictEqual(inspect(parser('***a***')), [['***', 'a', '***'], '']);
24
+ assert.deepStrictEqual(inspect(parser('* a*')), [['*', ' ', 'a', '*'], '']);
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**')), [['<em>a</em>', '*'], '']);
29
+ assert.deepStrictEqual(inspect(parser('*a**b')), [['*', 'a', '**', 'b'], '']);
30
+ assert.deepStrictEqual(inspect(parser('*a**b*')), [['*', 'a', '**', 'b', '*'], '']);
31
+ assert.deepStrictEqual(inspect(parser('*a**b*c')), [['*', 'a', '**', 'b', '*', 'c'], '']);
32
+ assert.deepStrictEqual(inspect(parser('*a**b*c*')), [['*', 'a', '**', 'b', '<em>c</em>'], '']);
33
+ assert.deepStrictEqual(inspect(parser('*a**b**')), [['*', 'a', '<strong>b</strong>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('*a**b**c')), [['*', 'a', '<strong>b</strong>', 'c'], '']);
35
+ assert.deepStrictEqual(inspect(parser('*a**b***')), [['<em>a<strong>b</strong></em>'], '']);
36
+ assert.deepStrictEqual(inspect(parser('*a**b***c')), [['<em>a<strong>b</strong></em>', 'c'], '']);
37
+ assert.deepStrictEqual(inspect(parser('*a**b****')), [['<em>a<strong>b</strong></em>', '*'], '']);
38
+ assert.deepStrictEqual(inspect(parser('*a**b****c')), [['*', 'a', '<strong>b</strong>', '**', 'c'], '']);
39
+ assert.deepStrictEqual(inspect(parser('*a***b****')), [['<em>a</em>', '<strong>b</strong>', '**'], '']);
40
+ assert.deepStrictEqual(inspect(parser('*a***b****c')), [['<em>a</em>', '<strong>b</strong>', '**', 'c'], '']);
41
+ assert.deepStrictEqual(inspect(parser('*a *b**')), [['<em>a <em>b</em></em>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('*a *b**c')), [['*', 'a', ' ', '*', 'b', '**', 'c'], '']);
43
+ assert.deepStrictEqual(inspect(parser('*a **b***')), [['<em>a <strong>b</strong></em>'], '']);
44
+ assert.deepStrictEqual(inspect(parser('*a **b***c')), [['<em>a <strong>b</strong></em>', 'c'], '']);
45
+ assert.deepStrictEqual(inspect(parser('*a ***b****')), [['<em>a <em><strong>b</strong></em></em>'], '']);
46
+ assert.deepStrictEqual(inspect(parser('*a ***b****c')), [['<em>a <em><strong>b</strong></em></em>', 'c'], '']);
47
+ assert.deepStrictEqual(inspect(parser('**a*')), [['**', 'a', '*'], '']);
48
+ assert.deepStrictEqual(inspect(parser('**a*b**')), [['**', 'a', '<em>b</em>', '*'], '']);
49
+ assert.deepStrictEqual(inspect(parser('**a*b**c')), [['**', 'a', '*', 'b', '**', 'c'], '']);
50
+ assert.deepStrictEqual(inspect(parser('**a*b***')), [['<strong>a<em>b</em></strong>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('**a*b***c')), [['<strong>a<em>b</em></strong>', 'c'], '']);
52
+ assert.deepStrictEqual(inspect(parser('**a**b****')), [['<strong>a</strong>', 'b', '****'], '']);
53
+ assert.deepStrictEqual(inspect(parser('**a**b****c')), [['<strong>a</strong>', 'b', '****', 'c'], '']);
54
+ assert.deepStrictEqual(inspect(parser('**a***b*****')), [['<strong>a</strong>', '<em>b</em>', '****'], '']);
55
+ assert.deepStrictEqual(inspect(parser('**a***b*****c')), [['<strong>a</strong>', '<em>b</em>', '****', 'c'], '']);
56
+ assert.deepStrictEqual(inspect(parser('**a *b***')), [['<strong>a <em>b</em></strong>'], '']);
57
+ assert.deepStrictEqual(inspect(parser('**a *b***c')), [['<strong>a <em>b</em></strong>', 'c'], '']);
58
+ assert.deepStrictEqual(inspect(parser('**a **b****')), [['<strong>a <strong>b</strong></strong>'], '']);
59
+ assert.deepStrictEqual(inspect(parser('**a **b****c')), [['<strong>a <strong>b</strong></strong>', 'c'], '']);
60
+ assert.deepStrictEqual(inspect(parser('**a ***b*****')), [['<strong>a <em><strong>b</strong></em></strong>'], '']);
61
+ assert.deepStrictEqual(inspect(parser('**a ***b*****c')), [['<strong>a <em><strong>b</strong></em></strong>', 'c'], '']);
62
+ assert.deepStrictEqual(inspect(parser('***a*b**')), [['<strong><em>a</em>b</strong>'], '']);
63
+ assert.deepStrictEqual(inspect(parser('***a*b**c')), [['<strong><em>a</em>b</strong>', 'c'], '']);
64
+ assert.deepStrictEqual(inspect(parser('***a*b*c***')), [['<strong><em>a</em>b<em>c</em></strong>'], '']);
65
+ assert.deepStrictEqual(inspect(parser('***a*b*c***d')), [['<strong><em>a</em>b<em>c</em></strong>', 'd'], '']);
66
+ assert.deepStrictEqual(inspect(parser('***a*b**c****')), [['<strong><em>a</em>b</strong>', 'c', '****'], '']);
67
+ assert.deepStrictEqual(inspect(parser('***a* **b****')), [['<strong><em>a</em> <strong>b</strong></strong>'], '']);
68
+ assert.deepStrictEqual(inspect(parser('***a*\\ **b****')), [['<strong><em>a</em> <strong>b</strong></strong>'], '']);
69
+ assert.deepStrictEqual(inspect(parser('***a*&Tab;**b****')), [['<strong><em>a</em>\t<strong>b</strong></strong>'], '']);
70
+ assert.deepStrictEqual(inspect(parser('***a*<wbr>**b****')), [['<strong><em>a</em><wbr><strong>b</strong></strong>'], '']);
71
+ assert.deepStrictEqual(inspect(parser('***a *b****')), [['<em><strong>a <em>b</em></strong></em>'], '']);
72
+ assert.deepStrictEqual(inspect(parser('***a\\ *b****')), [['<em><strong>a <em>b</em></strong></em>'], '']);
73
+ assert.deepStrictEqual(inspect(parser('***a&Tab;*b****')), [['<em><strong>a\t<em>b</em></strong></em>'], '']);
74
+ assert.deepStrictEqual(inspect(parser('***a<wbr>*b****')), [['<em><strong>a<wbr><em>b</em></strong></em>'], '']);
75
+ assert.deepStrictEqual(inspect(parser('***a*b **')), [['**', '<em>a</em>', 'b', ' ', '**'], '']);
76
+ assert.deepStrictEqual(inspect(parser('***a*b\\ **')), [['**', '<em>a</em>', 'b', ' ', '**'], '']);
77
+ assert.deepStrictEqual(inspect(parser('***a**b*')), [['<em><strong>a</strong>b</em>'], '']);
78
+ assert.deepStrictEqual(inspect(parser('***a**b*c')), [['<em><strong>a</strong>b</em>', 'c'], '']);
79
+ assert.deepStrictEqual(inspect(parser('***a**b*c**')), [['<em><strong>a</strong>b</em>', 'c', '**'], '']);
80
+ assert.deepStrictEqual(inspect(parser('***a**b**c***')), [['<em><strong>a</strong>b<strong>c</strong></em>'], '']);
81
+ assert.deepStrictEqual(inspect(parser('***a**b**c***d')), [['<em><strong>a</strong>b<strong>c</strong></em>', 'd'], '']);
82
+ assert.deepStrictEqual(inspect(parser('***a** *b**')), [['<em><strong>a</strong> <em>b</em></em>'], '']);
83
+ assert.deepStrictEqual(inspect(parser('***a**\\ *b**')), [['<em><strong>a</strong> <em>b</em></em>'], '']);
84
+ assert.deepStrictEqual(inspect(parser('***a**&Tab;*b**')), [['<em><strong>a</strong>\t<em>b</em></em>'], '']);
85
+ assert.deepStrictEqual(inspect(parser('***a**<wbr>*b**')), [['<em><strong>a</strong><wbr><em>b</em></em>'], '']);
86
+ assert.deepStrictEqual(inspect(parser('***a **b*')), [['***', 'a', ' ', '**', 'b', '*'], '']);
87
+ assert.deepStrictEqual(inspect(parser('***a\\ **b*')), [['***', 'a', ' ', '**', 'b', '*'], '']);
88
+ assert.deepStrictEqual(inspect(parser('***a**b *')), [['*', '<strong>a</strong>', 'b', ' ', '*'], '']);
89
+ assert.deepStrictEqual(inspect(parser('***a**b\\ *')), [['*', '<strong>a</strong>', 'b', ' ', '*'], '']);
90
+ assert.deepStrictEqual(inspect(parser('***a*')), [['**', '<em>a</em>'], '']);
91
+ assert.deepStrictEqual(inspect(parser('***a**')), [['*', '<strong>a</strong>'], '']);
92
+ assert.deepStrictEqual(inspect(parser('***a***')), [['<em><strong>a</strong></em>'], '']);
93
+ assert.deepStrictEqual(inspect(parser('***a***b')), [['<em><strong>a</strong></em>', 'b'], '']);
94
+ assert.deepStrictEqual(inspect(parser('***a****')), [['<em><strong>a</strong></em>', '*'], '']);
95
+ assert.deepStrictEqual(inspect(parser('****a***')), [['****', 'a', '***'], '']);
96
+ assert.deepStrictEqual(inspect(parser('****a****')), [['****', 'a', '****'], '']);
97
+ assert.deepStrictEqual(inspect(parser('*(*a*)*')), [['<em><span class="paren">(<em>a</em>)</span></em>'], '']);
98
+ assert.deepStrictEqual(inspect(parser('**(**a**)**')), [['<strong><span class="paren">(<strong>a</strong>)</span></strong>'], '']);
99
+ assert.deepStrictEqual(inspect(parser('*++ ++*')), [['<em><ins> </ins></em>'], '']);
100
+ assert.deepStrictEqual(inspect(parser('*++ a ++*')), [['<em><ins> a </ins></em>'], '']);
101
+ assert.deepStrictEqual(inspect(parser('*++ a ++*')), [['<em><ins> a </ins></em>'], '']);
102
+ assert.deepStrictEqual(inspect(parser('*<bdi>`a`</bdi>*')), [['<em><bdi><code data-src="`a`">a</code></bdi></em>'], '']);
103
+ assert.deepStrictEqual(inspect(parser('<bdi>*<bdi>a</bdi>*</bdi>')), [['<bdi><em><bdi>a</bdi></em></bdi>'], '']);
104
+ assert.deepStrictEqual(inspect(parser('<bdi>((<bdi>((a))</bdi>))</bdi>')), [['<bdi><sup class="annotation"><span><bdi><span class="paren">((a))</span></bdi></span></sup></bdi>'], '']);
105
+ assert.deepStrictEqual(inspect(parser('<bdi>[[<bdi>[[a]]</bdi>]]</bdi>')), [['<bdi><sup class="reference"><span><bdi>[[a]]</bdi></span></sup></bdi>'], '']);
29
106
  assert.deepStrictEqual(inspect(parser('*[*]')), [['*', '[', '*', ']'], '']);
30
- assert.deepStrictEqual(inspect(parser('*<*>')), [['<strong>&lt;</strong>', '>'], '']);
31
- assert.deepStrictEqual(inspect(parser('*a((b))*')), [['<strong>a<sup class="annotation"><span>b</span></sup></strong>'], '']);
107
+ assert.deepStrictEqual(inspect(parser('*<*>')), [['<em>&lt;</em>', '>'], '']);
108
+ assert.deepStrictEqual(inspect(parser('*a((b))*')), [['<em>a<sup class="annotation"><span>b</span></sup></em>'], '']);
32
109
  assert.deepStrictEqual(inspect(parser('++\na\n++\n~~\nb\n~~\nc')), [['<ins><br>a</ins>', '<br>', '<del><br>b</del>', '<br>', 'c'], '']);
33
110
  assert.deepStrictEqual(inspect(parser('``a`')), [['``', 'a', '`'], '']);
34
111
  assert.deepStrictEqual(inspect(parser('[@a]')), [['[', '<a class="account" href="/@a">@a</a>', ']'], '']);
@@ -97,7 +174,7 @@ describe('Unit: parser/inline', () => {
97
174
  assert.deepStrictEqual(inspect(parser('[++[a\nb++]')), [['', '[', '++', '[', 'a', '<br>', 'b', '++', ']'], '']);
98
175
  assert.deepStrictEqual(inspect(parser('[[++a\nb++]]')), [['[', '[', '<ins>a<br>b</ins>', ']', ']'], '']);
99
176
  assert.deepStrictEqual(inspect(parser('"[% *"*"*')), [['"', '[%', ' ', '*', '"', '*', '"', '*'], '']);
100
- assert.deepStrictEqual(inspect(parser('"[% "*"* %]')), [['"', '<span class="comment"><input type="checkbox"><span>[% "*"* %]</span></span>'], '']);
177
+ assert.deepStrictEqual(inspect(parser('"[% "*"* %]')), [['"', '<span class="remark"><input type="checkbox"><span>[% "*"* %]</span></span>'], '']);
101
178
  });
102
179
 
103
180
  it('uri', () => {
@@ -108,8 +185,8 @@ describe('Unit: parser/inline', () => {
108
185
  assert.deepStrictEqual(inspect(parser('0!http://host')), [['0', '!', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
109
186
  assert.deepStrictEqual(inspect(parser('0?http://host')), [['0', '?', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
110
187
  assert.deepStrictEqual(inspect(parser('_http://host')), [['_', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
111
- assert.deepStrictEqual(inspect(parser('_http://host_')), [['<em><a class="url" href="http://host" target="_blank">http://host</a></em>'], '']);
112
- assert.deepStrictEqual(inspect(parser('*http://host*')), [['<strong><a class="url" href="http://host" target="_blank">http://host</a></strong>'], '']);
188
+ assert.deepStrictEqual(inspect(parser('_http://host_')), [['_', '<a class="url" href="http://host" target="_blank">http://host</a>', '_'], '']);
189
+ assert.deepStrictEqual(inspect(parser('*http://host*')), [['<em><a class="url" href="http://host" target="_blank">http://host</a></em>'], '']);
113
190
  assert.deepStrictEqual(inspect(parser('(http://host)')), [['<span class="paren">(<a class="url" href="http://host" target="_blank">http://host</a>)</span>'], '']);
114
191
  assert.deepStrictEqual(inspect(parser(' http://host')), [[' ', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
115
192
  assert.deepStrictEqual(inspect(parser('あhttp://hostい')), [['あ', '<a class="url" href="http://host" target="_blank">http://host</a>', 'い'], '']);
@@ -118,9 +195,9 @@ describe('Unit: parser/inline', () => {
118
195
  it('email', () => {
119
196
  assert.deepStrictEqual(inspect(parser('a@b')), [['<a class="email" href="mailto:a@b">a@b</a>'], '']);
120
197
  assert.deepStrictEqual(inspect(parser('_a@b')), [['_', '<a class="email" href="mailto:a@b">a@b</a>'], '']);
121
- assert.deepStrictEqual(inspect(parser('_a@b_')), [['<em><a class="email" href="mailto:a@b">a@b</a></em>'], '']);
122
- assert.deepStrictEqual(inspect(parser('_a_b@c_')), [['<em><a class="email" href="mailto:a_b@c">a_b@c</a></em>'], '']);
123
- assert.deepStrictEqual(inspect(parser('*a@b*')), [['<strong><a class="email" href="mailto:a@b">a@b</a></strong>'], '']);
198
+ assert.deepStrictEqual(inspect(parser('_a@b_')), [['_', '<a class="email" href="mailto:a@b">a@b</a>', '_'], '']);
199
+ assert.deepStrictEqual(inspect(parser('_a_b@c_')), [['_', '<a class="email" href="mailto:a_b@c">a_b@c</a>', '_'], '']);
200
+ assert.deepStrictEqual(inspect(parser('*a@b*')), [['<em><a class="email" href="mailto:a@b">a@b</a></em>'], '']);
124
201
  assert.deepStrictEqual(inspect(parser('(a@b)')), [['<span class="paren">(<a class="email" href="mailto:a@b">a@b</a>)</span>'], '']);
125
202
  assert.deepStrictEqual(inspect(parser(' a@b')), [[' ', '<a class="email" href="mailto:a@b">a@b</a>'], '']);
126
203
  assert.deepStrictEqual(inspect(parser('++a++b@c++')), [['<ins>a</ins>', '<a class="email" href="mailto:b@c">b@c</a>', '++'], '']);
@@ -130,14 +207,15 @@ describe('Unit: parser/inline', () => {
130
207
  assert.deepStrictEqual(inspect(parser('@a#b')), [['<a class="channel" href="/@a?ch=b">@a#b</a>'], '']);
131
208
  assert.deepStrictEqual(inspect(parser('@domain/a#b')), [['<a class="channel" href="https://domain/@a?ch=b" target="_blank">@domain/a#b</a>'], '']);
132
209
  assert.deepStrictEqual(inspect(parser('_@a#b')), [['_', '<a class="channel" href="/@a?ch=b">@a#b</a>'], '']);
210
+ assert.deepStrictEqual(inspect(parser('_@a#b_')), [['_', '<a class="channel" href="/@a?ch=b">@a#b</a>', '_'], '']);
133
211
  assert.deepStrictEqual(inspect(parser(' @a#b')), [[' ', '<a class="channel" href="/@a?ch=b">@a#b</a>'], '']);
134
212
  });
135
213
 
136
214
  it('account', () => {
137
215
  assert.deepStrictEqual(inspect(parser('@a')), [['<a class="account" href="/@a">@a</a>'], '']);
138
216
  assert.deepStrictEqual(inspect(parser('_@a')), [['_', '<a class="account" href="/@a">@a</a>'], '']);
139
- assert.deepStrictEqual(inspect(parser('_@a_')), [['<em><a class="account" href="/@a">@a</a></em>'], '']);
140
- assert.deepStrictEqual(inspect(parser('*@a*')), [['<strong><a class="account" href="/@a">@a</a></strong>'], '']);
217
+ assert.deepStrictEqual(inspect(parser('_@a_')), [['_', '<a class="account" href="/@a">@a</a>', '_'], '']);
218
+ assert.deepStrictEqual(inspect(parser('*@a*')), [['<em><a class="account" href="/@a">@a</a></em>'], '']);
141
219
  assert.deepStrictEqual(inspect(parser('(@a)')), [['<span class="paren">(<a class="account" href="/@a">@a</a>)</span>'], '']);
142
220
  assert.deepStrictEqual(inspect(parser(' @a')), [[' ', '<a class="account" href="/@a">@a</a>'], '']);
143
221
  });
@@ -148,8 +226,9 @@ describe('Unit: parser/inline', () => {
148
226
  assert.deepStrictEqual(inspect(parser('#a')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
149
227
  assert.deepStrictEqual(inspect(parser('#a\nb\n#c\n[#d]')), [['<a class="hashtag" href="/hashtags/a">#a</a>', '<br>', 'b', '<br>', '<a class="hashtag" href="/hashtags/c">#c</a>', '<br>', '<a class="index" href="#index::d">d</a>'], '']);
150
228
  assert.deepStrictEqual(inspect(parser('##a')), [['##a'], '']);
151
- assert.deepStrictEqual(inspect(parser('_#a')), [['_', '<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
152
- assert.deepStrictEqual(inspect(parser('_#a_')), [['<em><a class="hashtag" href="/hashtags/a">#a</a></em>'], '']);
229
+ assert.deepStrictEqual(inspect(parser('_#a')), [['_#a'], '']);
230
+ assert.deepStrictEqual(inspect(parser('_#a_')), [['_#a', '_'], '']);
231
+ assert.deepStrictEqual(inspect(parser('_#a_b')), [['_#a_b'], '']);
153
232
  assert.deepStrictEqual(inspect(parser('a#b')), [['a#b'], '']);
154
233
  assert.deepStrictEqual(inspect(parser('0a#b')), [['0a#b'], '']);
155
234
  assert.deepStrictEqual(inspect(parser('あ#b')), [['あ#b'], '']);
@@ -159,8 +238,8 @@ describe('Unit: parser/inline', () => {
159
238
  assert.deepStrictEqual(inspect(parser('「#あ」')), [['「', '<a class="hashtag" href="/hashtags/あ">#あ</a>', '」'], '']);
160
239
  assert.deepStrictEqual(inspect(parser('a\n#b')), [['a', '<br>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
161
240
  assert.deepStrictEqual(inspect(parser('a\\\n#b')), [['a', '<br>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
162
- assert.deepStrictEqual(inspect(parser('_a_#b')), [['<em>a</em>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
163
- assert.deepStrictEqual(inspect(parser('*a*#b')), [['<strong>a</strong>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
241
+ assert.deepStrictEqual(inspect(parser('_a_#b')), [['_', 'a_#b'], '']);
242
+ assert.deepStrictEqual(inspect(parser('*a*#b')), [['<em>a</em>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
164
243
  assert.deepStrictEqual(inspect(parser('((a))#b')), [['<sup class="annotation"><span>a</span></sup>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
165
244
  assert.deepStrictEqual(inspect(parser('[[a]]#b')), [['<sup class="reference"><span>a</span></sup>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
166
245
  assert.deepStrictEqual(inspect(parser('[#a')), [['', '[', '<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
@@ -170,9 +249,10 @@ describe('Unit: parser/inline', () => {
170
249
 
171
250
  it('hashnum', () => {
172
251
  assert.deepStrictEqual(inspect(parser('#1')), [['<a class="hashnum">#1</a>'], '']);
173
- assert.deepStrictEqual(inspect(parser('#12345678901234567@a')), [['#12345678901234567@a'], '']);
174
- assert.deepStrictEqual(inspect(parser('_#1_')), [['<em><a class="hashnum">#1</a></em>'], '']);
175
- assert.deepStrictEqual(inspect(parser('_#1_0')), [['<em><a class="hashnum">#1</a></em>', '0'], '']);
252
+ assert.deepStrictEqual(inspect(parser('#1234567890@a')), [['#1234567890@a'], '']);
253
+ assert.deepStrictEqual(inspect(parser('_#1')), [['_#1'], '']);
254
+ assert.deepStrictEqual(inspect(parser('_#1_')), [['_#1_'], '']);
255
+ assert.deepStrictEqual(inspect(parser('_#1_0')), [['_#1_0'], '']);
176
256
  assert.deepStrictEqual(inspect(parser('「#1」')), [['「', '<a class="hashnum">#1</a>', '」'], '']);
177
257
  });
178
258
 
@@ -3,7 +3,7 @@ import { union, lazy } from '../combinator';
3
3
  import { annotation } from './inline/annotation';
4
4
  import { reference } from './inline/reference';
5
5
  import { template } from './inline/template';
6
- import { comment } from './inline/comment';
6
+ import { remark } from './inline/remark';
7
7
  import { math } from './inline/math';
8
8
  import { extension } from './inline/extension';
9
9
  import { ruby } from './inline/ruby';
@@ -12,6 +12,7 @@ import { html } from './inline/html';
12
12
  import { insertion } from './inline/insertion';
13
13
  import { deletion } from './inline/deletion';
14
14
  import { mark } from './inline/mark';
15
+ import { emstrong } from './inline/emstrong';
15
16
  import { emphasis } from './inline/emphasis';
16
17
  import { strong } from './inline/strong';
17
18
  import { code } from './inline/code';
@@ -26,7 +27,7 @@ export import InlineParser = MarkdownParser.InlineParser;
26
27
  export import AnnotationParser = InlineParser.AnnotationParser;
27
28
  export import ReferenceParser = InlineParser.ReferenceParser;
28
29
  export import TemplateParser = InlineParser.TemplateParser;
29
- export import CommentParser = InlineParser.CommentParser;
30
+ export import RemarkParser = InlineParser.RemarkParser;
30
31
  export import MathParser = InlineParser.MathParser;
31
32
  export import ExtensionParser = InlineParser.ExtensionParser;
32
33
  export import RubyParser = InlineParser.RubyParser;
@@ -35,6 +36,7 @@ export import HTMLParser = InlineParser.HTMLParser;
35
36
  export import InsertionParser = InlineParser.InsertionParser;
36
37
  export import DeletionParser = InlineParser.DeletionParser;
37
38
  export import MarkParser = InlineParser.MarkParser;
39
+ export import EmStrongParser = InlineParser.EmStrongParser;
38
40
  export import EmphasisParser = InlineParser.EmphasisParser;
39
41
  export import StrongParser = InlineParser.StrongParser;
40
42
  export import CodeParser = InlineParser.CodeParser;
@@ -49,7 +51,7 @@ export const inline: InlineParser = lazy(() => union([
49
51
  annotation,
50
52
  reference,
51
53
  template,
52
- comment,
54
+ remark,
53
55
  math,
54
56
  extension,
55
57
  ruby,
@@ -60,6 +62,7 @@ export const inline: InlineParser = lazy(() => union([
60
62
  insertion,
61
63
  deletion,
62
64
  mark,
65
+ emstrong,
63
66
  strong,
64
67
  emphasis,
65
68
  code,
@@ -23,10 +23,10 @@ export const reference = build('reference', (n, abbr) => `[${abbr || n}]`);
23
23
  function build(
24
24
  syntax: 'annotation' | 'reference',
25
25
  marker: (index: number, abbr: string) => string,
26
- splitter?: string,
26
+ splitter: string = '',
27
27
  ) {
28
28
  assert(syntax.match(/^[a-z]+$/));
29
- splitter = splitter?.concat(`, .${syntax}s`) ?? `.${syntax}s`;
29
+ splitter &&= `${splitter}, .${syntax}s`;
30
30
  // Referenceを含むAnnotationの重複排除は両構文が互いに処理済みであることを必要とするため
31
31
  // 構文ごとに各1回の処理では不可能
32
32
  const memory = memoize((ref: HTMLElement): {
@@ -61,15 +61,13 @@ function build(
61
61
  opts: { readonly id?: string } = {},
62
62
  bottom: Node | null = null,
63
63
  ): Generator<HTMLAnchorElement | HTMLLIElement | undefined, undefined, undefined> {
64
- assert(splitter = splitter!);
65
64
  const defs = new Map<string, HTMLLIElement>();
66
65
  const refs = target.querySelectorAll(`sup.${syntax}:not(.disabled)`);
67
66
  const titles = new Map<string, string>();
68
67
  const defIndexes = new Map<HTMLLIElement, number>();
69
68
  const refSubindexes = new Map<string, number>();
70
69
  const defSubindexes = new Map<string, number>();
71
- const split = splitter.includes(',');
72
- const splitters = split ? target.querySelectorAll(splitter) : [];
70
+ const splitters = splitter ? target.querySelectorAll(splitter) : [];
73
71
  let iSplitters = 0;
74
72
  let total = 0;
75
73
  let format: 'number' | 'abbr';
@@ -80,7 +78,7 @@ function build(
80
78
  yield;
81
79
  continue;
82
80
  }
83
- if (split) for (
81
+ if (splitter) for (
84
82
  let el: Element;
85
83
  el = splitters[iSplitters],
86
84
  el?.compareDocumentPosition(ref) & Node.DOCUMENT_POSITION_FOLLOWING;
@@ -108,13 +106,13 @@ function build(
108
106
  const refId = opts.id !== ''
109
107
  ? `${syntax}:${opts.id ?? ''}:ref:${identifier}:${refSubindex}`
110
108
  : undefined;
111
- const initial = split
109
+ const initial = splitter
112
110
  ? !defs.has(identifier)
113
111
  : refSubindex === 1;
114
112
  const defSubindex = defSubindexes?.get(identifier)! + +initial || 1;
115
113
  initial && defSubindexes?.set(identifier, defSubindex);
116
114
  const defId = opts.id !== ''
117
- ? `${syntax}:${opts.id ?? ''}:def:${identifier}${split ? `:${defSubindex}` : ''}`
115
+ ? `${syntax}:${opts.id ?? ''}:def:${identifier}${splitter && `:${defSubindex}`}`
118
116
  : undefined;
119
117
  const def = initial
120
118
  ? html('li',
@@ -170,7 +168,7 @@ function build(
170
168
  : target.insertBefore(html('ol', { class: `${syntax}s` }), splitters[iSplitters] ?? bottom);
171
169
  yield* proc(defs, note);
172
170
  }
173
- if (split) for (
171
+ if (splitter) for (
174
172
  let el: Element;
175
173
  el = splitters[iSplitters];
176
174
  ++iSplitters) {
@@ -14,7 +14,6 @@ describe('Unit: parser/text/text', () => {
14
14
  assert.deepStrictEqual(inspect(parser('a')), [['a'], '']);
15
15
  assert.deepStrictEqual(inspect(parser('ab')), [['ab'], '']);
16
16
  assert.deepStrictEqual(inspect(parser('09あいAZaz')), [['09', 'あい', 'AZaz'], '']);
17
- assert.deepStrictEqual(inspect(parser('a_b')), [['a', '_', 'b'], '']);
18
17
  assert.deepStrictEqual(inspect(parser('a\nb')), [['a', '<br>', 'b'], '']);
19
18
  });
20
19
 
@@ -32,7 +32,6 @@ export const text: TextParser = creation(1, false, ({ source, context }) => {
32
32
  }
33
33
  case '\n':
34
34
  return [[html('br')], source.slice(1)];
35
- case '_':
36
35
  case '*':
37
36
  case '+':
38
37
  case '~':