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.
Files changed (35) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/index.js +44 -58
  3. package/index.d.ts +2 -1
  4. package/package.json +1 -1
  5. package/src/combinator/data/parser/some.ts +2 -1
  6. package/src/parser/api/bind.test.ts +17 -17
  7. package/src/parser/api/bind.ts +1 -0
  8. package/src/parser/api/normalize.ts +1 -1
  9. package/src/parser/api/parse.test.ts +6 -6
  10. package/src/parser/api/parse.ts +2 -1
  11. package/src/parser/block/blockquote.ts +1 -1
  12. package/src/parser/block/dlist.test.ts +34 -34
  13. package/src/parser/block/extension/aside.test.ts +3 -3
  14. package/src/parser/block/extension/aside.ts +2 -4
  15. package/src/parser/block/extension/figure.test.ts +2 -2
  16. package/src/parser/block/heading.test.ts +47 -47
  17. package/src/parser/block/olist.test.ts +30 -28
  18. package/src/parser/block/reply/cite.test.ts +1 -1
  19. package/src/parser/block/sidefence.ts +1 -1
  20. package/src/parser/block/ulist.test.ts +26 -26
  21. package/src/parser/inline/extension/index.test.ts +48 -48
  22. package/src/parser/inline/extension/index.ts +1 -1
  23. package/src/parser/inline/extension/indexee.ts +19 -18
  24. package/src/parser/inline/extension/indexer.ts +1 -1
  25. package/src/parser/inline/link.test.ts +26 -22
  26. package/src/parser/inline/link.ts +9 -14
  27. package/src/parser/inline/mark.test.ts +9 -9
  28. package/src/parser/inline/mark.ts +1 -1
  29. package/src/parser/inline.test.ts +7 -6
  30. package/src/parser/processor/figure.test.ts +19 -19
  31. package/src/parser/processor/figure.ts +0 -2
  32. package/src/parser/processor/footnote.test.ts +66 -66
  33. package/src/parser/processor/footnote.ts +11 -15
  34. package/src/util/toc.test.ts +28 -28
  35. 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: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 &nbsp;]')), [['<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>'], '']);
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 &nbsp;]')), [['<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: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>'], '']);
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:|">|</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|&copy;]')), [['<a class="index" href="#index:&amp;copy;">a<span class="indexer" data-index="&amp;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 &nbsp;|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>'], '']);
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|&copy;]')), [['<a class="index" href="#index::&amp;copy;">a<span class="indexer" data-index="&amp;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 &nbsp;|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('')).slice(6) }),
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 !== '' && identity(text(el, optional)) || undefined })]);
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.length <= 100) return text && `${name}:${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).slice(6) === '0'.repeat(100 - 1) + 1);
23
- assert(identity('0'.repeat(100) + 1).slice(6) === '0'.repeat(97) + '...');
24
- assert(identity('0'.repeat(200) + 1).slice(6) === '0'.repeat(97) + '...');
25
- assert(identity('0'.repeat(100 - 1) + 1, 'mark').slice(5) === '0'.repeat(100 - 1) + 1);
26
- assert(identity('0'.repeat(100) + 1, 'mark').slice(5) === '0'.repeat(50) + '...' + '0'.repeat(47 - 1) + 1);
27
- assert(identity('0'.repeat(200) + 1, 'mark').slice(5) === '0'.repeat(50) + '...' + '0'.repeat(47 - 1) + 1);
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
- assert(!source.querySelector('br'));
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
- define(el, el.getAttribute('data-src')!);
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
- define(el, el.getAttribute('data-src')!);
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(7) }),
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}')), undefined);
24
- assert.deepStrictEqual(inspect(parser('[\\http://host]{http://evil}')), undefined);
25
- assert.deepStrictEqual(inspect(parser('[https://host]{http://host}')), undefined);
26
- assert.deepStrictEqual(inspect(parser('[[]{http://host}.com]{http://host}')), undefined);
27
- assert.deepStrictEqual(inspect(parser('[[]{http://host/a}b]{http://host/ab}')), undefined);
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}')), undefined);
31
- assert.deepStrictEqual(inspect(parser('[xxx://á]{http://evil}')), undefined);
32
- assert.deepStrictEqual(inspect(parser('[mailto:á]{http://evil}')), undefined);
33
- assert.deepStrictEqual(inspect(parser('[file:///]{http://evil}')), undefined);
34
- assert.deepStrictEqual(inspect(parser('[.http://á]{http://evil}')), undefined);
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}')), undefined);
41
- //assert.deepStrictEqual(inspect(parser('[\\#a]{b}')), undefined);
42
- //assert.deepStrictEqual(inspect(parser('[c #a]{b}')), undefined);
43
- //assert.deepStrictEqual(inspect(parser('[c \\#a]{b}')), undefined);
44
- //assert.deepStrictEqual(inspect(parser('[]{#a}')), [['<a class="link" href="#a">#a</a>'], '']);
45
- //assert.deepStrictEqual(inspect(parser('[@a]{b}')), undefined);
46
- //assert.deepStrictEqual(inspect(parser('[\\@a]{b}')), undefined);
47
- //assert.deepStrictEqual(inspect(parser('[c @a]{b}')), undefined);
48
- //assert.deepStrictEqual(inspect(parser('[c \\@a]{b}')), undefined);
49
- //assert.deepStrictEqual(inspect(parser('[]{@a}')), [['<a class="link" href="@a">@a</a>'], '']);
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}')), undefined);
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('[_a_]{b}')), [['<a class="link" href="b"><em>a</em></a>'], '']);
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, eval, exec } from '../../combinator/data/parser';
4
- import { union, inits, tails, sequence, some, constraint, syntax, creation, precedence, state, validate, surround, open, dup, reverse, lazy, fmap, bind } from '../../combinator';
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])*:(?:\/{0,2}[^/?#\s]+|\/\/(?=[/]))/i.test(path)) {
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: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>'], '=']);
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: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&Tab;==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>'], '']);
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&Tab;==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 !== '' && identity(text(el), 'mark') || undefined });
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>&lt;</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:1">1</a>', '<a class="index" href="#index:2">2</a>'], '']);
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:-1">-1</a>', 'a', ']', '(', 'b', ')'], '']);
47
- assert.deepStrictEqual(inspect(parser('[#a]{b}')), [['<a class="index" href="#index:a">a</a>', '<a class="url" href="b">b</a>'], '']);
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}')), [['[', '<a class="url" href="http://host" target="_blank">http://host</a>', ']', '<a class="url" href="http://evil" target="_blank">http://evil</a>'], '']);
50
- assert.deepStrictEqual(inspect(parser('[http://host]{http://host}')), [['[', '<a class="url" href="http://host" target="_blank">http://host</a>', ']', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
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:d">d</a>'], '']);
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:0">0</h2>',
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:0">0</h1>',
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:0">0</h2>',
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:0">0</h2>',
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:0">0</h2>',
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:0">0</h3>',
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:0">0</h2>',
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:0">0</h2>',
191
- '<h2 id="index:0">0</h2>',
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:0">0</h2>',
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:0">0</h3>',
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:0">0</h3>',
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:0">0</h1>',
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:0">0</h2>',
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:0">0</h2>',
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:0">0</h3>',
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:0">0</h2>',
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:0">0</h3>',
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:0">0</h2>',
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
  ]);