securemark 0.260.6 → 0.261.2
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 +12 -0
- package/README.md +12 -12
- package/design.md +0 -4
- package/dist/index.js +983 -630
- package/markdown.d.ts +5 -32
- package/package.json +9 -9
- package/src/debug.test.ts +3 -3
- package/src/parser/api/parse.test.ts +1 -1
- package/src/parser/block/blockquote.test.ts +2 -2
- package/src/parser/block/dlist.test.ts +1 -1
- package/src/parser/block/extension/example.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/olist.ts +4 -6
- package/src/parser/block/paragraph.test.ts +1 -4
- package/src/parser/inline/autolink/anchor.test.ts +1 -0
- package/src/parser/inline/autolink/email.test.ts +3 -0
- package/src/parser/inline/autolink/email.ts +1 -1
- package/src/parser/inline/autolink/hashnum.test.ts +1 -2
- package/src/parser/inline/autolink/hashnum.ts +1 -1
- package/src/parser/inline/autolink/hashtag.test.ts +15 -12
- package/src/parser/inline/autolink/hashtag.ts +3 -3
- package/src/parser/inline/autolink/url.test.ts +1 -1
- package/src/parser/inline/autolink/url.ts +1 -1
- package/src/parser/inline/autolink.ts +13 -4
- package/src/parser/inline/deletion.test.ts +2 -2
- package/src/parser/inline/deletion.ts +1 -1
- package/src/parser/inline/emphasis.test.ts +26 -35
- package/src/parser/inline/emphasis.ts +5 -12
- package/src/parser/inline/extension/index.test.ts +2 -2
- package/src/parser/inline/insertion.test.ts +2 -2
- package/src/parser/inline/insertion.ts +1 -1
- package/src/parser/inline/link.test.ts +1 -1
- package/src/parser/inline/mark.test.ts +1 -1
- package/src/parser/inline/mark.ts +1 -1
- package/src/parser/inline/strong.test.ts +25 -32
- package/src/parser/inline/strong.ts +5 -9
- package/src/parser/inline.test.ts +18 -91
- package/src/parser/inline.ts +0 -6
- package/src/parser/locale/ja.ts +1 -9
- package/src/parser/locale.test.ts +1 -1
- package/src/parser/processor/figure.ts +2 -1
- package/src/parser/processor/footnote.ts +2 -1
- package/src/parser/source/str.ts +4 -2
- package/src/parser/source/text.test.ts +9 -4
- package/src/parser/source/text.ts +9 -16
- package/src/renderer/render.ts +3 -3
- package/src/parser/inline/emstrong.ts +0 -62
- package/src/parser/inline/escape.ts +0 -30
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { EmphasisParser } from '../inline';
|
|
2
2
|
import { union, some, syntax, surround, open, lazy } from '../../combinator';
|
|
3
3
|
import { inline } from '../inline';
|
|
4
|
-
import { emstrong } from './emstrong';
|
|
5
|
-
import { strong } from './strong';
|
|
6
4
|
import { str } from '../source';
|
|
7
5
|
import { Syntax, State } from '../context';
|
|
8
6
|
import { startTight, blankWith } from '../visibility';
|
|
@@ -10,17 +8,12 @@ import { html, defrag } from 'typed-dom/dom';
|
|
|
10
8
|
import { unshift } from 'spica/array';
|
|
11
9
|
|
|
12
10
|
export const emphasis: EmphasisParser = lazy(() => surround(
|
|
13
|
-
str('
|
|
11
|
+
str('_', '_'),
|
|
14
12
|
syntax(Syntax.none, 1, 1, State.none,
|
|
15
13
|
startTight(some(union([
|
|
16
|
-
|
|
17
|
-
some(inline,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
strong,
|
|
21
|
-
emphasis,
|
|
22
|
-
])),
|
|
23
|
-
])), '*')),
|
|
24
|
-
str('*'), false,
|
|
14
|
+
some(inline, blankWith('_')),
|
|
15
|
+
open(some(inline, '_'), emphasis),
|
|
16
|
+
])))),
|
|
17
|
+
str('_'), false,
|
|
25
18
|
([, bs], rest) => [[html('em', defrag(bs))], rest],
|
|
26
19
|
([as, bs], rest) => [unshift(as, bs), rest]));
|
|
@@ -53,7 +53,7 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
53
53
|
assert.deepStrictEqual(inspect(parser('[#\\\\]')), [['<a class="index" href="#index:\\">\\</a>'], '']);
|
|
54
54
|
assert.deepStrictEqual(inspect(parser('[#A]')), [['<a class="index" href="#index:A">A</a>'], '']);
|
|
55
55
|
assert.deepStrictEqual(inspect(parser('[#==]')), [['<a class="index" href="#index:==">==</a>'], '']);
|
|
56
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
56
|
+
assert.deepStrictEqual(inspect(parser('[#_A_]')), [['<a class="index" href="#index:A"><em>A</em></a>'], '']);
|
|
57
57
|
assert.deepStrictEqual(inspect(parser('[#`A`]')), [['<a class="index" href="#index:`A`"><code data-src="`A`">A</code></a>'], '']);
|
|
58
58
|
assert.deepStrictEqual(inspect(parser('[#${A}$]')), [['<a class="index" href="#index:${A}$"><span class="math" translate="no" data-src="${A}$">${A}$</span></a>'], '']);
|
|
59
59
|
assert.deepStrictEqual(inspect(parser('[#[A](a)]')), [['<a class="index" href="#index:A"><ruby>A<rp>(</rp><rt>a</rt><rp>)</rp></ruby></a>'], '']);
|
|
@@ -80,7 +80,7 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
80
80
|
assert.deepStrictEqual(inspect(parser('[#a|#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
81
81
|
assert.deepStrictEqual(inspect(parser('[#a|#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
82
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
|
|
83
|
+
assert.deepStrictEqual(inspect(parser('[#a|#_b_]')), [['<a class="index" href="#index:_b_">a<span class="indexer" data-index="_b_"></span></a>'], '']);
|
|
84
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
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
86
|
assert.deepStrictEqual(inspect(parser('[#a|#[]]')), [['<a class="index" href="#index:[]">a<span class="indexer" data-index="[]"></span></a>'], '']);
|
|
@@ -37,8 +37,8 @@ describe('Unit: parser/inline/insertion', () => {
|
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
it('nest', () => {
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('
|
|
40
|
+
assert.deepStrictEqual(inspect(parser('++_++a++_++')), [['<ins><em><ins>a</ins></em></ins>'], '']);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser('++_~~a~~_++')), [['<ins><em><del>a</del></em></ins>'], '']);
|
|
42
42
|
});
|
|
43
43
|
|
|
44
44
|
});
|
|
@@ -8,7 +8,7 @@ import { html, defrag } from 'typed-dom/dom';
|
|
|
8
8
|
import { unshift } from 'spica/array';
|
|
9
9
|
|
|
10
10
|
export const insertion: InsertionParser = lazy(() => surround(
|
|
11
|
-
str('++'),
|
|
11
|
+
str('++', '+'),
|
|
12
12
|
syntax(Syntax.none, 1, 1, State.none,
|
|
13
13
|
some(union([
|
|
14
14
|
some(inline, blankWith('\n', '++')),
|
|
@@ -170,7 +170,7 @@ describe('Unit: parser/inline/link', () => {
|
|
|
170
170
|
assert.deepStrictEqual(inspect(parser('[((a))]{b}')), [['<a class="link" href="b"><span class="paren">((a))</span></a>'], '']);
|
|
171
171
|
assert.deepStrictEqual(inspect(parser('[[[a]]]{b}')), [['<a class="link" href="b">[[a]]</a>'], '']);
|
|
172
172
|
assert.deepStrictEqual(inspect(parser('[!http://host]{/}')), [['<a class="link" href="/" target="_blank"><img class="media" data-src="http://host" alt=""></a>'], '']);
|
|
173
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
173
|
+
assert.deepStrictEqual(inspect(parser('[_a_]{b}')), [['<a class="link" href="b"><em>a</em></a>'], '']);
|
|
174
174
|
});
|
|
175
175
|
|
|
176
176
|
it('external', () => {
|
|
@@ -40,7 +40,7 @@ describe('Unit: parser/inline/mark', () => {
|
|
|
40
40
|
assert.deepStrictEqual(inspect(parser('==a\\ ==b====')), [['<mark>a <mark>b</mark></mark>'], '']);
|
|
41
41
|
assert.deepStrictEqual(inspect(parser('==a	==b====')), [['<mark>a\t<mark>b</mark></mark>'], '']);
|
|
42
42
|
assert.deepStrictEqual(inspect(parser('==a<wbr>==b====')), [['<mark>a<wbr><mark>b</mark></mark>'], '']);
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('==_==a==_==')), [['<mark><em><mark>a</mark></em></mark>'], '']);
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
});
|
|
@@ -8,7 +8,7 @@ import { html, defrag } from 'typed-dom/dom';
|
|
|
8
8
|
import { unshift } from 'spica/array';
|
|
9
9
|
|
|
10
10
|
export const mark: MarkParser = lazy(() => surround(
|
|
11
|
-
str('=='),
|
|
11
|
+
str('==', '='),
|
|
12
12
|
syntax(Syntax.none, 1, 1, State.none,
|
|
13
13
|
startTight(some(union([
|
|
14
14
|
some(inline, blankWith('==')),
|
|
@@ -7,44 +7,37 @@ 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('**<wbr>a**')), undefined);
|
|
27
|
-
assert.deepStrictEqual(inspect(parser('***a***')), undefined);
|
|
28
|
-
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\\ *')), [['*', 'a'], '\\ *']);
|
|
16
|
+
assert.deepStrictEqual(inspect(parser('*a\\\n*')), [['*', 'a'], '\\\n*']);
|
|
17
|
+
assert.deepStrictEqual(inspect(parser('* *')), undefined);
|
|
18
|
+
assert.deepStrictEqual(inspect(parser('* a*')), undefined);
|
|
19
|
+
assert.deepStrictEqual(inspect(parser('* a *')), undefined);
|
|
20
|
+
assert.deepStrictEqual(inspect(parser('*\n*')), undefined);
|
|
21
|
+
assert.deepStrictEqual(inspect(parser('*\na*')), undefined);
|
|
22
|
+
assert.deepStrictEqual(inspect(parser('*\\ a*')), undefined);
|
|
23
|
+
assert.deepStrictEqual(inspect(parser('*\\\na*')), undefined);
|
|
24
|
+
assert.deepStrictEqual(inspect(parser('*<wbr>a*')), undefined);
|
|
25
|
+
assert.deepStrictEqual(inspect(parser(' *a*')), undefined);
|
|
29
26
|
});
|
|
30
27
|
|
|
31
28
|
it('basic', () => {
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('
|
|
33
|
-
assert.deepStrictEqual(inspect(parser('
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('
|
|
35
|
-
assert.deepStrictEqual(inspect(parser('
|
|
29
|
+
assert.deepStrictEqual(inspect(parser('*a*')), [['<strong>a</strong>'], '']);
|
|
30
|
+
assert.deepStrictEqual(inspect(parser('*ab*')), [['<strong>ab</strong>'], '']);
|
|
31
|
+
assert.deepStrictEqual(inspect(parser('*a\nb*')), [['<strong>a<br>b</strong>'], '']);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser('*a\\\nb*')), [['<strong>a<span class="linebreak"> </span>b</strong>'], '']);
|
|
36
33
|
});
|
|
37
34
|
|
|
38
35
|
it('nest', () => {
|
|
39
|
-
assert.deepStrictEqual(inspect(parser('
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('
|
|
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>'], '']);
|
|
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	*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>'], '']);
|
|
48
41
|
});
|
|
49
42
|
|
|
50
43
|
});
|
|
@@ -1,7 +1,6 @@
|
|
|
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';
|
|
5
4
|
import { str } from '../source';
|
|
6
5
|
import { Syntax, State } from '../context';
|
|
7
6
|
import { startTight, blankWith } from '../visibility';
|
|
@@ -9,15 +8,12 @@ import { html, defrag } from 'typed-dom/dom';
|
|
|
9
8
|
import { unshift } from 'spica/array';
|
|
10
9
|
|
|
11
10
|
export const strong: StrongParser = lazy(() => surround(
|
|
12
|
-
str('
|
|
11
|
+
str('*', '*'),
|
|
13
12
|
syntax(Syntax.none, 1, 1, State.none,
|
|
14
13
|
startTight(some(union([
|
|
15
|
-
some(inline, blankWith('
|
|
16
|
-
open(some(inline, '*'),
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
])),
|
|
20
|
-
])), '*')),
|
|
21
|
-
str('**'), false,
|
|
14
|
+
some(inline, blankWith('*')),
|
|
15
|
+
open(some(inline, '*'), strong),
|
|
16
|
+
])))),
|
|
17
|
+
str('*'), false,
|
|
22
18
|
([, bs], rest) => [[html('strong', defrag(bs))], rest],
|
|
23
19
|
([as, bs], rest) => [unshift(as, bs), rest]));
|
|
@@ -21,91 +21,14 @@ 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('
|
|
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>'], '']);
|
|
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', '***'], '']);
|
|
106
29
|
assert.deepStrictEqual(inspect(parser('*[*]')), [['*', '[', '*', ']'], '']);
|
|
107
|
-
assert.deepStrictEqual(inspect(parser('*<*>')), [['<
|
|
108
|
-
assert.deepStrictEqual(inspect(parser('*a((b))*')), [['<
|
|
30
|
+
assert.deepStrictEqual(inspect(parser('*<*>')), [['<strong><</strong>', '>'], '']);
|
|
31
|
+
assert.deepStrictEqual(inspect(parser('*a((b))*')), [['<strong>a<sup class="annotation"><span>b</span></sup></strong>'], '']);
|
|
109
32
|
assert.deepStrictEqual(inspect(parser('``a`')), [['``', 'a', '`'], '']);
|
|
110
33
|
assert.deepStrictEqual(inspect(parser('[@a]')), [['[', '<a class="account" href="/@a">@a</a>', ']'], '']);
|
|
111
34
|
assert.deepStrictEqual(inspect(parser('[#1][#2]')), [['<a class="index" href="#index:1">1</a>', '<a class="index" href="#index:2">2</a>'], '']);
|
|
@@ -166,11 +89,11 @@ describe('Unit: parser/inline', () => {
|
|
|
166
89
|
assert.deepStrictEqual(inspect(parser('[~~a~~]')), [['[', '<del>a</del>', ']'], '']);
|
|
167
90
|
assert.deepStrictEqual(inspect(parser('[^http://host')), [['[^', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
|
|
168
91
|
assert.deepStrictEqual(inspect(parser('[^a@b')), [['[^', '<a class="email" href="mailto:a@b">a@b</a>'], '']);
|
|
169
|
-
assert.deepStrictEqual(inspect(parser('[#a*b\nc*]')), [['[', '<a class="hashtag" href="/hashtags/a">#a</a>', '<
|
|
170
|
-
assert.deepStrictEqual(inspect(parser('[*a\nb*]{/}')), [['[', '<
|
|
92
|
+
assert.deepStrictEqual(inspect(parser('[#a*b\nc*]')), [['[', '<a class="hashtag" href="/hashtags/a">#a</a>', '<strong>b<br>c</strong>', ']'], '']);
|
|
93
|
+
assert.deepStrictEqual(inspect(parser('[*a\nb*]{/}')), [['[', '<strong>a<br>b</strong>', ']', '<a class="url" href="/">/</a>'], '']);
|
|
171
94
|
assert.deepStrictEqual(inspect(parser('[*a\nb]*')), [['[', '*', 'a', '<br>', 'b', ']', '*'], '']);
|
|
172
95
|
assert.deepStrictEqual(inspect(parser('[*[a\nb*]')), [['', '[', '*', '[', 'a', '<br>', 'b', '*', ']'], '']);
|
|
173
|
-
assert.deepStrictEqual(inspect(parser('[[*a\nb*]]')), [['[', '[', '<
|
|
96
|
+
assert.deepStrictEqual(inspect(parser('[[*a\nb*]]')), [['[', '[', '<strong>a<br>b</strong>', ']', ']'], '']);
|
|
174
97
|
assert.deepStrictEqual(inspect(parser('"[% *"*"*')), [['"', '[%', ' ', '*', '"', '*', '"', '*'], '']);
|
|
175
98
|
assert.deepStrictEqual(inspect(parser('"[% "*"* %]')), [['"', '[%', ' ', '"', '*', '"', '*', ' ', '%', ']'], '']);
|
|
176
99
|
});
|
|
@@ -186,7 +109,8 @@ describe('Unit: parser/inline', () => {
|
|
|
186
109
|
assert.deepStrictEqual(inspect(parser('0?!http://host')), [['0', '?', '<a href="http://host" target="_blank"><img class="media" data-src="http://host" alt=""></a>'], '']);
|
|
187
110
|
assert.deepStrictEqual(inspect(parser('0!?http://host')), [['0', '!', '?', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
|
|
188
111
|
assert.deepStrictEqual(inspect(parser('_http://host')), [['_', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
|
|
189
|
-
assert.deepStrictEqual(inspect(parser('
|
|
112
|
+
assert.deepStrictEqual(inspect(parser('_http://host_')), [['<em><a class="url" href="http://host" target="_blank">http://host</a></em>'], '']);
|
|
113
|
+
assert.deepStrictEqual(inspect(parser('*http://host*')), [['<strong><a class="url" href="http://host" target="_blank">http://host</a></strong>'], '']);
|
|
190
114
|
assert.deepStrictEqual(inspect(parser('(http://host)')), [['<span class="paren">(<a class="url" href="http://host" target="_blank">http://host</a>)</span>'], '']);
|
|
191
115
|
assert.deepStrictEqual(inspect(parser(' http://host')), [[' ', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
|
|
192
116
|
assert.deepStrictEqual(inspect(parser('あhttp://hostい')), [['あ', '<a class="url" href="http://host" target="_blank">http://host</a>', 'い'], '']);
|
|
@@ -195,7 +119,8 @@ describe('Unit: parser/inline', () => {
|
|
|
195
119
|
it('email', () => {
|
|
196
120
|
assert.deepStrictEqual(inspect(parser('a@b')), [['<a class="email" href="mailto:a@b">a@b</a>'], '']);
|
|
197
121
|
assert.deepStrictEqual(inspect(parser('_a@b')), [['_', '<a class="email" href="mailto:a@b">a@b</a>'], '']);
|
|
198
|
-
assert.deepStrictEqual(inspect(parser('
|
|
122
|
+
assert.deepStrictEqual(inspect(parser('_a@b_')), [['<em><a class="email" href="mailto:a@b">a@b</a></em>'], '']);
|
|
123
|
+
assert.deepStrictEqual(inspect(parser('*a@b*')), [['<strong><a class="email" href="mailto:a@b">a@b</a></strong>'], '']);
|
|
199
124
|
assert.deepStrictEqual(inspect(parser('(a@b)')), [['<span class="paren">(<a class="email" href="mailto:a@b">a@b</a>)</span>'], '']);
|
|
200
125
|
assert.deepStrictEqual(inspect(parser(' a@b')), [[' ', '<a class="email" href="mailto:a@b">a@b</a>'], '']);
|
|
201
126
|
assert.deepStrictEqual(inspect(parser('++a++b@c++')), [['<ins>a</ins>', '<a class="email" href="mailto:b@c">b@c</a>', '++'], '']);
|
|
@@ -213,7 +138,8 @@ describe('Unit: parser/inline', () => {
|
|
|
213
138
|
it('account', () => {
|
|
214
139
|
assert.deepStrictEqual(inspect(parser('@a')), [['<a class="account" href="/@a">@a</a>'], '']);
|
|
215
140
|
assert.deepStrictEqual(inspect(parser('_@a')), [['_', '<a class="account" href="/@a">@a</a>'], '']);
|
|
216
|
-
assert.deepStrictEqual(inspect(parser('
|
|
141
|
+
assert.deepStrictEqual(inspect(parser('_@a_')), [['<em><a class="account" href="/@a">@a</a></em>'], '']);
|
|
142
|
+
assert.deepStrictEqual(inspect(parser('*@a*')), [['<strong><a class="account" href="/@a">@a</a></strong>'], '']);
|
|
217
143
|
assert.deepStrictEqual(inspect(parser('(@a)')), [['<span class="paren">(<a class="account" href="/@a">@a</a>)</span>'], '']);
|
|
218
144
|
assert.deepStrictEqual(inspect(parser(' @a')), [[' ', '<a class="account" href="/@a">@a</a>'], '']);
|
|
219
145
|
});
|
|
@@ -233,7 +159,8 @@ describe('Unit: parser/inline', () => {
|
|
|
233
159
|
assert.deepStrictEqual(inspect(parser('「#あ」')), [['「', '<a class="hashtag" href="/hashtags/あ">#あ</a>', '」'], '']);
|
|
234
160
|
assert.deepStrictEqual(inspect(parser('a\n#b')), [['a', '<br>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
|
235
161
|
assert.deepStrictEqual(inspect(parser('a\\\n#b')), [['a', '<span class="linebreak"> </span>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
|
236
|
-
assert.deepStrictEqual(inspect(parser('
|
|
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>'], '']);
|
|
237
164
|
assert.deepStrictEqual(inspect(parser('((a))#b')), [['<sup class="annotation"><span>a</span></sup>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
|
238
165
|
assert.deepStrictEqual(inspect(parser('[[a]]#b')), [['<sup class="reference"><span>a</span></sup>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
|
239
166
|
assert.deepStrictEqual(inspect(parser('[#a')), [['', '[', '<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
|
package/src/parser/inline.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { MarkdownParser } from '../../markdown';
|
|
2
2
|
import { union } from '../combinator';
|
|
3
|
-
import { escape } from './inline/escape';
|
|
4
3
|
import { annotation } from './inline/annotation';
|
|
5
4
|
import { reference } from './inline/reference';
|
|
6
5
|
import { template } from './inline/template';
|
|
@@ -13,7 +12,6 @@ import { html } from './inline/html';
|
|
|
13
12
|
import { insertion } from './inline/insertion';
|
|
14
13
|
import { deletion } from './inline/deletion';
|
|
15
14
|
import { mark } from './inline/mark';
|
|
16
|
-
import { emstrong } from './inline/emstrong';
|
|
17
15
|
import { emphasis } from './inline/emphasis';
|
|
18
16
|
import { strong } from './inline/strong';
|
|
19
17
|
import { code } from './inline/code';
|
|
@@ -25,7 +23,6 @@ import { bracket } from './inline/bracket';
|
|
|
25
23
|
import { text } from './source';
|
|
26
24
|
|
|
27
25
|
export import InlineParser = MarkdownParser.InlineParser;
|
|
28
|
-
export import EscapeParser = InlineParser.EscapeParser;
|
|
29
26
|
export import AnnotationParser = InlineParser.AnnotationParser;
|
|
30
27
|
export import ReferenceParser = InlineParser.ReferenceParser;
|
|
31
28
|
export import TemplateParser = InlineParser.TemplateParser;
|
|
@@ -38,7 +35,6 @@ export import HTMLParser = InlineParser.HTMLParser;
|
|
|
38
35
|
export import InsertionParser = InlineParser.InsertionParser;
|
|
39
36
|
export import DeletionParser = InlineParser.DeletionParser;
|
|
40
37
|
export import MarkParser = InlineParser.MarkParser;
|
|
41
|
-
export import EmStrongParser = InlineParser.EmStrongParser;
|
|
42
38
|
export import EmphasisParser = InlineParser.EmphasisParser;
|
|
43
39
|
export import StrongParser = InlineParser.StrongParser;
|
|
44
40
|
export import CodeParser = InlineParser.CodeParser;
|
|
@@ -50,7 +46,6 @@ export import AutolinkParser = InlineParser.AutolinkParser;
|
|
|
50
46
|
export import BracketParser = InlineParser.BracketParser;
|
|
51
47
|
|
|
52
48
|
export const inline: InlineParser = union([
|
|
53
|
-
escape,
|
|
54
49
|
annotation,
|
|
55
50
|
reference,
|
|
56
51
|
template,
|
|
@@ -64,7 +59,6 @@ export const inline: InlineParser = union([
|
|
|
64
59
|
insertion,
|
|
65
60
|
deletion,
|
|
66
61
|
mark,
|
|
67
|
-
emstrong,
|
|
68
62
|
strong,
|
|
69
63
|
emphasis,
|
|
70
64
|
code,
|
package/src/parser/locale/ja.ts
CHANGED
|
@@ -9,7 +9,7 @@ describe('Unit: parser/locale', () => {
|
|
|
9
9
|
it('basic', () => {
|
|
10
10
|
assert.deepStrictEqual(inspect(parser('。\\\n0')), [['<p>。<span class="linebreak"></span>0</p>'], '']);
|
|
11
11
|
assert.deepStrictEqual(inspect(parser('。 \\\n0')), [['<p>。<span class="linebreak"></span>0</p>'], '']);
|
|
12
|
-
assert.deepStrictEqual(inspect(parser('
|
|
12
|
+
assert.deepStrictEqual(inspect(parser('_。_\\\n0')), [['<p><em>。</em><span class="linebreak"></span>0</p>'], '']);
|
|
13
13
|
assert.deepStrictEqual(inspect(parser('!> 。\\\n0')), [['<blockquote><section><p>。<span class="linebreak"></span>0</p><ol class="references"></ol></section></blockquote>'], '']);
|
|
14
14
|
assert.deepStrictEqual(inspect(parser('[。](a)\\\n0')), [['<p><ruby>。<rp>(</rp><rt>a</rt><rp>)</rp></ruby><span class="linebreak"></span>0</p>'], '']);
|
|
15
15
|
assert.deepStrictEqual(inspect(parser('[。 ](a )\\\n0')), [['<p><ruby>。<rp>(</rp><rt>a</rt><rp>)</rp></ruby><span class="linebreak"></span>0</p>'], '']);
|
|
@@ -141,7 +141,8 @@ export function* figure(
|
|
|
141
141
|
}
|
|
142
142
|
labels.add(label);
|
|
143
143
|
opts.id !== '' && def.setAttribute('id', `label:${opts.id ? `${opts.id}:` : ''}${label}`);
|
|
144
|
-
for (
|
|
144
|
+
for (let rs = refs.take(label, Infinity), i = 0; i < rs.length; ++i) {
|
|
145
|
+
const ref = rs[i];
|
|
145
146
|
if (ref.getAttribute('data-invalid-message') === messages.reference) {
|
|
146
147
|
define(ref, {
|
|
147
148
|
class: void ref.classList.remove('invalid'),
|
|
@@ -114,7 +114,8 @@ function build(
|
|
|
114
114
|
if (title && !blank && def.childNodes.length === 1) {
|
|
115
115
|
def.insertBefore(content.cloneNode(true), def.lastChild);
|
|
116
116
|
assert(def.childNodes.length > 1);
|
|
117
|
-
for (
|
|
117
|
+
for (let refs = buffer.take(identifier, Infinity), i = 0; i < refs.length; ++i) {
|
|
118
|
+
const ref = refs[i];
|
|
118
119
|
if (ref.getAttribute('data-invalid-type') !== 'content') continue;
|
|
119
120
|
define(ref, {
|
|
120
121
|
title,
|
package/src/parser/source/str.ts
CHANGED
|
@@ -3,12 +3,13 @@ import { StrParser } from '../source';
|
|
|
3
3
|
import { Parser, Context } from '../../combinator/data/parser';
|
|
4
4
|
import { creation } from '../../combinator';
|
|
5
5
|
|
|
6
|
-
export function str(pattern: string | RegExp): StrParser;
|
|
7
|
-
export function str(pattern: string | RegExp): Parser<string, Context<StrParser>, []> {
|
|
6
|
+
export function str(pattern: string | RegExp, not?: string): StrParser;
|
|
7
|
+
export function str(pattern: string | RegExp, not?: string): Parser<string, Context<StrParser>, []> {
|
|
8
8
|
assert(pattern);
|
|
9
9
|
return typeof pattern === 'string'
|
|
10
10
|
? creation(1, false, ({ source }) => {
|
|
11
11
|
if (source === '') return;
|
|
12
|
+
if (not && source.slice(pattern.length, pattern.length + not.length) === not) return;
|
|
12
13
|
return source.slice(0, pattern.length) === pattern
|
|
13
14
|
? [[pattern], source.slice(pattern.length)]
|
|
14
15
|
: undefined;
|
|
@@ -16,6 +17,7 @@ export function str(pattern: string | RegExp): Parser<string, Context<StrParser>
|
|
|
16
17
|
: creation(1, false, ({ source }) => {
|
|
17
18
|
if (source === '') return;
|
|
18
19
|
const m = source.match(pattern);
|
|
20
|
+
if (m && not && source.slice(m[0].length, m[0].length + not.length) === not) return;
|
|
19
21
|
return m && m[0].length > 0
|
|
20
22
|
? [[m[0]], source.slice(m[0].length)]
|
|
21
23
|
: undefined;
|
|
@@ -14,6 +14,7 @@ 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'], '']);
|
|
17
18
|
assert.deepStrictEqual(inspect(parser('a\nb')), [['a', '<br>', 'b'], '']);
|
|
18
19
|
});
|
|
19
20
|
|
|
@@ -116,10 +117,14 @@ describe('Unit: parser/text/text', () => {
|
|
|
116
117
|
});
|
|
117
118
|
|
|
118
119
|
it('localize', () => {
|
|
119
|
-
assert.deepStrictEqual(inspect(parser('
|
|
120
|
-
assert.deepStrictEqual(inspect(parser('
|
|
121
|
-
assert.deepStrictEqual(inspect(parser('
|
|
122
|
-
assert.deepStrictEqual(inspect(parser('
|
|
120
|
+
assert.deepStrictEqual(inspect(parser('a\\\n0')), [['a', '<span class="linebreak"> </span>', '0'], '']);
|
|
121
|
+
assert.deepStrictEqual(inspect(parser('あ\\\n0')), [['あ', '<span class="linebreak"></span>', '0'], '']);
|
|
122
|
+
assert.deepStrictEqual(inspect(parser('ア\\\n0')), [['ア', '<span class="linebreak"></span>', '0'], '']);
|
|
123
|
+
assert.deepStrictEqual(inspect(parser('亜\\\n0')), [['亜', '<span class="linebreak"></span>', '0'], '']);
|
|
124
|
+
assert.deepStrictEqual(inspect(parser('、\\\n0')), [['、', '<span class="linebreak"></span>', '0'], '']);
|
|
125
|
+
assert.deepStrictEqual(inspect(parser('。\\\n0')), [['。', '<span class="linebreak"></span>', '0'], '']);
|
|
126
|
+
assert.deepStrictEqual(inspect(parser('!?\\\n0')), [['!', '?', '<span class="linebreak"></span>', '0'], '']);
|
|
127
|
+
assert.deepStrictEqual(inspect(parser('\\あ\\\n0')), [['あ', '<span class="linebreak"></span>', '0'], '']);
|
|
123
128
|
});
|
|
124
129
|
|
|
125
130
|
});
|
|
@@ -4,9 +4,10 @@ import { union, creation, focus } from '../../combinator';
|
|
|
4
4
|
import { str } from './str';
|
|
5
5
|
import { html } from 'typed-dom/dom';
|
|
6
6
|
|
|
7
|
-
export const delimiter = /[\s\x00-\x7F]|\S[#>]|[
|
|
7
|
+
export const delimiter = /[\s\x00-\x7F]|\S[#>]|[\p{Ideo}\p{scx=Hiragana}\p{scx=Katakana}~!?][^\S\n]*(?=\\\n)/u;
|
|
8
8
|
export const nonWhitespace = /[\S\n]|$/;
|
|
9
9
|
export const nonAlphanumeric = /[^0-9A-Za-z]|\S[#>]|$/;
|
|
10
|
+
const nssb = /^[\p{Ideo}\p{scx=Hiragana}\p{scx=Katakana}~!?][^\S\n]*(?=\\\n)/u;
|
|
10
11
|
const repeat = str(/^(.)\1*/);
|
|
11
12
|
|
|
12
13
|
export const text: TextParser = creation(1, false, ({ source, context }) => {
|
|
@@ -19,21 +20,12 @@ export const text: TextParser = creation(1, false, ({ source, context }) => {
|
|
|
19
20
|
switch (source[0]) {
|
|
20
21
|
case '\x1B':
|
|
21
22
|
case '\\':
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return text({ source: source.slice(1), context });
|
|
29
|
-
}
|
|
30
|
-
break;
|
|
31
|
-
case '、':
|
|
32
|
-
case '。':
|
|
33
|
-
case '!':
|
|
34
|
-
case '?':
|
|
35
|
-
const i = source.slice(1).search(nonWhitespace) + 1;
|
|
36
|
-
if (i > 0 && source.slice(i, i + 2) === '\\\n') return [[source[0], html('span', { class: 'linebreak' })], source.slice(i + 2)];
|
|
23
|
+
if (!nssb.test(source.slice(1))) break;
|
|
24
|
+
assert(source[0] !== '\x1B');
|
|
25
|
+
return text({ source: source.slice(1), context });
|
|
26
|
+
default:
|
|
27
|
+
const i = source.match(nssb)?.[0].length ?? -1;
|
|
28
|
+
if (i !== -1) return [[source[0], html('span', { class: 'linebreak' })], source.slice(i + 2)];
|
|
37
29
|
}
|
|
38
30
|
switch (source[0]) {
|
|
39
31
|
case '\x1B':
|
|
@@ -50,6 +42,7 @@ export const text: TextParser = creation(1, false, ({ source, context }) => {
|
|
|
50
42
|
}
|
|
51
43
|
case '\n':
|
|
52
44
|
return [[html('br')], source.slice(1)];
|
|
45
|
+
case '_':
|
|
53
46
|
case '*':
|
|
54
47
|
case '+':
|
|
55
48
|
case '~':
|