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.
- package/CHANGELOG.md +12 -0
- package/README.md +12 -12
- package/design.md +0 -4
- package/dist/index.js +199 -245
- package/markdown.d.ts +5 -32
- package/package.json +6 -6
- package/src/parser/api/parse.test.ts +1 -1
- package/src/parser/block/blockquote.test.ts +2 -2
- package/src/parser/block/dlist.test.ts +1 -1
- package/src/parser/block/extension/example.test.ts +1 -1
- package/src/parser/block/extension/fig.test.ts +1 -1
- package/src/parser/block/heading.test.ts +2 -2
- package/src/parser/block/paragraph.test.ts +1 -4
- package/src/parser/block/reply/cite.test.ts +5 -0
- package/src/parser/block/reply/cite.ts +5 -4
- package/src/parser/inline/autolink/anchor.test.ts +1 -0
- package/src/parser/inline/autolink/email.test.ts +3 -0
- package/src/parser/inline/autolink/email.ts +1 -1
- package/src/parser/inline/autolink/hashnum.test.ts +1 -2
- package/src/parser/inline/autolink/hashnum.ts +1 -1
- package/src/parser/inline/autolink/hashtag.test.ts +15 -12
- package/src/parser/inline/autolink/hashtag.ts +3 -3
- package/src/parser/inline/autolink/url.test.ts +1 -1
- package/src/parser/inline/autolink/url.ts +1 -1
- package/src/parser/inline/autolink.ts +13 -4
- package/src/parser/inline/deletion.test.ts +2 -2
- package/src/parser/inline/deletion.ts +1 -1
- package/src/parser/inline/emphasis.test.ts +26 -35
- package/src/parser/inline/emphasis.ts +5 -12
- package/src/parser/inline/extension/index.test.ts +2 -2
- package/src/parser/inline/insertion.test.ts +2 -2
- package/src/parser/inline/insertion.ts +1 -1
- package/src/parser/inline/link.test.ts +1 -1
- package/src/parser/inline/mark.test.ts +1 -1
- package/src/parser/inline/mark.ts +1 -1
- package/src/parser/inline/strong.test.ts +25 -32
- package/src/parser/inline/strong.ts +5 -9
- package/src/parser/inline.test.ts +18 -91
- package/src/parser/inline.ts +0 -6
- package/src/parser/locale/ja.ts +1 -9
- package/src/parser/locale.test.ts +1 -1
- package/src/parser/source/str.ts +4 -2
- package/src/parser/source/text.test.ts +9 -4
- package/src/parser/source/text.ts +9 -16
- package/src/parser/inline/emstrong.ts +0 -62
- 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
|
-
//
|
|
1024
|
+
// *abc*
|
|
1045
1025
|
Inline<'strong'>,
|
|
1046
1026
|
Parser<HTMLElement | string, Context, [
|
|
1047
1027
|
InlineParser,
|
|
1048
|
-
|
|
1049
|
-
EmStrongParser,
|
|
1050
|
-
StrongParser,
|
|
1051
|
-
]>,
|
|
1028
|
+
StrongParser,
|
|
1052
1029
|
]> {
|
|
1053
1030
|
}
|
|
1054
1031
|
export interface EmphasisParser extends
|
|
1055
|
-
//
|
|
1032
|
+
// _abc_
|
|
1056
1033
|
Inline<'emphasis'>,
|
|
1057
1034
|
Parser<HTMLElement | string, Context, [
|
|
1058
|
-
StrongParser,
|
|
1059
1035
|
InlineParser,
|
|
1060
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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": "^
|
|
52
|
+
"npm-check-updates": "^16.0.5",
|
|
53
53
|
"semver": "^7.3.7",
|
|
54
|
-
"spica": "0.0.
|
|
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.
|
|
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]][[
|
|
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('!>
|
|
74
|
-
assert.deepStrictEqual(inspect(parser('!>
|
|
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('~
|
|
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\
|
|
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!>
|
|
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('#
|
|
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 [
|
|
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><wbr><br>a</p>'], '']);
|
|
28
28
|
assert.deepStrictEqual(inspect(parser('a\n<wbr>\n')), [['<p>a<br><wbr></p>'], '']);
|
|
29
29
|
assert.deepStrictEqual(inspect(parser('a\n<wbr>\nb')), [['<p>a<br><wbr><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">>><a class="anchor" href="?at=0" data-depth="2">>0</a></span>', '<br>'], '>>']);
|
|
40
40
|
assert.deepStrictEqual(inspect(parser('>>>0\n>>1')), [['<span class="cite">>><a class="anchor" href="?at=0" data-depth="2">>0</a></span>', '<br>', '<span class="cite">><a class="anchor" href="?at=1" data-depth="1">>1</a></span>', '<br>'], '']);
|
|
41
41
|
assert.deepStrictEqual(inspect(parser('>>.')), [['<span class="cite">><a class="anchor" data-depth="1">>.</a></span>', '<br>'], '']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('>>. ')), [['<span class="cite">><a class="anchor" data-depth="1">>.</a></span>', '<br>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('>>.\n')), [['<span class="cite">><a class="anchor" data-depth="1">>.</a></span>', '<br>'], '']);
|
|
42
44
|
assert.deepStrictEqual(inspect(parser('>>#')), [['<span class="cite">><a class="anchor" data-depth="1">>#</a></span>', '<br>'], '']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser('>>#\n')), [['<span class="cite">><a class="anchor" data-depth="1">>#</a></span>', '<br>'], '']);
|
|
43
46
|
assert.deepStrictEqual(inspect(parser('>>#a')), [['<span class="cite">><a class="anchor" data-depth="1">>#a</a></span>', '<br>'], '']);
|
|
44
47
|
assert.deepStrictEqual(inspect(parser('>>#index:a')), [['<span class="cite">><a class="anchor" data-depth="1">>#index:a</a></span>', '<br>'], '']);
|
|
45
48
|
assert.deepStrictEqual(inspect(parser('>>#:~:text=a')), [['<span class="cite">><a class="anchor" data-depth="1">>#:~:text=a</a></span>', '<br>'], '']);
|
|
46
49
|
assert.deepStrictEqual(inspect(parser('>>http://host')), [['<span class="cite">><a class="anchor" href="http://host" target="_blank" data-depth="1">>http://host</a></span>', '<br>'], '']);
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('>>http://host ')), [['<span class="cite">><a class="anchor" href="http://host" target="_blank" data-depth="1">>http://host</a></span>', '<br>'], '']);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser('>>http://host\n')), [['<span class="cite">><a class="anchor" href="http://host" target="_blank" data-depth="1">>http://host</a></span>', '<br>'], '']);
|
|
47
52
|
assert.deepStrictEqual(inspect(parser('>>https://host')), [['<span class="cite">><a class="anchor" href="https://host" target="_blank" data-depth="1">>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]
|
|
10
|
+
str(/^>*(?=>>[^>\s]+\s*$)/),
|
|
11
11
|
union([
|
|
12
12
|
anchor,
|
|
13
13
|
// Subject page representation.
|
|
14
14
|
// リンクの実装は後で検討
|
|
15
|
-
focus(/^>>\.
|
|
16
|
-
focus(/^>>#\S*
|
|
17
|
-
|
|
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](?:[
|
|
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|
|
|
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(
|
|
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)}
|
|
40
|
-
assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(127)}_'a`)), [[`#${'1'.repeat(127)}
|
|
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
|
-
|
|
66
|
-
assert.deepStrictEqual(inspect(parser(`#
|
|
67
|
-
assert.deepStrictEqual(inspect(parser(`#
|
|
68
|
-
assert.deepStrictEqual(inspect(parser(`#
|
|
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]{
|
|
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
|
|
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&" target="_blank">http://host&</a>'], '']);
|
|
61
|
-
assert.deepStrictEqual(inspect(parser('http://host_')), [['<a class="url" href="http://
|
|
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
|
-
|
|
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
|
|
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|
|
|
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('
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('
|
|
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('
|
|
11
|
-
assert.deepStrictEqual(inspect(parser('
|
|
12
|
-
assert.deepStrictEqual(inspect(parser('
|
|
13
|
-
assert.deepStrictEqual(inspect(parser('
|
|
14
|
-
assert.deepStrictEqual(inspect(parser('
|
|
15
|
-
assert.deepStrictEqual(inspect(parser('
|
|
16
|
-
assert.deepStrictEqual(inspect(parser('
|
|
17
|
-
assert.deepStrictEqual(inspect(parser('
|
|
18
|
-
assert.deepStrictEqual(inspect(parser('
|
|
19
|
-
assert.deepStrictEqual(inspect(parser('
|
|
20
|
-
assert.deepStrictEqual(inspect(parser('
|
|
21
|
-
assert.deepStrictEqual(inspect(parser('
|
|
22
|
-
assert.deepStrictEqual(inspect(parser('
|
|
23
|
-
assert.deepStrictEqual(inspect(parser('
|
|
24
|
-
assert.deepStrictEqual(inspect(parser('
|
|
25
|
-
assert.deepStrictEqual(inspect(parser('
|
|
26
|
-
assert.deepStrictEqual(inspect(parser('*<wbr>a*')), undefined);
|
|
27
|
-
assert.deepStrictEqual(inspect(parser('**a**')), undefined);
|
|
28
|
-
assert.deepStrictEqual(inspect(parser('***a***')), undefined);
|
|
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('
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('
|
|
35
|
-
assert.deepStrictEqual(inspect(parser('
|
|
36
|
-
assert.deepStrictEqual(inspect(parser('
|
|
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('
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('*
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('
|
|
44
|
-
assert.deepStrictEqual(inspect(parser('
|
|
45
|
-
assert.deepStrictEqual(inspect(parser('
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('
|
|
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	_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
|
});
|