securemark 0.248.1 → 0.250.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.
- package/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/dist/index.js +351 -284
- package/karma.conf.js +1 -1
- package/markdown.d.ts +11 -5
- package/package.json +12 -12
- package/src/parser/api/parse.test.ts +6 -6
- package/src/parser/block/blockquote.test.ts +2 -2
- package/src/parser/block/dlist.test.ts +2 -1
- package/src/parser/block/dlist.ts +4 -4
- package/src/parser/block/extension/figure.ts +3 -3
- package/src/parser/block/heading.test.ts +1 -0
- package/src/parser/block/heading.ts +4 -4
- package/src/parser/block/olist.ts +3 -2
- package/src/parser/block/paragraph.test.ts +10 -10
- package/src/parser/block/paragraph.ts +2 -2
- package/src/parser/block/reply.ts +2 -2
- package/src/parser/block/ulist.ts +4 -3
- package/src/parser/inline/annotation.test.ts +2 -2
- package/src/parser/inline/annotation.ts +3 -4
- package/src/parser/inline/comment.test.ts +44 -44
- package/src/parser/inline/comment.ts +3 -3
- package/src/parser/inline/deletion.ts +3 -3
- package/src/parser/inline/emphasis.test.ts +5 -4
- package/src/parser/inline/emphasis.ts +8 -3
- package/src/parser/inline/emstrong.ts +14 -6
- package/src/parser/inline/extension/index.test.ts +4 -4
- package/src/parser/inline/extension/placeholder.test.ts +4 -4
- package/src/parser/inline/html.test.ts +5 -2
- package/src/parser/inline/html.ts +10 -14
- package/src/parser/inline/insertion.ts +3 -3
- package/src/parser/inline/link.test.ts +2 -2
- package/src/parser/inline/link.ts +3 -4
- package/src/parser/inline/mark.test.ts +5 -4
- package/src/parser/inline/mark.ts +3 -3
- package/src/parser/inline/reference.test.ts +5 -5
- package/src/parser/inline/reference.ts +7 -9
- package/src/parser/inline/strong.test.ts +5 -4
- package/src/parser/inline/strong.ts +7 -3
- package/src/parser/inline.test.ts +2 -2
- package/src/parser/source/escapable.test.ts +4 -3
- package/src/parser/source/escapable.ts +3 -3
- package/src/parser/source/text.test.ts +4 -4
- package/src/parser/source/text.ts +3 -3
- package/src/parser/source/unescapable.test.ts +4 -3
- package/src/parser/source/unescapable.ts +3 -3
- package/src/parser/util.ts +26 -13
- package/src/renderer/render/media/image.ts +3 -3
- package/src/renderer/render/media/video.ts +2 -2
package/karma.conf.js
CHANGED
|
@@ -12,7 +12,7 @@ module.exports = function (config) {
|
|
|
12
12
|
{ pattern: 'https://cdnjs.cloudflare.com/ajax/libs/dompurify/2.3.8/purify.js', watched: false, served: false, included: true, integrity: 'sha512-QaF+0tDlqVmwZaQSc0kImgYmw+Cd66TxA5D9X70I5V9BNSqk6yBTbyqw2VEUsVYV5OTbxw8HD9d45on1wvYv7g==' },
|
|
13
13
|
{ pattern: 'dist/**/*.{js,map}', watched: true, served: true, included: true },
|
|
14
14
|
],
|
|
15
|
-
reporters: ['dots'
|
|
15
|
+
reporters: ['dots'],
|
|
16
16
|
preprocessors: {
|
|
17
17
|
'dist/**/*.js': ['coverage'],
|
|
18
18
|
},
|
package/markdown.d.ts
CHANGED
|
@@ -736,7 +736,7 @@ export namespace MarkdownParser {
|
|
|
736
736
|
}
|
|
737
737
|
}
|
|
738
738
|
export interface CommentParser extends
|
|
739
|
-
// [
|
|
739
|
+
// [% comment %]
|
|
740
740
|
Inline<'comment'>,
|
|
741
741
|
Parser<HTMLElement | string, Context, [
|
|
742
742
|
InlineParser,
|
|
@@ -994,7 +994,6 @@ export namespace MarkdownParser {
|
|
|
994
994
|
Inline<'html/tag'>,
|
|
995
995
|
Parser<HTMLElement | string, Context, [
|
|
996
996
|
InlineParser,
|
|
997
|
-
InlineParser,
|
|
998
997
|
]> {
|
|
999
998
|
}
|
|
1000
999
|
export namespace TagParser {
|
|
@@ -1027,7 +1026,7 @@ export namespace MarkdownParser {
|
|
|
1027
1026
|
Inline<'mark'>,
|
|
1028
1027
|
Parser<HTMLElement | string, Context, [
|
|
1029
1028
|
InlineParser,
|
|
1030
|
-
|
|
1029
|
+
MarkParser,
|
|
1031
1030
|
]> {
|
|
1032
1031
|
}
|
|
1033
1032
|
export interface EmStrongParser extends
|
|
@@ -1043,7 +1042,10 @@ export namespace MarkdownParser {
|
|
|
1043
1042
|
Inline<'strong'>,
|
|
1044
1043
|
Parser<HTMLElement | string, Context, [
|
|
1045
1044
|
InlineParser,
|
|
1046
|
-
|
|
1045
|
+
Parser<HTMLElement | string, Context, [
|
|
1046
|
+
EmStrongParser,
|
|
1047
|
+
StrongParser,
|
|
1048
|
+
]>,
|
|
1047
1049
|
]> {
|
|
1048
1050
|
}
|
|
1049
1051
|
export interface EmphasisParser extends
|
|
@@ -1052,7 +1054,11 @@ export namespace MarkdownParser {
|
|
|
1052
1054
|
Parser<HTMLElement | string, Context, [
|
|
1053
1055
|
StrongParser,
|
|
1054
1056
|
InlineParser,
|
|
1055
|
-
|
|
1057
|
+
Parser<HTMLElement | string, Context, [
|
|
1058
|
+
EmStrongParser,
|
|
1059
|
+
StrongParser,
|
|
1060
|
+
EmphasisParser,
|
|
1061
|
+
]>,
|
|
1056
1062
|
]> {
|
|
1057
1063
|
}
|
|
1058
1064
|
export interface CodeParser extends
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "securemark",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.250.0",
|
|
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.27.1",
|
|
38
38
|
"babel-loader": "^8.2.5",
|
|
39
39
|
"babel-plugin-unassert": "^3.2.0",
|
|
40
|
-
"concurrently": "^7.2.
|
|
41
|
-
"eslint": "^8.
|
|
40
|
+
"concurrently": "^7.2.1",
|
|
41
|
+
"eslint": "^8.17.0",
|
|
42
42
|
"eslint-plugin-redos": "^4.4.0",
|
|
43
43
|
"eslint-webpack-plugin": "^3.1.1",
|
|
44
44
|
"glob": "^8.0.3",
|
|
@@ -49,22 +49,22 @@
|
|
|
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": "^13.
|
|
52
|
+
"npm-check-updates": "^13.1.2",
|
|
53
53
|
"semver": "^7.3.7",
|
|
54
|
-
"spica": "0.0.
|
|
54
|
+
"spica": "0.0.567",
|
|
55
55
|
"ts-loader": "^9.3.0",
|
|
56
|
-
"typed-dom": "^0.0.
|
|
57
|
-
"typescript": "4.
|
|
58
|
-
"webpack": "^5.
|
|
56
|
+
"typed-dom": "^0.0.298",
|
|
57
|
+
"typescript": "4.7.3",
|
|
58
|
+
"webpack": "^5.73.0",
|
|
59
59
|
"webpack-cli": "^4.9.2",
|
|
60
60
|
"webpack-merge": "^5.8.0"
|
|
61
61
|
},
|
|
62
62
|
"scripts": {
|
|
63
63
|
"update": "ncu -u && npm i --no-shrinkwrap && bundle update",
|
|
64
|
-
"dev": "concurrently \"webpack --env mode=test -w\" \"karma start --auto-watch
|
|
65
|
-
"test": "webpack --env mode=test && karma start --single-run --concurrency 1",
|
|
64
|
+
"dev": "concurrently \"webpack --env mode=test -w\" \"karma start --auto-watch\" \"webpack --env mode=dist -w --output-path ./gh-pages/assets/dist\" \"bundle exec jekyll serve -s ./gh-pages -d ./gh-pages/_site --incremental\"",
|
|
65
|
+
"test": "webpack --env mode=test && karma start --single-run --concurrency 1 --reporters dots,coverage",
|
|
66
66
|
"lint": "webpack --env mode=lint",
|
|
67
|
-
"bench": "webpack --env mode=bench && karma start --single-run --concurrency 1
|
|
67
|
+
"bench": "webpack --env mode=bench && karma start --single-run --concurrency 1",
|
|
68
68
|
"dist": "webpack --env mode=dist"
|
|
69
69
|
},
|
|
70
70
|
"author": "falsandtru",
|
|
@@ -52,11 +52,11 @@ describe('Unit: parser/api/parse', () => {
|
|
|
52
52
|
[...parse('<wbr>\na').children].map(el => el.outerHTML),
|
|
53
53
|
['<p><wbr><br>a</p>']);
|
|
54
54
|
assert.deepStrictEqual(
|
|
55
|
-
[...parse('[
|
|
56
|
-
['<p><span class="comment"><input type="checkbox"><span>[
|
|
55
|
+
[...parse('[%\n<wbr>\n%]').children].map(el => el.outerHTML),
|
|
56
|
+
['<p><span class="comment"><input type="checkbox"><span>[%<br><wbr><br>%]</span></span></p>']);
|
|
57
57
|
assert.deepStrictEqual(
|
|
58
|
-
[...parse('[
|
|
59
|
-
['<p><span class="comment"><input type="checkbox"><span>[
|
|
58
|
+
[...parse('[%\n<wbr>\n%]\na').children].map(el => el.outerHTML),
|
|
59
|
+
['<p><span class="comment"><input type="checkbox"><span>[%<br><wbr><br>%]</span></span><br>a</p>']);
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
it('linebreak', () => {
|
|
@@ -220,8 +220,8 @@ describe('Unit: parser/api/parse', () => {
|
|
|
220
220
|
|
|
221
221
|
it('creation', () => {
|
|
222
222
|
assert.deepStrictEqual(
|
|
223
|
-
[...parse('"[
|
|
224
|
-
[`<p>${'"[
|
|
223
|
+
[...parse('"[% '.repeat(100)).children].map(el => el.outerHTML),
|
|
224
|
+
[`<p>${'"[% '.repeat(100).trim()}</p>`]);
|
|
225
225
|
});
|
|
226
226
|
|
|
227
227
|
it('recursion', () => {
|
|
@@ -72,7 +72,7 @@ describe('Unit: parser/block/blockquote', () => {
|
|
|
72
72
|
assert.deepStrictEqual(inspect(parser('!> a\\\nb')), [['<blockquote><section><p>a<span class="linebreak"> </span>b</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
73
73
|
assert.deepStrictEqual(inspect(parser('!> *a\nb*')), [['<blockquote><section><p><em>a<br>b</em></p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
74
74
|
assert.deepStrictEqual(inspect(parser('!> *a\n> b*')), [['<blockquote><section><p><em>a<br>b</em></p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
75
|
-
assert.deepStrictEqual(inspect(parser('!> a \n b c ')), [['<blockquote><section><p>a<br> b c</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
75
|
+
assert.deepStrictEqual(inspect(parser('!> a \n b c ')), [['<blockquote><section><p> a<br> b c</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
76
76
|
assert.deepStrictEqual(inspect(parser('!>> a')), [['<blockquote><blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote></blockquote>'], '']);
|
|
77
77
|
assert.deepStrictEqual(inspect(parser('!>> a\n> b')), [['<blockquote><blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote><section><p>b</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
78
78
|
assert.deepStrictEqual(inspect(parser('!> - a')), [['<blockquote><section><ul><li>a</li></ul><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
@@ -90,7 +90,7 @@ describe('Unit: parser/block/blockquote', () => {
|
|
|
90
90
|
assert.deepStrictEqual(inspect(parser('!> \na')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
91
91
|
assert.deepStrictEqual(inspect(parser('!>\n')), undefined);
|
|
92
92
|
assert.deepStrictEqual(inspect(parser('!>\na')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
93
|
-
assert.deepStrictEqual(inspect(parser('!>\n a')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
93
|
+
assert.deepStrictEqual(inspect(parser('!>\n a')), [['<blockquote><section><p> a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
94
94
|
assert.deepStrictEqual(inspect(parser('!>\n>')), [['<blockquote><section><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
95
95
|
assert.deepStrictEqual(inspect(parser('!>\n> a')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
96
96
|
assert.deepStrictEqual(inspect(parser('!>> ## a\n> ## a')), [['<blockquote><blockquote><section><h2>a</h2><ol class="annotations"></ol><ol class="references"></ol></section></blockquote><section><h2>a</h2><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
@@ -33,6 +33,7 @@ describe('Unit: parser/block/dlist', () => {
|
|
|
33
33
|
it('single', () => {
|
|
34
34
|
assert.deepStrictEqual(inspect(parser('~ a')), [['<dl><dt id="index:a">a</dt><dd></dd></dl>'], '']);
|
|
35
35
|
assert.deepStrictEqual(inspect(parser('~ \\')), [['<dl><dt id="index:\\">\\</dt><dd></dd></dl>'], '']);
|
|
36
|
+
assert.deepStrictEqual(inspect(parser('~ \\ a')), [['<dl><dt id="index:a">a</dt><dd></dd></dl>'], '']);
|
|
36
37
|
assert.deepStrictEqual(inspect(parser('~ a\nb')), [['<dl><dt id="index:a">a</dt><dd>b</dd></dl>'], '']);
|
|
37
38
|
assert.deepStrictEqual(inspect(parser('~ a\nb\n')), [['<dl><dt id="index:a">a</dt><dd>b</dd></dl>'], '']);
|
|
38
39
|
assert.deepStrictEqual(inspect(parser('~ a\nb\nc')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd></dl>'], '']);
|
|
@@ -57,7 +58,7 @@ describe('Unit: parser/block/dlist', () => {
|
|
|
57
58
|
|
|
58
59
|
it('multiple', () => {
|
|
59
60
|
assert.deepStrictEqual(inspect(parser('~ a\n: b\n~ c\n: d')), [['<dl><dt id="index:a">a</dt><dd>b</dd><dt id="index:c">c</dt><dd>d</dd></dl>'], '']);
|
|
60
|
-
assert.deepStrictEqual(inspect(parser('~ a\n b\nc\n d')), [['<dl><dt id="index:a">a</dt><dd>b<br>c<br> d</dd></dl>'], '']);
|
|
61
|
+
assert.deepStrictEqual(inspect(parser('~ a\n b\nc\n d')), [['<dl><dt id="index:a">a</dt><dd> b<br>c<br> d</dd></dl>'], '']);
|
|
61
62
|
assert.deepStrictEqual(inspect(parser('~ a\n: b\nc\n: d')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd><dd>d</dd></dl>'], '']);
|
|
62
63
|
assert.deepStrictEqual(inspect(parser('~ a\n: b\nc\n~ d\n: e')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd><dt id="index:d">d</dt><dd>e</dd></dl>'], '']);
|
|
63
64
|
assert.deepStrictEqual(inspect(parser('~ a\n: b\n~ c\n: d\n~ e\n: f')), [['<dl><dt id="index:a">a</dt><dd>b</dd><dt id="index:c">c</dt><dd>d</dd><dt id="index:e">e</dt><dd>f</dd></dl>'], '']);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { DListParser } from '../block';
|
|
2
|
-
import { union, inits, some, block, line, validate, rewrite, context, creator, open,
|
|
2
|
+
import { union, inits, some, block, line, validate, rewrite, context, creator, open, trimEnd, lazy, fmap } from '../../combinator';
|
|
3
3
|
import { inline, indexee, indexer } from '../inline';
|
|
4
4
|
import { anyline } from '../source';
|
|
5
5
|
import { localize } from '../locale';
|
|
6
|
-
import { visualize } from '../util';
|
|
6
|
+
import { visualize, trimBlank } from '../util';
|
|
7
7
|
import { html, defrag } from 'typed-dom/dom';
|
|
8
8
|
import { push } from 'spica/array';
|
|
9
9
|
|
|
@@ -25,7 +25,7 @@ export const dlist: DListParser = lazy(() => block(localize(fmap(validate(
|
|
|
25
25
|
|
|
26
26
|
const term: DListParser.TermParser = creator(line(indexee(fmap(open(
|
|
27
27
|
/^~[^\S\n]+(?=\S)/,
|
|
28
|
-
|
|
28
|
+
visualize(trimBlank(some(union([indexer, inline])))),
|
|
29
29
|
true),
|
|
30
30
|
ns => [html('dt', defrag(ns))]))));
|
|
31
31
|
|
|
@@ -33,7 +33,7 @@ const desc: DListParser.DescriptionParser = creator(block(fmap(open(
|
|
|
33
33
|
/^:[^\S\n]+(?=\S)|/,
|
|
34
34
|
rewrite(
|
|
35
35
|
some(anyline, /^[~:][^\S\n]+\S/),
|
|
36
|
-
|
|
36
|
+
visualize(trimEnd(some(union([inline]))))),
|
|
37
37
|
true),
|
|
38
38
|
ns => [html('dd', defrag(ns))]),
|
|
39
39
|
false));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { undefined } from 'spica/global';
|
|
2
2
|
import { ExtensionParser } from '../../block';
|
|
3
|
-
import { union, inits, sequence, some, block, line, fence, rewrite, context, close, match, convert,
|
|
3
|
+
import { union, inits, sequence, some, block, line, fence, rewrite, context, close, match, convert, trimEnd, fallback, fmap } from '../../../combinator';
|
|
4
4
|
import { str, contentline, emptyline } from '../../source';
|
|
5
5
|
import { label, segment as seg_label } from '../../inline/extension/label';
|
|
6
6
|
import { ulist } from '../ulist';
|
|
@@ -15,7 +15,7 @@ import { blockquote, segment as seg_blockquote } from '../blockquote';
|
|
|
15
15
|
import { placeholder, segment_ as seg_placeholder } from './placeholder';
|
|
16
16
|
import { inline, media, shortmedia } from '../../inline';
|
|
17
17
|
import { localize } from '../../locale';
|
|
18
|
-
import { visualize } from '../../util';
|
|
18
|
+
import { visualize, trimBlank } from '../../util';
|
|
19
19
|
import { html, defrag } from 'typed-dom/dom';
|
|
20
20
|
import { memoize } from 'spica/memoize';
|
|
21
21
|
import { unshift } from 'spica/array';
|
|
@@ -70,7 +70,7 @@ export const figure: FigureParser = block(fallback(rewrite(segment, fmap(
|
|
|
70
70
|
emptyline,
|
|
71
71
|
block(localize(
|
|
72
72
|
context({ syntax: { inline: { media: false } } },
|
|
73
|
-
|
|
73
|
+
visualize(trimBlank(trimEnd(some(inline))))))),
|
|
74
74
|
]),
|
|
75
75
|
])),
|
|
76
76
|
([label, param, content, ...caption]: [HTMLAnchorElement, string, ...HTMLElement[]]) => [
|
|
@@ -40,6 +40,7 @@ describe('Unit: parser/block/heading', () => {
|
|
|
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>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('# \\ a')), [['<h1 id="index:a">a</h1>'], '']);
|
|
43
44
|
assert.deepStrictEqual(inspect(parser('## \\')), [['<h2 id="index:\\">\\</h2>'], '']);
|
|
44
45
|
assert.deepStrictEqual(inspect(parser('# @a')), [['<h1 id="index:@a">@a</h1>'], '']);
|
|
45
46
|
assert.deepStrictEqual(inspect(parser('## @a')), [['<h2 id="index:@a"><a href="/@a" class="account">@a</a></h2>'], '']);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { HeadingParser } from '../block';
|
|
2
|
-
import { union, some, block, line, validate, focus, rewrite, context, open,
|
|
2
|
+
import { union, some, block, line, validate, focus, rewrite, context, open, fmap } from '../../combinator';
|
|
3
3
|
import { inline, indexee, indexer } from '../inline';
|
|
4
4
|
import { str } from '../source';
|
|
5
|
-
import { visualize } from '../util';
|
|
5
|
+
import { visualize, trimBlank } from '../util';
|
|
6
6
|
import { html, defrag } from 'typed-dom/dom';
|
|
7
7
|
|
|
8
8
|
export const segment: HeadingParser.SegmentParser = block(validate('#', focus(
|
|
@@ -21,13 +21,13 @@ export const heading: HeadingParser = block(rewrite(segment,
|
|
|
21
21
|
line(indexee(fmap(union([
|
|
22
22
|
open(
|
|
23
23
|
str(/^##+/),
|
|
24
|
-
|
|
24
|
+
visualize(trimBlank(some(union([indexer, inline])))), true),
|
|
25
25
|
open(
|
|
26
26
|
str('#'),
|
|
27
27
|
context({ syntax: { inline: {
|
|
28
28
|
autolink: false,
|
|
29
29
|
}}},
|
|
30
|
-
|
|
30
|
+
visualize(trimBlank(some(union([indexer, inline]))))), true),
|
|
31
31
|
]),
|
|
32
32
|
([h, ...ns]: [string, ...(HTMLElement | string)[]]) => [
|
|
33
33
|
h.length <= 6
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { undefined } from 'spica/global';
|
|
2
2
|
import { OListParser } from '../block';
|
|
3
|
-
import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, match, trim,
|
|
3
|
+
import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, match, trim, fallback, lazy, fmap } from '../../combinator';
|
|
4
4
|
import { checkbox, ulist_, fillFirstLine } from './ulist';
|
|
5
5
|
import { ilist_ } from './ilist';
|
|
6
6
|
import { inline, indexee, indexer } from '../inline';
|
|
7
7
|
import { contentline } from '../source';
|
|
8
|
+
import { trimBlank } from '../util';
|
|
8
9
|
import { html, define, defrag } from 'typed-dom/dom';
|
|
9
10
|
import { memoize } from 'spica/memoize';
|
|
10
11
|
import { shift } from 'spica/array';
|
|
@@ -35,7 +36,7 @@ const list = (type: string, form: string): OListParser.ListParser => fmap(
|
|
|
35
36
|
some(creator(union([
|
|
36
37
|
indexee(fmap(fallback(
|
|
37
38
|
inits([
|
|
38
|
-
line(open(heads[form], trim(subsequence([checkbox,
|
|
39
|
+
line(open(heads[form], trim(subsequence([checkbox, trimBlank(some(union([indexer, inline])))])), true)),
|
|
39
40
|
indent(union([ulist_, olist_, ilist_])),
|
|
40
41
|
]),
|
|
41
42
|
invalid),
|
|
@@ -33,7 +33,7 @@ describe('Unit: parser/block/paragraph', () => {
|
|
|
33
33
|
assert.deepStrictEqual(inspect(parser('***a*b\n<wbr>**\nc')), [['<p>**<em>a</em>b<br><wbr>**<br>c</p>'], '']);
|
|
34
34
|
assert.deepStrictEqual(inspect(parser('***a**b\n<wbr>*\nc')), [['<p>*<strong>a</strong>b<br><wbr>*<br>c</p>'], '']);
|
|
35
35
|
assert.deepStrictEqual(inspect(parser('==a\n<wbr>==\nb')), [['<p>==a<br><wbr>==<br>b</p>'], '']);
|
|
36
|
-
assert.deepStrictEqual(inspect(parser(' a')), [['<p>a</p>'], '']);
|
|
36
|
+
assert.deepStrictEqual(inspect(parser(' a')), [['<p> a</p>'], '']);
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
it('anchor', () => {
|
|
@@ -50,18 +50,18 @@ describe('Unit: parser/block/paragraph', () => {
|
|
|
50
50
|
assert.deepStrictEqual(inspect(parser('a\n>>1')), [['<p>a<br><a href="?at=1" class="anchor">>>1</a></p>'], '']);
|
|
51
51
|
assert.deepStrictEqual(inspect(parser('a\n>>1\nb')), [['<p>a<br><a href="?at=1" class="anchor">>>1</a><br>b</p>'], '']);
|
|
52
52
|
assert.deepStrictEqual(inspect(parser('a\n>> b\nc')), [['<p>a<br>>> b<br>c</p>'], '']);
|
|
53
|
-
assert.deepStrictEqual(inspect(parser(' >>1')), [['<p
|
|
54
|
-
assert.deepStrictEqual(inspect(parser(' >>>1')), [['<p
|
|
53
|
+
assert.deepStrictEqual(inspect(parser(' >>1')), [['<p> <a href="?at=1" class="anchor">>>1</a></p>'], '']);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser(' >>>1')), [['<p> ><a href="?at=1" class="anchor">>>1</a></p>'], '']);
|
|
55
55
|
});
|
|
56
56
|
|
|
57
57
|
it('comment', () => {
|
|
58
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
59
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
60
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
61
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
62
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
63
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
64
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
58
|
+
assert.deepStrictEqual(inspect(parser('[% a %]')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span></p>'], '']);
|
|
59
|
+
assert.deepStrictEqual(inspect(parser('[% a %]b')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span>b</p>'], '']);
|
|
60
|
+
assert.deepStrictEqual(inspect(parser('[% a %]\nb')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span><br>b</p>'], '']);
|
|
61
|
+
assert.deepStrictEqual(inspect(parser('[%% a %%]')), [['<p><span class="comment"><input type="checkbox"><span>[%% a %%]</span></span></p>'], '']);
|
|
62
|
+
assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]')), [['<p><span class="comment"><input type="checkbox"><span>[%<br><wbr><br>%]</span></span></p>'], '']);
|
|
63
|
+
assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]a')), [['<p><span class="comment"><input type="checkbox"><span>[%<br><wbr><br>%]</span></span>a</p>'], '']);
|
|
64
|
+
assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]\na')), [['<p><span class="comment"><input type="checkbox"><span>[%<br><wbr><br>%]</span></span><br>a</p>'], '']);
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
it('template', () => {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ParagraphParser } from '../block';
|
|
2
|
-
import { union, some, block,
|
|
2
|
+
import { union, some, block, trimEnd, fmap } from '../../combinator';
|
|
3
3
|
import { inline } from '../inline';
|
|
4
4
|
import { localize } from '../locale';
|
|
5
5
|
import { visualize } from '../util';
|
|
6
6
|
import { html, defrag } from 'typed-dom/dom';
|
|
7
7
|
|
|
8
8
|
export const paragraph: ParagraphParser = block(localize(fmap(
|
|
9
|
-
|
|
9
|
+
visualize(trimEnd(some(union([inline])))),
|
|
10
10
|
ns => [html('p', defrag(ns))])));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReplyParser } from '../block';
|
|
2
|
-
import { inits, subsequence, some, block, validate, rewrite,
|
|
2
|
+
import { inits, subsequence, some, block, validate, rewrite, trimEnd, fmap } from '../../combinator';
|
|
3
3
|
import { cite } from './reply/cite';
|
|
4
4
|
import { quote, syntax as delimiter } from './reply/quote';
|
|
5
5
|
import { inline } from '../inline';
|
|
@@ -26,7 +26,7 @@ export const reply: ReplyParser = block(validate('>', localize(fmap(
|
|
|
26
26
|
some(quote),
|
|
27
27
|
fmap(rewrite(
|
|
28
28
|
some(anyline, delimiter),
|
|
29
|
-
|
|
29
|
+
visualize(trimEnd(some(inline)))),
|
|
30
30
|
ns => push(ns, [html('br')])),
|
|
31
31
|
])),
|
|
32
32
|
]),
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { UListParser } from '../block';
|
|
2
|
-
import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, trim,
|
|
2
|
+
import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, trim, fallback, lazy, fmap } from '../../combinator';
|
|
3
3
|
import { olist_ } from './olist';
|
|
4
4
|
import { ilist_ } from './ilist';
|
|
5
5
|
import { inline, indexer, indexee } from '../inline';
|
|
6
|
+
import { contentline } from '../source';
|
|
7
|
+
import { trimBlank } from '../util';
|
|
6
8
|
import { html, defrag } from 'typed-dom/dom';
|
|
7
9
|
import { unshift } from 'spica/array';
|
|
8
|
-
import { contentline } from '../source';
|
|
9
10
|
|
|
10
11
|
export const ulist: UListParser = lazy(() => block(validate(
|
|
11
12
|
/^-(?=[^\S\n]|\n[^\S\n]*\S)/,
|
|
@@ -17,7 +18,7 @@ export const ulist_: UListParser = lazy(() => block(fmap(validate(
|
|
|
17
18
|
some(creator(union([
|
|
18
19
|
indexee(fmap(fallback(
|
|
19
20
|
inits([
|
|
20
|
-
line(open(/^-(?:$|\s)/, trim(subsequence([checkbox,
|
|
21
|
+
line(open(/^-(?:$|\s)/, trim(subsequence([checkbox, trimBlank(some(union([indexer, inline])))])), true)),
|
|
21
22
|
indent(union([ulist_, olist_, ilist_])),
|
|
22
23
|
]),
|
|
23
24
|
invalid),
|
|
@@ -16,9 +16,7 @@ describe('Unit: parser/inline/annotation', () => {
|
|
|
16
16
|
assert.deepStrictEqual(inspect(parser('(( ))')), undefined);
|
|
17
17
|
assert.deepStrictEqual(inspect(parser('((\n))')), undefined);
|
|
18
18
|
assert.deepStrictEqual(inspect(parser('((\na))')), undefined);
|
|
19
|
-
assert.deepStrictEqual(inspect(parser('((\\ a))')), undefined);
|
|
20
19
|
assert.deepStrictEqual(inspect(parser('((\\\na))')), undefined);
|
|
21
|
-
assert.deepStrictEqual(inspect(parser('((<wbr>a))')), undefined);
|
|
22
20
|
assert.deepStrictEqual(inspect(parser('((a\n))')), undefined);
|
|
23
21
|
assert.deepStrictEqual(inspect(parser('((a\\\n))')), undefined);
|
|
24
22
|
assert.deepStrictEqual(inspect(parser('((a\nb))')), undefined);
|
|
@@ -33,6 +31,8 @@ describe('Unit: parser/inline/annotation', () => {
|
|
|
33
31
|
it('basic', () => {
|
|
34
32
|
assert.deepStrictEqual(inspect(parser('(( a))')), [['<sup class="annotation">a</sup>'], '']);
|
|
35
33
|
assert.deepStrictEqual(inspect(parser('(( a ))')), [['<sup class="annotation">a</sup>'], '']);
|
|
34
|
+
assert.deepStrictEqual(inspect(parser('((\\ a))')), [['<sup class="annotation">a</sup>'], '']);
|
|
35
|
+
assert.deepStrictEqual(inspect(parser('((<wbr>a))')), [['<sup class="annotation">a</sup>'], '']);
|
|
36
36
|
assert.deepStrictEqual(inspect(parser('((a))')), [['<sup class="annotation">a</sup>'], '']);
|
|
37
37
|
assert.deepStrictEqual(inspect(parser('((a ))')), [['<sup class="annotation">a</sup>'], '']);
|
|
38
38
|
assert.deepStrictEqual(inspect(parser('((a ))')), [['<sup class="annotation">a</sup>'], '']);
|
|
@@ -2,13 +2,12 @@ import { undefined } from 'spica/global';
|
|
|
2
2
|
import { AnnotationParser } from '../inline';
|
|
3
3
|
import { union, some, validate, guard, context, creator, surround, lazy, fmap } from '../../combinator';
|
|
4
4
|
import { inline } from '../inline';
|
|
5
|
-
import {
|
|
5
|
+
import { trimBlank } from '../util';
|
|
6
6
|
import { html, defrag } from 'typed-dom/dom';
|
|
7
7
|
|
|
8
8
|
export const annotation: AnnotationParser = lazy(() => creator(validate('((', '))', '\n', fmap(surround(
|
|
9
9
|
'((',
|
|
10
10
|
guard(context => context.syntax?.inline?.annotation ?? true,
|
|
11
|
-
startLoose(
|
|
12
11
|
context({ syntax: { inline: {
|
|
13
12
|
annotation: false,
|
|
14
13
|
// Redundant
|
|
@@ -20,6 +19,6 @@ export const annotation: AnnotationParser = lazy(() => creator(validate('((', ')
|
|
|
20
19
|
//link: true,
|
|
21
20
|
//autolink: true,
|
|
22
21
|
}}, delimiters: undefined },
|
|
23
|
-
|
|
22
|
+
trimBlank(some(union([inline]), ')', /^\\?\n/)))),
|
|
24
23
|
'))'),
|
|
25
|
-
ns => [html('sup', { class: 'annotation' },
|
|
24
|
+
ns => [html('sup', { class: 'annotation' }, defrag(ns))]))));
|
|
@@ -9,53 +9,53 @@ describe('Unit: parser/inline/comment', () => {
|
|
|
9
9
|
it('invalid', () => {
|
|
10
10
|
assert.deepStrictEqual(inspect(parser('')), undefined);
|
|
11
11
|
assert.deepStrictEqual(inspect(parser('<')), undefined);
|
|
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('[
|
|
27
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
28
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
29
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
30
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
31
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
33
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
35
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
36
|
-
assert.deepStrictEqual(inspect(parser(' [
|
|
12
|
+
assert.deepStrictEqual(inspect(parser('[%')), undefined);
|
|
13
|
+
assert.deepStrictEqual(inspect(parser('[%[%')), undefined);
|
|
14
|
+
assert.deepStrictEqual(inspect(parser('[%a%]')), undefined);
|
|
15
|
+
assert.deepStrictEqual(inspect(parser('[%a b%]')), undefined);
|
|
16
|
+
assert.deepStrictEqual(inspect(parser('[% ')), [['[%'], '']);
|
|
17
|
+
assert.deepStrictEqual(inspect(parser('[% \n a')), [['[%', '<br>', ' ', 'a'], '']);
|
|
18
|
+
assert.deepStrictEqual(inspect(parser('[%%]')), undefined);
|
|
19
|
+
assert.deepStrictEqual(inspect(parser('[% [%')), [['[%', ' ', '[', '%'], '']);
|
|
20
|
+
assert.deepStrictEqual(inspect(parser('[% [% ')), [['[%', ' ', '[%'], '']);
|
|
21
|
+
assert.deepStrictEqual(inspect(parser('[% [% a')), [['[%', ' ', '[%', ' ', 'a'], '']);
|
|
22
|
+
assert.deepStrictEqual(inspect(parser('[% [% a %]')), [['[%', ' ', '<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], '']);
|
|
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 [% b')), [['[%', ' ', 'a', ' ', '[%', ' ', 'b'], '']);
|
|
27
|
+
assert.deepStrictEqual(inspect(parser('[% a [%% b')), [['[%', ' ', 'a', ' ', '[%%', ' ', 'b'], '']);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser('[%% a [% b')), [['[%%', ' ', 'a', ' ', '[%', ' ', 'b'], '']);
|
|
29
|
+
assert.deepStrictEqual(inspect(parser('[%\\ a %]')), undefined);
|
|
30
|
+
assert.deepStrictEqual(inspect(parser('[% a\\ %]')), [['[%', ' ', 'a', ' ', '%', ']'], '']);
|
|
31
|
+
assert.deepStrictEqual(inspect(parser('[% a%]')), [['[%', ' ', 'a', '%', ']'], '']);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser('[% a %%]')), [['[%', ' ', 'a', ' ', '%', '%', ']'], '']);
|
|
33
|
+
assert.deepStrictEqual(inspect(parser('[% [%% %]')), [['[%', ' ', '[%%', ' ', '%', ']'], '']);
|
|
34
|
+
assert.deepStrictEqual(inspect(parser('[%% [% %%]')), [['[%%', ' ', '[%', ' ', '%', '%', ']'], '']);
|
|
35
|
+
assert.deepStrictEqual(inspect(parser('[%% a %]')), [['[%%', ' ', 'a', ' ', '%', ']'], '']);
|
|
36
|
+
assert.deepStrictEqual(inspect(parser(' [% a %]')), undefined);
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
it('basic', () => {
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
44
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
45
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
47
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
50
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
51
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
52
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
53
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
54
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
55
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
56
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
57
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
58
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
40
|
+
assert.deepStrictEqual(inspect(parser('[% %]')), [['<span class="comment"><input type="checkbox"><span>[% %]</span></span>'], '']);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser('[% %]')), [['<span class="comment"><input type="checkbox"><span>[% %]</span></span>'], '']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('[% %]')), [['<span class="comment"><input type="checkbox"><span>[% %]</span></span>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('[% a %]')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], '']);
|
|
44
|
+
assert.deepStrictEqual(inspect(parser('[% a b %]')), [['<span class="comment"><input type="checkbox"><span>[% a b %]</span></span>'], '']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser('[% a\nb %]')), [['<span class="comment"><input type="checkbox"><span>[% a<br>b %]</span></span>'], '']);
|
|
46
|
+
assert.deepStrictEqual(inspect(parser('[% a %] %]')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], ' %]']);
|
|
47
|
+
assert.deepStrictEqual(inspect(parser('[% %%] %]')), [['<span class="comment"><input type="checkbox"><span>[% %%] %]</span></span>'], '']);
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('[% [% a %] %]')), [['<span class="comment"><input type="checkbox"><span>[% <span class="comment"><input type="checkbox"><span>[% a %]</span></span> %]</span></span>'], '']);
|
|
49
|
+
assert.deepStrictEqual(inspect(parser('[% [%% a %%] %]')), [['<span class="comment"><input type="checkbox"><span>[% <span class="comment"><input type="checkbox"><span>[%% a %%]</span></span> %]</span></span>'], '']);
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('[%% a %%]')), [['<span class="comment"><input type="checkbox"><span>[%% a %%]</span></span>'], '']);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser('[%% %] %%]')), [['<span class="comment"><input type="checkbox"><span>[%% %] %%]</span></span>'], '']);
|
|
52
|
+
assert.deepStrictEqual(inspect(parser('[%% [% a %] %%]')), [['<span class="comment"><input type="checkbox"><span>[%% <span class="comment"><input type="checkbox"><span>[% a %]</span></span> %%]</span></span>'], '']);
|
|
53
|
+
assert.deepStrictEqual(inspect(parser('[% a %]b')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], 'b']);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser('[%\na\n%]')), [['<span class="comment"><input type="checkbox"><span>[%<br>a<br>%]</span></span>'], '']);
|
|
55
|
+
assert.deepStrictEqual(inspect(parser('[% &a; %]')), [['<span class="comment"><input type="checkbox"><span>[% <span class="invalid">&a;</span> %]</span></span>'], '']);
|
|
56
|
+
assert.deepStrictEqual(inspect(parser('[% © %]')), [['<span class="comment"><input type="checkbox"><span>[% © %]</span></span>'], '']);
|
|
57
|
+
assert.deepStrictEqual(inspect(parser('[% &copy; %]')), [['<span class="comment"><input type="checkbox"><span>[% &copy; %]</span></span>'], '']);
|
|
58
|
+
assert.deepStrictEqual(inspect(parser('[% \\ a %]')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], '']);
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
});
|
|
@@ -6,13 +6,13 @@ import { html, defrag } from 'typed-dom/dom';
|
|
|
6
6
|
import { memoize } from 'spica/memoize';
|
|
7
7
|
import { unshift, push } from 'spica/array';
|
|
8
8
|
|
|
9
|
-
export const comment: CommentParser = lazy(() => creator(validate('[
|
|
10
|
-
/^(?=\[(
|
|
9
|
+
export const comment: CommentParser = lazy(() => creator(validate('[%', match(
|
|
10
|
+
/^(?=\[(%+)\s)/,
|
|
11
11
|
memoize(
|
|
12
12
|
([, fence]) =>
|
|
13
13
|
surround(
|
|
14
14
|
open(str(`[${fence}`), some(text, new RegExp(String.raw`^\s+${fence}\]|^\S`)), true),
|
|
15
|
-
union([
|
|
15
|
+
some(union([inline]), new RegExp(String.raw`^\s+${fence}\]`)),
|
|
16
16
|
close(some(text, /^\S/), str(`${fence}]`)), true,
|
|
17
17
|
([as, bs = [], cs], rest) => [[
|
|
18
18
|
html('span', { class: 'comment' }, [
|