securemark 0.260.5 → 0.261.1

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 (46) 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 +199 -245
  5. package/markdown.d.ts +5 -32
  6. package/package.json +6 -6
  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/block/reply/cite.test.ts +5 -0
  15. package/src/parser/block/reply/cite.ts +5 -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/source/str.ts +4 -2
  43. package/src/parser/source/text.test.ts +9 -4
  44. package/src/parser/source/text.ts +9 -16
  45. package/src/parser/inline/emstrong.ts +0 -62
  46. package/src/parser/inline/escape.ts +0 -30
package/markdown.d.ts CHANGED
@@ -621,7 +621,6 @@ export namespace MarkdownParser {
621
621
  export interface InlineParser extends
622
622
  Markdown<'inline'>,
623
623
  Parser<HTMLElement | string, Context, [
624
- InlineParser.EscapeParser,
625
624
  InlineParser.AnnotationParser,
626
625
  InlineParser.ReferenceParser,
627
626
  InlineParser.TemplateParser,
@@ -635,7 +634,6 @@ export namespace MarkdownParser {
635
634
  InlineParser.InsertionParser,
636
635
  InlineParser.DeletionParser,
637
636
  InlineParser.MarkParser,
638
- InlineParser.EmStrongParser,
639
637
  InlineParser.StrongParser,
640
638
  InlineParser.EmphasisParser,
641
639
  InlineParser.CodeParser,
@@ -648,16 +646,6 @@ export namespace MarkdownParser {
648
646
  }
649
647
  export namespace InlineParser {
650
648
  interface Inline<T extends string> extends Markdown<`inline/${T}`> { }
651
- export interface EscapeParser extends
652
- // ****
653
- // +++
654
- // ~~~
655
- // ===
656
- Inline<'escape'>,
657
- Parser<string, Context, [
658
- SourceParser.StrParser,
659
- ]> {
660
- }
661
649
  export interface AnnotationParser extends
662
650
  // ((abc))
663
651
  Inline<'annotation'>,
@@ -1032,36 +1020,20 @@ export namespace MarkdownParser {
1032
1020
  MarkParser,
1033
1021
  ]> {
1034
1022
  }
1035
- export interface EmStrongParser extends
1036
- // *abc*
1037
- Inline<'emstrong'>,
1038
- Parser<HTMLElement | string, Context, [
1039
- InlineParser,
1040
- InlineParser,
1041
- ]> {
1042
- }
1043
1023
  export interface StrongParser extends
1044
- // **abc**
1024
+ // *abc*
1045
1025
  Inline<'strong'>,
1046
1026
  Parser<HTMLElement | string, Context, [
1047
1027
  InlineParser,
1048
- Parser<HTMLElement | string, Context, [
1049
- EmStrongParser,
1050
- StrongParser,
1051
- ]>,
1028
+ StrongParser,
1052
1029
  ]> {
1053
1030
  }
1054
1031
  export interface EmphasisParser extends
1055
- // *abc*
1032
+ // _abc_
1056
1033
  Inline<'emphasis'>,
1057
1034
  Parser<HTMLElement | string, Context, [
1058
- StrongParser,
1059
1035
  InlineParser,
1060
- Parser<HTMLElement | string, Context, [
1061
- EmStrongParser,
1062
- StrongParser,
1063
- EmphasisParser,
1064
- ]>,
1036
+ EmphasisParser,
1065
1037
  ]> {
1066
1038
  }
1067
1039
  export interface CodeParser extends
@@ -1103,6 +1075,7 @@ export namespace MarkdownParser {
1103
1075
  AutolinkParser.HashtagParser,
1104
1076
  AutolinkParser.HashnumParser,
1105
1077
  SourceParser.StrParser,
1078
+ SourceParser.StrParser,
1106
1079
  AutolinkParser.AnchorParser,
1107
1080
  ]> {
1108
1081
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.260.5",
3
+ "version": "0.261.1",
4
4
  "description": "Secure markdown renderer working on browsers for user input data.",
5
5
  "private": false,
6
6
  "homepage": "https://github.com/falsandtru/securemark",
@@ -34,11 +34,11 @@
34
34
  "@types/mocha": "9.1.1",
35
35
  "@types/power-assert": "1.5.8",
36
36
  "@types/prismjs": "1.26.0",
37
- "@typescript-eslint/parser": "^5.30.7",
37
+ "@typescript-eslint/parser": "^5.33.1",
38
38
  "babel-loader": "^8.2.5",
39
39
  "babel-plugin-unassert": "^3.2.0",
40
40
  "concurrently": "^7.3.0",
41
- "eslint": "^8.20.0",
41
+ "eslint": "^8.22.0",
42
42
  "eslint-plugin-redos": "^4.4.1",
43
43
  "eslint-webpack-plugin": "^3.2.0",
44
44
  "glob": "^8.0.3",
@@ -49,13 +49,13 @@
49
49
  "karma-mocha": "^2.0.1",
50
50
  "karma-power-assert": "^1.0.0",
51
51
  "mocha": "^10.0.0",
52
- "npm-check-updates": "^15.3.4",
52
+ "npm-check-updates": "^16.0.5",
53
53
  "semver": "^7.3.7",
54
- "spica": "0.0.573",
54
+ "spica": "0.0.591",
55
55
  "ts-loader": "^9.3.1",
56
56
  "typed-dom": "^0.0.301",
57
57
  "typescript": "4.7.4",
58
- "webpack": "^5.73.0",
58
+ "webpack": "^5.74.0",
59
59
  "webpack-cli": "^4.10.0",
60
60
  "webpack-merge": "^5.8.0"
61
61
  },
@@ -206,7 +206,7 @@ describe('Unit: parser/api/parse', () => {
206
206
  it('footnote', () => {
207
207
  const footnotes = { references: html('ol') };
208
208
  assert.deepStrictEqual(
209
- [...parse('$-a\n$$\n$$\n\n(($-a[[b]][[c*d*]]))', { footnotes }).children].map(el => el.outerHTML),
209
+ [...parse('$-a\n$$\n$$\n\n(($-a[[b]][[c_d_]]))', { footnotes }).children].map(el => el.outerHTML),
210
210
  [
211
211
  '<figure data-type="math" data-label="$-a" data-group="$" data-number="1" id="label:$-a"><figcaption><span class="figindex">(1)</span><span class="figtext"></span></figcaption><div><div class="math" translate="no">$$\n$$</div></div></figure>',
212
212
  '<p><sup class="annotation" id="annotation:ref:1" title="(1)[1][2]"><span hidden=""><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference:ref:1" title="b"><span hidden="">b</span><a href="#reference:def:1">[1]</a></sup><sup class="reference" id="reference:ref:2" title="cd"><span hidden="">c<em>d</em></span><a href="#reference:def:2">[2]</a></sup></span><a href="#annotation:def:1">*1</a></sup></p>',
@@ -70,8 +70,8 @@ describe('Unit: parser/block/blockquote', () => {
70
70
  assert.deepStrictEqual(inspect(parser('!> a')), [['<blockquote><section><p>a</p><ol class="references"></ol></section></blockquote>'], '']);
71
71
  assert.deepStrictEqual(inspect(parser('!> a\n')), [['<blockquote><section><p>a</p><ol class="references"></ol></section></blockquote>'], '']);
72
72
  assert.deepStrictEqual(inspect(parser('!> a\\\nb')), [['<blockquote><section><p>a<span class="linebreak"> </span>b</p><ol class="references"></ol></section></blockquote>'], '']);
73
- assert.deepStrictEqual(inspect(parser('!> *a\nb*')), [['<blockquote><section><p><em>a<br>b</em></p><ol class="references"></ol></section></blockquote>'], '']);
74
- assert.deepStrictEqual(inspect(parser('!> *a\n> b*')), [['<blockquote><section><p><em>a<br>b</em></p><ol class="references"></ol></section></blockquote>'], '']);
73
+ assert.deepStrictEqual(inspect(parser('!> _a\nb_')), [['<blockquote><section><p><em>a<br>b</em></p><ol class="references"></ol></section></blockquote>'], '']);
74
+ assert.deepStrictEqual(inspect(parser('!> _a\n> b_')), [['<blockquote><section><p><em>a<br>b</em></p><ol class="references"></ol></section></blockquote>'], '']);
75
75
  assert.deepStrictEqual(inspect(parser('!> a \n b c ')), [['<blockquote><section><p> a<br> b c</p><ol class="references"></ol></section></blockquote>'], '']);
76
76
  assert.deepStrictEqual(inspect(parser('!>> a')), [['<blockquote><blockquote><section><p>a</p><ol class="references"></ol></section></blockquote></blockquote>'], '']);
77
77
  assert.deepStrictEqual(inspect(parser('!>> a\n> b')), [['<blockquote><blockquote><section><p>a</p><ol class="references"></ol></section></blockquote><section><p>b</p><ol class="references"></ol></section></blockquote>'], '']);
@@ -68,7 +68,7 @@ describe('Unit: parser/block/dlist', () => {
68
68
  assert.deepStrictEqual(inspect(parser('~ a [#b]')), [['<dl><dt id="index:b">a<span class="indexer" data-index="b"></span></dt><dd></dd></dl>'], '']);
69
69
  assert.deepStrictEqual(inspect(parser('~ a [#b]\\')), [['<dl><dt id="index:a_[#b]">a [<a class="hashtag" href="/hashtags/b">#b</a>]</dt><dd></dd></dl>'], '']);
70
70
  assert.deepStrictEqual(inspect(parser('~ A')), [['<dl><dt id="index:A">A</dt><dd></dd></dl>'], '']);
71
- assert.deepStrictEqual(inspect(parser('~ *A*')), [['<dl><dt id="index:A"><em>A</em></dt><dd></dd></dl>'], '']);
71
+ assert.deepStrictEqual(inspect(parser('~ _A_')), [['<dl><dt id="index:A"><em>A</em></dt><dd></dd></dl>'], '']);
72
72
  assert.deepStrictEqual(inspect(parser('~ `A`')), [['<dl><dt id="index:`A`"><code data-src="`A`">A</code></dt><dd></dd></dl>'], '']);
73
73
  assert.deepStrictEqual(inspect(parser('~ ${A}$')), [['<dl><dt id="index:${A}$"><span class="math" translate="no" data-src="${A}$">${A}$</span></dt><dd></dd></dl>'], '']);
74
74
  });
@@ -18,7 +18,7 @@ describe('Unit: parser/block/extension/example', () => {
18
18
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no"></pre><hr><section><ol class="references"></ol></section></aside>'], '']);
19
19
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\n\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no"></pre><hr><section><ol class="references"></ol></section></aside>'], '']);
20
20
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\na\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">a</pre><hr><section><p>a</p><ol class="references"></ol></section></aside>'], '']);
21
- assert.deepStrictEqual(inspect(parser('~~~example/markdown\n*a\nb*\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">*a\nb*</pre><hr><section><p><em>a<br>b</em></p><ol class="references"></ol></section></aside>'], '']);
21
+ assert.deepStrictEqual(inspect(parser('~~~example/markdown\n_a\nb_\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">_a\nb_</pre><hr><section><p><em>a<br>b</em></p><ol class="references"></ol></section></aside>'], '']);
22
22
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\n$fig-a\n!https://host\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">$fig-a\n!https://host</pre><hr><section><figure data-type="media" data-label="fig-a" data-group="fig" data-number="1"><figcaption><span class="figindex">Fig. 1. </span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure><ol class="references"></ol></section></aside>'], '']);
23
23
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\n[$fig-a]\n!https://host\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">[$fig-a]\n!https://host</pre><hr><section><figure data-type="media" data-label="fig-a" data-group="fig" data-number="1"><figcaption><span class="figindex">Fig. 1. </span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure><ol class="references"></ol></section></aside>'], '']);
24
24
  assert.deepStrictEqual(inspect(parser('~~~example/markdown\n## a\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">## a</pre><hr><section><h2>a</h2><ol class="references"></ol></section></aside>'], '']);
@@ -40,7 +40,7 @@ describe('Unit: parser/block/extension/fig', () => {
40
40
  assert.deepStrictEqual(inspect(parser('[$group-name]\n> ')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
41
41
  assert.deepStrictEqual(inspect(parser('[$group-name]\n> \n')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>'], '']);
42
42
  assert.deepStrictEqual(inspect(parser('[$group-name]\n>\n~~~')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><blockquote><pre><br>~~~</pre></blockquote></div></figure>'], '']);
43
- assert.deepStrictEqual(inspect(parser('[$group-name]\n!> *a*')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><blockquote><section><p><em>a</em></p><ol class="references"></ol></section></blockquote></div></figure>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('[$group-name]\n!> _a_')), [['<figure data-type="quote" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><blockquote><section><p><em>a</em></p><ol class="references"></ol></section></blockquote></div></figure>'], '']);
44
44
  assert.deepStrictEqual(inspect(parser('[$group-name]\n![]{https://host}')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
45
45
  assert.deepStrictEqual(inspect(parser('[$group-name]\n![]{https://host}\n')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
46
46
  assert.deepStrictEqual(inspect(parser('$group-name\n!https://host')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
@@ -36,7 +36,7 @@ describe('Unit: parser/block/heading', () => {
36
36
  assert.deepStrictEqual(inspect(parser('# a ')), [['<h1 id="index:a">a</h1>'], '']);
37
37
  assert.deepStrictEqual(inspect(parser('# a b c \n')), [['<h1 id="index:a_b_c">a b c</h1>'], '']);
38
38
  assert.deepStrictEqual(inspect(parser('# a\n')), [['<h1 id="index:a">a</h1>'], '']);
39
- assert.deepStrictEqual(inspect(parser('# *a*`b`${c}$')), [['<h1 id="index:a`b`${c}$"><em>a</em><code data-src="`b`">b</code><span class="math" translate="no" data-src="${c}$">${c}$</span></h1>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('# _a_`b`${c}$')), [['<h1 id="index:a`b`${c}$"><em>a</em><code data-src="`b`">b</code><span class="math" translate="no" data-src="${c}$">${c}$</span></h1>'], '']);
40
40
  assert.deepStrictEqual(inspect(parser('# a\\')), [['<h1 id="index:a">a</h1>'], '']);
41
41
  assert.deepStrictEqual(inspect(parser('# a\\\n')), [['<h1 id="index:a">a</h1>'], '']);
42
42
  assert.deepStrictEqual(inspect(parser('# \\')), [['<h1 id="index:\\">\\</h1>'], '']);
@@ -69,7 +69,7 @@ describe('Unit: parser/block/heading', () => {
69
69
  assert.deepStrictEqual(inspect(parser('# a [#b ]')), [['<h1 id="index:b">a<span class="indexer" data-index="b"></span></h1>'], '']);
70
70
  assert.deepStrictEqual(inspect(parser('# a [#b ]')), [['<h1 id="index:b">a<span class="indexer" data-index="b"></span></h1>'], '']);
71
71
  assert.deepStrictEqual(inspect(parser('# a [#b c]')), [['<h1 id="index:b_c">a<span class="indexer" data-index="b_c"></span></h1>'], '']);
72
- assert.deepStrictEqual(inspect(parser('# a [#*b*`c`${d}$]')), [['<h1 id="index:b`c`${d}$">a<span class="indexer" data-index="b`c`${d}$"></span></h1>'], '']);
72
+ assert.deepStrictEqual(inspect(parser('# a [#_b_`c`${d}$]')), [['<h1 id="index:b`c`${d}$">a<span class="indexer" data-index="b`c`${d}$"></span></h1>'], '']);
73
73
  assert.deepStrictEqual(inspect(parser('# a [#@a]')), [['<h1 id="index:@a">a<span class="indexer" data-index="@a"></span></h1>'], '']);
74
74
  assert.deepStrictEqual(inspect(parser('# a [#http://host]')), [['<h1 id="index:http://host">a<span class="indexer" data-index="http://host"></span></h1>'], '']);
75
75
  assert.deepStrictEqual(inspect(parser('# a [#!http://host]')), [['<h1 id="index:!http://host">a<span class="indexer" data-index="!http://host"></span></h1>'], '']);
@@ -27,11 +27,8 @@ describe('Unit: parser/block/paragraph', () => {
27
27
  assert.deepStrictEqual(inspect(parser('<wbr>\na')), [['<p>&lt;wbr&gt;<br>a</p>'], '']);
28
28
  assert.deepStrictEqual(inspect(parser('a\n<wbr>\n')), [['<p>a<br>&lt;wbr&gt;</p>'], '']);
29
29
  assert.deepStrictEqual(inspect(parser('a\n<wbr>\nb')), [['<p>a<br>&lt;wbr&gt;<br>b</p>'], '']);
30
+ assert.deepStrictEqual(inspect(parser('_a\n<wbr>_\nb')), [['<p>_a<br><wbr>_<br>b</p>'], '']);
30
31
  assert.deepStrictEqual(inspect(parser('*a\n<wbr>*\nb')), [['<p>*a<br><wbr>*<br>b</p>'], '']);
31
- assert.deepStrictEqual(inspect(parser('**a\n<wbr>**\nb')), [['<p>**a<br><wbr>**<br>b</p>'], '']);
32
- assert.deepStrictEqual(inspect(parser('***a\n<wbr>***\nb')), [['<p>***a<br><wbr>***<br>b</p>'], '']);
33
- assert.deepStrictEqual(inspect(parser('***a*b\n<wbr>**\nc')), [['<p>**<em>a</em>b<br><wbr>**<br>c</p>'], '']);
34
- assert.deepStrictEqual(inspect(parser('***a**b\n<wbr>*\nc')), [['<p>*<strong>a</strong>b<br><wbr>*<br>c</p>'], '']);
35
32
  assert.deepStrictEqual(inspect(parser('==a\n<wbr>==\nb')), [['<p>==a<br><wbr>==<br>b</p>'], '']);
36
33
  assert.deepStrictEqual(inspect(parser('\ta')), [['<p>\ta</p>'], '']);
37
34
  });
@@ -39,11 +39,16 @@ describe('Unit: parser/block/reply/cite', () => {
39
39
  assert.deepStrictEqual(inspect(parser('>>>0\n>>')), [['<span class="cite">&gt;&gt;<a class="anchor" href="?at=0" data-depth="2">&gt;0</a></span>', '<br>'], '>>']);
40
40
  assert.deepStrictEqual(inspect(parser('>>>0\n>>1')), [['<span class="cite">&gt;&gt;<a class="anchor" href="?at=0" data-depth="2">&gt;0</a></span>', '<br>', '<span class="cite">&gt;<a class="anchor" href="?at=1" data-depth="1">&gt;1</a></span>', '<br>'], '']);
41
41
  assert.deepStrictEqual(inspect(parser('>>.')), [['<span class="cite">&gt;<a class="anchor" data-depth="1">&gt;.</a></span>', '<br>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('>>. ')), [['<span class="cite">&gt;<a class="anchor" data-depth="1">&gt;.</a></span>', '<br>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('>>.\n')), [['<span class="cite">&gt;<a class="anchor" data-depth="1">&gt;.</a></span>', '<br>'], '']);
42
44
  assert.deepStrictEqual(inspect(parser('>>#')), [['<span class="cite">&gt;<a class="anchor" data-depth="1">&gt;#</a></span>', '<br>'], '']);
45
+ assert.deepStrictEqual(inspect(parser('>>#\n')), [['<span class="cite">&gt;<a class="anchor" data-depth="1">&gt;#</a></span>', '<br>'], '']);
43
46
  assert.deepStrictEqual(inspect(parser('>>#a')), [['<span class="cite">&gt;<a class="anchor" data-depth="1">&gt;#a</a></span>', '<br>'], '']);
44
47
  assert.deepStrictEqual(inspect(parser('>>#index:a')), [['<span class="cite">&gt;<a class="anchor" data-depth="1">&gt;#index:a</a></span>', '<br>'], '']);
45
48
  assert.deepStrictEqual(inspect(parser('>>#:~:text=a')), [['<span class="cite">&gt;<a class="anchor" data-depth="1">&gt;#:~:text=a</a></span>', '<br>'], '']);
46
49
  assert.deepStrictEqual(inspect(parser('>>http://host')), [['<span class="cite">&gt;<a class="anchor" href="http://host" target="_blank" data-depth="1">&gt;http://host</a></span>', '<br>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('>>http://host ')), [['<span class="cite">&gt;<a class="anchor" href="http://host" target="_blank" data-depth="1">&gt;http://host</a></span>', '<br>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('>>http://host\n')), [['<span class="cite">&gt;<a class="anchor" href="http://host" target="_blank" data-depth="1">&gt;http://host</a></span>', '<br>'], '']);
47
52
  assert.deepStrictEqual(inspect(parser('>>https://host')), [['<span class="cite">&gt;<a class="anchor" href="https://host" target="_blank" data-depth="1">&gt;https://host</a></span>', '<br>'], '']);
48
53
  });
49
54
 
@@ -7,14 +7,15 @@ import { html, define, defrag } from 'typed-dom/dom';
7
7
  export const cite: ReplyParser.CiteParser = creation(1, false, line(fmap(validate(
8
8
  '>>',
9
9
  reverse(tails([
10
- str(/^>*(?=>>[^>\s]+[^\S\n]*(?:$|\n))/),
10
+ str(/^>*(?=>>[^>\s]+\s*$)/),
11
11
  union([
12
12
  anchor,
13
13
  // Subject page representation.
14
14
  // リンクの実装は後で検討
15
- focus(/^>>\.[^\S\n]*(?:$|\n)/, () => [[html('a', { class: 'anchor' }, '>>.')], '']),
16
- focus(/^>>#\S*[^\S\n]*(?:$|\n)/, ({ source }) => [[html('a', { class: 'anchor' }, source)], '']),
17
- focus(/^>>https?:\/\/\w\S*[^\S\n]*(?:$|\n)/, ({ source }) => [[html('a', { class: 'anchor', href: source.slice(2).trimEnd(), target: '_blank' }, source)], '']),
15
+ focus(/^>>\.(?=\s*$)/, () => [[html('a', { class: 'anchor' }, '>>.')], '']),
16
+ focus(/^>>#\S*(?=\s*$)/, ({ source }) => [[html('a', { class: 'anchor' }, source)], '']),
17
+ // Support all domains, but don't support IP(v6) addresses.
18
+ focus(/^>>https?:\/\/[^\p{C}\p{S}\p{P}\s]\S*(?=\s*$)/u, ({ source }) => [[html('a', { class: 'anchor', href: source.slice(2).trimEnd(), target: '_blank' }, source)], '']),
18
19
  ]),
19
20
  ]))),
20
21
  ([el, quotes = '']: [HTMLElement, string?]) => [
@@ -16,6 +16,7 @@ describe('Unit: parser/inline/autolink/anchor', () => {
16
16
  assert.deepStrictEqual(inspect(parser('>>https://host')), undefined);
17
17
  assert.deepStrictEqual(inspect(parser('>>tel:1234567890')), undefined);
18
18
  assert.deepStrictEqual(inspect(parser('>>>')), undefined);
19
+ assert.deepStrictEqual(inspect(parser('a>>0')), [['a>>0'], '']);
19
20
  assert.deepStrictEqual(inspect(parser(' >>0')), undefined);
20
21
  });
21
22
 
@@ -8,6 +8,9 @@ describe('Unit: parser/inline/autolink/email', () => {
8
8
 
9
9
  it('invalid', () => {
10
10
  assert.deepStrictEqual(inspect(parser('')), undefined);
11
+ assert.deepStrictEqual(inspect(parser('a_b')), [['a'], '_b']);
12
+ assert.deepStrictEqual(inspect(parser('a_b_c')), [['a'], '_b_c']);
13
+ assert.deepStrictEqual(inspect(parser(`a_${'b'.repeat(255 - 2)}@`)), [[`a_${'b'.repeat(255 - 2)}@`], '']);
11
14
  assert.deepStrictEqual(inspect(parser('a@')), [['a@'], '']);
12
15
  assert.deepStrictEqual(inspect(parser('a@+')), [['a@'], '+']);
13
16
  assert.deepStrictEqual(inspect(parser('a@_')), [['a@'], '_']);
@@ -6,6 +6,6 @@ import { html } from 'typed-dom/dom';
6
6
  // https://html.spec.whatwg.org/multipage/input.html
7
7
 
8
8
  export const email: AutolinkParser.EmailParser = creation(rewrite(verify(
9
- str(/^[0-9a-z](?:[.+_-](?=[^\W_])|[0-9a-z]){0,255}@[0-9a-z](?:(?:[0-9a-z]|-(?=\w)){0,61}[0-9a-z])?(?:\.[0-9a-z](?:(?:[0-9a-z]|-(?=\w)){0,61}[0-9a-z])?)*(?![0-9a-z])/i),
9
+ str(/^[0-9a-z](?:[_.+-](?=[0-9a-z])|[0-9a-z]){0,255}@[0-9a-z](?:(?:[0-9a-z]|-(?=\w)){0,61}[0-9a-z])?(?:\.[0-9a-z](?:(?:[0-9a-z]|-(?=\w)){0,61}[0-9a-z])?)*(?![0-9a-z])/i),
10
10
  ([source]) => source.length <= 255),
11
11
  ({ source }) => [[html('a', { class: 'email', href: `mailto:${source}` }, source)], '']));
@@ -20,8 +20,6 @@ describe('Unit: parser/inline/autolink/hashnum', () => {
20
20
  assert.deepStrictEqual(inspect(parser('##')), [['##'], '']);
21
21
  assert.deepStrictEqual(inspect(parser('##1')), [['##1'], '']);
22
22
  assert.deepStrictEqual(inspect(parser('###1')), [['###1'], '']);
23
- assert.deepStrictEqual(inspect(parser(`#1'`)), [[`#1'`], '']);
24
- assert.deepStrictEqual(inspect(parser(`#1''`)), [[`#1''`], '']);
25
23
  assert.deepStrictEqual(inspect(parser('#{}')), [['#'], '{}']);
26
24
  assert.deepStrictEqual(inspect(parser('#{{}')), [['#'], '{{}']);
27
25
  assert.deepStrictEqual(inspect(parser('#{}}')), [['#'], '{}}']);
@@ -40,6 +38,7 @@ describe('Unit: parser/inline/autolink/hashnum', () => {
40
38
 
41
39
  it('valid', () => {
42
40
  assert.deepStrictEqual(inspect(parser('#1')), [['<a class="hashnum">#1</a>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('#1_')), [['<a class="hashnum">#1</a>'], '_']);
43
42
  assert.deepStrictEqual(inspect(parser('#1 ')), [['<a class="hashnum">#1</a>'], ' ']);
44
43
  assert.deepStrictEqual(inspect(parser('#1\n')), [['<a class="hashnum">#1</a>'], '\n']);
45
44
  assert.deepStrictEqual(inspect(parser('#1\\')), [['<a class="hashnum">#1</a>'], '\\']);
@@ -8,7 +8,7 @@ import { define } from 'typed-dom/dom';
8
8
 
9
9
  export const hashnum: AutolinkParser.HashnumParser = lazy(() => fmap(rewrite(
10
10
  constraint(State.shortcut, false,
11
- open('#', str(new RegExp(/^[0-9]{1,16}(?![^\p{C}\p{S}\p{P}\s]|emoji|['_])/u.source.replace(/emoji/, emoji), 'u')))),
11
+ open('#', str(new RegExp(/^[0-9]{1,16}(?![^\p{C}\p{S}\p{P}\s]|emoji|')/u.source.replace(/emoji/, emoji), 'u')))),
12
12
  convert(
13
13
  source => `[${source}]{ ${source.slice(1)} }`,
14
14
  union([unsafelink]))),
@@ -20,9 +20,8 @@ describe('Unit: parser/inline/autolink/hashtag', () => {
20
20
  assert.deepStrictEqual(inspect(parser('##')), [['##'], '']);
21
21
  assert.deepStrictEqual(inspect(parser('##a')), [['##a'], '']);
22
22
  assert.deepStrictEqual(inspect(parser('###a')), [['###a'], '']);
23
- assert.deepStrictEqual(inspect(parser(`#'`)), [[`#'`], '']);
24
- assert.deepStrictEqual(inspect(parser(`#a''`)), [[`#a''`], '']);
25
- assert.deepStrictEqual(inspect(parser('#_')), [['#_'], '']);
23
+ assert.deepStrictEqual(inspect(parser('#_')), [['#'], '_']);
24
+ assert.deepStrictEqual(inspect(parser('#_a')), [['#'], '_a']);
26
25
  assert.deepStrictEqual(inspect(parser('#(a)')), [['#'], '(a)']);
27
26
  assert.deepStrictEqual(inspect(parser('#{}')), [['#'], '{}']);
28
27
  assert.deepStrictEqual(inspect(parser('#{{}')), [['#'], '{{}']);
@@ -35,9 +34,9 @@ describe('Unit: parser/inline/autolink/hashtag', () => {
35
34
  assert.deepStrictEqual(inspect(parser('a##1')), [['a##1'], '']);
36
35
  assert.deepStrictEqual(inspect(parser('a##b')), [['a##b'], '']);
37
36
  assert.deepStrictEqual(inspect(parser('あ#b')), [['あ#b'], '']);
38
- assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(127)}_`)), [[`#${'1'.repeat(127)}_`], '']);
39
- assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(127)}_a`)), [[`#${'1'.repeat(127)}_a`], '']);
40
- assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(127)}_'a`)), [[`#${'1'.repeat(127)}_'a`], '']);
37
+ assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(127)}_`)), [[`#${'1'.repeat(127)}`], '_']);
38
+ assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(127)}_a`)), [[`#${'1'.repeat(127)}`], '_a']);
39
+ assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(127)}_'a`)), [[`#${'1'.repeat(127)}`], `_'a`]);
41
40
  assert.deepStrictEqual(inspect(parser(' #a')), undefined);
42
41
  });
43
42
 
@@ -52,9 +51,8 @@ describe('Unit: parser/inline/autolink/hashtag', () => {
52
51
  assert.deepStrictEqual(inspect(parser('#a(b')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '(b']);
53
52
  assert.deepStrictEqual(inspect(parser('#a(b)')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '(b)']);
54
53
  assert.deepStrictEqual(inspect(parser('#a_')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '_']);
55
- assert.deepStrictEqual(inspect(parser('#a_b')), [['<a class="hashtag" href="/hashtags/a_b">#a_b</a>'], '']);
56
- assert.deepStrictEqual(inspect(parser(`#a_'b`)), [['<a class="hashtag" href="/hashtags/a">#a</a>'], `_'b`]);
57
54
  assert.deepStrictEqual(inspect(parser('#a__b')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '__b']);
55
+ assert.deepStrictEqual(inspect(parser('#a_b')), [['<a class="hashtag" href="/hashtags/a_b">#a_b</a>'], '']);
58
56
  assert.deepStrictEqual(inspect(parser('#あ')), [['<a class="hashtag" href="/hashtags/あ">#あ</a>'], '']);
59
57
  assert.deepStrictEqual(inspect(parser('#👩')), [['<a class="hashtag" href="/hashtags/👩">#👩</a>'], '']);
60
58
  assert.deepStrictEqual(inspect(parser('#1a')), [['<a class="hashtag" href="/hashtags/1a">#1a</a>'], '']);
@@ -62,10 +60,15 @@ describe('Unit: parser/inline/autolink/hashtag', () => {
62
60
  assert.deepStrictEqual(inspect(parser('#1👩')), [['<a class="hashtag" href="/hashtags/1👩">#1👩</a>'], '']);
63
61
  assert.deepStrictEqual(inspect(parser('#domain/a')), [['<a class="hashtag" href="https://domain/hashtags/a" target="_blank">#domain/a</a>'], '']);
64
62
  assert.deepStrictEqual(inspect(parser('#domain.co.jp/a')), [['<a class="hashtag" href="https://domain.co.jp/hashtags/a" target="_blank">#domain.co.jp/a</a>'], '']);
65
- // Reserved
66
- assert.deepStrictEqual(inspect(parser(`#a'`)), [[`#a'`], '']);
67
- assert.deepStrictEqual(inspect(parser(`#a'b`)), [[`#a'b`], '']);
68
- assert.deepStrictEqual(inspect(parser(`#a'_b`)), [[`#a'_b`], '']);
63
+ assert.deepStrictEqual(inspect(parser(`#'0`)), [[`<a class="hashtag" href="/hashtags/'0">#'0</a>`], '']);
64
+ assert.deepStrictEqual(inspect(parser(`#'00`)), [[`<a class="hashtag" href="/hashtags/'00">#'00</a>`], '']);
65
+ assert.deepStrictEqual(inspect(parser(`#1'`)), [[`<a class="hashtag" href="/hashtags/1'">#1'</a>`], '']);
66
+ assert.deepStrictEqual(inspect(parser(`#1''`)), [[`<a class="hashtag" href="/hashtags/1'">#1'</a>`], `'`]);
67
+ assert.deepStrictEqual(inspect(parser(`#a'`)), [[`<a class="hashtag" href="/hashtags/a'">#a'</a>`], '']);
68
+ assert.deepStrictEqual(inspect(parser(`#a''`)), [[`<a class="hashtag" href="/hashtags/a'">#a'</a>`], `'`]);
69
+ assert.deepStrictEqual(inspect(parser(`#a'b`)), [[`<a class="hashtag" href="/hashtags/a'b">#a'b</a>`], '']);
70
+ assert.deepStrictEqual(inspect(parser(`#a'_b`)), [[`<a class="hashtag" href="/hashtags/a'_b">#a'_b</a>`], '']);
71
+ assert.deepStrictEqual(inspect(parser(`#a_'b`)), [[`<a class="hashtag" href="/hashtags/a_'b">#a_'b</a>`], '']);
69
72
  });
70
73
 
71
74
  });
@@ -20,9 +20,9 @@ export const hashtag: AutolinkParser.HashtagParser = lazy(() => fmap(rewrite(
20
20
  ([source]) => source.length <= 253 + 1),
21
21
  verify(
22
22
  str(new RegExp([
23
- /^(?=[0-9]{0,127}_?(?:[^\d\p{C}\p{S}\p{P}\s]|emoji))/u.source,
24
- /(?:[^\p{C}\p{S}\p{P}\s]|emoji|_(?=[^\p{C}\p{S}\p{P}\s]|emoji)){1,128}/u.source,
25
- /(?!_?(?:[^\p{C}\p{S}\p{P}\s]|emoji)|')/u.source,
23
+ /^(?=(?:[0-9]{1,127}_?)?(?:[^\d\p{C}\p{S}\p{P}\s]|emoji|'))/u.source,
24
+ /(?:[^\p{C}\p{S}\p{P}\s]|emoji|(?<!')'|_(?=[^\p{C}\p{S}\p{P}\s]|emoji|')){1,128}/u.source,
25
+ /(?!_?(?:[^\p{C}\p{S}\p{P}\s]|emoji|(?<!')'))/u.source,
26
26
  ].join('').replace(/emoji/g, emoji), 'u')),
27
27
  ([source]) => source.length <= 128),
28
28
  ]))),
@@ -58,7 +58,7 @@ describe('Unit: parser/inline/autolink/url', () => {
58
58
  assert.deepStrictEqual(inspect(parser('http://host`')), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '`']);
59
59
  assert.deepStrictEqual(inspect(parser('http://host|')), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '|']);
60
60
  assert.deepStrictEqual(inspect(parser('http://host&')), [['<a class="url" href="http://host&amp;" target="_blank">http://host&amp;</a>'], '']);
61
- assert.deepStrictEqual(inspect(parser('http://host_')), [['<a class="url" href="http://host_" target="_blank">http://host_</a>'], '']);
61
+ assert.deepStrictEqual(inspect(parser('http://host_')), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '_']);
62
62
  assert.deepStrictEqual(inspect(parser('http://host$')), [['<a class="url" href="http://host$" target="_blank">http://host$</a>'], '']);
63
63
  assert.deepStrictEqual(inspect(parser('http://user@host')), [['<a class="url" href="http://user@host" target="_blank">http://user@host</a>'], '']);
64
64
  assert.deepStrictEqual(inspect(parser('http://host#@')), [['<a class="url" href="http://host#@" target="_blank">http://host#@</a>'], '']);
@@ -3,7 +3,7 @@ import { union, some, creation, precedence, validate, focus, rewrite, convert, s
3
3
  import { unsafelink } from '../link';
4
4
  import { unescsource } from '../../source';
5
5
 
6
- const closer = /^[-+*=~^,.;:!?]*(?=[\\"`|\[\](){}<>]|$)/;
6
+ const closer = /^[-+*=~^_,.;:!?]*(?=[\\"`|\[\](){}<>]|$)/;
7
7
 
8
8
  export const url: AutolinkParser.UrlParser = lazy(() => validate(['http://', 'https://'], rewrite(
9
9
  open(
@@ -1,5 +1,5 @@
1
1
  import { AutolinkParser } from '../inline';
2
- import { union, some, syntax, constraint, validate, fmap } from '../../combinator';
2
+ import { union, some, syntax, constraint, validate, focus, fmap } from '../../combinator';
3
3
  import { url } from './autolink/url';
4
4
  import { email } from './autolink/email';
5
5
  import { channel } from './autolink/channel';
@@ -19,17 +19,26 @@ export const autolink: AutolinkParser = fmap(
19
19
  url,
20
20
  email,
21
21
  // Escape unmatched email-like strings.
22
- str(/^[0-9a-z]+(?:[.+_-][0-9a-z]+)*(?:@(?:[0-9a-z]+(?:[.-][0-9a-z]+)*)?)*/i),
22
+ focus(
23
+ /^[0-9a-z](?:[_.+-](?=[0-9a-z])|[0-9a-z])*(?:@(?:[0-9a-z]+(?:[.-][0-9a-z]+)*)?)*/i,
24
+ ({ source }) => {
25
+ if (source.length > 255 || source.includes('@')) return [[source], ''];
26
+ const i = source.indexOf('_');
27
+ if (i === -1) return [[source], ''];
28
+ return [[source.slice(0, i)], source.slice(i)];
29
+ }),
23
30
  channel,
24
31
  account,
25
32
  // Escape unmatched account-like strings.
26
33
  str(/^@+[0-9a-z]*(?:-[0-9a-z]+)*/i),
27
34
  // Escape invalid leading characters.
28
- str(new RegExp(/^(?:[^\p{C}\p{S}\p{P}\s]|emoji|['_])(?=#)/u.source.replace('emoji', emoji), 'u')),
35
+ str(new RegExp(/^(?:[^\p{C}\p{S}\p{P}\s]|emoji)(?=#)/u.source.replace('emoji', emoji), 'u')),
29
36
  hashtag,
30
37
  hashnum,
31
38
  // Escape unmatched hashtag-like strings.
32
- str(new RegExp(/^#+(?:[^\p{C}\p{S}\p{P}\s]|emoji|['_])*/u.source.replace('emoji', emoji), 'u')),
39
+ str(new RegExp(/^#+(?:[^\p{C}\p{S}\p{P}\s]|emoji|')*/u.source.replace('emoji', emoji), 'u')),
40
+ // Escape invalid leading characters.
41
+ str(/^[0-9\p{Sc}](?=>)/u),
33
42
  anchor,
34
43
  ]))))),
35
44
  ns => ns.length === 1 ? ns : [stringify(ns)]);
@@ -37,8 +37,8 @@ describe('Unit: parser/inline/deletion', () => {
37
37
  });
38
38
 
39
39
  it('nest', () => {
40
- assert.deepStrictEqual(inspect(parser('~~*~~a~~*~~')), [['<del><em><del>a</del></em></del>'], '']);
41
- assert.deepStrictEqual(inspect(parser('~~*++a++*~~')), [['<del><em><ins>a</ins></em></del>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('~~_~~a~~_~~')), [['<del><em><del>a</del></em></del>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('~~_++a++_~~')), [['<del><em><ins>a</ins></em></del>'], '']);
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 deletion: DeletionParser = 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', '~~')),
@@ -7,47 +7,38 @@ describe('Unit: parser/inline/emphasis', () => {
7
7
  const parser = (source: string) => some(emphasis)({ 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**b')), [['*', 'a', '**', 'b'], '']);
18
- assert.deepStrictEqual(inspect(parser('*a**b*')), [['*', 'a', '**', 'b', '*'], '']);
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);
29
- 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);
30
26
  });
31
27
 
32
28
  it('basic', () => {
33
- assert.deepStrictEqual(inspect(parser('*a*')), [['<em>a</em>'], '']);
34
- assert.deepStrictEqual(inspect(parser('*ab*')), [['<em>ab</em>'], '']);
35
- assert.deepStrictEqual(inspect(parser('*a\nb*')), [['<em>a<br>b</em>'], '']);
36
- assert.deepStrictEqual(inspect(parser('*a\\\nb*')), [['<em>a<span class="linebreak"> </span>b</em>'], '']);
37
- assert.deepStrictEqual(inspect(parser('*a**')), [['<em>a</em>'], '*']);
29
+ assert.deepStrictEqual(inspect(parser('_a_')), [['<em>a</em>'], '']);
30
+ assert.deepStrictEqual(inspect(parser('_ab_')), [['<em>ab</em>'], '']);
31
+ assert.deepStrictEqual(inspect(parser('_a\nb_')), [['<em>a<br>b</em>'], '']);
32
+ assert.deepStrictEqual(inspect(parser('_a\\\nb_')), [['<em>a<span class="linebreak"> </span>b</em>'], '']);
38
33
  });
39
34
 
40
35
  it('nest', () => {
41
- assert.deepStrictEqual(inspect(parser('*a *b**')), [['<em>a <em>b</em></em>'], '']);
42
- assert.deepStrictEqual(inspect(parser('*a **b***')), [['<em>a <strong>b</strong></em>'], '']);
43
- assert.deepStrictEqual(inspect(parser('*a\\ *b**')), [['<em>a <em>b</em></em>'], '']);
44
- assert.deepStrictEqual(inspect(parser('*a&Tab;*b**')), [['<em>a\t<em>b</em></em>'], '']);
45
- assert.deepStrictEqual(inspect(parser('*a<wbr>*b**')), [['<em>a<wbr><em>b</em></em>'], '']);
46
- assert.deepStrictEqual(inspect(parser('*a**b**c*')), [['<em>a<strong>b</strong>c</em>'], '']);
47
- assert.deepStrictEqual(inspect(parser('*a**b**c*d')), [['<em>a<strong>b</strong>c</em>'], 'd']);
48
- assert.deepStrictEqual(inspect(parser('*`a`*')), [['<em><code data-src="`a`">a</code></em>'], '']);
49
- assert.deepStrictEqual(inspect(parser('*(*a*)*')), [['<em><span class="paren">(<em>a</em>)</span></em>'], '']);
50
- assert.deepStrictEqual(inspect(parser('*(**a**)*')), [['<em><span class="paren">(<strong>a</strong>)</span></em>'], '']);
36
+ assert.deepStrictEqual(inspect(parser('_a _b__')), [['<em>a <em>b</em></em>'], '']);
37
+ assert.deepStrictEqual(inspect(parser('_a *b*_')), [['<em>a <strong>b</strong></em>'], '']);
38
+ assert.deepStrictEqual(inspect(parser('_a\\ _b__')), [['<em>a <em>b</em></em>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('_a&Tab;_b__')), [['<em>a\t<em>b</em></em>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('_a<wbr>_b__')), [['<em>a<wbr><em>b</em></em>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('_(_a_)_')), [['<em><span class="paren">(<em>a</em>)</span></em>'], '']);
51
42
  });
52
43
 
53
44
  });