securemark 0.249.0 → 0.251.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 +285 -155
- package/karma.conf.js +1 -1
- package/markdown.d.ts +1 -1
- package/package.json +11 -11
- package/src/combinator/control/manipulation/indent.ts +7 -4
- package/src/combinator/control/manipulation/match.ts +2 -3
- package/src/parser/api/parse.test.ts +12 -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 +5 -5
- package/src/parser/block/heading.test.ts +1 -0
- package/src/parser/block/heading.ts +4 -4
- package/src/parser/block/indentblock.test.ts +17 -10
- package/src/parser/block/indentblock.ts +3 -3
- package/src/parser/block/olist.ts +7 -6
- 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.ts +2 -2
- package/src/parser/inline/code.ts +1 -1
- package/src/parser/inline/comment.test.ts +44 -44
- package/src/parser/inline/comment.ts +2 -2
- 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.ts +8 -9
- package/src/parser/inline/link.ts +2 -2
- package/src/parser/inline/reference.ts +3 -3
- package/src/parser/inline.test.ts +2 -2
- package/src/parser/util.ts +8 -8
|
@@ -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,8 +6,8 @@ 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(
|
|
@@ -45,7 +45,7 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
45
45
|
assert.deepStrictEqual(inspect(parser('[#a \\ ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
46
46
|
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
47
47
|
assert.deepStrictEqual(inspect(parser('[#a <wbr>]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('[#a [
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('[#a [% b %]]')), [['<a class="index" href="#index:a">a <span class="comment"><input type="checkbox"><span>[% b %]</span></span></a>'], '']);
|
|
49
49
|
assert.deepStrictEqual(inspect(parser('[#a\\ ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
50
50
|
assert.deepStrictEqual(inspect(parser('[#a\\ b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
|
|
51
51
|
assert.deepStrictEqual(inspect(parser('[#[]]')), [['<a class="index" href="#index:[]">[]</a>'], '']);
|
|
@@ -61,8 +61,8 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
61
61
|
assert.deepStrictEqual(inspect(parser('[#@a]')), [['<a class="index" href="#index:@a">@a</a>'], '']);
|
|
62
62
|
assert.deepStrictEqual(inspect(parser('[#http://host]')), [['<a class="index" href="#index:http://host">http://host</a>'], '']);
|
|
63
63
|
assert.deepStrictEqual(inspect(parser('[#!http://host]')), [['<a class="index" href="#index:!http://host">!http://host</a>'], '']);
|
|
64
|
-
assert.deepStrictEqual(inspect(parser('[#[
|
|
65
|
-
assert.deepStrictEqual(inspect(parser('[#[
|
|
64
|
+
assert.deepStrictEqual(inspect(parser('[#[% %]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[% %]</span></span></a>'], '']);
|
|
65
|
+
assert.deepStrictEqual(inspect(parser('[#[% a %]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[% a %]</span></span></a>'], '']);
|
|
66
66
|
assert.deepStrictEqual(inspect(parser('[#a((b))]')), [['<a class="index" href="#index:a((b))">a<span class="paren">((b))</span></a>'], '']);
|
|
67
67
|
assert.deepStrictEqual(inspect(parser('[#a[[b]]]')), [['<a class="index" href="#index:a[[b]]">a[[b]]</a>'], '']);
|
|
68
68
|
});
|
|
@@ -89,7 +89,7 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
89
89
|
assert.deepStrictEqual(inspect(parser('[#a \\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
90
90
|
assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
91
91
|
assert.deepStrictEqual(inspect(parser('[#a <wbr>|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
92
|
-
assert.deepStrictEqual(inspect(parser('[#a [
|
|
92
|
+
assert.deepStrictEqual(inspect(parser('[#a [% b %]|#c]')), [['<a class="index" href="#index:c">a <span class="comment"><input type="checkbox"><span>[% b %]</span></span><span class="indexer" data-index="c"></span></a>'], '']);
|
|
93
93
|
assert.deepStrictEqual(inspect(parser('[#a\\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
94
94
|
});
|
|
95
95
|
|
|
@@ -45,13 +45,13 @@ describe('Unit: parser/inline/extension/placeholder', () => {
|
|
|
45
45
|
assert.deepStrictEqual(inspect(parser('[^a\\ \\ ]')), [['<span class="invalid">a </span>'], '']);
|
|
46
46
|
assert.deepStrictEqual(inspect(parser('[^a<wbr>]')), [['<span class="invalid">a<wbr></span>'], '']);
|
|
47
47
|
assert.deepStrictEqual(inspect(parser('[^a<wbr><wbr>]')), [['<span class="invalid">a<wbr><wbr></span>'], '']);
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('[^a[
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('[^a[
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('[^a[% b %]]')), [['<span class="invalid">a<span class="comment"><input type="checkbox"><span>[% b %]</span></span></span>'], '']);
|
|
49
|
+
assert.deepStrictEqual(inspect(parser('[^a[% b %][% c %]]')), [['<span class="invalid">a<span class="comment"><input type="checkbox"><span>[% b %]</span></span><span class="comment"><input type="checkbox"><span>[% c %]</span></span></span>'], '']);
|
|
50
50
|
assert.deepStrictEqual(inspect(parser('[^\\]]')), [['<span class="invalid">]</span>'], '']);
|
|
51
51
|
assert.deepStrictEqual(inspect(parser('[^(])]')), [['<span class="invalid"><span class="paren">(])</span></span>'], '']);
|
|
52
52
|
assert.deepStrictEqual(inspect(parser('[^!http://host]')), [['<span class="invalid"><a href="http://host" target="_blank"><img class="media" data-src="http://host" alt=""></a></span>'], '']);
|
|
53
|
-
assert.deepStrictEqual(inspect(parser('[^[
|
|
54
|
-
assert.deepStrictEqual(inspect(parser('[^[
|
|
53
|
+
assert.deepStrictEqual(inspect(parser('[^[% a %]]')), [['<span class="invalid"><span class="comment"><input type="checkbox"><span>[% a %]</span></span></span>'], '']);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser('[^[% a %]b]')), [['<span class="invalid"><span class="comment"><input type="checkbox"><span>[% a %]</span></span>b</span>'], '']);
|
|
55
55
|
});
|
|
56
56
|
|
|
57
57
|
});
|
|
@@ -20,7 +20,7 @@ Object.values(attrspec).forEach(o => Object.setPrototypeOf(o, null));
|
|
|
20
20
|
|
|
21
21
|
export const html: HTMLParser = lazy(() => creator(validate('<', validate(/^<[a-z]+(?=[^\S\n]|>)/, union([
|
|
22
22
|
match(
|
|
23
|
-
|
|
23
|
+
/^<(wbr)(?=[^\S\n]|>)/,
|
|
24
24
|
memoize(
|
|
25
25
|
([, tag]) =>
|
|
26
26
|
surround(
|
|
@@ -29,30 +29,30 @@ export const html: HTMLParser = lazy(() => creator(validate('<', validate(/^<[a-
|
|
|
29
29
|
[[h(tag as 'span', attributes('html', [], attrspec[tag], bs))], rest]),
|
|
30
30
|
([, tag]) => tags.indexOf(tag), [])),
|
|
31
31
|
match(
|
|
32
|
-
|
|
32
|
+
/^<(sup|sub|small|bdo|bdi)(?=[^\S\n]|>)/,
|
|
33
33
|
memoize(
|
|
34
34
|
([, tag]) =>
|
|
35
35
|
surround<HTMLParser.TagParser, string>(surround(
|
|
36
36
|
str(`<${tag}`), some(attribute), str(/^\s*>/), true),
|
|
37
37
|
startLoose(some(union([
|
|
38
38
|
open(/^\n?/, some(inline, blankWith('\n', `</${tag}>`)), true),
|
|
39
|
-
])
|
|
39
|
+
])), `</${tag}>`),
|
|
40
40
|
str(`</${tag}>`), false,
|
|
41
41
|
([as, bs, cs], rest) =>
|
|
42
|
-
[[elem(tag, as,
|
|
42
|
+
[[elem(tag, as, bs, cs)], rest]),
|
|
43
43
|
([, tag]) => tags.indexOf(tag), [])),
|
|
44
44
|
match(
|
|
45
|
-
|
|
45
|
+
/^<([a-z]+)(?=[^\S\n]|>)/,
|
|
46
46
|
memoize(
|
|
47
47
|
([, tag]) =>
|
|
48
48
|
surround<HTMLParser.TagParser, string>(surround(
|
|
49
49
|
str(`<${tag}`), some(attribute), str(/^\s*>/), true),
|
|
50
50
|
startLoose(some(union([
|
|
51
51
|
open(/^\n?/, some(inline, blankWith('\n', `</${tag}>`)), true),
|
|
52
|
-
])
|
|
52
|
+
])), `</${tag}>`),
|
|
53
53
|
str(`</${tag}>`), false,
|
|
54
54
|
([as, bs, cs], rest) =>
|
|
55
|
-
[[elem(tag, as,
|
|
55
|
+
[[elem(tag, as, bs, cs)], rest]),
|
|
56
56
|
([, tag]) => tag,
|
|
57
57
|
new Cache(10000))),
|
|
58
58
|
])))));
|
|
@@ -64,13 +64,12 @@ export const attribute: HTMLParser.TagParser.AttributeParser = union([
|
|
|
64
64
|
function elem(tag: string, as: string[], bs: (HTMLElement | string)[], cs: string[]): HTMLElement {
|
|
65
65
|
assert(as.length > 0);
|
|
66
66
|
assert(as[0][0] === '<' && as[as.length - 1].slice(-1) === '>');
|
|
67
|
-
assert(bs.length === defrag(bs).length);
|
|
68
67
|
assert(cs.length === 1);
|
|
69
68
|
if (!tags.includes(tag)) return invalid('tag', `Invalid HTML tag <${tag}>`, as, bs, cs);
|
|
70
69
|
const attrs = attributes('html', [], attrspec[tag], as.slice(1, -1));
|
|
71
70
|
return 'data-invalid-syntax' in attrs
|
|
72
71
|
? invalid('attribute', 'Invalid HTML attribute', as, bs, cs)
|
|
73
|
-
: h(tag as 'span', attrs, bs);
|
|
72
|
+
: h(tag as 'span', attrs, defrag(bs));
|
|
74
73
|
}
|
|
75
74
|
function invalid(type: string, message: string, as: (HTMLElement | string)[], bs: (HTMLElement | string)[], cs: (HTMLElement | string)[]): HTMLElement {
|
|
76
75
|
return h('span', {
|
|
@@ -6,7 +6,7 @@ import { inline, media, shortmedia } from '../inline';
|
|
|
6
6
|
import { attributes } from './html';
|
|
7
7
|
import { autolink } from '../autolink';
|
|
8
8
|
import { str } from '../source';
|
|
9
|
-
import {
|
|
9
|
+
import { trimBlank, stringify } from '../util';
|
|
10
10
|
import { html, define, defrag } from 'typed-dom/dom';
|
|
11
11
|
import { ReadonlyURL } from 'spica/url';
|
|
12
12
|
|
|
@@ -36,7 +36,7 @@ export const link: LinkParser = lazy(() => creator(10, validate(['[', '{'], '}',
|
|
|
36
36
|
media: false,
|
|
37
37
|
autolink: false,
|
|
38
38
|
}}},
|
|
39
|
-
|
|
39
|
+
trimBlank(some(inline, ']', /^\\?\n/))),
|
|
40
40
|
']',
|
|
41
41
|
true),
|
|
42
42
|
]))),
|
|
@@ -3,7 +3,7 @@ import { ReferenceParser } from '../inline';
|
|
|
3
3
|
import { union, subsequence, some, validate, focus, guard, context, creator, surround, lazy, fmap, bind } from '../../combinator';
|
|
4
4
|
import { inline } from '../inline';
|
|
5
5
|
import { str } from '../source';
|
|
6
|
-
import {
|
|
6
|
+
import { regBlankStart, trimBlank, stringify } from '../util';
|
|
7
7
|
import { html, defrag } from 'typed-dom/dom';
|
|
8
8
|
|
|
9
9
|
export const reference: ReferenceParser = lazy(() => creator(validate('[[', ']]', '\n', fmap(surround(
|
|
@@ -22,7 +22,7 @@ export const reference: ReferenceParser = lazy(() => creator(validate('[[', ']]'
|
|
|
22
22
|
subsequence([
|
|
23
23
|
abbr,
|
|
24
24
|
focus(/^\^[^\S\n]*/, source => [['', source], '']),
|
|
25
|
-
|
|
25
|
+
trimBlank(some(inline, ']', /^\\?\n/)),
|
|
26
26
|
]))),
|
|
27
27
|
']]'),
|
|
28
28
|
ns => [html('sup', attributes(ns), defrag(ns))]))));
|
|
@@ -31,7 +31,7 @@ const abbr: ReferenceParser.AbbrParser = creator(bind(surround(
|
|
|
31
31
|
'^',
|
|
32
32
|
union([str(/^(?![0-9]+\s?[|\]])[0-9A-Za-z]+(?:(?:-|(?=\W)(?!'\d)'?(?!\.\d)\.?(?!,\S),? ?)[0-9A-Za-z]+)*(?:-|'?\.?,? ?)?/)]),
|
|
33
33
|
/^\|?(?=]])|^\|[^\S\n]*/),
|
|
34
|
-
([source], rest) => [[html('abbr', source)], rest.replace(
|
|
34
|
+
([source], rest) => [[html('abbr', source)], rest.replace(regBlankStart, '')]));
|
|
35
35
|
|
|
36
36
|
function attributes(ns: (string | HTMLElement)[]): Record<string, string | undefined> {
|
|
37
37
|
return typeof ns[0] === 'object' && ns[0].tagName === 'ABBR'
|
|
@@ -166,8 +166,8 @@ describe('Unit: parser/inline', () => {
|
|
|
166
166
|
assert.deepStrictEqual(inspect(parser('[#a*b\nc*]')), [['[', '<a href="/hashtags/a" class="hashtag">#a</a>', '<em>b<br>c</em>', ']'], '']);
|
|
167
167
|
assert.deepStrictEqual(inspect(parser('[*a\nb*]{/}')), [['[', '<em>a<br>b</em>', ']', '<a href="/">/</a>'], '']);
|
|
168
168
|
assert.deepStrictEqual(inspect(parser('[[*a\nb*]]')), [['[', '[', '<em>a<br>b</em>', ']', ']'], '']);
|
|
169
|
-
assert.deepStrictEqual(inspect(parser('"[
|
|
170
|
-
assert.deepStrictEqual(inspect(parser('"[
|
|
169
|
+
assert.deepStrictEqual(inspect(parser('"[% *"*"*')), [['"', '[%', ' ', '*', '"', '*', '"', '*'], '']);
|
|
170
|
+
assert.deepStrictEqual(inspect(parser('"[% "*"* %]')), [['"', '[%', ' ', '"', '*', '"', '*', ' ', '%', ']'], '']);
|
|
171
171
|
});
|
|
172
172
|
|
|
173
173
|
it('uri', () => {
|
package/src/parser/util.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { invisibleHTMLEntityNames } from './api/normalize';
|
|
|
8
8
|
import { reduce } from 'spica/memoize';
|
|
9
9
|
import { push } from 'spica/array';
|
|
10
10
|
|
|
11
|
-
export const
|
|
11
|
+
export const regBlankStart = new RegExp(String.raw
|
|
12
12
|
`^(?:\\?[^\S\n]|&(?:${invisibleHTMLEntityNames.join('|')});|<wbr>)+`);
|
|
13
13
|
|
|
14
14
|
export function blankWith(delimiter: string | RegExp): RegExp;
|
|
@@ -60,7 +60,7 @@ export function startLoose<T extends HTMLElement | string>(parser: Parser<T>, ex
|
|
|
60
60
|
: undefined;
|
|
61
61
|
}
|
|
62
62
|
const isStartLoose = reduce((source: string, context: MarkdownParser.Context, except?: string): boolean => {
|
|
63
|
-
return isStartTight(source.replace(
|
|
63
|
+
return isStartTight(source.replace(regBlankStart, ''), context, except);
|
|
64
64
|
}, (source, _, except = '') => `${source}\x1E${except}`);
|
|
65
65
|
|
|
66
66
|
export function startTight<P extends Parser<unknown>>(parser: P, except?: string): P;
|
|
@@ -137,16 +137,16 @@ function isVisible(node: HTMLElement | string, strpos?: number): boolean {
|
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
-
export function
|
|
141
|
-
export function
|
|
140
|
+
export function trimBlank<P extends Parser<HTMLElement | string>>(parser: P): P;
|
|
141
|
+
export function trimBlank<T extends HTMLElement | string>(parser: Parser<T>): Parser<T> {
|
|
142
142
|
return fmap(
|
|
143
|
-
|
|
143
|
+
trimBlankStart(parser),
|
|
144
144
|
trimNodeEnd);
|
|
145
145
|
}
|
|
146
|
-
function
|
|
147
|
-
function
|
|
146
|
+
function trimBlankStart<P extends Parser<unknown>>(parser: P): P;
|
|
147
|
+
function trimBlankStart<T>(parser: Parser<T>): Parser<T> {
|
|
148
148
|
return convert(
|
|
149
|
-
reduce(source => source.replace(
|
|
149
|
+
reduce(source => source.replace(regBlankStart, '')),
|
|
150
150
|
parser);
|
|
151
151
|
}
|
|
152
152
|
//export function trimNode(nodes: (HTMLElement | string)[]): (HTMLElement | string)[] {
|