securemark 0.260.6 → 0.261.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +12 -12
  3. package/design.md +0 -4
  4. package/dist/index.js +34 -113
  5. package/markdown.d.ts +5 -21
  6. package/package.json +4 -4
  7. package/src/parser/api/parse.test.ts +1 -1
  8. package/src/parser/block/blockquote.test.ts +2 -2
  9. package/src/parser/block/dlist.test.ts +1 -1
  10. package/src/parser/block/extension/example.test.ts +1 -1
  11. package/src/parser/block/extension/fig.test.ts +1 -1
  12. package/src/parser/block/heading.test.ts +2 -2
  13. package/src/parser/block/paragraph.test.ts +1 -4
  14. package/src/parser/inline/autolink/anchor.test.ts +1 -0
  15. package/src/parser/inline/autolink/email.test.ts +3 -0
  16. package/src/parser/inline/autolink/email.ts +1 -1
  17. package/src/parser/inline/autolink/hashnum.test.ts +1 -2
  18. package/src/parser/inline/autolink/hashnum.ts +1 -1
  19. package/src/parser/inline/autolink/hashtag.test.ts +15 -12
  20. package/src/parser/inline/autolink/hashtag.ts +3 -3
  21. package/src/parser/inline/autolink/url.test.ts +1 -1
  22. package/src/parser/inline/autolink/url.ts +1 -1
  23. package/src/parser/inline/autolink.ts +13 -4
  24. package/src/parser/inline/deletion.test.ts +2 -2
  25. package/src/parser/inline/emphasis.test.ts +26 -35
  26. package/src/parser/inline/emphasis.ts +5 -12
  27. package/src/parser/inline/escape.ts +1 -10
  28. package/src/parser/inline/extension/index.test.ts +2 -2
  29. package/src/parser/inline/insertion.test.ts +2 -2
  30. package/src/parser/inline/link.test.ts +1 -1
  31. package/src/parser/inline/mark.test.ts +1 -1
  32. package/src/parser/inline/strong.test.ts +25 -32
  33. package/src/parser/inline/strong.ts +4 -8
  34. package/src/parser/inline.test.ts +18 -91
  35. package/src/parser/inline.ts +0 -3
  36. package/src/parser/locale/ja.ts +1 -9
  37. package/src/parser/locale.test.ts +1 -1
  38. package/src/parser/source/text.test.ts +9 -4
  39. package/src/parser/source/text.ts +9 -16
  40. package/src/parser/inline/emstrong.ts +0 -62
@@ -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>'], '']);
@@ -13,7 +13,6 @@ import { html } from './inline/html';
13
13
  import { insertion } from './inline/insertion';
14
14
  import { deletion } from './inline/deletion';
15
15
  import { mark } from './inline/mark';
16
- import { emstrong } from './inline/emstrong';
17
16
  import { emphasis } from './inline/emphasis';
18
17
  import { strong } from './inline/strong';
19
18
  import { code } from './inline/code';
@@ -38,7 +37,6 @@ export import HTMLParser = InlineParser.HTMLParser;
38
37
  export import InsertionParser = InlineParser.InsertionParser;
39
38
  export import DeletionParser = InlineParser.DeletionParser;
40
39
  export import MarkParser = InlineParser.MarkParser;
41
- export import EmStrongParser = InlineParser.EmStrongParser;
42
40
  export import EmphasisParser = InlineParser.EmphasisParser;
43
41
  export import StrongParser = InlineParser.StrongParser;
44
42
  export import CodeParser = InlineParser.CodeParser;
@@ -64,7 +62,6 @@ export const inline: InlineParser = union([
64
62
  insertion,
65
63
  deletion,
66
64
  mark,
67
- emstrong,
68
65
  strong,
69
66
  emphasis,
70
67
  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{Script_Extensions=Hiragana}\p{Script_Extensions=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>'], '']);
@@ -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{Script_Extensions=Hiragana}\p{Script_Extensions=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{Script_Extensions=Hiragana}\p{Script_Extensions=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 '~':
@@ -1,62 +0,0 @@
1
- import { EmStrongParser, EmphasisParser, StrongParser } from '../inline';
2
- import { Result, IntermediateParser } from '../../combinator/data/parser';
3
- import { union, syntax, some, surround, open, lazy, bind } from '../../combinator';
4
- import { inline } from '../inline';
5
- import { strong } from './strong';
6
- import { emphasis } from './emphasis';
7
- import { str } from '../source';
8
- import { Syntax, State } from '../context';
9
- import { startTight, blankWith } from '../visibility';
10
- import { html, defrag } from 'typed-dom/dom';
11
- import { unshift } from 'spica/array';
12
-
13
- const substrong: IntermediateParser<StrongParser> = lazy(() => some(union([
14
- some(inline, blankWith('**')),
15
- open(some(inline, '*'), union([
16
- emstrong,
17
- strong,
18
- ])),
19
- ])));
20
- const subemphasis: IntermediateParser<EmphasisParser> = lazy(() => some(union([
21
- strong,
22
- some(inline, blankWith('*')),
23
- open(some(inline, '*'), union([
24
- emstrong,
25
- strong,
26
- emphasis,
27
- ])),
28
- ])));
29
-
30
- export const emstrong: EmStrongParser = lazy(() => surround(
31
- str('***'),
32
- syntax(Syntax.none, 1, 1, State.none,
33
- startTight(some(union([
34
- some(inline, blankWith('*')),
35
- open(some(inline, '*'), inline),
36
- ])))),
37
- str(/^\*{1,3}/), false,
38
- ([, bs, cs], rest, context): Result<HTMLElement | string, typeof context> => {
39
- assert(cs.length === 1);
40
- switch (cs[0]) {
41
- case '***':
42
- return [[html('em', [html('strong', defrag(bs))])], rest];
43
- case '**':
44
- return bind<EmphasisParser>(
45
- subemphasis,
46
- (ds, rest) =>
47
- rest.slice(0, 1) === '*'
48
- ? [[html('em', unshift([html('strong', defrag(bs))], defrag(ds)))], rest.slice(1)]
49
- : [unshift(['*', html('strong', defrag(bs))], ds), rest])
50
- ({ source: rest, context }) ?? [['*', html('strong', defrag(bs))], rest];
51
- case '*':
52
- return bind<StrongParser>(
53
- substrong,
54
- (ds, rest) =>
55
- rest.slice(0, 2) === '**'
56
- ? [[html('strong', unshift([html('em', defrag(bs))], defrag(ds)))], rest.slice(2)]
57
- : [unshift(['**', html('em', defrag(bs))], ds), rest])
58
- ({ source: rest, context }) ?? [['**', html('em', defrag(bs))], rest];
59
- }
60
- assert(false);
61
- },
62
- ([as, bs], rest) => [unshift(as, bs), rest]));