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.
Files changed (49) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +12 -12
  3. package/design.md +0 -4
  4. package/dist/index.js +983 -630
  5. package/markdown.d.ts +5 -32
  6. package/package.json +9 -9
  7. package/src/debug.test.ts +3 -3
  8. package/src/parser/api/parse.test.ts +1 -1
  9. package/src/parser/block/blockquote.test.ts +2 -2
  10. package/src/parser/block/dlist.test.ts +1 -1
  11. package/src/parser/block/extension/example.test.ts +1 -1
  12. package/src/parser/block/extension/fig.test.ts +1 -1
  13. package/src/parser/block/heading.test.ts +2 -2
  14. package/src/parser/block/olist.ts +4 -6
  15. package/src/parser/block/paragraph.test.ts +1 -4
  16. package/src/parser/inline/autolink/anchor.test.ts +1 -0
  17. package/src/parser/inline/autolink/email.test.ts +3 -0
  18. package/src/parser/inline/autolink/email.ts +1 -1
  19. package/src/parser/inline/autolink/hashnum.test.ts +1 -2
  20. package/src/parser/inline/autolink/hashnum.ts +1 -1
  21. package/src/parser/inline/autolink/hashtag.test.ts +15 -12
  22. package/src/parser/inline/autolink/hashtag.ts +3 -3
  23. package/src/parser/inline/autolink/url.test.ts +1 -1
  24. package/src/parser/inline/autolink/url.ts +1 -1
  25. package/src/parser/inline/autolink.ts +13 -4
  26. package/src/parser/inline/deletion.test.ts +2 -2
  27. package/src/parser/inline/deletion.ts +1 -1
  28. package/src/parser/inline/emphasis.test.ts +26 -35
  29. package/src/parser/inline/emphasis.ts +5 -12
  30. package/src/parser/inline/extension/index.test.ts +2 -2
  31. package/src/parser/inline/insertion.test.ts +2 -2
  32. package/src/parser/inline/insertion.ts +1 -1
  33. package/src/parser/inline/link.test.ts +1 -1
  34. package/src/parser/inline/mark.test.ts +1 -1
  35. package/src/parser/inline/mark.ts +1 -1
  36. package/src/parser/inline/strong.test.ts +25 -32
  37. package/src/parser/inline/strong.ts +5 -9
  38. package/src/parser/inline.test.ts +18 -91
  39. package/src/parser/inline.ts +0 -6
  40. package/src/parser/locale/ja.ts +1 -9
  41. package/src/parser/locale.test.ts +1 -1
  42. package/src/parser/processor/figure.ts +2 -1
  43. package/src/parser/processor/footnote.ts +2 -1
  44. package/src/parser/source/str.ts +4 -2
  45. package/src/parser/source/text.test.ts +9 -4
  46. package/src/parser/source/text.ts +9 -16
  47. package/src/renderer/render.ts +3 -3
  48. package/src/parser/inline/emstrong.ts +0 -62
  49. 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
- strong,
17
- some(inline, blankWith('*')),
18
- open(some(inline, '*'), union([
19
- emstrong,
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('[#*A*]')), [['<a class="index" href="#index:A"><em>A</em></a>'], '']);
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|#*b*]')), [['<a class="index" href="#index:*b*">a<span class="indexer" data-index="*b*"></span></a>'], '']);
83
+ assert.deepStrictEqual(inspect(parser('[#a|#_b_]')), [['<a class="index" href="#index:_b_">a<span class="indexer" data-index="_b_"></span></a>'], '']);
84
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('++*++a++*++')), [['<ins><em><ins>a</ins></em></ins>'], '']);
41
- assert.deepStrictEqual(inspect(parser('++*~~a~~*++')), [['<ins><em><del>a</del></em></ins>'], '']);
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('[*a*]{b}')), [['<a class="link" href="b"><em>a</em></a>'], '']);
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&Tab;==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('==*==a==*==')), [['<mark><em><mark>a</mark></em></mark>'], '']);
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('**')), 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('**a*')), [['**', 'a', '*'], '']);
18
- assert.deepStrictEqual(inspect(parser('**a*b**')), [['**', 'a', '<em>b</em>', '*'], '']);
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);
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('**a**')), [['<strong>a</strong>'], '']);
33
- assert.deepStrictEqual(inspect(parser('**ab**')), [['<strong>ab</strong>'], '']);
34
- assert.deepStrictEqual(inspect(parser('**a\nb**')), [['<strong>a<br>b</strong>'], '']);
35
- assert.deepStrictEqual(inspect(parser('**a\\\nb**')), [['<strong>a<span class="linebreak"> </span>b</strong>'], '']);
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('**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>'], '']);
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>'], '']);
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, '*'), union([
17
- emstrong,
18
- strong,
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('* 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>'], '']);
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('*<*>')), [['<em>&lt;</em>', '>'], '']);
108
- assert.deepStrictEqual(inspect(parser('*a((b))*')), [['<em>a<sup class="annotation"><span>b</span></sup></em>'], '']);
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>'], '']);
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>', '<em>b<br>c</em>', ']'], '']);
170
- assert.deepStrictEqual(inspect(parser('[*a\nb*]{/}')), [['[', '<em>a<br>b</em>', ']', '<a class="url" href="/">/</a>'], '']);
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*]]')), [['[', '[', '<em>a<br>b</em>', ']', ']'], '']);
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('*http://host*')), [['<em><a class="url" href="http://host" target="_blank">http://host</a></em>'], '']);
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('*a@b*')), [['<em><a class="email" href="mailto:a@b">a@b</a></em>'], '']);
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('*@a*')), [['<em><a class="account" href="/@a">@a</a></em>'], '']);
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('*a*#b')), [['<em>a</em>', '<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>'], '']);
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>'], '']);
@@ -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,
@@ -1,11 +1,3 @@
1
1
  export function japanese(char: string): boolean {
2
- switch (char) {
3
- case '、':
4
- case '。':
5
- case '!':
6
- case '?':
7
- return true;
8
- default:
9
- return false;
10
- }
2
+ return /^[\p{Ideo}\p{scx=Hiragana}\p{scx=Katakana}~!?]/u.test(char);
11
3
  }
@@ -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('*。*\\\n0')), [['<p><em>。</em><span class="linebreak"></span>0</p>'], '']);
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 (const ref of refs.take(label, Infinity)) {
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 (const ref of buffer.take(identifier, Infinity)) {
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,
@@ -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('.\\\n0')), [['.', '<span class="linebreak"> </span>', '0'], '']);
120
- assert.deepStrictEqual(inspect(parser('。\\\n0')), [['', '<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'], '']);
120
+ assert.deepStrictEqual(inspect(parser('a\\\n0')), [['a', '<span class="linebreak"> </span>', '0'], '']);
121
+ assert.deepStrictEqual(inspect(parser('あ\\\n0')), [['', '<span class="linebreak"></span>', ''], '']);
122
+ assert.deepStrictEqual(inspect(parser('ア\\\n0')), [['', '<span class="linebreak"></span>', ''], '']);
123
+ assert.deepStrictEqual(inspect(parser('亜\\\n0')), [['', '<span class="linebreak"></span>', ''], '']);
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[#>]|[()、。!?][^\S\n]*(?=\\\n)/;
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
- switch (source[1]) {
23
- case '':
24
- case '。':
25
- case '!':
26
- case '?':
27
- assert(source[0] !== '\x1B');
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 '~':