securemark 0.264.0 → 0.266.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 +10 -0
- package/dist/index.js +44 -58
- package/index.d.ts +2 -1
- package/package.json +1 -1
- package/src/combinator/data/parser/some.ts +2 -1
- package/src/parser/api/bind.test.ts +17 -17
- package/src/parser/api/bind.ts +1 -0
- package/src/parser/api/normalize.ts +1 -1
- package/src/parser/api/parse.test.ts +6 -6
- package/src/parser/api/parse.ts +2 -1
- package/src/parser/block/blockquote.ts +1 -1
- package/src/parser/block/dlist.test.ts +34 -34
- package/src/parser/block/extension/aside.test.ts +3 -3
- package/src/parser/block/extension/aside.ts +2 -4
- package/src/parser/block/extension/figure.test.ts +2 -2
- package/src/parser/block/heading.test.ts +47 -47
- package/src/parser/block/olist.test.ts +30 -28
- package/src/parser/block/reply/cite.test.ts +1 -1
- package/src/parser/block/sidefence.ts +1 -1
- package/src/parser/block/ulist.test.ts +26 -26
- package/src/parser/inline/extension/index.test.ts +48 -48
- package/src/parser/inline/extension/index.ts +1 -1
- package/src/parser/inline/extension/indexee.ts +19 -18
- package/src/parser/inline/extension/indexer.ts +1 -1
- package/src/parser/inline/link.test.ts +26 -22
- package/src/parser/inline/link.ts +9 -14
- package/src/parser/inline/mark.test.ts +9 -9
- package/src/parser/inline/mark.ts +1 -1
- package/src/parser/inline.test.ts +7 -6
- package/src/parser/processor/figure.test.ts +19 -19
- package/src/parser/processor/figure.ts +0 -2
- package/src/parser/processor/footnote.test.ts +66 -66
- package/src/parser/processor/footnote.ts +11 -15
- package/src/util/toc.test.ts +28 -28
- package/src/util/toc.ts +0 -2
|
@@ -35,59 +35,59 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
it('basic', () => {
|
|
38
|
-
assert.deepStrictEqual(inspect(parser('[#a]')), [['<a class="index" href="#index
|
|
39
|
-
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('[#a \\ ]')), [['<a class="index" href="#index
|
|
44
|
-
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index
|
|
45
|
-
assert.deepStrictEqual(inspect(parser('[#a <wbr>]')), [['<a class="index" href="#index
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('[#a [% b %]]')), [['<a class="index" href="#index
|
|
47
|
-
assert.deepStrictEqual(inspect(parser('[#a\\ ]')), [['<a class="index" href="#index
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('[#a\\ b]')), [['<a class="index" href="#index
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('[#[]]')), [['<a class="index" href="#index
|
|
50
|
-
assert.deepStrictEqual(inspect(parser('[#\\]]')), [['<a class="index" href="#index
|
|
51
|
-
assert.deepStrictEqual(inspect(parser('[#\\\\]')), [['<a class="index" href="#index
|
|
52
|
-
assert.deepStrictEqual(inspect(parser('[#A]')), [['<a class="index" href="#index
|
|
53
|
-
assert.deepStrictEqual(inspect(parser('[#==]')), [['<a class="index" href="#index
|
|
54
|
-
assert.deepStrictEqual(inspect(parser('[#_A_]')), [['<a class="index" href="#index
|
|
55
|
-
assert.deepStrictEqual(inspect(parser('[#`A`]')), [['<a class="index" href="#index
|
|
56
|
-
assert.deepStrictEqual(inspect(parser('[#${A}$]')), [['<a class="index" href="#index
|
|
57
|
-
assert.deepStrictEqual(inspect(parser('[#[A](a)]')), [['<a class="index" href="#index
|
|
58
|
-
assert.deepStrictEqual(inspect(parser('[#[]{a}]')), [['<a class="index" href="#index
|
|
59
|
-
assert.deepStrictEqual(inspect(parser('[#![]{a}]')), [['<a class="index" href="#index
|
|
60
|
-
assert.deepStrictEqual(inspect(parser('[#@a]')), [['<a class="index" href="#index
|
|
61
|
-
assert.deepStrictEqual(inspect(parser('[#http://host]')), [['<a class="index" href="#index
|
|
62
|
-
assert.deepStrictEqual(inspect(parser('[#!http://host]')), [['<a class="index" href="#index
|
|
38
|
+
assert.deepStrictEqual(inspect(parser('[#a]')), [['<a class="index" href="#index::a">a</a>'], '']);
|
|
39
|
+
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index::a">a</a>'], '']);
|
|
40
|
+
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index::a">a</a>'], '']);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index::a_b">a b</a>'], '']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index::a_b">a b</a>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('[#a \\ ]')), [['<a class="index" href="#index::a">a</a>'], '']);
|
|
44
|
+
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index::a">a</a>'], '']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser('[#a <wbr>]')), [['<a class="index" href="#index::a">a</a>'], '']);
|
|
46
|
+
assert.deepStrictEqual(inspect(parser('[#a [% b %]]')), [['<a class="index" href="#index::a">a <span class="comment"><input type="checkbox"><span>[% b %]</span></span></a>'], '']);
|
|
47
|
+
assert.deepStrictEqual(inspect(parser('[#a\\ ]')), [['<a class="index" href="#index::a">a</a>'], '']);
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('[#a\\ b]')), [['<a class="index" href="#index::a_b">a b</a>'], '']);
|
|
49
|
+
assert.deepStrictEqual(inspect(parser('[#[]]')), [['<a class="index" href="#index::[]">[]</a>'], '']);
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('[#\\]]')), [['<a class="index" href="#index::]">]</a>'], '']);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser('[#\\\\]')), [['<a class="index" href="#index::\\">\\</a>'], '']);
|
|
52
|
+
assert.deepStrictEqual(inspect(parser('[#A]')), [['<a class="index" href="#index::A">A</a>'], '']);
|
|
53
|
+
assert.deepStrictEqual(inspect(parser('[#==]')), [['<a class="index" href="#index::==">==</a>'], '']);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser('[#_A_]')), [['<a class="index" href="#index::A"><em>A</em></a>'], '']);
|
|
55
|
+
assert.deepStrictEqual(inspect(parser('[#`A`]')), [['<a class="index" href="#index::`A`"><code data-src="`A`">A</code></a>'], '']);
|
|
56
|
+
assert.deepStrictEqual(inspect(parser('[#${A}$]')), [['<a class="index" href="#index::${A}$"><span class="math" translate="no" data-src="${A}$">${A}$</span></a>'], '']);
|
|
57
|
+
assert.deepStrictEqual(inspect(parser('[#[A](a)]')), [['<a class="index" href="#index::A"><ruby>A<rp>(</rp><rt>a</rt><rp>)</rp></ruby></a>'], '']);
|
|
58
|
+
assert.deepStrictEqual(inspect(parser('[#[]{a}]')), [['<a class="index" href="#index::[]{a}">[]{a}</a>'], '']);
|
|
59
|
+
assert.deepStrictEqual(inspect(parser('[#![]{a}]')), [['<a class="index" href="#index::![]{a}">![]{a}</a>'], '']);
|
|
60
|
+
assert.deepStrictEqual(inspect(parser('[#@a]')), [['<a class="index" href="#index::@a">@a</a>'], '']);
|
|
61
|
+
assert.deepStrictEqual(inspect(parser('[#http://host]')), [['<a class="index" href="#index::http://host">http://host</a>'], '']);
|
|
62
|
+
assert.deepStrictEqual(inspect(parser('[#!http://host]')), [['<a class="index" href="#index::!http://host">!http://host</a>'], '']);
|
|
63
63
|
assert.deepStrictEqual(inspect(parser('[#[% %]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[% %]</span></span></a>'], '']);
|
|
64
64
|
assert.deepStrictEqual(inspect(parser('[#[% a %]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[% a %]</span></span></a>'], '']);
|
|
65
|
-
assert.deepStrictEqual(inspect(parser('[#a((b))]')), [['<a class="index" href="#index
|
|
66
|
-
assert.deepStrictEqual(inspect(parser('[#a[[b]]]')), [['<a class="index" href="#index
|
|
65
|
+
assert.deepStrictEqual(inspect(parser('[#a((b))]')), [['<a class="index" href="#index::a((b))">a<span class="paren">((b))</span></a>'], '']);
|
|
66
|
+
assert.deepStrictEqual(inspect(parser('[#a[[b]]]')), [['<a class="index" href="#index::a[[b]]">a[[b]]</a>'], '']);
|
|
67
67
|
});
|
|
68
68
|
|
|
69
69
|
it('indexer', () => {
|
|
70
|
-
assert.deepStrictEqual(inspect(parser('[#|]')), [['<a class="index" href="#index
|
|
71
|
-
assert.deepStrictEqual(inspect(parser('[#|b]')), [['<a class="index" href="#index
|
|
72
|
-
assert.deepStrictEqual(inspect(parser('[#a|]')), [['<a class="index" href="#index
|
|
73
|
-
assert.deepStrictEqual(inspect(parser('[#a| ]')), [['<a class="index" href="#index
|
|
74
|
-
assert.deepStrictEqual(inspect(parser('[#a|\\ ]')), [['<a class="index" href="#index
|
|
75
|
-
assert.deepStrictEqual(inspect(parser('[#a|b]')), [['<a class="index" href="#index
|
|
76
|
-
assert.deepStrictEqual(inspect(parser('[#a|b ]')), [['<a class="index" href="#index
|
|
77
|
-
assert.deepStrictEqual(inspect(parser('[#a|b ]')), [['<a class="index" href="#index
|
|
78
|
-
assert.deepStrictEqual(inspect(parser('[#a|\\b]')), [['<a class="index" href="#index
|
|
79
|
-
assert.deepStrictEqual(inspect(parser('[#a|_b_]')), [['<a class="index" href="#index
|
|
80
|
-
assert.deepStrictEqual(inspect(parser('[#a|b c]')), [['<a class="index" href="#index
|
|
81
|
-
assert.deepStrictEqual(inspect(parser('[#a|b c]')), [['<a class="index" href="#index
|
|
82
|
-
assert.deepStrictEqual(inspect(parser('[#a|[]]')), [['<a class="index" href="#index
|
|
83
|
-
assert.deepStrictEqual(inspect(parser('[#a|©]')), [['<a class="index" href="#index
|
|
84
|
-
assert.deepStrictEqual(inspect(parser('[#a |b]')), [['<a class="index" href="#index
|
|
85
|
-
assert.deepStrictEqual(inspect(parser('[#a |b]')), [['<a class="index" href="#index
|
|
86
|
-
assert.deepStrictEqual(inspect(parser('[#a \\ |b]')), [['<a class="index" href="#index
|
|
87
|
-
assert.deepStrictEqual(inspect(parser('[#a |b]')), [['<a class="index" href="#index
|
|
88
|
-
assert.deepStrictEqual(inspect(parser('[#a <wbr>|b]')), [['<a class="index" href="#index
|
|
89
|
-
assert.deepStrictEqual(inspect(parser('[#a [% b %]|c]')), [['<a class="index" href="#index
|
|
90
|
-
assert.deepStrictEqual(inspect(parser('[#a\\ |b]')), [['<a class="index" href="#index
|
|
70
|
+
assert.deepStrictEqual(inspect(parser('[#|]')), [['<a class="index" href="#index::|">|</a>'], '']);
|
|
71
|
+
assert.deepStrictEqual(inspect(parser('[#|b]')), [['<a class="index" href="#index::|b">|b</a>'], '']);
|
|
72
|
+
assert.deepStrictEqual(inspect(parser('[#a|]')), [['<a class="index" href="#index::a|">a|</a>'], '']);
|
|
73
|
+
assert.deepStrictEqual(inspect(parser('[#a| ]')), [['<a class="index" href="#index::a|">a|</a>'], '']);
|
|
74
|
+
assert.deepStrictEqual(inspect(parser('[#a|\\ ]')), [['<a class="index" href="#index::a|">a|</a>'], '']);
|
|
75
|
+
assert.deepStrictEqual(inspect(parser('[#a|b]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
76
|
+
assert.deepStrictEqual(inspect(parser('[#a|b ]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
77
|
+
assert.deepStrictEqual(inspect(parser('[#a|b ]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
78
|
+
assert.deepStrictEqual(inspect(parser('[#a|\\b]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
79
|
+
assert.deepStrictEqual(inspect(parser('[#a|_b_]')), [['<a class="index" href="#index::_b_">a<span class="indexer" data-index="_b_"></span></a>'], '']);
|
|
80
|
+
assert.deepStrictEqual(inspect(parser('[#a|b c]')), [['<a class="index" href="#index::b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
|
|
81
|
+
assert.deepStrictEqual(inspect(parser('[#a|b c]')), [['<a class="index" href="#index::b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
|
|
82
|
+
assert.deepStrictEqual(inspect(parser('[#a|[]]')), [['<a class="index" href="#index::[]">a<span class="indexer" data-index="[]"></span></a>'], '']);
|
|
83
|
+
assert.deepStrictEqual(inspect(parser('[#a|©]')), [['<a class="index" href="#index::&copy;">a<span class="indexer" data-index="&copy;"></span></a>'], '']);
|
|
84
|
+
assert.deepStrictEqual(inspect(parser('[#a |b]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
85
|
+
assert.deepStrictEqual(inspect(parser('[#a |b]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
86
|
+
assert.deepStrictEqual(inspect(parser('[#a \\ |b]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
87
|
+
assert.deepStrictEqual(inspect(parser('[#a |b]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
88
|
+
assert.deepStrictEqual(inspect(parser('[#a <wbr>|b]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
89
|
+
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>'], '']);
|
|
90
|
+
assert.deepStrictEqual(inspect(parser('[#a\\ |b]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
91
91
|
});
|
|
92
92
|
|
|
93
93
|
});
|
|
@@ -35,7 +35,7 @@ const signature: IndexParser.SignatureParser = lazy(() => creation(fmap(open(
|
|
|
35
35
|
'|',
|
|
36
36
|
startTight(some(union([bracket, txt]), ']'))),
|
|
37
37
|
ns => [
|
|
38
|
-
html('span', { class: 'indexer', 'data-index': identity(ns.join(''))
|
|
38
|
+
html('span', { class: 'indexer', 'data-index': identity(undefined, ns.join(''))!.slice(7) }),
|
|
39
39
|
])));
|
|
40
40
|
|
|
41
41
|
const bracket: IndexParser.SignatureParser.BracketParser = lazy(() => creation(union([
|
|
@@ -5,56 +5,57 @@ import { define } from 'typed-dom/dom';
|
|
|
5
5
|
|
|
6
6
|
export function indexee<P extends Parser<unknown, MarkdownParser.Context>>(parser: P, optional?: boolean): P;
|
|
7
7
|
export function indexee(parser: Parser<HTMLElement, MarkdownParser.Context>, optional?: boolean): Parser<HTMLElement> {
|
|
8
|
-
return fmap(parser, ([el], _, { id }) => [define(el, { id: id
|
|
8
|
+
return fmap(parser, ([el], _, { id }) => [define(el, { id: identity(id, text(el, optional)) })]);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export function identity(text: string, name: 'index' | 'mark' = 'index'): string {
|
|
11
|
+
export function identity(id: string | undefined, text: string, name: 'index' | 'mark' = 'index'): string | undefined {
|
|
12
12
|
assert(!text.includes('\n'));
|
|
13
|
+
if (id === '') return undefined;
|
|
13
14
|
text &&= text.trim().replace(/\s+/g, '_');
|
|
14
|
-
if (text
|
|
15
|
+
if (text === '') return undefined;
|
|
16
|
+
if (text.length <= 100) return `${name}:${id ?? ''}:${text}`;
|
|
15
17
|
switch (name) {
|
|
16
18
|
case 'index':
|
|
17
|
-
return `${name}:${text.slice(0, 97)}...`;
|
|
19
|
+
return `${name}:${id ?? ''}:${text.slice(0, 97)}...`;
|
|
18
20
|
case 'mark':
|
|
19
|
-
return `${name}:${text.slice(0, 50)}...${text.slice(-47)}`;
|
|
21
|
+
return `${name}:${id ?? ''}:${text.slice(0, 50)}...${text.slice(-47)}`;
|
|
20
22
|
}
|
|
23
|
+
assert(false);
|
|
21
24
|
}
|
|
22
|
-
assert(identity('0'.repeat(100 - 1) + 1)
|
|
23
|
-
assert(identity('0'.repeat(100) + 1)
|
|
24
|
-
assert(identity('0'.repeat(200) + 1)
|
|
25
|
-
assert(identity('0'.repeat(100 - 1) + 1, 'mark')
|
|
26
|
-
assert(identity('0'.repeat(100) + 1, 'mark')
|
|
27
|
-
assert(identity('0'.repeat(200) + 1, 'mark')
|
|
25
|
+
assert(identity(undefined, '0'.repeat(100 - 1) + 1)!.slice(7) === '0'.repeat(100 - 1) + 1);
|
|
26
|
+
assert(identity(undefined, '0'.repeat(100) + 1)!.slice(7) === '0'.repeat(97) + '...');
|
|
27
|
+
assert(identity(undefined, '0'.repeat(200) + 1)!.slice(7) === '0'.repeat(97) + '...');
|
|
28
|
+
assert(identity(undefined, '0'.repeat(100 - 1) + 1, 'mark')!.slice(6) === '0'.repeat(100 - 1) + 1);
|
|
29
|
+
assert(identity(undefined, '0'.repeat(100) + 1, 'mark')!.slice(6) === '0'.repeat(50) + '...' + '0'.repeat(47 - 1) + 1);
|
|
30
|
+
assert(identity(undefined, '0'.repeat(200) + 1, 'mark')!.slice(6) === '0'.repeat(50) + '...' + '0'.repeat(47 - 1) + 1);
|
|
28
31
|
|
|
29
32
|
export function text(source: HTMLElement | DocumentFragment, optional = false): string {
|
|
30
33
|
assert(source instanceof DocumentFragment || !source.matches('.indexer'));
|
|
31
34
|
assert(source.querySelectorAll(':scope > .indexer').length <= 1);
|
|
32
35
|
const indexer = source.querySelector(':scope > .indexer');
|
|
33
|
-
if (!indexer && optional) return '';
|
|
34
36
|
const index = indexer?.getAttribute('data-index');
|
|
35
37
|
if (index) return index;
|
|
36
|
-
|
|
38
|
+
if (index === '' && optional) return '';
|
|
39
|
+
assert(!navigator.userAgent.includes('Chrome') || !source.querySelector('br:not(:has(+ :is(ul, ol)))'));
|
|
37
40
|
const target = source.cloneNode(true) as typeof source;
|
|
38
41
|
for (let es = target.querySelectorAll('code[data-src], .math[data-src], .comment, rt, rp, br, .annotation, .reference, .checkbox, ul, ol'),
|
|
39
42
|
len = es.length, i = 0; i < len; ++i) {
|
|
40
43
|
const el = es[i];
|
|
41
44
|
switch (el.tagName) {
|
|
42
45
|
case 'CODE':
|
|
43
|
-
|
|
46
|
+
el.replaceWith(el.getAttribute('data-src')!);
|
|
44
47
|
continue;
|
|
45
48
|
case 'RT':
|
|
46
49
|
case 'RP':
|
|
50
|
+
case 'BR':
|
|
47
51
|
case 'UL':
|
|
48
52
|
case 'OL':
|
|
49
53
|
el.remove();
|
|
50
54
|
continue;
|
|
51
|
-
case 'BR':
|
|
52
|
-
el.replaceWith('\n');
|
|
53
|
-
continue;
|
|
54
55
|
}
|
|
55
56
|
switch (el.className) {
|
|
56
57
|
case 'math':
|
|
57
|
-
|
|
58
|
+
el.replaceWith(el.getAttribute('data-src')!);
|
|
58
59
|
continue;
|
|
59
60
|
case 'comment':
|
|
60
61
|
case 'checkbox':
|
|
@@ -15,5 +15,5 @@ export const indexer: ExtensionParser.IndexerParser = creation(fmap(verify(surro
|
|
|
15
15
|
// Indexer is invisible but invalids must be visible.
|
|
16
16
|
([el]) => el.getElementsByClassName('invalid').length === 0),
|
|
17
17
|
([el]) => [
|
|
18
|
-
html('span', { class: 'indexer', 'data-index': el.getAttribute('href')!.slice(
|
|
18
|
+
html('span', { class: 'indexer', 'data-index': el.getAttribute('href')!.slice(1).replace(/^\w+:\w*:/, '') }),
|
|
19
19
|
]));
|
|
@@ -20,33 +20,33 @@ describe('Unit: parser/inline/link', () => {
|
|
|
20
20
|
});
|
|
21
21
|
|
|
22
22
|
it('fishing', () => {
|
|
23
|
-
assert.deepStrictEqual(inspect(parser('[http://host]{http://evil}')),
|
|
24
|
-
assert.deepStrictEqual(inspect(parser('[\\http://host]{http://evil}')),
|
|
25
|
-
assert.deepStrictEqual(inspect(parser('[https://host]{http://host}')),
|
|
26
|
-
assert.deepStrictEqual(inspect(parser('[[]{http://host}.com]{http://host}')),
|
|
27
|
-
assert.deepStrictEqual(inspect(parser('[[]{http://host/a}b]{http://host/ab}')),
|
|
23
|
+
assert.deepStrictEqual(inspect(parser('[http://host]{http://evil}')), [['<a class="invalid">http://host</a>'], '']);
|
|
24
|
+
assert.deepStrictEqual(inspect(parser('[\\http://host]{http://evil}')), [['<a class="invalid">http://host</a>'], '']);
|
|
25
|
+
assert.deepStrictEqual(inspect(parser('[https://host]{http://host}')), [['<a class="invalid">https://host</a>'], '']);
|
|
26
|
+
assert.deepStrictEqual(inspect(parser('[[]{http://host}.com]{http://host}')), [['<a class="invalid">[]{http://host}.com</a>'], '']);
|
|
27
|
+
assert.deepStrictEqual(inspect(parser('[[]{http://host/a}b]{http://host/ab}')), [['<a class="invalid">[]{http://host/a}b</a>'], '']);
|
|
28
28
|
assert.deepStrictEqual(inspect(parser('{http%73://host}')), [['<a class="url" href="http%73://host">http%73://host</a>'], '']);
|
|
29
29
|
assert.deepStrictEqual(inspect(parser('{http://a%C3%A1}')), [['<a class="url" href="http://a%C3%A1" target="_blank">http://a%C3%A1</a>'], '']);
|
|
30
|
-
assert.deepStrictEqual(inspect(parser('[http://á]{http://evil}')),
|
|
31
|
-
assert.deepStrictEqual(inspect(parser('[xxx://á]{http://evil}')),
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('[mailto:á]{http://evil}')),
|
|
33
|
-
assert.deepStrictEqual(inspect(parser('[file:///]{http://evil}')),
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('[.http://á]{http://evil}')),
|
|
30
|
+
assert.deepStrictEqual(inspect(parser('[http://á]{http://evil}')), [['<a class="invalid">http://á</a>'], '']);
|
|
31
|
+
assert.deepStrictEqual(inspect(parser('[xxx://á]{http://evil}')), [['<a class="invalid">xxx://á</a>'], '']);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser('[mailto:á]{http://evil}')), [['<a class="invalid">mailto:á</a>'], '']);
|
|
33
|
+
assert.deepStrictEqual(inspect(parser('[file:///]{http://evil}')), [['<a class="invalid">file:///</a>'], '']);
|
|
34
|
+
assert.deepStrictEqual(inspect(parser('[.http://á]{http://evil}')), [['<a class="invalid">.http://á</a>'], '']);
|
|
35
35
|
assert.deepStrictEqual(inspect(parser('[0987654321]{tel:1234567890}')), [['<a class="invalid">0987654321</a>'], '']);
|
|
36
36
|
assert.deepStrictEqual(inspect(parser('[1234567890-]{tel:1234567890}')), [['<a class="invalid">1234567890-</a>'], '']);
|
|
37
37
|
assert.deepStrictEqual(inspect(parser('[-1234567890]{tel:1234567890}')), [['<a class="invalid">-1234567890</a>'], '']);
|
|
38
38
|
assert.deepStrictEqual(inspect(parser('[123456789a]{tel:1234567890}')), [['<a class="invalid">123456789a</a>'], '']);
|
|
39
39
|
assert.deepStrictEqual(inspect(parser('[1234567890]{tel:ttel:1234567890}')), [['<a class="invalid">1234567890</a>'], '']);
|
|
40
|
-
//assert.deepStrictEqual(inspect(parser('[#a]{b}')),
|
|
41
|
-
//assert.deepStrictEqual(inspect(parser('[\\#a]{b}')),
|
|
42
|
-
//assert.deepStrictEqual(inspect(parser('[c #a]{b}')),
|
|
43
|
-
//assert.deepStrictEqual(inspect(parser('[c \\#a]{b}')),
|
|
44
|
-
//assert.deepStrictEqual(inspect(parser('[]{#a}')), [['<a class="
|
|
45
|
-
//assert.deepStrictEqual(inspect(parser('[@a]{b}')),
|
|
46
|
-
//assert.deepStrictEqual(inspect(parser('[\\@a]{b}')),
|
|
47
|
-
//assert.deepStrictEqual(inspect(parser('[c @a]{b}')),
|
|
48
|
-
//assert.deepStrictEqual(inspect(parser('[c \\@a]{b}')),
|
|
49
|
-
//assert.deepStrictEqual(inspect(parser('[]{@a}')), [['<a class="
|
|
40
|
+
//assert.deepStrictEqual(inspect(parser('[#a]{b}')), [['<a class="link" href="b">#a</a>'], '']);
|
|
41
|
+
//assert.deepStrictEqual(inspect(parser('[\\#a]{b}')), [['<a class="link" href="b">#a</a>'], '']);
|
|
42
|
+
//assert.deepStrictEqual(inspect(parser('[c #a]{b}')), [['<a class="link" href="b">c #a</a>'], '']);
|
|
43
|
+
//assert.deepStrictEqual(inspect(parser('[c \\#a]{b}')), [['<a class="link" href="b">c #a</a>'], '']);
|
|
44
|
+
//assert.deepStrictEqual(inspect(parser('[]{#a}')), [['<a class="url" href="#a">#a</a>'], '']);
|
|
45
|
+
//assert.deepStrictEqual(inspect(parser('[@a]{b}')), [['<a class="link" href="b">@a</a>'], '']);
|
|
46
|
+
//assert.deepStrictEqual(inspect(parser('[\\@a]{b}')), [['<a class="link" href="b">@a</a>'], '']);
|
|
47
|
+
//assert.deepStrictEqual(inspect(parser('[c @a]{b}')), [['<a class="link" href="b">c @a</a>'], '']);
|
|
48
|
+
//assert.deepStrictEqual(inspect(parser('[c \\@a]{b}')), [['<a class="link" href="b">c @a</a>'], '']);
|
|
49
|
+
//assert.deepStrictEqual(inspect(parser('[]{@a}')), [['<a class="url" href="@a">@a</a>'], '']);
|
|
50
50
|
});
|
|
51
51
|
|
|
52
52
|
it('invalid', () => {
|
|
@@ -79,7 +79,7 @@ describe('Unit: parser/inline/link', () => {
|
|
|
79
79
|
assert.deepStrictEqual(inspect(parser('[a\\\nb]{b}')), undefined);
|
|
80
80
|
assert.deepStrictEqual(inspect(parser('[<wbr>]{b}')), undefined);
|
|
81
81
|
assert.deepStrictEqual(inspect(parser('[*a\nb*]{/}')), undefined);
|
|
82
|
-
assert.deepStrictEqual(inspect(parser('[http://host]{http://host}')),
|
|
82
|
+
assert.deepStrictEqual(inspect(parser('[http://host]{http://host}')), [['<a class="invalid">http://host</a>'], '']);
|
|
83
83
|
assert.deepStrictEqual(inspect(parser('[]{ttp://host}')), [['<a class="invalid">ttp://host</a>'], '']);
|
|
84
84
|
//assert.deepStrictEqual(inspect(parser('[]{http://[::ffff:0:0%1]}')), [['<a class="invalid">http://[::ffff:0:0%1]</a>'], '']);
|
|
85
85
|
//assert.deepStrictEqual(inspect(parser('[]{http://[::ffff:0:0/96]}')), [['<a class="invalid">http://[::ffff:0:0/96]</a>'], '']);
|
|
@@ -171,7 +171,11 @@ describe('Unit: parser/inline/link', () => {
|
|
|
171
171
|
assert.deepStrictEqual(inspect(parser('[((a))]{b}')), [['<a class="link" href="b"><span class="paren">((a))</span></a>'], '']);
|
|
172
172
|
assert.deepStrictEqual(inspect(parser('[[[a]]]{b}')), [['<a class="link" href="b">[[a]]</a>'], '']);
|
|
173
173
|
assert.deepStrictEqual(inspect(parser('[!http://host]{/}')), [['<a class="link" href="/" target="_blank"><img class="media" data-src="http://host" alt=""></a>'], '']);
|
|
174
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
174
|
+
assert.deepStrictEqual(inspect(parser('[#a]{b}')), [['<a class="link" href="b">#a</a>'], '']);
|
|
175
|
+
assert.deepStrictEqual(inspect(parser('[@a]{b}')), [['<a class="link" href="b">@a</a>'], '']);
|
|
176
|
+
assert.deepStrictEqual(inspect(parser('[@a@b]{c}')), [['<a class="link" href="c">@a@b</a>'], '']);
|
|
177
|
+
assert.deepStrictEqual(inspect(parser('[a@b]{c}')), [['<a class="link" href="c">a@b</a>'], '']);
|
|
178
|
+
assert.deepStrictEqual(inspect(parser('[*a*]{b}')), [['<a class="link" href="b"><strong>a</strong></a>'], '']);
|
|
175
179
|
});
|
|
176
180
|
|
|
177
181
|
it('external', () => {
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { MarkdownParser } from '../../../markdown';
|
|
2
2
|
import { LinkParser } from '../inline';
|
|
3
|
-
import { Result
|
|
4
|
-
import { union, inits, tails, sequence, some, constraint, syntax, creation, precedence,
|
|
3
|
+
import { Result } from '../../combinator/data/parser';
|
|
4
|
+
import { union, inits, tails, sequence, some, constraint, syntax, creation, precedence, validate, surround, open, dup, reverse, lazy, fmap, bind } from '../../combinator';
|
|
5
5
|
import { inline, media, shortmedia } from '../inline';
|
|
6
6
|
import { attributes } from './html';
|
|
7
|
-
import { autolink as autolink_ } from '../autolink';
|
|
8
7
|
import { unescsource, str } from '../source';
|
|
9
8
|
import { Syntax, State } from '../context';
|
|
10
9
|
import { trimNode } from '../visibility';
|
|
@@ -74,8 +73,6 @@ export const option: LinkParser.ParameterParser.OptionParser = union([
|
|
|
74
73
|
fmap(str(/^[^\S\n]+[^\s{}]+/), opt => [` \\${opt.slice(1)}`]),
|
|
75
74
|
]);
|
|
76
75
|
|
|
77
|
-
const autolink = state(State.autolink, false, state(State.shortcut, autolink_));
|
|
78
|
-
|
|
79
76
|
function parse(
|
|
80
77
|
content: (string | HTMLElement)[],
|
|
81
78
|
params: string[],
|
|
@@ -85,13 +82,6 @@ function parse(
|
|
|
85
82
|
assert(params.length > 0);
|
|
86
83
|
assert(params.every(p => typeof p === 'string'));
|
|
87
84
|
if (content.length !== 0 && trimNode(content).length === 0) return;
|
|
88
|
-
content = defrag(content);
|
|
89
|
-
for (let source = stringify(content); source;) {
|
|
90
|
-
if (/^[a-z][0-9a-z]*(?:[-.][0-9a-z]+)*:(?:\/{0,2}[^/?#\s]+|\/\/(?=[/]))/i.test(source)) return;
|
|
91
|
-
const result = autolink({ source, context });
|
|
92
|
-
if (typeof eval(result, [])[0] === 'object') return;
|
|
93
|
-
source = exec(result, '');
|
|
94
|
-
}
|
|
95
85
|
const INSECURE_URI = params.shift()!;
|
|
96
86
|
assert(INSECURE_URI === INSECURE_URI.trim());
|
|
97
87
|
assert(!INSECURE_URI.match(/\s/));
|
|
@@ -100,7 +90,7 @@ function parse(
|
|
|
100
90
|
context.host?.href || location.href);
|
|
101
91
|
const el = elem(
|
|
102
92
|
INSECURE_URI,
|
|
103
|
-
content,
|
|
93
|
+
defrag(content),
|
|
104
94
|
uri,
|
|
105
95
|
context.host?.origin || location.origin);
|
|
106
96
|
if (el.className === 'invalid') return [[el], rest];
|
|
@@ -120,6 +110,10 @@ function elem(
|
|
|
120
110
|
case 'https:':
|
|
121
111
|
assert(uri.host);
|
|
122
112
|
switch (true) {
|
|
113
|
+
case /[a-z][0-9]*:\/{0,2}\S/i.test(stringify(content)):
|
|
114
|
+
type = 'content';
|
|
115
|
+
message = 'URI must not be contained';
|
|
116
|
+
break;
|
|
123
117
|
case INSECURE_URI.slice(0, 2) === '^/'
|
|
124
118
|
&& /\/\.\.?(?:\/|$)/.test(INSECURE_URI.slice(0, INSECURE_URI.search(/[?#]|$/))):
|
|
125
119
|
type = 'argument';
|
|
@@ -165,6 +159,7 @@ function elem(
|
|
|
165
159
|
type = 'content';
|
|
166
160
|
message = 'Invalid content';
|
|
167
161
|
}
|
|
162
|
+
break;
|
|
168
163
|
}
|
|
169
164
|
return html('a',
|
|
170
165
|
{
|
|
@@ -205,7 +200,7 @@ function decode(uri: string): string {
|
|
|
205
200
|
const origin = uri.match(/^[a-z](?:[-.](?=\w)|[0-9a-z])*:(?:\/{0,2}[^/?#\s]+|\/\/(?=[/]))/i)?.[0] ?? '';
|
|
206
201
|
try {
|
|
207
202
|
let path = decodeURI(uri.slice(origin.length));
|
|
208
|
-
if (!origin && /^[a-z](?:[-.](?=\w)|[0-9a-z])
|
|
203
|
+
if (!origin && /^[a-z](?:[-.](?=\w)|[0-9a-z])*:\/{0,2}\S/i.test(path)) {
|
|
209
204
|
path = uri.slice(origin.length);
|
|
210
205
|
}
|
|
211
206
|
uri = origin + path;
|
|
@@ -29,18 +29,18 @@ describe('Unit: parser/inline/mark', () => {
|
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
it('basic', () => {
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('==a==')), [['<mark id="mark
|
|
33
|
-
assert.deepStrictEqual(inspect(parser('==a=b==')), [['<mark id="mark
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('==\\===')), [['<mark id="mark
|
|
35
|
-
assert.deepStrictEqual(inspect(parser('==a===')), [['<mark id="mark
|
|
32
|
+
assert.deepStrictEqual(inspect(parser('==a==')), [['<mark id="mark::a">a</mark>', '<a href="#mark::a"></a>'], '']);
|
|
33
|
+
assert.deepStrictEqual(inspect(parser('==a=b==')), [['<mark id="mark::a=b">a=b</mark>', '<a href="#mark::a=b"></a>'], '']);
|
|
34
|
+
assert.deepStrictEqual(inspect(parser('==\\===')), [['<mark id="mark::=">=</mark>', '<a href="#mark::="></a>'], '']);
|
|
35
|
+
assert.deepStrictEqual(inspect(parser('==a===')), [['<mark id="mark::a">a</mark>', '<a href="#mark::a"></a>'], '=']);
|
|
36
36
|
});
|
|
37
37
|
|
|
38
38
|
it('nest', () => {
|
|
39
|
-
assert.deepStrictEqual(inspect(parser('==a ==b====')), [['<mark id="mark
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('==a\\ ==b====')), [['<mark id="mark
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('==a	==b====')), [['<mark id="mark
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('==a<wbr>==b====')), [['<mark id="mark
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('==_==a==_==')), [['<mark id="mark
|
|
39
|
+
assert.deepStrictEqual(inspect(parser('==a ==b====')), [['<mark id="mark::a_b">a <mark id="mark::b">b</mark><a href="#mark::b"></a></mark>', '<a href="#mark::a_b"></a>'], '']);
|
|
40
|
+
assert.deepStrictEqual(inspect(parser('==a\\ ==b====')), [['<mark id="mark::a_b">a <mark id="mark::b">b</mark><a href="#mark::b"></a></mark>', '<a href="#mark::a_b"></a>'], '']);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser('==a	==b====')), [['<mark id="mark::a_b">a\t<mark id="mark::b">b</mark><a href="#mark::b"></a></mark>', '<a href="#mark::a_b"></a>'], '']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('==a<wbr>==b====')), [['<mark id="mark::ab">a<wbr><mark id="mark::b">b</mark><a href="#mark::b"></a></mark>', '<a href="#mark::ab"></a>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('==_==a==_==')), [['<mark id="mark::a"><em><mark id="mark::a">a</mark><a href="#mark::a"></a></em></mark>', '<a href="#mark::a"></a>'], '']);
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
});
|
|
@@ -19,7 +19,7 @@ export const mark: MarkParser = lazy(() => surround(
|
|
|
19
19
|
str('=='), false,
|
|
20
20
|
([, bs], rest, { id }) => {
|
|
21
21
|
const el = html('mark', defrag(bs));
|
|
22
|
-
define(el, { id: id
|
|
22
|
+
define(el, { id: identity(id, text(el), 'mark') });
|
|
23
23
|
return [[el, html('a', { href: el.id ? `#${el.id}` : undefined })], rest];
|
|
24
24
|
},
|
|
25
25
|
([as, bs], rest) => [unshift(as, bs), rest]));
|
|
@@ -29,9 +29,10 @@ describe('Unit: parser/inline', () => {
|
|
|
29
29
|
assert.deepStrictEqual(inspect(parser('*[*]')), [['*', '[', '*', ']'], '']);
|
|
30
30
|
assert.deepStrictEqual(inspect(parser('*<*>')), [['<strong><</strong>', '>'], '']);
|
|
31
31
|
assert.deepStrictEqual(inspect(parser('*a((b))*')), [['<strong>a<sup class="annotation"><span>b</span></sup></strong>'], '']);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser('++\na\n++\n~~\nb\n~~\nc')), [['<ins><br>a</ins>', '<br>', '<del><br>b</del>', '<br>', 'c'], '']);
|
|
32
33
|
assert.deepStrictEqual(inspect(parser('``a`')), [['``', 'a', '`'], '']);
|
|
33
34
|
assert.deepStrictEqual(inspect(parser('[@a]')), [['[', '<a class="account" href="/@a">@a</a>', ']'], '']);
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('[#1][#2]')), [['<a class="index" href="#index
|
|
35
|
+
assert.deepStrictEqual(inspect(parser('[#1][#2]')), [['<a class="index" href="#index::1">1</a>', '<a class="index" href="#index::2">2</a>'], '']);
|
|
35
36
|
assert.deepStrictEqual(inspect(parser('[$1]')), [['[', '$', '1', ']'], '']);
|
|
36
37
|
assert.deepStrictEqual(inspect(parser('[$1-2]')), [['[', '$', '1-2', ']'], '']);
|
|
37
38
|
assert.deepStrictEqual(inspect(parser('[$-1][$-2]')), [['<a class="label" data-label="$-1">$-1</a>', '<a class="label" data-label="$-2">$-2</a>'], '']);
|
|
@@ -43,11 +44,11 @@ describe('Unit: parser/inline', () => {
|
|
|
43
44
|
assert.deepStrictEqual(inspect(parser('[[#-1]]{b}')), [['<sup class="reference"><span>#-1</span></sup>', '<a class="url" href="b">b</a>'], '']);
|
|
44
45
|
assert.deepStrictEqual(inspect(parser('[[#-1]](b)')), [['<sup class="reference"><span>#-1</span></sup>', '(', 'b', ')'], '']);
|
|
45
46
|
assert.deepStrictEqual(inspect(parser('[[#-1]a]{b}')), [['<a class="link" href="b">[#-1]a</a>'], '']);
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('[[#-1]a](b)')), [['[', '<a class="index" href="#index
|
|
47
|
-
assert.deepStrictEqual(inspect(parser('[#a]{b}')), [['<a class="index" href="#index
|
|
47
|
+
assert.deepStrictEqual(inspect(parser('[[#-1]a](b)')), [['[', '<a class="index" href="#index::-1">-1</a>', 'a', ']', '(', 'b', ')'], '']);
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('[#a]{b}')), [['<a class="index" href="#index::a">a</a>', '<a class="url" href="b">b</a>'], '']);
|
|
48
49
|
assert.deepStrictEqual(inspect(parser('[@a]{b}')), [['<a class="link" href="b">@a</a>'], '']);
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('[http://host]{http://evil}')), [['
|
|
50
|
-
assert.deepStrictEqual(inspect(parser('[http://host]{http://host}')), [['
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('[http://host]{http://evil}')), [['<a class="invalid">http://host</a>'], '']);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser('[http://host]{http://host}')), [['<a class="invalid">http://host</a>'], '']);
|
|
51
52
|
assert.deepStrictEqual(inspect(parser('[]{{a}}')), [['[', ']', '<span class="template">{{a}}</span>'], '']);
|
|
52
53
|
assert.deepStrictEqual(inspect(parser('![]{{a}}')), [['!', '[', ']', '<span class="template">{{a}}</span>'], '']);
|
|
53
54
|
assert.deepStrictEqual(inspect(parser('[\n]{a}')), [['[', '<br>', ']', '<a class="url" href="a">a</a>'], '']);
|
|
@@ -149,7 +150,7 @@ describe('Unit: parser/inline', () => {
|
|
|
149
150
|
assert.deepStrictEqual(inspect(parser('#a#')), [['#a#'], '']);
|
|
150
151
|
assert.deepStrictEqual(inspect(parser('#a#b')), [['#a#b'], '']);
|
|
151
152
|
assert.deepStrictEqual(inspect(parser('#a')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
|
|
152
|
-
assert.deepStrictEqual(inspect(parser('#a\nb\n#c\n[#d]')), [['<a class="hashtag" href="/hashtags/a">#a</a>', '<br>', 'b', '<br>', '<a class="hashtag" href="/hashtags/c">#c</a>', '<br>', '<a class="index" href="#index
|
|
153
|
+
assert.deepStrictEqual(inspect(parser('#a\nb\n#c\n[#d]')), [['<a class="hashtag" href="/hashtags/a">#a</a>', '<br>', 'b', '<br>', '<a class="hashtag" href="/hashtags/c">#c</a>', '<br>', '<a class="index" href="#index::d">d</a>'], '']);
|
|
153
154
|
assert.deepStrictEqual(inspect(parser('##a')), [['##a'], '']);
|
|
154
155
|
assert.deepStrictEqual(inspect(parser('a#b')), [['a#b'], '']);
|
|
155
156
|
assert.deepStrictEqual(inspect(parser('0a#b')), [['0a#b'], '']);
|
|
@@ -52,7 +52,7 @@ describe('Unit: parser/processor/figure', () => {
|
|
|
52
52
|
[...target.children].map(el => el.outerHTML),
|
|
53
53
|
[
|
|
54
54
|
'<figure data-type="quote" data-label="test-a" data-group="test" data-number="1" id="label:test-a"><figcaption><span class="figindex">Test 1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
55
|
-
'<h2 id="index
|
|
55
|
+
'<h2 id="index::0">0</h2>',
|
|
56
56
|
'<figure data-type="quote" data-label="test-b" data-group="test" data-number="2" id="label:test-b"><figcaption><span class="figindex">Test 2. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
57
57
|
'<figure data-type="quote" data-label="quote-a" data-group="quote" data-number="1" id="label:quote-a"><figcaption><span class="figindex">Quote 1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
58
58
|
'<figure data-type="quote" data-label="test-b" data-group="test" data-number="3" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Duplicate label"><figcaption><span class="figindex">Test 3. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
@@ -168,40 +168,40 @@ describe('Unit: parser/processor/figure', () => {
|
|
|
168
168
|
assert.deepStrictEqual(
|
|
169
169
|
[...target.children].map(el => normalize(el.outerHTML)),
|
|
170
170
|
[
|
|
171
|
-
'<h1 id="index
|
|
171
|
+
'<h1 id="index::0">0</h1>',
|
|
172
172
|
'<figure data-label="$-0.0" data-group="$" hidden="" data-number="0.0"></figure>',
|
|
173
|
-
'<h2 id="index
|
|
173
|
+
'<h2 id="index::0">0</h2>',
|
|
174
174
|
'<figure data-type="quote" data-label="test-1" data-group="test" data-number="1" id="label:test-1"><figcaption><span class="figindex">Test 1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
175
|
-
'<h2 id="index
|
|
175
|
+
'<h2 id="index::0">0</h2>',
|
|
176
176
|
'<blockquote><section><h2>0</h2><h2>References</h2><ol class="references"></ol></section></blockquote>',
|
|
177
177
|
'<figure data-type="quote" data-label="test-b" data-group="test" data-number="2.1" id="label:test-b"><figcaption><span class="figindex">Test 2.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
178
|
-
'<h2 id="index
|
|
178
|
+
'<h2 id="index::0">0</h2>',
|
|
179
179
|
'<figure data-label="$-0.0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Base index must be $-x.0 format"></figure>',
|
|
180
|
-
'<h3 id="index
|
|
180
|
+
'<h3 id="index::0">0</h3>',
|
|
181
181
|
'<figure data-label="$-0.0" data-group="$" hidden="" data-number="3.0"></figure>',
|
|
182
182
|
'<figure data-type="quote" data-label="test-c" data-group="test" data-number="3.1" id="label:test-c"><figcaption><span class="figindex">Test 3.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
183
|
-
'<h2 id="index
|
|
183
|
+
'<h2 id="index::0">0</h2>',
|
|
184
184
|
'<figure data-label="$-0.1.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Base index must be $-x.0 format"></figure>',
|
|
185
185
|
'<figure data-type="quote" data-label="test-d" data-group="test" data-number="4.1" id="label:test-d"><figcaption><span class="figindex">Test 4.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
186
186
|
'<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 to 6 headings"></figure>',
|
|
187
187
|
'<figure data-label="$-0.1.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Base index must be $-x.0 format"></figure>',
|
|
188
188
|
'<figure data-label="$-0.4.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Base index must be $-x.0 format"></figure>',
|
|
189
189
|
'<figure data-label="$-0.1.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Base index must be $-x.0 format"></figure>',
|
|
190
|
-
'<h2 id="index
|
|
191
|
-
'<h2 id="index
|
|
190
|
+
'<h2 id="index::0">0</h2>',
|
|
191
|
+
'<h2 id="index::0">0</h2>',
|
|
192
192
|
'<figure data-label="$-0.0" data-group="$" hidden="" data-number="6.0"></figure>',
|
|
193
193
|
'<figure data-type="quote" data-label="test-e" data-group="test" data-number="6.1" id="label:test-e"><figcaption><span class="figindex">Test 6.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
194
|
-
'<h2 id="index
|
|
194
|
+
'<h2 id="index::0">0</h2>',
|
|
195
195
|
'<figure data-label="$-5.0" data-group="$" hidden="" data-number="5.0"></figure>',
|
|
196
196
|
'<figure data-type="quote" data-label="test-f" data-group="test" data-number="5.1" id="label:test-f"><figcaption><span class="figindex">Test 5.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
197
197
|
'<figure data-label="$-0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Invalid base index"></figure>',
|
|
198
198
|
'<figure data-type="quote" data-label="test-g" data-group="test" data-number="5.2" id="label:test-g"><figcaption><span class="figindex">Test 5.2. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
199
|
-
'<h3 id="index
|
|
199
|
+
'<h3 id="index::0">0</h3>',
|
|
200
200
|
'<figure data-label="$-0.0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="argument" data-invalid-message="Base index must be $-x.0 format"></figure>',
|
|
201
201
|
'<figure data-type="quote" data-label="test-h" data-group="test" data-number="5.3" id="label:test-h"><figcaption><span class="figindex">Test 5.3. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
202
|
-
'<h3 id="index
|
|
202
|
+
'<h3 id="index::0">0</h3>',
|
|
203
203
|
'<figure data-type="quote" data-label="test-i" data-group="test" data-number="5.4" id="label:test-i"><figcaption><span class="figindex">Test 5.4. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
204
|
-
'<h1 id="index
|
|
204
|
+
'<h1 id="index::0">0</h1>',
|
|
205
205
|
'<figure data-type="quote" data-label="test-j" data-group="test" data-number="6.1" id="label:test-j"><figcaption><span class="figindex">Test 6.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
206
206
|
]);
|
|
207
207
|
}
|
|
@@ -235,22 +235,22 @@ describe('Unit: parser/processor/figure', () => {
|
|
|
235
235
|
[...target.children].map(el => normalize(el.outerHTML)),
|
|
236
236
|
[
|
|
237
237
|
'<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 to 6 headings"></figure>',
|
|
238
|
-
'<h2 id="index
|
|
238
|
+
'<h2 id="index::0">0</h2>',
|
|
239
239
|
'<figure data-label="$-0.0" data-group="$" hidden="" data-number="0.0"></figure>',
|
|
240
240
|
'<figure data-type="quote" data-label="test-a" data-group="test" data-number="0.1" id="label:test-a"><figcaption><span class="figindex">Test 0.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
241
241
|
'<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 to 6 headings"></figure>',
|
|
242
|
-
'<h2 id="index
|
|
242
|
+
'<h2 id="index::0">0</h2>',
|
|
243
243
|
'<figure data-type="quote" data-label="test-b" data-group="test" data-number="1.1" id="label:test-b"><figcaption><span class="figindex">Test 1.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
244
244
|
'<figure data-label="$-0.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 to 6 headings"></figure>',
|
|
245
|
-
'<h3 id="index
|
|
245
|
+
'<h3 id="index::0">0</h3>',
|
|
246
246
|
'<figure data-type="quote" data-label="test-c" data-group="test" data-number="1.2" id="label:test-c"><figcaption><span class="figindex">Test 1.2. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
247
247
|
'<figure data-label="$-1.0" data-group="$" class="invalid" data-invalid-syntax="figure" data-invalid-type="position" data-invalid-message="Base index declarations must be after level 1 to 6 headings"></figure>',
|
|
248
|
-
'<h2 id="index
|
|
248
|
+
'<h2 id="index::0">0</h2>',
|
|
249
249
|
'<figure data-label="$-0.0" data-group="$" hidden="" data-number="2.0"></figure>',
|
|
250
250
|
'<figure data-type="quote" data-label="test-d" data-group="test" data-number="2.1" id="label:test-d"><figcaption><span class="figindex">Test 2.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
251
|
-
'<h3 id="index
|
|
251
|
+
'<h3 id="index::0">0</h3>',
|
|
252
252
|
'<figure data-label="$-0.0" data-group="$" hidden="" data-number="2.0"></figure>',
|
|
253
|
-
'<h2 id="index
|
|
253
|
+
'<h2 id="index::0">0</h2>',
|
|
254
254
|
'<figure data-label="$-9.0" data-group="$" hidden="" data-number="9.0"></figure>',
|
|
255
255
|
'<figure data-type="quote" data-label="test-e" data-group="test" data-number="9.1" id="label:test-e"><figcaption><span class="figindex">Test 9.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure>',
|
|
256
256
|
]);
|