securemark 0.259.0 → 0.260.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 (152) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/design.md +16 -5
  3. package/dist/index.js +625 -318
  4. package/package.json +1 -1
  5. package/src/combinator/control/constraint/block.test.ts +5 -5
  6. package/src/combinator/control/constraint/block.ts +2 -2
  7. package/src/combinator/control/constraint/contract.ts +4 -4
  8. package/src/combinator/control/constraint/line.test.ts +6 -6
  9. package/src/combinator/control/constraint/line.ts +5 -5
  10. package/src/combinator/control/manipulation/convert.ts +5 -5
  11. package/src/combinator/control/manipulation/fence.ts +1 -1
  12. package/src/combinator/control/manipulation/indent.test.ts +14 -14
  13. package/src/combinator/control/manipulation/indent.ts +5 -5
  14. package/src/combinator/control/manipulation/lazy.ts +2 -2
  15. package/src/combinator/control/manipulation/match.ts +2 -2
  16. package/src/combinator/control/manipulation/recovery.ts +6 -6
  17. package/src/combinator/control/manipulation/scope.ts +11 -10
  18. package/src/combinator/control/manipulation/surround.ts +9 -8
  19. package/src/combinator/control/manipulation/trim.test.ts +9 -9
  20. package/src/combinator/control/monad/bind.ts +2 -2
  21. package/src/combinator/data/parser/context/memo.ts +3 -4
  22. package/src/combinator/data/parser/context.test.ts +9 -9
  23. package/src/combinator/data/parser/context.ts +33 -33
  24. package/src/combinator/data/parser/inits.ts +2 -2
  25. package/src/combinator/data/parser/sequence.test.ts +10 -10
  26. package/src/combinator/data/parser/sequence.ts +2 -2
  27. package/src/combinator/data/parser/some.test.ts +13 -13
  28. package/src/combinator/data/parser/some.ts +2 -2
  29. package/src/combinator/data/parser/subsequence.test.ts +14 -14
  30. package/src/combinator/data/parser/union.test.ts +10 -10
  31. package/src/combinator/data/parser/union.ts +2 -2
  32. package/src/combinator/data/parser.ts +6 -1
  33. package/src/parser/api/bind.ts +3 -3
  34. package/src/parser/api/header.ts +1 -1
  35. package/src/parser/api/normalize.ts +1 -1
  36. package/src/parser/api/parse.test.ts +19 -19
  37. package/src/parser/api/parse.ts +3 -3
  38. package/src/parser/autolink.test.ts +7 -7
  39. package/src/parser/autolink.ts +2 -2
  40. package/src/parser/block/blockquote.test.ts +9 -9
  41. package/src/parser/block/blockquote.ts +1 -1
  42. package/src/parser/block/codeblock.test.ts +5 -5
  43. package/src/parser/block/codeblock.ts +1 -1
  44. package/src/parser/block/dlist.test.ts +2 -2
  45. package/src/parser/block/extension/aside.test.ts +1 -1
  46. package/src/parser/block/extension/example.test.ts +1 -1
  47. package/src/parser/block/extension/example.ts +1 -1
  48. package/src/parser/block/extension/fig.test.ts +1 -1
  49. package/src/parser/block/extension/figbase.test.ts +1 -1
  50. package/src/parser/block/extension/figure.test.ts +2 -2
  51. package/src/parser/block/extension/figure.ts +1 -1
  52. package/src/parser/block/extension/message.test.ts +1 -1
  53. package/src/parser/block/extension/message.ts +1 -1
  54. package/src/parser/block/extension/placeholder.test.ts +1 -1
  55. package/src/parser/block/extension/table.test.ts +1 -1
  56. package/src/parser/block/extension/table.ts +1 -1
  57. package/src/parser/block/extension.test.ts +1 -1
  58. package/src/parser/block/heading.test.ts +8 -8
  59. package/src/parser/block/heading.ts +1 -1
  60. package/src/parser/block/horizontalrule.test.ts +1 -1
  61. package/src/parser/block/ilist.test.ts +1 -1
  62. package/src/parser/block/mathblock.test.ts +1 -1
  63. package/src/parser/block/olist.test.ts +2 -2
  64. package/src/parser/block/olist.ts +5 -5
  65. package/src/parser/block/paragraph.test.ts +15 -15
  66. package/src/parser/block/reply/cite.test.ts +12 -12
  67. package/src/parser/block/reply/cite.ts +2 -2
  68. package/src/parser/block/reply/quote.test.ts +4 -4
  69. package/src/parser/block/reply/quote.ts +2 -2
  70. package/src/parser/block/reply.test.ts +9 -9
  71. package/src/parser/block/sidefence.test.ts +7 -7
  72. package/src/parser/block/table.test.ts +1 -1
  73. package/src/parser/block/table.ts +1 -1
  74. package/src/parser/block/ulist.test.ts +2 -2
  75. package/src/parser/block/ulist.ts +1 -1
  76. package/src/parser/block.ts +2 -2
  77. package/src/parser/context.ts +23 -13
  78. package/src/parser/header.test.ts +1 -1
  79. package/src/parser/header.ts +3 -3
  80. package/src/parser/inline/annotation.test.ts +4 -4
  81. package/src/parser/inline/annotation.ts +3 -4
  82. package/src/parser/inline/autolink/account.test.ts +12 -12
  83. package/src/parser/inline/autolink/account.ts +4 -2
  84. package/src/parser/inline/autolink/anchor.test.ts +10 -10
  85. package/src/parser/inline/autolink/anchor.ts +14 -11
  86. package/src/parser/inline/autolink/channel.test.ts +4 -4
  87. package/src/parser/inline/autolink/email.test.ts +1 -1
  88. package/src/parser/inline/autolink/email.ts +1 -1
  89. package/src/parser/inline/autolink/hashnum.test.ts +1 -1
  90. package/src/parser/inline/autolink/hashnum.ts +4 -2
  91. package/src/parser/inline/autolink/hashtag.test.ts +21 -21
  92. package/src/parser/inline/autolink/hashtag.ts +4 -2
  93. package/src/parser/inline/autolink/url.test.ts +56 -56
  94. package/src/parser/inline/autolink/url.ts +5 -3
  95. package/src/parser/inline/autolink.ts +1 -1
  96. package/src/parser/inline/bracket.test.ts +1 -1
  97. package/src/parser/inline/bracket.ts +8 -8
  98. package/src/parser/inline/code.test.ts +1 -1
  99. package/src/parser/inline/code.ts +2 -2
  100. package/src/parser/inline/comment.test.ts +1 -1
  101. package/src/parser/inline/comment.ts +2 -2
  102. package/src/parser/inline/deletion.test.ts +1 -1
  103. package/src/parser/inline/deletion.ts +2 -2
  104. package/src/parser/inline/emphasis.test.ts +1 -1
  105. package/src/parser/inline/emphasis.ts +2 -2
  106. package/src/parser/inline/emstrong.ts +4 -4
  107. package/src/parser/inline/escape.ts +3 -3
  108. package/src/parser/inline/extension/index.test.ts +1 -1
  109. package/src/parser/inline/extension/index.ts +3 -4
  110. package/src/parser/inline/extension/indexer.test.ts +1 -1
  111. package/src/parser/inline/extension/label.test.ts +1 -1
  112. package/src/parser/inline/extension/placeholder.test.ts +1 -1
  113. package/src/parser/inline/extension/placeholder.ts +2 -2
  114. package/src/parser/inline/html.test.ts +1 -3
  115. package/src/parser/inline/html.ts +3 -3
  116. package/src/parser/inline/htmlentity.test.ts +1 -1
  117. package/src/parser/inline/htmlentity.ts +1 -1
  118. package/src/parser/inline/insertion.test.ts +1 -1
  119. package/src/parser/inline/insertion.ts +2 -2
  120. package/src/parser/inline/link.test.ts +111 -111
  121. package/src/parser/inline/link.ts +12 -12
  122. package/src/parser/inline/mark.test.ts +1 -1
  123. package/src/parser/inline/mark.ts +2 -2
  124. package/src/parser/inline/math.test.ts +1 -1
  125. package/src/parser/inline/math.ts +1 -1
  126. package/src/parser/inline/media.test.ts +2 -1
  127. package/src/parser/inline/media.ts +4 -4
  128. package/src/parser/inline/reference.test.ts +4 -4
  129. package/src/parser/inline/reference.ts +3 -4
  130. package/src/parser/inline/ruby.test.ts +1 -1
  131. package/src/parser/inline/ruby.ts +5 -5
  132. package/src/parser/inline/shortmedia.test.ts +1 -1
  133. package/src/parser/inline/strong.test.ts +1 -1
  134. package/src/parser/inline/strong.ts +2 -2
  135. package/src/parser/inline/template.test.ts +1 -1
  136. package/src/parser/inline/template.ts +2 -2
  137. package/src/parser/inline.test.ts +52 -52
  138. package/src/parser/locale.test.ts +1 -1
  139. package/src/parser/segment.ts +1 -1
  140. package/src/parser/source/escapable.test.ts +1 -1
  141. package/src/parser/source/escapable.ts +1 -1
  142. package/src/parser/source/line.test.ts +1 -1
  143. package/src/parser/source/line.ts +2 -2
  144. package/src/parser/source/str.ts +4 -4
  145. package/src/parser/source/text.test.ts +1 -1
  146. package/src/parser/source/text.ts +4 -4
  147. package/src/parser/source/unescapable.test.ts +1 -1
  148. package/src/parser/source/unescapable.ts +1 -1
  149. package/src/parser/visibility.ts +13 -13
  150. package/src/renderer/render/media/pdf.ts +1 -0
  151. package/src/util/info.ts +2 -4
  152. package/src/util/quote.ts +1 -1
@@ -6,13 +6,13 @@ export function inits<P extends Parser<unknown>>(parsers: SubParsers<P>, resume?
6
6
  export function inits<T, D extends Parser<T>[]>(parsers: D, resume?: (nodes: T[], rest: string) => boolean): Parser<T, Ctx, D> {
7
7
  assert(parsers.every(f => f));
8
8
  if (parsers.length === 1) return parsers[0];
9
- return (source, context) => {
9
+ return ({ source, context }) => {
10
10
  let rest = source;
11
11
  let nodes: T[] | undefined;
12
12
  for (let i = 0, len = parsers.length; i < len; ++i) {
13
13
  if (rest === '') break;
14
14
  if (context.delimiters?.match(rest, context.precedence)) break;
15
- const result = parsers[i](rest, context);
15
+ const result = parsers[i]({ source: rest, context });
16
16
  assert(check(rest, result));
17
17
  if (!result) break;
18
18
  nodes = nodes
@@ -4,12 +4,12 @@ import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: combinator/data/parser/sequence', () => {
6
6
  describe('sequence', () => {
7
- const a: Parser<string, never> = source => {
7
+ const a: Parser<string, never> = ({ source }) => {
8
8
  return source && source[0] === 'a'
9
9
  ? [['A'], source.slice(1)]
10
10
  : undefined;
11
11
  };
12
- const b: Parser<string, never> = source => {
12
+ const b: Parser<string, never> = ({ source }) => {
13
13
  return source && source[0] === 'b'
14
14
  ? [['B'], source.slice(1)]
15
15
  : undefined;
@@ -18,14 +18,14 @@ describe('Unit: combinator/data/parser/sequence', () => {
18
18
 
19
19
  it('basic', () => {
20
20
  const parser = ab;
21
- assert.deepStrictEqual(inspect(parser('', {})), undefined);
22
- assert.deepStrictEqual(inspect(parser('a', {})), undefined);
23
- assert.deepStrictEqual(inspect(parser('b', {})), undefined);
24
- assert.deepStrictEqual(inspect(parser('ab', {})), [['A', 'B'], '']);
25
- assert.deepStrictEqual(inspect(parser('ba', {})), undefined);
26
- assert.deepStrictEqual(inspect(parser('aab', {})), undefined);
27
- assert.deepStrictEqual(inspect(parser('abb', {})), [['A', 'B'], 'b']);
28
- assert.deepStrictEqual(inspect(parser('bba', {})), undefined);
21
+ assert.deepStrictEqual(inspect(parser({ source: '', context: {} })), undefined);
22
+ assert.deepStrictEqual(inspect(parser({ source: 'a', context: {} })), undefined);
23
+ assert.deepStrictEqual(inspect(parser({ source: 'b', context: {} })), undefined);
24
+ assert.deepStrictEqual(inspect(parser({ source: 'ab', context: {} })), [['A', 'B'], '']);
25
+ assert.deepStrictEqual(inspect(parser({ source: 'ba', context: {} })), undefined);
26
+ assert.deepStrictEqual(inspect(parser({ source: 'aab', context: {} })), undefined);
27
+ assert.deepStrictEqual(inspect(parser({ source: 'abb', context: {} })), [['A', 'B'], 'b']);
28
+ assert.deepStrictEqual(inspect(parser({ source: 'bba', context: {} })), undefined);
29
29
  });
30
30
 
31
31
  });
@@ -6,13 +6,13 @@ export function sequence<P extends Parser<unknown>>(parsers: SubParsers<P>, resu
6
6
  export function sequence<T, D extends Parser<T>[]>(parsers: D, resume?: (nodes: T[], rest: string) => boolean): Parser<T, Ctx, D> {
7
7
  assert(parsers.every(f => f));
8
8
  if (parsers.length === 1) return parsers[0];
9
- return (source, context) => {
9
+ return ({ source, context }) => {
10
10
  let rest = source;
11
11
  let nodes: T[] | undefined;
12
12
  for (let i = 0, len = parsers.length; i < len; ++i) {
13
13
  if (rest === '') return;
14
14
  if (context.delimiters?.match(rest, context.precedence)) return;
15
- const result = parsers[i](rest, context);
15
+ const result = parsers[i]({ source: rest, context });
16
16
  assert(check(rest, result));
17
17
  if (!result) return;
18
18
  nodes = nodes
@@ -5,12 +5,12 @@ import { inspect } from '../../../debug.test';
5
5
 
6
6
  describe('Unit: combinator/data/parser/some', () => {
7
7
  describe('some', () => {
8
- const a: Parser<string, never> = source => {
8
+ const a: Parser<string, never> = ({ source }) => {
9
9
  return source && source[0] === 'a'
10
10
  ? [['A'], source.slice(1)]
11
11
  : undefined;
12
12
  };
13
- const b: Parser<string, never> = source => {
13
+ const b: Parser<string, never> = ({ source }) => {
14
14
  return source && source[0] === 'b'
15
15
  ? [['B'], source.slice(1)]
16
16
  : undefined;
@@ -19,17 +19,17 @@ describe('Unit: combinator/data/parser/some', () => {
19
19
 
20
20
  it('basic', () => {
21
21
  const parser = some(ab, /^aaa/);
22
- assert.deepStrictEqual(inspect(parser('', {})), undefined);
23
- assert.deepStrictEqual(inspect(parser('a', {})), [['A'], '']);
24
- assert.deepStrictEqual(inspect(parser('b', {})), [['B'], '']);
25
- assert.deepStrictEqual(inspect(parser('ab', {})), [['A', 'B'], '']);
26
- assert.deepStrictEqual(inspect(parser('ba', {})), [['B', 'A'], '']);
27
- assert.deepStrictEqual(inspect(parser('aab', {})), [['A', 'A', 'B'], '']);
28
- assert.deepStrictEqual(inspect(parser('bba', {})), [['B', 'B', 'A'], '']);
29
- assert.deepStrictEqual(inspect(parser('aaa', {})), undefined);
30
- assert.deepStrictEqual(inspect(parser('bbb', {})), [['B', 'B', 'B'], '']);
31
- assert.deepStrictEqual(inspect(parser('aaab', {})), undefined);
32
- assert.deepStrictEqual(inspect(parser('baaa', {})), [['B'], 'aaa']);
22
+ assert.deepStrictEqual(inspect(parser({ source: '', context: {} })), undefined);
23
+ assert.deepStrictEqual(inspect(parser({ source: 'a', context: {} })), [['A'], '']);
24
+ assert.deepStrictEqual(inspect(parser({ source: 'b', context: {} })), [['B'], '']);
25
+ assert.deepStrictEqual(inspect(parser({ source: 'ab', context: {} })), [['A', 'B'], '']);
26
+ assert.deepStrictEqual(inspect(parser({ source: 'ba', context: {} })), [['B', 'A'], '']);
27
+ assert.deepStrictEqual(inspect(parser({ source: 'aab', context: {} })), [['A', 'A', 'B'], '']);
28
+ assert.deepStrictEqual(inspect(parser({ source: 'bba', context: {} })), [['B', 'B', 'A'], '']);
29
+ assert.deepStrictEqual(inspect(parser({ source: 'aaa', context: {} })), undefined);
30
+ assert.deepStrictEqual(inspect(parser({ source: 'bbb', context: {} })), [['B', 'B', 'B'], '']);
31
+ assert.deepStrictEqual(inspect(parser({ source: 'aaab', context: {} })), undefined);
32
+ assert.deepStrictEqual(inspect(parser({ source: 'baaa', context: {} })), [['B'], 'aaa']);
33
33
  });
34
34
 
35
35
  });
@@ -16,7 +16,7 @@ export function some<T>(parser: Parser<T>, end?: string | RegExp | number, delim
16
16
  matcher: Delimiters.matcher(delimiter),
17
17
  precedence,
18
18
  }));
19
- return (source, context) => {
19
+ return ({ source, context }) => {
20
20
  if (source === '') return;
21
21
  let rest = source;
22
22
  let nodes: T[] | undefined;
@@ -28,7 +28,7 @@ export function some<T>(parser: Parser<T>, end?: string | RegExp | number, delim
28
28
  if (rest === '') break;
29
29
  if (match(rest)) break;
30
30
  if (context.delimiters?.match(rest, context.precedence)) break;
31
- const result = parser(rest, context);
31
+ const result = parser({ source: rest, context });
32
32
  assert.doesNotThrow(() => limit < 0 && check(rest, result));
33
33
  if (!result) break;
34
34
  nodes = nodes
@@ -4,17 +4,17 @@ import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: combinator/data/parser/subsequence', () => {
6
6
  describe('subsequence', () => {
7
- const a: Parser<string, never> = source => {
7
+ const a: Parser<string, never> = ({ source }) => {
8
8
  return source && source[0] === 'a'
9
9
  ? [['A'], source.slice(1)]
10
10
  : undefined;
11
11
  };
12
- const b: Parser<string, never> = source => {
12
+ const b: Parser<string, never> = ({ source }) => {
13
13
  return source && source[0] === 'b'
14
14
  ? [['B'], source.slice(1)]
15
15
  : undefined;
16
16
  };
17
- const c: Parser<string, never> = source => {
17
+ const c: Parser<string, never> = ({ source }) => {
18
18
  return source && source[0] === 'c'
19
19
  ? [['C'], source.slice(1)]
20
20
  : undefined;
@@ -23,17 +23,17 @@ describe('Unit: combinator/data/parser/subsequence', () => {
23
23
 
24
24
  it('basic', () => {
25
25
  const parser = abc;
26
- assert.deepStrictEqual(inspect(parser('', {})), undefined);
27
- assert.deepStrictEqual(inspect(parser('a', {})), [['A'], '']);
28
- assert.deepStrictEqual(inspect(parser('b', {})), [['B'], '']);
29
- assert.deepStrictEqual(inspect(parser('c', {})), [['C'], '']);
30
- assert.deepStrictEqual(inspect(parser('ab', {})), [['A', 'B'], '']);
31
- assert.deepStrictEqual(inspect(parser('ba', {})), [['B'], 'a']);
32
- assert.deepStrictEqual(inspect(parser('aab', {})), [['A'], 'ab']);
33
- assert.deepStrictEqual(inspect(parser('abb', {})), [['A', 'B'], 'b']);
34
- assert.deepStrictEqual(inspect(parser('bba', {})), [['B'], 'ba']);
35
- assert.deepStrictEqual(inspect(parser('ac', {})), [['A', 'C'], '']);
36
- assert.deepStrictEqual(inspect(parser('bc', {})), [['B', 'C'], '']);
26
+ assert.deepStrictEqual(inspect(parser({ source: '', context: {} })), undefined);
27
+ assert.deepStrictEqual(inspect(parser({ source: 'a', context: {} })), [['A'], '']);
28
+ assert.deepStrictEqual(inspect(parser({ source: 'b', context: {} })), [['B'], '']);
29
+ assert.deepStrictEqual(inspect(parser({ source: 'c', context: {} })), [['C'], '']);
30
+ assert.deepStrictEqual(inspect(parser({ source: 'ab', context: {} })), [['A', 'B'], '']);
31
+ assert.deepStrictEqual(inspect(parser({ source: 'ba', context: {} })), [['B'], 'a']);
32
+ assert.deepStrictEqual(inspect(parser({ source: 'aab', context: {} })), [['A'], 'ab']);
33
+ assert.deepStrictEqual(inspect(parser({ source: 'abb', context: {} })), [['A', 'B'], 'b']);
34
+ assert.deepStrictEqual(inspect(parser({ source: 'bba', context: {} })), [['B'], 'ba']);
35
+ assert.deepStrictEqual(inspect(parser({ source: 'ac', context: {} })), [['A', 'C'], '']);
36
+ assert.deepStrictEqual(inspect(parser({ source: 'bc', context: {} })), [['B', 'C'], '']);
37
37
  });
38
38
 
39
39
  });
@@ -4,12 +4,12 @@ import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: combinator/data/parser/union', () => {
6
6
  describe('union', () => {
7
- const a: Parser<string, never> = source => {
7
+ const a: Parser<string, never> = ({ source }) => {
8
8
  return source && source[0] === 'a'
9
9
  ? [['A'], source.slice(1)]
10
10
  : undefined;
11
11
  };
12
- const b: Parser<string, never> = source => {
12
+ const b: Parser<string, never> = ({ source }) => {
13
13
  return source && source[0] === 'b'
14
14
  ? [['B'], source.slice(1)]
15
15
  : undefined;
@@ -18,14 +18,14 @@ describe('Unit: combinator/data/parser/union', () => {
18
18
 
19
19
  it('basic', () => {
20
20
  const parser = ab;
21
- assert.deepStrictEqual(inspect(parser('', {})), undefined);
22
- assert.deepStrictEqual(inspect(parser('a', {})), [['A'], '']);
23
- assert.deepStrictEqual(inspect(parser('b', {})), [['B'], '']);
24
- assert.deepStrictEqual(inspect(parser('ab', {})), [['A'], 'b']);
25
- assert.deepStrictEqual(inspect(parser('ba', {})), [['B'], 'a']);
26
- assert.deepStrictEqual(inspect(parser('aab', {})), [['A'], 'ab']);
27
- assert.deepStrictEqual(inspect(parser('abb', {})), [['A'], 'bb']);
28
- assert.deepStrictEqual(inspect(parser('bba', {})), [['B'], 'ba']);
21
+ assert.deepStrictEqual(inspect(parser({ source: '', context: {} })), undefined);
22
+ assert.deepStrictEqual(inspect(parser({ source: 'a', context: {} })), [['A'], '']);
23
+ assert.deepStrictEqual(inspect(parser({ source: 'b', context: {} })), [['B'], '']);
24
+ assert.deepStrictEqual(inspect(parser({ source: 'ab', context: {} })), [['A'], 'b']);
25
+ assert.deepStrictEqual(inspect(parser({ source: 'ba', context: {} })), [['B'], 'a']);
26
+ assert.deepStrictEqual(inspect(parser({ source: 'aab', context: {} })), [['A'], 'ab']);
27
+ assert.deepStrictEqual(inspect(parser({ source: 'abb', context: {} })), [['A'], 'bb']);
28
+ assert.deepStrictEqual(inspect(parser({ source: 'bba', context: {} })), [['B'], 'ba']);
29
29
  });
30
30
 
31
31
  });
@@ -12,9 +12,9 @@ export function union<T, D extends Parser<T>[]>(parsers: D): Parser<T, Ctx, D> {
12
12
  default:
13
13
  return Function('parsers', [
14
14
  '"use strict";',
15
- 'return (source, context) =>',
15
+ 'return (input, context) =>',
16
16
  '0',
17
- ...parsers.map((_, i) => `|| parsers[${i}](source, context)`),
17
+ ...parsers.map((_, i) => `|| parsers[${i}](input, context)`),
18
18
  ].join('\n'))(parsers);
19
19
  }
20
20
  }
@@ -2,7 +2,11 @@ import { Delimiters } from './parser/context/delimiter';
2
2
  import { Memo } from './parser/context/memo';
3
3
 
4
4
  export type Parser<T, C extends Ctx = Ctx, D extends Parser<unknown, C>[] = any>
5
- = (source: string, context: C) => Result<T, C, D>;
5
+ = (input: Input<C>) => Result<T, C, D>;
6
+ export interface Input<C extends Ctx = Ctx> {
7
+ readonly source: string;
8
+ readonly context: C;
9
+ }
6
10
  export type Result<T, C extends Ctx = Ctx, D extends Parser<unknown, C>[] = any>
7
11
  = readonly [T[], string, C, D]
8
12
  | readonly [T[], string]
@@ -12,6 +16,7 @@ export interface Ctx {
12
16
  clock: number;
13
17
  recursion: number;
14
18
  };
19
+ offset?: number;
15
20
  precedence?: number;
16
21
  delimiters?: Delimiters;
17
22
  state?: number;
@@ -5,7 +5,7 @@ import { eval } from '../../combinator/data/parser';
5
5
  import { segment, validate, MAX_INPUT_SIZE } from '../segment';
6
6
  import { header } from '../header';
7
7
  import { block } from '../block';
8
- import { backtrackable } from '../context';
8
+ import { State } from '../context';
9
9
  import { normalize } from './normalize';
10
10
  import { headers } from './header';
11
11
  import { figure } from '../processor/figure';
@@ -24,7 +24,7 @@ export function bind(target: DocumentFragment | HTMLElement | ShadowRoot, settin
24
24
  let context: MarkdownParser.Context = {
25
25
  ...settings,
26
26
  host: settings.host ?? new ReadonlyURL(location.pathname, location.origin),
27
- memorable: backtrackable,
27
+ memorable: State.backtrackable,
28
28
  };
29
29
  if (context.host?.origin === 'null') throw new Error(`Invalid host: ${context.host.href}`);
30
30
  assert(!settings.id);
@@ -77,7 +77,7 @@ export function bind(target: DocumentFragment | HTMLElement | ShadowRoot, settin
77
77
  for (; index < sourceSegments.length - last; ++index) {
78
78
  assert(rev === revision);
79
79
  const seg = sourceSegments[index];
80
- const es = eval(header(seg, { header: index === 0 }) || block(seg, context), []);
80
+ const es = eval(header({ source: seg, context: { header: index === 0 } }) || block({ source: seg, context }), []);
81
81
  blocks.splice(index, 0, [seg, es, url]);
82
82
  if (es.length === 0) continue;
83
83
  // All deletion processes always run after all addition processes have done.
@@ -12,7 +12,7 @@ export function headers(source: string): string[] {
12
12
  }
13
13
 
14
14
  function parse(source: string): [HTMLElement, string] | [] {
15
- const result = h(source, {});
15
+ const result = h({ source, context: {} });
16
16
  const [el] = eval(result, []);
17
17
  return el?.tagName === 'ASIDE'
18
18
  ? [el, exec(result!)]
@@ -60,7 +60,7 @@ export const invisibleHTMLEntityNames = [
60
60
  ] as const;
61
61
  const unreadableHTMLEntityNames: readonly string[] = invisibleHTMLEntityNames.slice(2);
62
62
  const unreadableEscapableCharacters = unreadableHTMLEntityNames
63
- .map(name => eval(unsafehtmlentity(`&${name};`, {}))![0]);
63
+ .map(name => eval(unsafehtmlentity({ source: `&${name};`, context: {} }))![0]);
64
64
  assert(unreadableEscapableCharacters.length === unreadableHTMLEntityNames.length);
65
65
  assert(unreadableEscapableCharacters.every(c => c.length === 1));
66
66
  const unreadableEscapableCharacter = new RegExp(`[${
@@ -117,23 +117,23 @@ describe('Unit: parser/api/parse', () => {
117
117
  ].join('\n\n'), { host: new URL(`${location.origin}/z`) }).children].map(el => el.outerHTML),
118
118
  [
119
119
  '<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="https://source/x/y"><span class="field-name">URL</span>: <span class="field-value">https://source/x/y</span>\n</span></details></aside>',
120
- '<p><a href="https://source/@a" target="_blank" class="account">@a</a></p>',
121
- '<p><a href="https://domain/@a" target="_blank" class="account">@domain/a</a></p>',
122
- '<p><a href="https://source/@a?ch=b" target="_blank" class="channel">@a#b</a></p>',
123
- '<p><a href="https://domain/@a?ch=b" target="_blank" class="channel">@domain/a#b</a></p>',
124
- '<p><a href="https://source/hashtags/a" target="_blank" class="hashtag">#a</a></p>',
125
- '<p><a href="https://domain/hashtags/a" target="_blank" class="hashtag">#domain/a</a></p>',
120
+ '<p><a class="account" href="https://source/@a" target="_blank">@a</a></p>',
121
+ '<p><a class="account" href="https://domain/@a" target="_blank">@domain/a</a></p>',
122
+ '<p><a class="channel" href="https://source/@a?ch=b" target="_blank">@a#b</a></p>',
123
+ '<p><a class="channel" href="https://domain/@a?ch=b" target="_blank">@domain/a#b</a></p>',
124
+ '<p><a class="hashtag" href="https://source/hashtags/a" target="_blank">#a</a></p>',
125
+ '<p><a class="hashtag" href="https://domain/hashtags/a" target="_blank">#domain/a</a></p>',
126
126
  '<p><a class="index" href="#index:a">a</a></p>',
127
127
  '<figure data-type="math" data-label="$-a" data-group="$" data-number="1" id="label:$-a"><figcaption><span class="figindex">(1)</span><span class="figtext"></span></figcaption><div><div class="math" translate="no">$$\n$$</div></div></figure>',
128
128
  '<p><a class="label" data-label="$-a" href="#label:$-a">(1)</a></p>',
129
129
  '<p><sup class="annotation" id="annotation:ref:1" title="a"><span hidden="">a</span><a href="#annotation:def:1">*1</a></sup></p>',
130
- '<p><a href="https://source/x/a" target="_blank">a</a></p>',
131
- '<p><a href="https://source/a" target="_blank">/a</a></p>',
132
- '<p><a href="/z/a">^/a</a></p>',
133
- '<p><a href="https://source/x/a" target="_blank">./a</a></p>',
134
- '<p><a href="https://source/a" target="_blank">../a</a></p>',
135
- '<p><a href="https://source/a" target="_blank">../../a</a></p>',
136
- '<p><a href="//domain/a" target="_blank">//domain/a</a></p>',
130
+ '<p><a class="link" href="https://source/x/a" target="_blank">a</a></p>',
131
+ '<p><a class="link" href="https://source/a" target="_blank">/a</a></p>',
132
+ '<p><a class="link" href="/z/a">^/a</a></p>',
133
+ '<p><a class="link" href="https://source/x/a" target="_blank">./a</a></p>',
134
+ '<p><a class="link" href="https://source/a" target="_blank">../a</a></p>',
135
+ '<p><a class="link" href="https://source/a" target="_blank">../../a</a></p>',
136
+ '<p><a class="link" href="//domain/a" target="_blank">//domain/a</a></p>',
137
137
  '<p><a href="https://source/x/a" target="_blank"><img class="media" data-src="https://source/x/a" alt=""></a></p>',
138
138
  '<p><a href="/z/a" target="_blank"><img class="media" data-src="/z/a" alt=""></a></p>',
139
139
  '<p><a href="https://source/a" target="_blank"><img class="media" data-src="https://source/a" alt=""></a></p>',
@@ -151,8 +151,8 @@ describe('Unit: parser/api/parse', () => {
151
151
  ].join('\n\n'), { host: new URL(`${location.origin}/index.md`) }).children].map(el => el.outerHTML),
152
152
  [
153
153
  '<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="https://source/x/y"><span class="field-name">URL</span>: <span class="field-value">https://source/x/y</span>\n</span></details></aside>',
154
- '<p><a href="/a">^/a</a></p>',
155
- '<p><a href="https://source/x/a" target="_blank">./a</a></p>',
154
+ '<p><a class="link" href="/a">^/a</a></p>',
155
+ '<p><a class="link" href="https://source/x/a" target="_blank">./a</a></p>',
156
156
  ]);
157
157
  assert.deepStrictEqual(
158
158
  [...parse([
@@ -166,8 +166,8 @@ describe('Unit: parser/api/parse', () => {
166
166
  ].join('\n\n'), { host: new URL(`${location.origin}/z`) }).children].map(el => el.outerHTML),
167
167
  [
168
168
  `<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="${location.origin}/x/y"><span class="field-name">URL</span>: <span class="field-value">${location.origin}/x/y</span>\n</span></details></aside>`,
169
- '<p><a href="/z/a">^/a</a></p>',
170
- '<p><a href="/x/a">./a</a></p>',
169
+ '<p><a class="link" href="/z/a">^/a</a></p>',
170
+ '<p><a class="link" href="/x/a">./a</a></p>',
171
171
  ]);
172
172
  });
173
173
 
@@ -198,8 +198,8 @@ describe('Unit: parser/api/parse', () => {
198
198
  [
199
199
  `<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="https://example/x"><span class="field-name">URL</span>: <span class="field-value">https://example/x</span>\n</span></details></aside>`,
200
200
  '<pre class="invalid" translate="no" data-invalid-syntax="header" data-invalid-type="syntax" data-invalid-message="Invalid syntax">---\nURL: https://example/y\n---\n</pre>',
201
- '<aside class="example" data-type="markdown"><pre translate="no">---\nURL: https://example/y\n---\n\n{#}</pre><hr><section><aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="https://example/y"><span class="field-name">URL</span>: <span class="field-value">https://example/y</span>\n</span></details></aside><p><a href="https://example/y#" target="_blank">#</a></p><ol class="references"></ol></section></aside>',
202
- '<p><a href="https://example/x#" target="_blank">#</a></p>',
201
+ '<aside class="example" data-type="markdown"><pre translate="no">---\nURL: https://example/y\n---\n\n{#}</pre><hr><section><aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="https://example/y"><span class="field-name">URL</span>: <span class="field-value">https://example/y</span>\n</span></details></aside><p><a class="link" href="https://example/y#" target="_blank">#</a></p><ol class="references"></ol></section></aside>',
202
+ '<p><a class="link" href="https://example/x#" target="_blank">#</a></p>',
203
203
  ]);
204
204
  });
205
205
 
@@ -5,7 +5,7 @@ import { eval } from '../../combinator/data/parser';
5
5
  import { segment, validate, MAX_SEGMENT_SIZE } from '../segment';
6
6
  import { header } from '../header';
7
7
  import { block } from '../block';
8
- import { backtrackable } from '../context';
8
+ import { State } from '../context';
9
9
  import { normalize } from './normalize';
10
10
  import { headers } from './header';
11
11
  import { figure } from '../processor/figure';
@@ -30,13 +30,13 @@ export function parse(source: string, opts: Options = {}, context?: MarkdownPars
30
30
  ...context?.resources && {
31
31
  resources: context.resources,
32
32
  },
33
- memorable: backtrackable,
33
+ memorable: State.backtrackable,
34
34
  };
35
35
  if (context.host?.origin === 'null') throw new Error(`Invalid host: ${context.host.href}`);
36
36
  const node = frag();
37
37
  let index = 0;
38
38
  for (const seg of segment(source)) {
39
- node.append(...eval(header(seg, { header: index++ === 0 }) || block(seg, context), []));
39
+ node.append(...eval(header({ source: seg, context: { header: index++ === 0 } }) || block({ source: seg, context }), []));
40
40
  }
41
41
  assert(opts.id !== '' || !node.querySelector('[id], .index[href], .label[href], .annotation > a[href], .reference > a[href]'));
42
42
  if (opts.test) return node;
@@ -4,13 +4,13 @@ import { inspect } from '../debug.test';
4
4
 
5
5
  describe('Unit: parser/autolink', () => {
6
6
  describe('autolink', () => {
7
- const parser = (source: string) => some(autolink)(source, {});
7
+ const parser = (source: string) => some(autolink)({ source, context: {} });
8
8
 
9
9
  it('basic', () => {
10
- assert.deepStrictEqual(inspect(parser(' http://host')), [[' ', '<a href="http://host" target="_blank">http://host</a>'], '']);
11
- assert.deepStrictEqual(inspect(parser('!http://host')), [['!', '<a href="http://host" target="_blank">http://host</a>'], '']);
12
- assert.deepStrictEqual(inspect(parser('#a')), [['<a href="/hashtags/a" class="hashtag">#a</a>'], '']);
13
- assert.deepStrictEqual(inspect(parser('@a#b')), [['<a href="/@a?ch=b" class="channel">@a#b</a>'], '']);
10
+ assert.deepStrictEqual(inspect(parser(' http://host')), [[' ', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
11
+ assert.deepStrictEqual(inspect(parser('!http://host')), [['!', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
12
+ assert.deepStrictEqual(inspect(parser('#a')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
13
+ assert.deepStrictEqual(inspect(parser('@a#b')), [['<a class="channel" href="/@a?ch=b">@a#b</a>'], '']);
14
14
  assert.deepStrictEqual(inspect(parser('\\\n')), [['\\', '<br>'], '']);
15
15
  assert.deepStrictEqual(inspect(parser('a#b')), [['a#b'], '']);
16
16
  assert.deepStrictEqual(inspect(parser('0a#b')), [['0a#b'], '']);
@@ -18,8 +18,8 @@ describe('Unit: parser/autolink', () => {
18
18
  assert.deepStrictEqual(inspect(parser('あい#b')), [['あ', 'い#b'], '']);
19
19
  assert.deepStrictEqual(inspect(parser('0aあ#b')), [['0aあ#b'], '']);
20
20
  assert.deepStrictEqual(inspect(parser('0aあい#b')), [['0a', 'あ', 'い#b'], '']);
21
- assert.deepStrictEqual(inspect(parser('a\n#b')), [['a', '<br>', '<a href="/hashtags/b" class="hashtag">#b</a>'], '']);
22
- assert.deepStrictEqual(inspect(parser('a\\\n#b')), [['a', '\\', '<br>', '<a href="/hashtags/b" class="hashtag">#b</a>'], '']);
21
+ assert.deepStrictEqual(inspect(parser('a\n#b')), [['a', '<br>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
22
+ assert.deepStrictEqual(inspect(parser('a\\\n#b')), [['a', '\\', '<br>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
23
23
  assert.deepStrictEqual(inspect(parser('0a>>b')), [['0a>>b'], '']);
24
24
  });
25
25
 
@@ -7,7 +7,7 @@ export import AutolinkParser = MarkdownParser.AutolinkParser;
7
7
 
8
8
  const delimiter = /[@#>0-9A-Za-z\n]|\S[#>]/;
9
9
 
10
- export const autolink: AutolinkParser = (source, context) => {
10
+ export const autolink: AutolinkParser = ({ source, context }) => {
11
11
  if (source === '') return;
12
12
  assert(source[0] !== '\x1B');
13
13
  const i = source.search(delimiter);
@@ -15,7 +15,7 @@ export const autolink: AutolinkParser = (source, context) => {
15
15
  case -1:
16
16
  return [[source], ''];
17
17
  case 0:
18
- return parser(source, context);
18
+ return parser({ source, context });
19
19
  default:
20
20
  return [[source.slice(0, i)], source.slice(i)];
21
21
  }
@@ -4,7 +4,7 @@ import { inspect } from '../../debug.test';
4
4
 
5
5
  describe('Unit: parser/block/blockquote', () => {
6
6
  describe('blockquote', () => {
7
- const parser = (source: string) => some(blockquote)(source, {});
7
+ const parser = (source: string) => some(blockquote)({ source, context: {} });
8
8
 
9
9
  it('invalid', () => {
10
10
  assert.deepStrictEqual(inspect(parser('')), undefined);
@@ -25,13 +25,13 @@ describe('Unit: parser/block/blockquote', () => {
25
25
  assert.deepStrictEqual(inspect(parser('> a\nb')), [['<blockquote><pre>a<br>b</pre></blockquote>'], '']);
26
26
  assert.deepStrictEqual(inspect(parser('> a\n b ')), [['<blockquote><pre>a<br> b </pre></blockquote>'], '']);
27
27
  assert.deepStrictEqual(inspect(parser('> a\n>')), [['<blockquote><pre>a<br></pre></blockquote>'], '']);
28
- assert.deepStrictEqual(inspect(parser('> a\n>>1')), [['<blockquote><pre>a<br><a href="?at=1" class="anchor">&gt;&gt;1</a></pre></blockquote>'], '']);
28
+ assert.deepStrictEqual(inspect(parser('> a\n>>1')), [['<blockquote><pre>a<br><a class="anchor" href="?at=1">&gt;&gt;1</a></pre></blockquote>'], '']);
29
29
  assert.deepStrictEqual(inspect(parser('> a\n> b ')), [['<blockquote><pre>a<br>b </pre></blockquote>'], '']);
30
30
  assert.deepStrictEqual(inspect(parser('> a\n>\n')), [['<blockquote><pre>a<br></pre></blockquote>'], '']);
31
31
  assert.deepStrictEqual(inspect(parser('> a\n>\nb')), [['<blockquote><pre>a<br><br>b</pre></blockquote>'], '']);
32
32
  assert.deepStrictEqual(inspect(parser('> a\n>\n b ')), [['<blockquote><pre>a<br><br> b </pre></blockquote>'], '']);
33
33
  assert.deepStrictEqual(inspect(parser('> a\n>\n>')), [['<blockquote><pre>a<br><br></pre></blockquote>'], '']);
34
- assert.deepStrictEqual(inspect(parser('> a\n>\n>>1')), [['<blockquote><pre>a<br><br><a href="?at=1" class="anchor">&gt;&gt;1</a></pre></blockquote>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('> a\n>\n>>1')), [['<blockquote><pre>a<br><br><a class="anchor" href="?at=1">&gt;&gt;1</a></pre></blockquote>'], '']);
35
35
  assert.deepStrictEqual(inspect(parser('> a\n>\n> b ')), [['<blockquote><pre>a<br><br>b </pre></blockquote>'], '']);
36
36
  assert.deepStrictEqual(inspect(parser('> a\\\nb')), [['<blockquote><pre>a\\<br>b</pre></blockquote>'], '']);
37
37
  assert.deepStrictEqual(inspect(parser('> a ')), [['<blockquote><pre> a </pre></blockquote>'], '']);
@@ -40,12 +40,12 @@ describe('Unit: parser/block/blockquote', () => {
40
40
  assert.deepStrictEqual(inspect(parser('>\n a')), [['<blockquote><pre><br> a</pre></blockquote>'], '']);
41
41
  assert.deepStrictEqual(inspect(parser('>\n>')), [['<blockquote><pre><br></pre></blockquote>'], '']);
42
42
  assert.deepStrictEqual(inspect(parser('>\n> a')), [['<blockquote><pre><br>a</pre></blockquote>'], '']);
43
- assert.deepStrictEqual(inspect(parser('> http://host')), [['<blockquote><pre><a href="http://host" target="_blank">http://host</a></pre></blockquote>'], '']);
44
- assert.deepStrictEqual(inspect(parser('> !http://host')), [['<blockquote><pre>!<a href="http://host" target="_blank">http://host</a></pre></blockquote>'], '']);
45
- assert.deepStrictEqual(inspect(parser('> #a')), [['<blockquote><pre><a href="/hashtags/a" class="hashtag">#a</a></pre></blockquote>'], '']);
46
- assert.deepStrictEqual(inspect(parser('> @a#b')), [['<blockquote><pre><a href="/@a?ch=b" class="channel">@a#b</a></pre></blockquote>'], '']);
47
- assert.deepStrictEqual(inspect(parser('> >>1\n> > b')), [['<blockquote><pre><a href="?at=1" class="anchor">&gt;&gt;1</a><br>&gt; b</pre></blockquote>'], '']);
48
- assert.deepStrictEqual(inspect(parser('> >>1\n> > b\n> c')), [['<blockquote><pre><a href="?at=1" class="anchor">&gt;&gt;1</a><br>&gt; b<br>c</pre></blockquote>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('> http://host')), [['<blockquote><pre><a class="url" href="http://host" target="_blank">http://host</a></pre></blockquote>'], '']);
44
+ assert.deepStrictEqual(inspect(parser('> !http://host')), [['<blockquote><pre>!<a class="url" href="http://host" target="_blank">http://host</a></pre></blockquote>'], '']);
45
+ assert.deepStrictEqual(inspect(parser('> #a')), [['<blockquote><pre><a class="hashtag" href="/hashtags/a">#a</a></pre></blockquote>'], '']);
46
+ assert.deepStrictEqual(inspect(parser('> @a#b')), [['<blockquote><pre><a class="channel" href="/@a?ch=b">@a#b</a></pre></blockquote>'], '']);
47
+ assert.deepStrictEqual(inspect(parser('> >>1\n> > b')), [['<blockquote><pre><a class="anchor" href="?at=1">&gt;&gt;1</a><br>&gt; b</pre></blockquote>'], '']);
48
+ assert.deepStrictEqual(inspect(parser('> >>1\n> > b\n> c')), [['<blockquote><pre><a class="anchor" href="?at=1">&gt;&gt;1</a><br>&gt; b<br>c</pre></blockquote>'], '']);
49
49
  });
50
50
 
51
51
  it('nest', () => {
@@ -37,7 +37,7 @@ const markdown: BlockquoteParser.MarkdownParser = lazy(() => fmap(
37
37
  creation(99,
38
38
  rewrite(
39
39
  some(contentline, opener),
40
- convert(unindent, (source, context) => {
40
+ convert(unindent, ({ source, context }) => {
41
41
  const references = html('ol', { class: 'references' });
42
42
  const document = parse(source, {
43
43
  id: '',
@@ -4,7 +4,7 @@ import { inspect } from '../../debug.test';
4
4
 
5
5
  describe('Unit: parser/block/codeblock', () => {
6
6
  describe('codeblock', () => {
7
- const parser = (source: string) => some(codeblock)(source, {});
7
+ const parser = (source: string) => some(codeblock)({ source, context: {} });
8
8
 
9
9
  it('invalid', () => {
10
10
  assert.deepStrictEqual(inspect(parser('')), undefined);
@@ -37,10 +37,10 @@ describe('Unit: parser/block/codeblock', () => {
37
37
  assert.deepStrictEqual(inspect(parser('````\n```\n````')), [['<pre class="text">```</pre>'], '']);
38
38
  assert.deepStrictEqual(inspect(parser('````\n```\n\n````')), [['<pre class="text">```<br></pre>'], '']);
39
39
  assert.deepStrictEqual(inspect(parser('```\n\n```\n')), [['<pre class="text"></pre>'], '']);
40
- assert.deepStrictEqual(inspect(parser('```\nhttp://host\n```')), [['<pre class="text"><a href="http://host" target="_blank">http://host</a></pre>'], '']);
41
- assert.deepStrictEqual(inspect(parser('```\n!http://host\n```')), [['<pre class="text">!<a href="http://host" target="_blank">http://host</a></pre>'], '']);
42
- assert.deepStrictEqual(inspect(parser('```\n#a\n```')), [['<pre class="text"><a href="/hashtags/a" class="hashtag">#a</a></pre>'], '']);
43
- assert.deepStrictEqual(inspect(parser('```\n@a#b\n```')), [['<pre class="text"><a href="/@a?ch=b" class="channel">@a#b</a></pre>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('```\nhttp://host\n```')), [['<pre class="text"><a class="url" href="http://host" target="_blank">http://host</a></pre>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('```\n!http://host\n```')), [['<pre class="text">!<a class="url" href="http://host" target="_blank">http://host</a></pre>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('```\n#a\n```')), [['<pre class="text"><a class="hashtag" href="/hashtags/a">#a</a></pre>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('```\n@a#b\n```')), [['<pre class="text"><a class="channel" href="/@a?ch=b">@a#b</a></pre>'], '']);
44
44
  assert.deepStrictEqual(inspect(parser(`\`\`\`\n0${'\n'.repeat(300)}\`\`\``), '>'), [['<pre class="text">'], '']);
45
45
  });
46
46
 
@@ -70,6 +70,6 @@ export const codeblock: CodeBlockParser = block(validate('```', fmap(
70
70
  params.lang
71
71
  ? context.caches?.code?.get(`${params.lang ?? ''}\n${body.slice(0, -1)}`)?.cloneNode(true).childNodes ||
72
72
  body.slice(0, -1) || undefined
73
- : defrag(eval(some(autolink)(body.slice(0, -1), context), [])));
73
+ : defrag(eval(some(autolink)({ source: body.slice(0, -1), context }), [])));
74
74
  return [el];
75
75
  })));
@@ -4,7 +4,7 @@ import { inspect } from '../../debug.test';
4
4
 
5
5
  describe('Unit: parser/block/dlist', () => {
6
6
  describe('dlist', () => {
7
- const parser = (source: string) => some(dlist)(source, {});
7
+ const parser = (source: string) => some(dlist)({ source, context: {} });
8
8
 
9
9
  it('invalid', () => {
10
10
  assert.deepStrictEqual(inspect(parser('')), undefined);
@@ -66,7 +66,7 @@ describe('Unit: parser/block/dlist', () => {
66
66
 
67
67
  it('index', () => {
68
68
  assert.deepStrictEqual(inspect(parser('~ a [#b]')), [['<dl><dt id="index:b">a<span class="indexer" data-index="b"></span></dt><dd></dd></dl>'], '']);
69
- assert.deepStrictEqual(inspect(parser('~ a [#b]\\')), [['<dl><dt id="index:a_[#b]">a [<a href="/hashtags/b" class="hashtag">#b</a>]</dt><dd></dd></dl>'], '']);
69
+ assert.deepStrictEqual(inspect(parser('~ a [#b]\\')), [['<dl><dt id="index:a_[#b]">a [<a class="hashtag" href="/hashtags/b">#b</a>]</dt><dd></dd></dl>'], '']);
70
70
  assert.deepStrictEqual(inspect(parser('~ A')), [['<dl><dt id="index:A">A</dt><dd></dd></dl>'], '']);
71
71
  assert.deepStrictEqual(inspect(parser('~ *A*')), [['<dl><dt id="index:A"><em>A</em></dt><dd></dd></dl>'], '']);
72
72
  assert.deepStrictEqual(inspect(parser('~ `A`')), [['<dl><dt id="index:`A`"><code data-src="`A`">A</code></dt><dd></dd></dl>'], '']);
@@ -4,7 +4,7 @@ import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: parser/block/extension/aside', () => {
6
6
  describe('aside', () => {
7
- const parser = (source: string) => some(aside)(source, {});
7
+ const parser = (source: string) => some(aside)({ source, context: {} });
8
8
 
9
9
  it('invalid', () => {
10
10
  assert.deepStrictEqual(inspect(parser('~~~aside\n~~~')), [['<pre class="invalid" translate="no">~~~aside\n~~~</pre>'], '']);
@@ -4,7 +4,7 @@ import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: parser/block/extension/example', () => {
6
6
  describe('example', () => {
7
- const parser = (source: string) => some(example)(source, {});
7
+ const parser = (source: string) => some(example)({ source, context: {} });
8
8
 
9
9
  it('invalid', () => {
10
10
  assert.deepStrictEqual(inspect(parser('~~~example/\n~~~')), undefined);