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.
- package/CHANGELOG.md +9 -0
- package/README.md +12 -12
- package/design.md +4 -0
- package/dist/index.js +80 -46
- package/markdown.d.ts +25 -8
- package/package.json +3 -3
- package/src/parser/api/parse.test.ts +2 -2
- package/src/parser/block/dlist.test.ts +1 -1
- package/src/parser/block/extension/fig.test.ts +1 -1
- package/src/parser/block/heading.test.ts +2 -2
- package/src/parser/block/paragraph.test.ts +12 -9
- package/src/parser/inline/autolink/email.test.ts +0 -3
- package/src/parser/inline/autolink/hashnum.test.ts +4 -4
- package/src/parser/inline/autolink/hashnum.ts +1 -1
- package/src/parser/inline/autolink/hashtag.test.ts +8 -7
- package/src/parser/inline/autolink/hashtag.ts +2 -2
- package/src/parser/inline/autolink.ts +5 -12
- package/src/parser/inline/deletion.test.ts +2 -2
- package/src/parser/inline/emphasis.test.ts +35 -26
- package/src/parser/inline/emphasis.ts +11 -4
- package/src/parser/inline/emstrong.ts +62 -0
- package/src/parser/inline/extension/index.test.ts +6 -6
- package/src/parser/inline/extension/indexee.ts +4 -4
- package/src/parser/inline/extension/placeholder.test.ts +4 -4
- package/src/parser/inline/insertion.test.ts +2 -2
- package/src/parser/inline/link.test.ts +1 -1
- package/src/parser/inline/mark.test.ts +1 -1
- package/src/parser/inline/{comment.test.ts → remark.test.ts} +26 -26
- package/src/parser/inline/{comment.ts → remark.ts} +3 -3
- package/src/parser/inline/strong.test.ts +32 -25
- package/src/parser/inline/strong.ts +8 -4
- package/src/parser/inline.test.ts +102 -22
- package/src/parser/inline.ts +6 -3
- package/src/parser/processor/note.ts +7 -9
- package/src/parser/source/text.test.ts +0 -1
- 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('
|
|
11
|
-
assert.deepStrictEqual(inspect(parser('
|
|
12
|
-
assert.deepStrictEqual(inspect(parser('
|
|
13
|
-
assert.deepStrictEqual(inspect(parser('
|
|
14
|
-
assert.deepStrictEqual(inspect(parser('
|
|
15
|
-
assert.deepStrictEqual(inspect(parser('
|
|
16
|
-
assert.deepStrictEqual(inspect(parser('
|
|
17
|
-
assert.deepStrictEqual(inspect(parser('
|
|
18
|
-
assert.deepStrictEqual(inspect(parser('
|
|
19
|
-
assert.deepStrictEqual(inspect(parser('*
|
|
20
|
-
assert.deepStrictEqual(inspect(parser('
|
|
21
|
-
assert.deepStrictEqual(inspect(parser('
|
|
22
|
-
assert.deepStrictEqual(inspect(parser('
|
|
23
|
-
assert.deepStrictEqual(inspect(parser('
|
|
24
|
-
assert.deepStrictEqual(inspect(parser('
|
|
25
|
-
assert.deepStrictEqual(inspect(parser('
|
|
26
|
-
assert.deepStrictEqual(inspect(parser('
|
|
27
|
-
assert.deepStrictEqual(inspect(parser('
|
|
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('
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('
|
|
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('
|
|
37
|
-
assert.deepStrictEqual(inspect(parser('
|
|
38
|
-
assert.deepStrictEqual(inspect(parser('
|
|
39
|
-
assert.deepStrictEqual(inspect(parser('
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('
|
|
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	**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('
|
|
15
|
-
open(some(inline, '*', [[/^\\?\n/, 9]]),
|
|
15
|
+
some(inline, blankWith('**'), [[/^\\?\n/, 9]]),
|
|
16
|
+
open(some(inline, '*', [[/^\\?\n/, 9]]), union([
|
|
17
|
+
emstrong,
|
|
18
|
+
strong,
|
|
19
|
+
])),
|
|
16
20
|
])))),
|
|
17
|
-
str('
|
|
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('
|
|
25
|
-
assert.deepStrictEqual(inspect(parser('
|
|
26
|
-
assert.deepStrictEqual(inspect(parser('
|
|
27
|
-
assert.deepStrictEqual(inspect(parser('
|
|
28
|
-
assert.deepStrictEqual(inspect(parser('
|
|
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*	**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	*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**	*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('*<*>')), [['<
|
|
31
|
-
assert.deepStrictEqual(inspect(parser('*a((b))*')), [['<
|
|
107
|
+
assert.deepStrictEqual(inspect(parser('*<*>')), [['<em><</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="
|
|
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_')), [['<
|
|
112
|
-
assert.deepStrictEqual(inspect(parser('*http://host*')), [['<
|
|
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_')), [['<
|
|
122
|
-
assert.deepStrictEqual(inspect(parser('_a_b@c_')), [['<
|
|
123
|
-
assert.deepStrictEqual(inspect(parser('*a@b*')), [['<
|
|
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_')), [['<
|
|
140
|
-
assert.deepStrictEqual(inspect(parser('*@a*')), [['<
|
|
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')), [['_
|
|
152
|
-
assert.deepStrictEqual(inspect(parser('_#a_')), [['
|
|
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')), [['
|
|
163
|
-
assert.deepStrictEqual(inspect(parser('*a*#b')), [['<
|
|
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('#
|
|
174
|
-
assert.deepStrictEqual(inspect(parser('_#
|
|
175
|
-
assert.deepStrictEqual(inspect(parser('_#
|
|
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
|
|
package/src/parser/inline.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
-
|
|
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
|
|
26
|
+
splitter: string = '',
|
|
27
27
|
) {
|
|
28
28
|
assert(syntax.match(/^[a-z]+$/));
|
|
29
|
-
splitter
|
|
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
|
|
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 (
|
|
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 =
|
|
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}${
|
|
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 (
|
|
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
|
|