securemark 0.299.4 → 0.300.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 (231) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/design.md +0 -6
  3. package/dist/index.js +2749 -1979
  4. package/index.d.ts +2 -1
  5. package/markdown.d.ts +209 -183
  6. package/package.json +1 -1
  7. package/src/api/bind.test.ts +0 -22
  8. package/src/api/bind.ts +15 -10
  9. package/src/api/header.ts +8 -5
  10. package/src/api/parse.test.ts +118 -122
  11. package/src/api/parse.ts +13 -31
  12. package/src/api/run.ts +6 -0
  13. package/src/api.ts +1 -0
  14. package/src/combinator/control/inits.ts +26 -0
  15. package/src/combinator/control/sequence.test.ts +38 -0
  16. package/src/combinator/control/sequence.ts +17 -0
  17. package/src/combinator/control/some.test.ts +41 -0
  18. package/src/combinator/{data/parser → control}/some.ts +39 -26
  19. package/src/combinator/control/state.ts +42 -0
  20. package/src/combinator/control/subsequence.test.ts +47 -0
  21. package/src/combinator/control/subsequence.ts +16 -0
  22. package/src/combinator/control/tails.ts +8 -0
  23. package/src/combinator/control/union.test.ts +37 -0
  24. package/src/combinator/control/union.ts +18 -0
  25. package/src/combinator/{data/delimiter.ts → delimiter.ts} +40 -60
  26. package/src/combinator/effect/backtrack.ts +64 -0
  27. package/src/combinator/effect/clock.ts +10 -0
  28. package/src/combinator/effect/precedence.ts +50 -0
  29. package/src/combinator/effect/recursion.ts +30 -0
  30. package/src/combinator/effect/scope.ts +100 -0
  31. package/src/combinator/effect/state.ts +72 -0
  32. package/src/combinator/{data/list → parser}/list.ts +35 -10
  33. package/src/combinator/parser.ts +293 -0
  34. package/src/combinator/process/bind.ts +34 -0
  35. package/src/combinator/process/block.test.ts +20 -0
  36. package/src/combinator/process/block.ts +33 -0
  37. package/src/combinator/process/clear.ts +16 -0
  38. package/src/combinator/process/contract.ts +35 -0
  39. package/src/combinator/process/duplicate.ts +7 -0
  40. package/src/combinator/process/error.ts +13 -0
  41. package/src/combinator/{control/manipulation → process}/fallback.ts +3 -3
  42. package/src/combinator/process/fence.ts +59 -0
  43. package/src/combinator/process/fmap.ts +10 -0
  44. package/src/combinator/process/indent.test.ts +31 -0
  45. package/src/combinator/process/indent.ts +51 -0
  46. package/src/combinator/process/lazy.ts +8 -0
  47. package/src/combinator/process/line.test.ts +21 -0
  48. package/src/combinator/process/line.ts +55 -0
  49. package/src/combinator/process/match.ts +37 -0
  50. package/src/combinator/process/reverse.ts +7 -0
  51. package/src/combinator/process/scope.ts +102 -0
  52. package/src/combinator/process/surround.ts +271 -0
  53. package/src/combinator.ts +28 -24
  54. package/src/debug.test.ts +11 -8
  55. package/src/parser/autolink.test.ts +17 -18
  56. package/src/parser/block/blockquote.test.ts +78 -79
  57. package/src/parser/block/blockquote.ts +32 -25
  58. package/src/parser/block/codeblock.test.ts +56 -57
  59. package/src/parser/block/codeblock.ts +44 -26
  60. package/src/parser/block/dlist.test.ts +56 -57
  61. package/src/parser/block/dlist.ts +5 -5
  62. package/src/parser/block/extension/aside.test.ts +8 -9
  63. package/src/parser/block/extension/aside.ts +76 -47
  64. package/src/parser/block/extension/example.test.ts +18 -19
  65. package/src/parser/block/extension/example.ts +88 -48
  66. package/src/parser/block/extension/fig.test.ts +37 -36
  67. package/src/parser/block/extension/fig.ts +20 -25
  68. package/src/parser/block/extension/figbase.test.ts +18 -19
  69. package/src/parser/block/extension/figbase.ts +3 -3
  70. package/src/parser/block/extension/figure.test.ts +62 -63
  71. package/src/parser/block/extension/figure.ts +23 -21
  72. package/src/parser/block/extension/message.test.ts +13 -14
  73. package/src/parser/block/extension/message.ts +52 -39
  74. package/src/parser/block/extension/placeholder.test.ts +13 -13
  75. package/src/parser/block/extension/placeholder.ts +23 -21
  76. package/src/parser/block/extension/table.test.ts +70 -71
  77. package/src/parser/block/extension/table.ts +43 -31
  78. package/src/parser/block/extension.test.ts +24 -24
  79. package/src/parser/block/extension.ts +3 -3
  80. package/src/parser/block/heading.test.ts +58 -59
  81. package/src/parser/block/heading.ts +19 -18
  82. package/src/parser/block/ilist.test.ts +8 -8
  83. package/src/parser/block/ilist.ts +9 -7
  84. package/src/parser/block/mathblock.test.ts +31 -32
  85. package/src/parser/block/mathblock.ts +24 -23
  86. package/src/parser/block/mediablock.ts +7 -7
  87. package/src/parser/block/olist.test.ts +102 -103
  88. package/src/parser/block/olist.ts +11 -12
  89. package/src/parser/block/pagebreak.test.ts +15 -16
  90. package/src/parser/block/pagebreak.ts +5 -5
  91. package/src/parser/block/paragraph.test.ts +57 -58
  92. package/src/parser/block/paragraph.ts +1 -1
  93. package/src/parser/block/reply/cite.test.ts +39 -40
  94. package/src/parser/block/reply/cite.ts +5 -5
  95. package/src/parser/block/reply/quote.test.ts +50 -51
  96. package/src/parser/block/reply/quote.ts +8 -7
  97. package/src/parser/block/reply.test.ts +19 -20
  98. package/src/parser/block/reply.ts +2 -2
  99. package/src/parser/block/sidefence.test.ts +41 -48
  100. package/src/parser/block/sidefence.ts +17 -11
  101. package/src/parser/block/table.test.ts +48 -49
  102. package/src/parser/block/table.ts +10 -9
  103. package/src/parser/block/ulist.test.ts +52 -53
  104. package/src/parser/block/ulist.ts +9 -8
  105. package/src/parser/block.ts +63 -51
  106. package/src/parser/context.ts +35 -32
  107. package/src/parser/document.ts +48 -0
  108. package/src/parser/header.test.ts +19 -20
  109. package/src/parser/header.ts +31 -25
  110. package/src/parser/inline/annotation.test.ts +49 -50
  111. package/src/parser/inline/annotation.ts +14 -16
  112. package/src/parser/inline/autolink/account.test.ts +32 -33
  113. package/src/parser/inline/autolink/account.ts +18 -19
  114. package/src/parser/inline/autolink/anchor.test.ts +21 -22
  115. package/src/parser/inline/autolink/anchor.ts +7 -8
  116. package/src/parser/inline/autolink/channel.test.ts +14 -15
  117. package/src/parser/inline/autolink/email.test.ts +36 -37
  118. package/src/parser/inline/autolink/email.ts +6 -6
  119. package/src/parser/inline/autolink/hashnum.test.ts +32 -33
  120. package/src/parser/inline/autolink/hashnum.ts +7 -8
  121. package/src/parser/inline/autolink/hashtag.test.ts +59 -60
  122. package/src/parser/inline/autolink/hashtag.ts +8 -9
  123. package/src/parser/inline/autolink/url.test.ts +75 -76
  124. package/src/parser/inline/autolink/url.ts +13 -14
  125. package/src/parser/inline/autolink.ts +24 -11
  126. package/src/parser/inline/bracket.test.ts +73 -74
  127. package/src/parser/inline/bracket.ts +88 -63
  128. package/src/parser/inline/code.test.ts +30 -31
  129. package/src/parser/inline/code.ts +6 -6
  130. package/src/parser/inline/deletion.test.ts +27 -28
  131. package/src/parser/inline/deletion.ts +5 -5
  132. package/src/parser/inline/emphasis.test.ts +39 -40
  133. package/src/parser/inline/emphasis.ts +5 -5
  134. package/src/parser/inline/emstrong.test.ts +101 -102
  135. package/src/parser/inline/emstrong.ts +103 -85
  136. package/src/parser/inline/extension/index.test.ts +91 -92
  137. package/src/parser/inline/extension/index.ts +17 -13
  138. package/src/parser/inline/extension/indexee.ts +4 -4
  139. package/src/parser/inline/extension/indexer.test.ts +23 -24
  140. package/src/parser/inline/extension/indexer.ts +6 -5
  141. package/src/parser/inline/extension/label.test.ts +32 -33
  142. package/src/parser/inline/extension/label.ts +14 -5
  143. package/src/parser/inline/extension/placeholder.test.ts +42 -43
  144. package/src/parser/inline/extension/placeholder.ts +8 -9
  145. package/src/parser/inline/html.test.ts +109 -109
  146. package/src/parser/inline/html.ts +27 -27
  147. package/src/parser/inline/htmlentity.test.ts +37 -38
  148. package/src/parser/inline/htmlentity.ts +6 -7
  149. package/src/parser/inline/insertion.test.ts +27 -28
  150. package/src/parser/inline/insertion.ts +5 -5
  151. package/src/parser/inline/italic.test.ts +55 -56
  152. package/src/parser/inline/italic.ts +5 -5
  153. package/src/parser/inline/link.test.ts +186 -187
  154. package/src/parser/inline/link.ts +29 -30
  155. package/src/parser/inline/mark.test.ts +31 -32
  156. package/src/parser/inline/mark.ts +6 -6
  157. package/src/parser/inline/math.test.ts +140 -141
  158. package/src/parser/inline/math.ts +6 -7
  159. package/src/parser/inline/media.test.ts +92 -93
  160. package/src/parser/inline/media.ts +31 -37
  161. package/src/parser/inline/reference.test.ts +111 -112
  162. package/src/parser/inline/reference.ts +61 -32
  163. package/src/parser/inline/remark.test.ts +49 -50
  164. package/src/parser/inline/remark.ts +13 -13
  165. package/src/parser/inline/ruby.test.ts +49 -50
  166. package/src/parser/inline/ruby.ts +60 -49
  167. package/src/parser/inline/shortmedia.test.ts +9 -10
  168. package/src/parser/inline/shortmedia.ts +11 -9
  169. package/src/parser/inline/strong.test.ts +36 -37
  170. package/src/parser/inline/strong.ts +5 -5
  171. package/src/parser/inline/template.test.ts +22 -23
  172. package/src/parser/inline/template.ts +13 -16
  173. package/src/parser/inline.test.ts +225 -226
  174. package/src/parser/inline.ts +68 -34
  175. package/src/parser/parser.ts +51 -0
  176. package/src/parser/repeat.ts +118 -91
  177. package/src/parser/segment.test.ts +0 -11
  178. package/src/parser/segment.ts +25 -28
  179. package/src/parser/source/escapable.test.ts +23 -24
  180. package/src/parser/source/escapable.ts +20 -20
  181. package/src/parser/source/line.test.ts +17 -18
  182. package/src/parser/source/line.ts +19 -24
  183. package/src/parser/source/str.ts +17 -10
  184. package/src/parser/source/text.test.ts +88 -89
  185. package/src/parser/source/text.ts +19 -20
  186. package/src/parser/source/unescapable.test.ts +23 -24
  187. package/src/parser/source/unescapable.ts +16 -16
  188. package/src/parser/util.ts +1 -1
  189. package/src/parser/visibility.ts +35 -14
  190. package/src/processor/figure.test.ts +20 -20
  191. package/src/processor/figure.ts +18 -10
  192. package/src/processor/note.test.ts +13 -13
  193. package/src/processor/note.ts +4 -2
  194. package/src/renderer/render/media/pdf.ts +2 -2
  195. package/src/renderer/render/media/twitter.ts +2 -2
  196. package/src/renderer/render/media.test.ts +12 -12
  197. package/src/renderer/render.test.ts +11 -11
  198. package/src/util/info.test.ts +2 -2
  199. package/src/util/quote.test.ts +3 -3
  200. package/src/util/quote.ts +6 -5
  201. package/src/util/toc.test.ts +12 -12
  202. package/src/combinator/control/constraint/block.test.ts +0 -20
  203. package/src/combinator/control/constraint/block.ts +0 -28
  204. package/src/combinator/control/constraint/contract.ts +0 -27
  205. package/src/combinator/control/constraint/line.test.ts +0 -21
  206. package/src/combinator/control/constraint/line.ts +0 -42
  207. package/src/combinator/control/manipulation/clear.ts +0 -5
  208. package/src/combinator/control/manipulation/convert.ts +0 -22
  209. package/src/combinator/control/manipulation/duplicate.ts +0 -7
  210. package/src/combinator/control/manipulation/fence.ts +0 -54
  211. package/src/combinator/control/manipulation/indent.test.ts +0 -31
  212. package/src/combinator/control/manipulation/indent.ts +0 -39
  213. package/src/combinator/control/manipulation/lazy.ts +0 -8
  214. package/src/combinator/control/manipulation/match.ts +0 -27
  215. package/src/combinator/control/manipulation/recovery.ts +0 -18
  216. package/src/combinator/control/manipulation/reverse.ts +0 -8
  217. package/src/combinator/control/manipulation/scope.ts +0 -61
  218. package/src/combinator/control/manipulation/surround.ts +0 -223
  219. package/src/combinator/control/monad/bind.ts +0 -26
  220. package/src/combinator/control/monad/fmap.ts +0 -10
  221. package/src/combinator/data/parser/context.ts +0 -96
  222. package/src/combinator/data/parser/inits.ts +0 -20
  223. package/src/combinator/data/parser/sequence.test.ts +0 -33
  224. package/src/combinator/data/parser/sequence.ts +0 -20
  225. package/src/combinator/data/parser/some.test.ts +0 -37
  226. package/src/combinator/data/parser/subsequence.test.ts +0 -41
  227. package/src/combinator/data/parser/subsequence.ts +0 -13
  228. package/src/combinator/data/parser/tails.ts +0 -8
  229. package/src/combinator/data/parser/union.test.ts +0 -33
  230. package/src/combinator/data/parser/union.ts +0 -18
  231. package/src/combinator/data/parser.ts +0 -144
@@ -1,7 +1,7 @@
1
1
  import { LinkParser } from '../inline';
2
- import { Context, State, Backtrack, Command } from '../context';
3
- import { List, Node } from '../../combinator/data/parser';
4
- import { union, inits, sequence, subsequence, some, spend, precedence, state, constraint, surround, open, setBacktrack, dup, lazy, fmap, bind } from '../../combinator';
2
+ import { Input, State, Backtrack, Command } from '../context';
3
+ import { List, Node } from '../../combinator/parser';
4
+ import { union, inits, sequence, subsequence, some, precedence, state, constraint, backtrack, surround, open, setBacktrack, dup, lazy, fmap, bind } from '../../combinator';
5
5
  import { inline, media, shortmedia } from '../inline';
6
6
  import { attributes } from './html';
7
7
  import { str } from '../source';
@@ -15,42 +15,42 @@ const optspec = {
15
15
  } as const;
16
16
  Object.setPrototypeOf(optspec, null);
17
17
 
18
- export const textlink: LinkParser.TextLinkParser = lazy(() => bind(
18
+ export const textlink: LinkParser.TextLinkParser = lazy(() => backtrack(bind(
19
19
  subsequence([
20
- constraint(State.link, state(State.linkers, dup(surround(
20
+ constraint(State.link, state(State.linkers, backtrack(dup(surround(
21
21
  open('[', beforeNonblank),
22
22
  precedence(1,
23
23
  some(union([inline]), ']', [[']', 1]])),
24
24
  ']',
25
25
  true,
26
26
  [3 | Backtrack.common | Backtrack.link, 2 | Backtrack.ruby],
27
- ([, ns = new List()], context) => {
28
- if (context.linebreak !== 0) {
29
- const head = context.position - context.range;
30
- return void setBacktrack(context, 2 | Backtrack.link | Backtrack.ruby, head);
27
+ ([, ns = new List()], input, output) => {
28
+ if (input.linebreak !== 0) {
29
+ const head = input.position - input.range;
30
+ return void setBacktrack(input, 2 | Backtrack.link | Backtrack.ruby, head);
31
31
  }
32
- return ns.push(new Node(Command.Separator)) && ns;
33
- })))),
32
+ return output.import(ns.push(new Node(Command.Separator)));
33
+ }))))),
34
34
  // `{ `と`{`で個別にバックトラックが発生し+1nされる。
35
35
  // 自己再帰的にパースしてもオプションの不要なパースによる計算量の増加により相殺される。
36
- dup(surround(
36
+ backtrack(dup(surround(
37
37
  /{(?![{}])/y,
38
38
  inits([uri, some(option)]),
39
39
  / ?}/y,
40
40
  false, [],
41
41
  undefined,
42
- ([as, bs]) =>
43
- bs && as.import(bs).push(new Node(Command.Cancel)) && as)),
42
+ ([as, bs], _, output) =>
43
+ bs && output.import(as.import(bs).push(new Node(Command.Cancel)))))),
44
44
  ]),
45
- ([{ value: content }, { value: params = undefined } = {}], context) => {
46
- if (context.state & State.link) return new List([
47
- new Node(context.source.slice(context.position - context.range, context.position).replace(/\\($|.)/g, '$1'))
45
+ ([{ value: content }, { value: params = undefined } = {}], input) => {
46
+ if (input.state & State.link) return new List([
47
+ new Node(input.source.slice(input.position - input.range, input.position).replace(/\\($|.)/g, '$1'))
48
48
  ]);
49
49
  if (content.last!.value === Command.Separator) {
50
50
  content.pop();
51
51
  if (params === undefined) {
52
- const head = context.position - context.range;
53
- return void setBacktrack(context, 2 | Backtrack.link, head);
52
+ const head = input.position - input.range;
53
+ return void setBacktrack(input, 2 | Backtrack.link, head);
54
54
  }
55
55
  }
56
56
  else {
@@ -65,18 +65,18 @@ export const textlink: LinkParser.TextLinkParser = lazy(() => bind(
65
65
  class: 'invalid',
66
66
  ...invalid('link', 'syntax', 'Missing the closing symbol "}"')
67
67
  },
68
- context.source.slice(context.position - context.range, context.position)))
68
+ input.source.slice(input.position - input.range, input.position)))
69
69
  ]);
70
70
  }
71
71
  assert(!html('div', unwrap(content)).querySelector('a, .media, .annotation, .reference'));
72
72
  assert(content.head?.value !== '');
73
73
  if (content.length !== 0 && trimBlankNodeEnd(content).length === 0) return;
74
- return new List([new Node(parse(content, params as List<Node<string>>, context))]);
75
- }));
74
+ return new List([new Node(parse(content, params as List<Node<string>>, input))]);
75
+ })));
76
76
 
77
77
  export const medialink: LinkParser.MediaLinkParser = lazy(() => constraint(State.link | State.media,
78
78
  state(State.linkers,
79
- bind(sequence([
79
+ backtrack(bind(sequence([
80
80
  dup(surround(
81
81
  '[',
82
82
  union([media, shortmedia]),
@@ -86,8 +86,8 @@ export const medialink: LinkParser.MediaLinkParser = lazy(() => constraint(State
86
86
  inits([uri, some(option)]),
87
87
  / ?}/y)),
88
88
  ]),
89
- ([{ value: content }, { value: params }], context) =>
90
- new List([new Node(parse(content, params as List<Node<string>>, context))])))));
89
+ ([{ value: content }, { value: params }], input) =>
90
+ new List([new Node(parse(content, params as List<Node<string>>, input))]))))));
91
91
 
92
92
  export const uri: LinkParser.ParameterParser.UriParser = union([
93
93
  open(' ', str(/\S+/y)),
@@ -103,18 +103,17 @@ export const option: LinkParser.ParameterParser.OptionParser = union([
103
103
  export function parse(
104
104
  content: List<Node<string | HTMLElement>>,
105
105
  params: List<Node<string>>,
106
- context: Context,
106
+ input: Input,
107
107
  ): HTMLAnchorElement {
108
108
  assert(params.length > 0);
109
109
  const INSECURE_URI = params.shift()!.value;
110
110
  assert(INSECURE_URI === INSECURE_URI.trim());
111
111
  assert(!INSECURE_URI.match(/\s/));
112
- spend(context, 10);
113
112
  let uri: ReadonlyURL | undefined;
114
113
  try{
115
114
  uri = new ReadonlyURL(
116
- resolve(INSECURE_URI, context.host ?? location, context.url ?? context.host ?? location),
117
- context.host?.href || location.href);
115
+ resolve(INSECURE_URI, input.host ?? location, input.url ?? input.host ?? location),
116
+ input.host?.href || location.href);
118
117
  }
119
118
  catch {
120
119
  }
@@ -122,7 +121,7 @@ export function parse(
122
121
  INSECURE_URI,
123
122
  content,
124
123
  uri,
125
- context.host?.origin || location.origin);
124
+ input.host?.origin || location.origin);
126
125
  return el.classList.contains('invalid')
127
126
  ? el
128
127
  : define(el, attributes('link', optspec, unwrap(params))[0]);
@@ -1,7 +1,6 @@
1
1
  import { mark } from './mark';
2
2
  import { some } from '../../combinator';
3
- import { input } from '../../combinator/data/parser';
4
- import { Context } from '../context';
3
+ import { input } from '../context';
5
4
  import { inspect } from '../../debug.test';
6
5
 
7
6
  describe('Unit: parser/inline/mark', () => {
@@ -9,42 +8,42 @@ describe('Unit: parser/inline/mark', () => {
9
8
  const parser = some(mark);
10
9
 
11
10
  it('invalid', () => {
12
- assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
13
- assert.deepStrictEqual(inspect(parser, input('=', new Context())), undefined);
14
- assert.deepStrictEqual(inspect(parser, input('==', new Context())), [['=='], '']);
15
- assert.deepStrictEqual(inspect(parser, input('==a', new Context())), [['==', 'a'], '']);
16
- assert.deepStrictEqual(inspect(parser, input('==a=', new Context())), [['==', 'a='], '']);
17
- assert.deepStrictEqual(inspect(parser, input('==a ==', new Context())), [['==', 'a ', '=='], '']);
18
- assert.deepStrictEqual(inspect(parser, input('==a ==', new Context())), [['==', 'a', ' ', '=='], '']);
19
- assert.deepStrictEqual(inspect(parser, input('==a\n==', new Context())), [['==', 'a', '<br>', '=='], '']);
20
- assert.deepStrictEqual(inspect(parser, input('==a\\ ==', new Context())), [['==', 'a', ' ', '=='], '']);
21
- assert.deepStrictEqual(inspect(parser, input('==a\\\n==', new Context())), [['==', 'a', '<br>', '=='], '']);
22
- assert.deepStrictEqual(inspect(parser, input('== ==', new Context())), undefined);
23
- assert.deepStrictEqual(inspect(parser, input('== a==', new Context())), undefined);
24
- assert.deepStrictEqual(inspect(parser, input('== a ==', new Context())), undefined);
25
- assert.deepStrictEqual(inspect(parser, input('==\na==', new Context())), undefined);
26
- assert.deepStrictEqual(inspect(parser, input('==\\\na==', new Context())), undefined);
27
- assert.deepStrictEqual(inspect(parser, input('==<wbr>a==', new Context())), undefined);
28
- assert.deepStrictEqual(inspect(parser, input(' ==a==', new Context())), undefined);
11
+ assert.deepStrictEqual(inspect(parser, input('')), undefined);
12
+ assert.deepStrictEqual(inspect(parser, input('=')), undefined);
13
+ assert.deepStrictEqual(inspect(parser, input('==')), [['=='], '']);
14
+ assert.deepStrictEqual(inspect(parser, input('==a')), [['==', 'a'], '']);
15
+ assert.deepStrictEqual(inspect(parser, input('==a=')), [['==', 'a='], '']);
16
+ assert.deepStrictEqual(inspect(parser, input('==a ==')), [['==', 'a ', '=='], '']);
17
+ assert.deepStrictEqual(inspect(parser, input('==a ==')), [['==', 'a', ' ', '=='], '']);
18
+ assert.deepStrictEqual(inspect(parser, input('==a\n==')), [['==', 'a', '<br>', '=='], '']);
19
+ assert.deepStrictEqual(inspect(parser, input('==a\\ ==')), [['==', 'a', ' ', '=='], '']);
20
+ assert.deepStrictEqual(inspect(parser, input('==a\\\n==')), [['==', 'a', '<br>', '=='], '']);
21
+ assert.deepStrictEqual(inspect(parser, input('== ==')), undefined);
22
+ assert.deepStrictEqual(inspect(parser, input('== a==')), undefined);
23
+ assert.deepStrictEqual(inspect(parser, input('== a ==')), undefined);
24
+ assert.deepStrictEqual(inspect(parser, input('==\na==')), undefined);
25
+ assert.deepStrictEqual(inspect(parser, input('==\\\na==')), undefined);
26
+ assert.deepStrictEqual(inspect(parser, input('==<wbr>a==')), undefined);
27
+ assert.deepStrictEqual(inspect(parser, input(' ==a==')), undefined);
29
28
  });
30
29
 
31
30
  it('basic', () => {
32
- assert.deepStrictEqual(inspect(parser, input('==a==', new Context())), [['<mark id="mark::a">a</mark>', '<a href="#mark::a"></a>'], '']);
33
- assert.deepStrictEqual(inspect(parser, input('==a=b==', new Context())), [['<mark id="mark::a=b=3lYfIw">a=b</mark>', '<a href="#mark::a=b=3lYfIw"></a>'], '']);
34
- assert.deepStrictEqual(inspect(parser, input('==\\===', new Context())), [['<mark id="mark::=">=</mark>', '<a href="#mark::="></a>'], '']);
35
- assert.deepStrictEqual(inspect(parser, input('==a===', new Context())), [['<mark id="mark::a">a</mark>', '<a href="#mark::a"></a>'], '=']);
36
- assert.deepStrictEqual(inspect(parser, input('==a\nb==', new Context())), [['<mark id="mark::a_b=12Ta86">a<br>b</mark>', '<a href="#mark::a_b=12Ta86"></a>'], '']);
37
- assert.deepStrictEqual(inspect(parser, input('==a\\\nb==', new Context())), [['<mark id="mark::a_b=12Ta86">a<br>b</mark>', '<a href="#mark::a_b=12Ta86"></a>'], '']);
31
+ assert.deepStrictEqual(inspect(parser, input('==a==')), [['<mark id="mark::a">a</mark>', '<a href="#mark::a"></a>'], '']);
32
+ assert.deepStrictEqual(inspect(parser, input('==a=b==')), [['<mark id="mark::a=b=3lYfIw">a=b</mark>', '<a href="#mark::a=b=3lYfIw"></a>'], '']);
33
+ assert.deepStrictEqual(inspect(parser, input('==\\===')), [['<mark id="mark::=">=</mark>', '<a href="#mark::="></a>'], '']);
34
+ assert.deepStrictEqual(inspect(parser, input('==a===')), [['<mark id="mark::a">a</mark>', '<a href="#mark::a"></a>'], '=']);
35
+ assert.deepStrictEqual(inspect(parser, input('==a\nb==')), [['<mark id="mark::a_b=12Ta86">a<br>b</mark>', '<a href="#mark::a_b=12Ta86"></a>'], '']);
36
+ assert.deepStrictEqual(inspect(parser, input('==a\\\nb==')), [['<mark id="mark::a_b=12Ta86">a<br>b</mark>', '<a href="#mark::a_b=12Ta86"></a>'], '']);
38
37
  });
39
38
 
40
39
  it('nest', () => {
41
- assert.deepStrictEqual(inspect(parser, input('==a ==b====', new Context())), [['<mark id="mark::a_b">a <mark>b</mark></mark>', '<a href="#mark::a_b"></a>'], '']);
42
- assert.deepStrictEqual(inspect(parser, input('==- ==b====', new Context())), [['<mark id="mark::-_b">- <mark>b</mark></mark>', '<a href="#mark::-_b"></a>'], '']);
43
- assert.deepStrictEqual(inspect(parser, input('==a\\ ==b====', new Context())), [['<mark id="mark::a_b">a <mark>b</mark></mark>', '<a href="#mark::a_b"></a>'], '']);
44
- assert.deepStrictEqual(inspect(parser, input('==a&Tab;==b====', new Context())), [['<mark id="mark::a_b=33Mw2l">a\t<mark>b</mark></mark>', '<a href="#mark::a_b=33Mw2l"></a>'], '']);
45
- assert.deepStrictEqual(inspect(parser, input('==a<wbr>==b====', new Context())), [['<mark id="mark::ab">a<wbr><mark>b</mark></mark>', '<a href="#mark::ab"></a>'], '']);
46
- assert.deepStrictEqual(inspect(parser, input('==*==a==*==', new Context())), [['<mark id="mark::a"><em><mark>a</mark></em></mark>', '<a href="#mark::a"></a>'], '']);
47
- assert.deepStrictEqual(inspect(parser, input('====a== b==', new Context())), [['<mark id="mark::a_b"><mark>a</mark> b</mark>', '<a href="#mark::a_b"></a>'], '']);
40
+ assert.deepStrictEqual(inspect(parser, input('==a ==b====')), [['<mark id="mark::a_b">a <mark>b</mark></mark>', '<a href="#mark::a_b"></a>'], '']);
41
+ assert.deepStrictEqual(inspect(parser, input('==- ==b====')), [['<mark id="mark::-_b">- <mark>b</mark></mark>', '<a href="#mark::-_b"></a>'], '']);
42
+ assert.deepStrictEqual(inspect(parser, input('==a\\ ==b====')), [['<mark id="mark::a_b">a <mark>b</mark></mark>', '<a href="#mark::a_b"></a>'], '']);
43
+ assert.deepStrictEqual(inspect(parser, input('==a&Tab;==b====')), [['<mark id="mark::a_b=33Mw2l">a\t<mark>b</mark></mark>', '<a href="#mark::a_b=33Mw2l"></a>'], '']);
44
+ assert.deepStrictEqual(inspect(parser, input('==a<wbr>==b====')), [['<mark id="mark::ab">a<wbr><mark>b</mark></mark>', '<a href="#mark::ab"></a>'], '']);
45
+ assert.deepStrictEqual(inspect(parser, input('==*==a==*==')), [['<mark id="mark::a"><em><mark>a</mark></em></mark>', '<a href="#mark::a"></a>'], '']);
46
+ assert.deepStrictEqual(inspect(parser, input('====a== b==')), [['<mark id="mark::a_b"><mark>a</mark> b</mark>', '<a href="#mark::a_b"></a>'], '']);
48
47
  });
49
48
 
50
49
  });
@@ -1,7 +1,7 @@
1
1
  import { MarkParser } from '../inline';
2
2
  import { State, Recursion, Command } from '../context';
3
- import { List, Node } from '../../combinator/data/parser';
4
- import { union, some, precedence, state, surround, lazy } from '../../combinator';
3
+ import { List, Node } from '../../combinator/parser';
4
+ import { union, some, precedence, state, backtrack, surround, lazy } from '../../combinator';
5
5
  import { inline } from '../inline';
6
6
  import { identity, signature } from './extension/indexee';
7
7
  import { repeat } from '../repeat';
@@ -10,14 +10,14 @@ import { unwrap } from '../util';
10
10
  import { html, define, defrag } from 'typed-dom/dom';
11
11
 
12
12
  export const mark: MarkParser = lazy(() =>
13
- repeat('==', beforeNonblank, '==', Recursion.inline, precedence(0, surround(
13
+ repeat('==', beforeNonblank, '==', Recursion.inline, precedence(0, backtrack(surround(
14
14
  '',
15
15
  state(State.mark, some(union([inline]), '==', afterNonblank)),
16
16
  '==',
17
17
  false, [],
18
- ([, bs], { buffer }) => buffer.import(bs),
19
- ([, bs], { buffer }) => bs && buffer.import(bs).push(new Node(Command.Cancel)) && buffer)),
20
- (nodes, { id, state }, lead) => {
18
+ ([, bs], _, output) => output.import(bs),
19
+ ([, bs], _, output) => bs && output.import(bs.push(new Node(Command.Cancel)))))),
20
+ (nodes, { id, state }, _, lead) => {
21
21
  const el = html('mark', defrag(unwrap(nodes)));
22
22
  if (state & State.linkers || lead >= 2) return new List([new Node(el)]);
23
23
  define(el, { id: identity('mark', id, signature(el.cloneNode(true))) });
@@ -1,7 +1,6 @@
1
1
  import { math } from './math';
2
2
  import { some } from '../../combinator';
3
- import { input } from '../../combinator/data/parser';
4
- import { Context } from '../context';
3
+ import { input } from '../context';
5
4
  import { inspect } from '../../debug.test';
6
5
 
7
6
  describe('Unit: parser/inline/math', () => {
@@ -9,153 +8,153 @@ describe('Unit: parser/inline/math', () => {
9
8
  const parser = some(math);
10
9
 
11
10
  it('invalid', () => {
12
- assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
13
- assert.deepStrictEqual(inspect(parser, input('$', new Context())), undefined);
14
- assert.deepStrictEqual(inspect(parser, input('$$', new Context())), undefined);
15
- assert.deepStrictEqual(inspect(parser, input('$$$', new Context())), undefined);
16
- assert.deepStrictEqual(inspect(parser, input('$0 $', new Context())), undefined);
17
- assert.deepStrictEqual(inspect(parser, input('$0\\ $', new Context())), undefined);
18
- assert.deepStrictEqual(inspect(parser, input('$0\\\n$', new Context())), undefined);
19
- assert.deepStrictEqual(inspect(parser, input('$-0, $-1', new Context())), undefined);
20
- assert.deepStrictEqual(inspect(parser, input('$-0 and $-1', new Context())), undefined);
21
- assert.deepStrictEqual(inspect(parser, input('$-0と$-1', new Context())), undefined);
22
- assert.deepStrictEqual(inspect(parser, input('$-a $-b', new Context())), undefined);
23
- assert.deepStrictEqual(inspect(parser, input('$-a\\ $-b', new Context())), undefined);
24
- assert.deepStrictEqual(inspect(parser, input('$a $', new Context())), undefined);
25
- assert.deepStrictEqual(inspect(parser, input('$-a `$`', new Context())), undefined);
26
- assert.deepStrictEqual(inspect(parser, input('$-a ``$``', new Context())), undefined);
11
+ assert.deepStrictEqual(inspect(parser, input('')), undefined);
12
+ assert.deepStrictEqual(inspect(parser, input('$')), undefined);
13
+ assert.deepStrictEqual(inspect(parser, input('$$')), undefined);
14
+ assert.deepStrictEqual(inspect(parser, input('$$$')), undefined);
15
+ assert.deepStrictEqual(inspect(parser, input('$0 $')), undefined);
16
+ assert.deepStrictEqual(inspect(parser, input('$0\\ $')), undefined);
17
+ assert.deepStrictEqual(inspect(parser, input('$0\\\n$')), undefined);
18
+ assert.deepStrictEqual(inspect(parser, input('$-0, $-1')), undefined);
19
+ assert.deepStrictEqual(inspect(parser, input('$-0 and $-1')), undefined);
20
+ assert.deepStrictEqual(inspect(parser, input('$-0と$-1')), undefined);
21
+ assert.deepStrictEqual(inspect(parser, input('$-a $-b')), undefined);
22
+ assert.deepStrictEqual(inspect(parser, input('$-a\\ $-b')), undefined);
23
+ assert.deepStrictEqual(inspect(parser, input('$a $')), undefined);
24
+ assert.deepStrictEqual(inspect(parser, input('$-a `$`')), undefined);
25
+ assert.deepStrictEqual(inspect(parser, input('$-a ``$``')), undefined);
27
26
  // (``" + ``" + $-b") or (``"`` + "$-b")
28
- assert.deepStrictEqual(inspect(parser, input('$-a ``"``"$-b"', new Context())), undefined);
27
+ assert.deepStrictEqual(inspect(parser, input('$-a ``"``"$-b"')), undefined);
29
28
  // (``b`` + "c" + $-d) or (``b``"c" + $-d)
30
- assert.deepStrictEqual(inspect(parser, input('$-a ``b``"c"$-d', new Context())), undefined);
31
- assert.deepStrictEqual(inspect(parser, input('$-a"$-b"', new Context())), undefined);
32
- assert.deepStrictEqual(inspect(parser, input('$-a\\"$-b\\"', new Context())), undefined);
33
- assert.deepStrictEqual(inspect(parser, input('$a"$', new Context())), undefined);
34
- assert.deepStrictEqual(inspect(parser, input('$-a($-b)', new Context())), undefined);
35
- assert.deepStrictEqual(inspect(parser, input('$-a\\($-b\\)', new Context())), undefined);
36
- assert.deepStrictEqual(inspect(parser, input('$-a[$-b]', new Context())), undefined);
37
- assert.deepStrictEqual(inspect(parser, input('$-a\\[$-b\\]', new Context())), undefined);
38
- assert.deepStrictEqual(inspect(parser, input('$-a{$-b}', new Context())), undefined);
39
- assert.deepStrictEqual(inspect(parser, input('$a{$', new Context())), undefined);
40
- assert.deepStrictEqual(inspect(parser, input('$a$b', new Context())), undefined);
41
- assert.deepStrictEqual(inspect(parser, input('$a$b$', new Context())), undefined);
42
- assert.deepStrictEqual(inspect(parser, input('$ $', new Context())), undefined);
43
- assert.deepStrictEqual(inspect(parser, input('$\\ $', new Context())), undefined);
44
- assert.deepStrictEqual(inspect(parser, input('$ a$', new Context())), undefined);
45
- assert.deepStrictEqual(inspect(parser, input('$ a $', new Context())), undefined);
46
- assert.deepStrictEqual(inspect(parser, input('$\n$', new Context())), undefined);
47
- assert.deepStrictEqual(inspect(parser, input('$\\\n$', new Context())), undefined);
48
- assert.deepStrictEqual(inspect(parser, input('$a\nb$', new Context())), undefined);
49
- assert.deepStrictEqual(inspect(parser, input('$a\\\nb$', new Context())), undefined);
50
- assert.deepStrictEqual(inspect(parser, input('$a\\$\nb$', new Context())), undefined);
51
- assert.deepStrictEqual(inspect(parser, input('$a\\$\\\nb$', new Context())), undefined);
52
- assert.deepStrictEqual(inspect(parser, input('$`$', new Context())), undefined);
53
- assert.deepStrictEqual(inspect(parser, input('$`a"$', new Context())), undefined);
54
- assert.deepStrictEqual(inspect(parser, input('$`a"b$', new Context())), undefined);
55
- assert.deepStrictEqual(inspect(parser, input('$``$', new Context())), undefined);
56
- assert.deepStrictEqual(inspect(parser, input('$``$"$', new Context())), undefined);
57
- assert.deepStrictEqual(inspect(parser, input('$``a$', new Context())), undefined);
58
- assert.deepStrictEqual(inspect(parser, input('$``a"$0', new Context())), undefined);
59
- assert.deepStrictEqual(inspect(parser, input('$``a""b$', new Context())), undefined);
60
- assert.deepStrictEqual(inspect(parser, input('$``a""$', new Context())), undefined);
61
- assert.deepStrictEqual(inspect(parser, input('$```a"$', new Context())), undefined);
62
- assert.deepStrictEqual(inspect(parser, input('$```a""$', new Context())), undefined);
63
- assert.deepStrictEqual(inspect(parser, input('$``\n"$', new Context())), undefined);
64
- assert.deepStrictEqual(inspect(parser, input('$``a\\$\nb"$', new Context())), undefined);
65
- assert.deepStrictEqual(inspect(parser, input('$``a\\$\\\nb"$', new Context())), undefined);
66
- assert.deepStrictEqual(inspect(parser, input('$``"$', new Context())), undefined);
67
- assert.deepStrictEqual(inspect(parser, input('$``a"$', new Context())), undefined);
68
- assert.deepStrictEqual(inspect(parser, input('$``\\"$', new Context())), undefined);
69
- assert.deepStrictEqual(inspect(parser, input('$``a``b"c"$', new Context())), undefined);
70
- assert.deepStrictEqual(inspect(parser, input('$````""$', new Context())), undefined);
71
- assert.deepStrictEqual(inspect(parser, input('$"$', new Context())), undefined);
72
- assert.deepStrictEqual(inspect(parser, input('$}$', new Context())), undefined);
73
- assert.deepStrictEqual(inspect(parser, input('${', new Context())), undefined);
74
- assert.deepStrictEqual(inspect(parser, input('${a', new Context())), undefined);
75
- assert.deepStrictEqual(inspect(parser, input('${$', new Context())), undefined);
76
- assert.deepStrictEqual(inspect(parser, input('${}', new Context())), undefined);
77
- assert.deepStrictEqual(inspect(parser, input('${a} $', new Context())), undefined);
78
- assert.deepStrictEqual(inspect(parser, input('${a{b}$', new Context())), undefined);
79
- assert.deepStrictEqual(inspect(parser, input('${a}b}$', new Context())), undefined);
80
- assert.deepStrictEqual(inspect(parser, input('${a}b$', new Context())), undefined);
81
- assert.deepStrictEqual(inspect(parser, input('${a}b{c}$', new Context())), undefined);
82
- assert.deepStrictEqual(inspect(parser, input('${a}{b}$', new Context())), undefined);
83
- assert.deepStrictEqual(inspect(parser, input('${\\}$', new Context())), undefined);
84
- assert.deepStrictEqual(inspect(parser, input('${\n}$', new Context())), undefined);
85
- assert.deepStrictEqual(inspect(parser, input('${\\\n}$', new Context())), undefined);
86
- assert.deepStrictEqual(inspect(parser, input('${a\nb}$', new Context())), undefined);
87
- assert.deepStrictEqual(inspect(parser, input('${a\\\nb}$', new Context())), undefined);
88
- assert.deepStrictEqual(inspect(parser, input('${$}$', new Context())), undefined);
89
- assert.deepStrictEqual(inspect(parser, input('${a\\$\nb}$', new Context())), undefined);
90
- assert.deepStrictEqual(inspect(parser, input('${a\\$\\\nb}$', new Context())), undefined);
91
- assert.deepStrictEqual(inspect(parser, input('$\\begin$', new Context())), [['<span class="invalid" translate="no">$\\begin$</span>'], '']);
92
- assert.deepStrictEqual(inspect(parser, input('$\\huge0$', new Context())), [['<span class="invalid" translate="no">$\\huge0$</span>'], '']);
93
- assert.deepStrictEqual(inspect(parser, input('$\\Begin$', new Context())), [['<span class="invalid" translate="no">$\\Begin$</span>'], '']);
94
- assert.deepStrictEqual(inspect(parser, input('$\\begin{}$', new Context())), [['<span class="invalid" translate="no">$\\begin{}$</span>'], '']);
95
- assert.deepStrictEqual(inspect(parser, input('${\\begin}$', new Context())), [['<span class="invalid" translate="no">${\\begin}$</span>'], '']);
96
- assert.deepStrictEqual(inspect(parser, input('$http://host$', new Context())), undefined);
97
- assert.deepStrictEqual(inspect(parser, input('${http://host}$', new Context())), undefined);
98
- assert.deepStrictEqual(inspect(parser, input(' ${a}$', new Context())), undefined);
29
+ assert.deepStrictEqual(inspect(parser, input('$-a ``b``"c"$-d')), undefined);
30
+ assert.deepStrictEqual(inspect(parser, input('$-a"$-b"')), undefined);
31
+ assert.deepStrictEqual(inspect(parser, input('$-a\\"$-b\\"')), undefined);
32
+ assert.deepStrictEqual(inspect(parser, input('$a"$')), undefined);
33
+ assert.deepStrictEqual(inspect(parser, input('$-a($-b)')), undefined);
34
+ assert.deepStrictEqual(inspect(parser, input('$-a\\($-b\\)')), undefined);
35
+ assert.deepStrictEqual(inspect(parser, input('$-a[$-b]')), undefined);
36
+ assert.deepStrictEqual(inspect(parser, input('$-a\\[$-b\\]')), undefined);
37
+ assert.deepStrictEqual(inspect(parser, input('$-a{$-b}')), undefined);
38
+ assert.deepStrictEqual(inspect(parser, input('$a{$')), undefined);
39
+ assert.deepStrictEqual(inspect(parser, input('$a$b')), undefined);
40
+ assert.deepStrictEqual(inspect(parser, input('$a$b$')), undefined);
41
+ assert.deepStrictEqual(inspect(parser, input('$ $')), undefined);
42
+ assert.deepStrictEqual(inspect(parser, input('$\\ $')), undefined);
43
+ assert.deepStrictEqual(inspect(parser, input('$ a$')), undefined);
44
+ assert.deepStrictEqual(inspect(parser, input('$ a $')), undefined);
45
+ assert.deepStrictEqual(inspect(parser, input('$\n$')), undefined);
46
+ assert.deepStrictEqual(inspect(parser, input('$\\\n$')), undefined);
47
+ assert.deepStrictEqual(inspect(parser, input('$a\nb$')), undefined);
48
+ assert.deepStrictEqual(inspect(parser, input('$a\\\nb$')), undefined);
49
+ assert.deepStrictEqual(inspect(parser, input('$a\\$\nb$')), undefined);
50
+ assert.deepStrictEqual(inspect(parser, input('$a\\$\\\nb$')), undefined);
51
+ assert.deepStrictEqual(inspect(parser, input('$`$')), undefined);
52
+ assert.deepStrictEqual(inspect(parser, input('$`a"$')), undefined);
53
+ assert.deepStrictEqual(inspect(parser, input('$`a"b$')), undefined);
54
+ assert.deepStrictEqual(inspect(parser, input('$``$')), undefined);
55
+ assert.deepStrictEqual(inspect(parser, input('$``$"$')), undefined);
56
+ assert.deepStrictEqual(inspect(parser, input('$``a$')), undefined);
57
+ assert.deepStrictEqual(inspect(parser, input('$``a"$0')), undefined);
58
+ assert.deepStrictEqual(inspect(parser, input('$``a""b$')), undefined);
59
+ assert.deepStrictEqual(inspect(parser, input('$``a""$')), undefined);
60
+ assert.deepStrictEqual(inspect(parser, input('$```a"$')), undefined);
61
+ assert.deepStrictEqual(inspect(parser, input('$```a""$')), undefined);
62
+ assert.deepStrictEqual(inspect(parser, input('$``\n"$')), undefined);
63
+ assert.deepStrictEqual(inspect(parser, input('$``a\\$\nb"$')), undefined);
64
+ assert.deepStrictEqual(inspect(parser, input('$``a\\$\\\nb"$')), undefined);
65
+ assert.deepStrictEqual(inspect(parser, input('$``"$')), undefined);
66
+ assert.deepStrictEqual(inspect(parser, input('$``a"$')), undefined);
67
+ assert.deepStrictEqual(inspect(parser, input('$``\\"$')), undefined);
68
+ assert.deepStrictEqual(inspect(parser, input('$``a``b"c"$')), undefined);
69
+ assert.deepStrictEqual(inspect(parser, input('$````""$')), undefined);
70
+ assert.deepStrictEqual(inspect(parser, input('$"$')), undefined);
71
+ assert.deepStrictEqual(inspect(parser, input('$}$')), undefined);
72
+ assert.deepStrictEqual(inspect(parser, input('${')), undefined);
73
+ assert.deepStrictEqual(inspect(parser, input('${a')), undefined);
74
+ assert.deepStrictEqual(inspect(parser, input('${$')), undefined);
75
+ assert.deepStrictEqual(inspect(parser, input('${}')), undefined);
76
+ assert.deepStrictEqual(inspect(parser, input('${a} $')), undefined);
77
+ assert.deepStrictEqual(inspect(parser, input('${a{b}$')), undefined);
78
+ assert.deepStrictEqual(inspect(parser, input('${a}b}$')), undefined);
79
+ assert.deepStrictEqual(inspect(parser, input('${a}b$')), undefined);
80
+ assert.deepStrictEqual(inspect(parser, input('${a}b{c}$')), undefined);
81
+ assert.deepStrictEqual(inspect(parser, input('${a}{b}$')), undefined);
82
+ assert.deepStrictEqual(inspect(parser, input('${\\}$')), undefined);
83
+ assert.deepStrictEqual(inspect(parser, input('${\n}$')), undefined);
84
+ assert.deepStrictEqual(inspect(parser, input('${\\\n}$')), undefined);
85
+ assert.deepStrictEqual(inspect(parser, input('${a\nb}$')), undefined);
86
+ assert.deepStrictEqual(inspect(parser, input('${a\\\nb}$')), undefined);
87
+ assert.deepStrictEqual(inspect(parser, input('${$}$')), undefined);
88
+ assert.deepStrictEqual(inspect(parser, input('${a\\$\nb}$')), undefined);
89
+ assert.deepStrictEqual(inspect(parser, input('${a\\$\\\nb}$')), undefined);
90
+ assert.deepStrictEqual(inspect(parser, input('$\\begin$')), [['<span class="invalid" translate="no">$\\begin$</span>'], '']);
91
+ assert.deepStrictEqual(inspect(parser, input('$\\huge0$')), [['<span class="invalid" translate="no">$\\huge0$</span>'], '']);
92
+ assert.deepStrictEqual(inspect(parser, input('$\\Begin$')), [['<span class="invalid" translate="no">$\\Begin$</span>'], '']);
93
+ assert.deepStrictEqual(inspect(parser, input('$\\begin{}$')), [['<span class="invalid" translate="no">$\\begin{}$</span>'], '']);
94
+ assert.deepStrictEqual(inspect(parser, input('${\\begin}$')), [['<span class="invalid" translate="no">${\\begin}$</span>'], '']);
95
+ assert.deepStrictEqual(inspect(parser, input('$http://host$')), undefined);
96
+ assert.deepStrictEqual(inspect(parser, input('${http://host}$')), undefined);
97
+ assert.deepStrictEqual(inspect(parser, input(' ${a}$')), undefined);
99
98
  });
100
99
 
101
100
  it('basic', () => {
102
- assert.deepStrictEqual(inspect(parser, input('$0$', new Context())), [['<span class="math" translate="no" data-src="$0$">$0$</span>'], '']);
103
- assert.deepStrictEqual(inspect(parser, input('$0$$', new Context())), [['<span class="math" translate="no" data-src="$0$">$0$</span>'], '$']);
104
- assert.deepStrictEqual(inspect(parser, input('$00$', new Context())), [['<span class="math" translate="no" data-src="$00$">$00$</span>'], '']);
105
- assert.deepStrictEqual(inspect(parser, input('$-0$', new Context())), [['<span class="math" translate="no" data-src="$-0$">$-0$</span>'], '']);
106
- assert.deepStrictEqual(inspect(parser, input('$0-1$', new Context())), [['<span class="math" translate="no" data-src="$0-1$">$0-1$</span>'], '']);
107
- assert.deepStrictEqual(inspect(parser, input('$0+1$', new Context())), [['<span class="math" translate="no" data-src="$0+1$">$0+1$</span>'], '']);
108
- assert.deepStrictEqual(inspect(parser, input('$0*1$', new Context())), [['<span class="math" translate="no" data-src="$0*1$">$0*1$</span>'], '']);
109
- assert.deepStrictEqual(inspect(parser, input('$0/1$', new Context())), [['<span class="math" translate="no" data-src="$0/1$">$0/1$</span>'], '']);
110
- assert.deepStrictEqual(inspect(parser, input('$a$', new Context())), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '']);
111
- assert.deepStrictEqual(inspect(parser, input('$a$$', new Context())), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '$']);
112
- assert.deepStrictEqual(inspect(parser, input('$a-b$', new Context())), [['<span class="math" translate="no" data-src="$a-b$">$a-b$</span>'], '']);
113
- assert.deepStrictEqual(inspect(parser, input('$a+b$', new Context())), [['<span class="math" translate="no" data-src="$a+b$">$a+b$</span>'], '']);
114
- assert.deepStrictEqual(inspect(parser, input('$a*b$', new Context())), [['<span class="math" translate="no" data-src="$a*b$">$a*b$</span>'], '']);
115
- assert.deepStrictEqual(inspect(parser, input('$a/b$', new Context())), [['<span class="math" translate="no" data-src="$a/b$">$a/b$</span>'], '']);
116
- assert.deepStrictEqual(inspect(parser, input(`$a'$`, new Context())), [[`<span class="math" translate="no" data-src="$a'$">$a'$</span>`], '']);
117
- assert.deepStrictEqual(inspect(parser, input(`$a''$`, new Context())), [[`<span class="math" translate="no" data-src="$a''$">$a''$</span>`], '']);
118
- assert.deepStrictEqual(inspect(parser, input('$a$[A](a)', new Context())), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '[A](a)']);
119
- assert.deepStrictEqual(inspect(parser, input('$A$', new Context())), [['<span class="math" translate="no" data-src="$A$">$A$</span>'], '']);
120
- assert.deepStrictEqual(inspect(parser, input('$-a$', new Context())), [['<span class="math" translate="no" data-src="$-a$">$-a$</span>'], '']);
121
- assert.deepStrictEqual(inspect(parser, input('$\\$$', new Context())), [['<span class="math" translate="no" data-src="$\\$$">$\\$$</span>'], '']);
122
- assert.deepStrictEqual(inspect(parser, input('$\\Pi$', new Context())), [['<span class="math" translate="no" data-src="$\\Pi$">$\\Pi$</span>'], '']);
123
- assert.deepStrictEqual(inspect(parser, input('$\\ 0$', new Context())), [['<span class="math" translate="no" data-src="$\\ 0$">$\\ 0$</span>'], '']);
124
- assert.deepStrictEqual(inspect(parser, input('$\\\\0$', new Context())), [['<span class="math" translate="no" data-src="$\\\\0$">$\\\\0$</span>'], '']);
125
- assert.deepStrictEqual(inspect(parser, input('$|1|$', new Context())), [['<span class="math" translate="no" data-src="$|1|$">$|1|$</span>'], '']);
126
- assert.deepStrictEqual(inspect(parser, input('$[0,1)$]', new Context())), [['<span class="math" translate="no" data-src="$[0,1)$">$[0,1)$</span>'], ']']);
127
- assert.deepStrictEqual(inspect(parser, input('$(0, 1]$)', new Context())), [['<span class="math" translate="no" data-src="$(0, 1]$">$(0, 1]$</span>'], ')']);
128
- assert.deepStrictEqual(inspect(parser, input('$\\{0,1\\}$', new Context())), [['<span class="math" translate="no" data-src="$\\{0,1\\}$">$\\{0,1\\}$</span>'], '']);
129
- assert.deepStrictEqual(inspect(parser, input('$n=1$', new Context())), [['<span class="math" translate="no" data-src="$n=1$">$n=1$</span>'], '']);
130
- assert.deepStrictEqual(inspect(parser, input('$n<m$', new Context())), [['<span class="math" translate="no" data-src="$n&lt;m$">$n&lt;m$</span>'], '']);
131
- assert.deepStrictEqual(inspect(parser, input('$n>m$', new Context())), [['<span class="math" translate="no" data-src="$n&gt;m$">$n&gt;m$</span>'], '']);
132
- assert.deepStrictEqual(inspect(parser, input('$E = mc^2$', new Context())), [['<span class="math" translate="no" data-src="$E = mc^2$">$E = mc^2$</span>'], '']);
133
- assert.deepStrictEqual(inspect(parser, input('$f(x)$', new Context())), [['<span class="math" translate="no" data-src="$f(x)$">$f(x)$</span>'], '']);
134
- assert.deepStrictEqual(inspect(parser, input('$f: x \\to y$', new Context())), [['<span class="math" translate="no" data-src="$f: x \\to y$">$f: x \\to y$</span>'], '']);
135
- assert.deepStrictEqual(inspect(parser, input('$k$\\-space', new Context())), [['<span class="math" translate="no" data-src="$k$">$k$</span>'], '\\-space']);
136
- assert.deepStrictEqual(inspect(parser, input('$a{b}$', new Context())), [['<span class="math" translate="no" data-src="$a{b}$">$a{b}$</span>'], '']);
137
- assert.deepStrictEqual(inspect(parser, input('$a\\{$\\}', new Context())), [['<span class="math" translate="no" data-src="$a\\{$">$a\\{$</span>'], '\\}']);
138
- assert.deepStrictEqual(inspect(parser, input('${}$', new Context())), [['<span class="math" translate="no" data-src="${}$">${}$</span>'], '']);
139
- assert.deepStrictEqual(inspect(parser, input('${ }$', new Context())), [['<span class="math" translate="no" data-src="${ }$">${ }$</span>'], '']);
140
- assert.deepStrictEqual(inspect(parser, input('${a}$', new Context())), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '']);
141
- assert.deepStrictEqual(inspect(parser, input('${a}$$', new Context())), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '$']);
142
- assert.deepStrictEqual(inspect(parser, input('${a}$0', new Context())), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '0']);
143
- assert.deepStrictEqual(inspect(parser, input('${a}$b', new Context())), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], 'b']);
144
- assert.deepStrictEqual(inspect(parser, input('${ab}$', new Context())), [['<span class="math" translate="no" data-src="${ab}$">${ab}$</span>'], '']);
145
- assert.deepStrictEqual(inspect(parser, input('${a b}$', new Context())), [['<span class="math" translate="no" data-src="${a b}$">${a b}$</span>'], '']);
146
- assert.deepStrictEqual(inspect(parser, input('${a }$', new Context())), [['<span class="math" translate="no" data-src="${a }$">${a }$</span>'], '']);
147
- assert.deepStrictEqual(inspect(parser, input('${ a}$', new Context())), [['<span class="math" translate="no" data-src="${ a}$">${ a}$</span>'], '']);
148
- assert.deepStrictEqual(inspect(parser, input('${ a }$', new Context())), [['<span class="math" translate="no" data-src="${ a }$">${ a }$</span>'], '']);
149
- assert.deepStrictEqual(inspect(parser, input('${``"}$', new Context())), [['<span class="math" translate="no" data-src="${``&quot;}$">${``"}$</span>'], '']);
150
- assert.deepStrictEqual(inspect(parser, input('${\\a}$', new Context())), [['<span class="math" translate="no" data-src="${\\a}$">${\\a}$</span>'], '']);
151
- assert.deepStrictEqual(inspect(parser, input('${\\$}$', new Context())), [['<span class="math" translate="no" data-src="${\\$}$">${\\$}$</span>'], '']);
152
- assert.deepStrictEqual(inspect(parser, input('${\\\\}$', new Context())), [['<span class="math" translate="no" data-src="${\\\\}$">${\\\\}$</span>'], '']);
153
- assert.deepStrictEqual(inspect(parser, input('${あ}$', new Context())), [['<span class="math" translate="no" data-src="${あ}$">${あ}$</span>'], '']);
101
+ assert.deepStrictEqual(inspect(parser, input('$0$')), [['<span class="math" translate="no" data-src="$0$">$0$</span>'], '']);
102
+ assert.deepStrictEqual(inspect(parser, input('$0$$')), [['<span class="math" translate="no" data-src="$0$">$0$</span>'], '$']);
103
+ assert.deepStrictEqual(inspect(parser, input('$00$')), [['<span class="math" translate="no" data-src="$00$">$00$</span>'], '']);
104
+ assert.deepStrictEqual(inspect(parser, input('$-0$')), [['<span class="math" translate="no" data-src="$-0$">$-0$</span>'], '']);
105
+ assert.deepStrictEqual(inspect(parser, input('$0-1$')), [['<span class="math" translate="no" data-src="$0-1$">$0-1$</span>'], '']);
106
+ assert.deepStrictEqual(inspect(parser, input('$0+1$')), [['<span class="math" translate="no" data-src="$0+1$">$0+1$</span>'], '']);
107
+ assert.deepStrictEqual(inspect(parser, input('$0*1$')), [['<span class="math" translate="no" data-src="$0*1$">$0*1$</span>'], '']);
108
+ assert.deepStrictEqual(inspect(parser, input('$0/1$')), [['<span class="math" translate="no" data-src="$0/1$">$0/1$</span>'], '']);
109
+ assert.deepStrictEqual(inspect(parser, input('$a$')), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '']);
110
+ assert.deepStrictEqual(inspect(parser, input('$a$$')), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '$']);
111
+ assert.deepStrictEqual(inspect(parser, input('$a-b$')), [['<span class="math" translate="no" data-src="$a-b$">$a-b$</span>'], '']);
112
+ assert.deepStrictEqual(inspect(parser, input('$a+b$')), [['<span class="math" translate="no" data-src="$a+b$">$a+b$</span>'], '']);
113
+ assert.deepStrictEqual(inspect(parser, input('$a*b$')), [['<span class="math" translate="no" data-src="$a*b$">$a*b$</span>'], '']);
114
+ assert.deepStrictEqual(inspect(parser, input('$a/b$')), [['<span class="math" translate="no" data-src="$a/b$">$a/b$</span>'], '']);
115
+ assert.deepStrictEqual(inspect(parser, input(`$a'$`)), [[`<span class="math" translate="no" data-src="$a'$">$a'$</span>`], '']);
116
+ assert.deepStrictEqual(inspect(parser, input(`$a''$`)), [[`<span class="math" translate="no" data-src="$a''$">$a''$</span>`], '']);
117
+ assert.deepStrictEqual(inspect(parser, input('$a$[A](a)')), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '[A](a)']);
118
+ assert.deepStrictEqual(inspect(parser, input('$A$')), [['<span class="math" translate="no" data-src="$A$">$A$</span>'], '']);
119
+ assert.deepStrictEqual(inspect(parser, input('$-a$')), [['<span class="math" translate="no" data-src="$-a$">$-a$</span>'], '']);
120
+ assert.deepStrictEqual(inspect(parser, input('$\\$$')), [['<span class="math" translate="no" data-src="$\\$$">$\\$$</span>'], '']);
121
+ assert.deepStrictEqual(inspect(parser, input('$\\Pi$')), [['<span class="math" translate="no" data-src="$\\Pi$">$\\Pi$</span>'], '']);
122
+ assert.deepStrictEqual(inspect(parser, input('$\\ 0$')), [['<span class="math" translate="no" data-src="$\\ 0$">$\\ 0$</span>'], '']);
123
+ assert.deepStrictEqual(inspect(parser, input('$\\\\0$')), [['<span class="math" translate="no" data-src="$\\\\0$">$\\\\0$</span>'], '']);
124
+ assert.deepStrictEqual(inspect(parser, input('$|1|$')), [['<span class="math" translate="no" data-src="$|1|$">$|1|$</span>'], '']);
125
+ assert.deepStrictEqual(inspect(parser, input('$[0,1)$]')), [['<span class="math" translate="no" data-src="$[0,1)$">$[0,1)$</span>'], ']']);
126
+ assert.deepStrictEqual(inspect(parser, input('$(0, 1]$)')), [['<span class="math" translate="no" data-src="$(0, 1]$">$(0, 1]$</span>'], ')']);
127
+ assert.deepStrictEqual(inspect(parser, input('$\\{0,1\\}$')), [['<span class="math" translate="no" data-src="$\\{0,1\\}$">$\\{0,1\\}$</span>'], '']);
128
+ assert.deepStrictEqual(inspect(parser, input('$n=1$')), [['<span class="math" translate="no" data-src="$n=1$">$n=1$</span>'], '']);
129
+ assert.deepStrictEqual(inspect(parser, input('$n<m$')), [['<span class="math" translate="no" data-src="$n&lt;m$">$n&lt;m$</span>'], '']);
130
+ assert.deepStrictEqual(inspect(parser, input('$n>m$')), [['<span class="math" translate="no" data-src="$n&gt;m$">$n&gt;m$</span>'], '']);
131
+ assert.deepStrictEqual(inspect(parser, input('$E = mc^2$')), [['<span class="math" translate="no" data-src="$E = mc^2$">$E = mc^2$</span>'], '']);
132
+ assert.deepStrictEqual(inspect(parser, input('$f(x)$')), [['<span class="math" translate="no" data-src="$f(x)$">$f(x)$</span>'], '']);
133
+ assert.deepStrictEqual(inspect(parser, input('$f: x \\to y$')), [['<span class="math" translate="no" data-src="$f: x \\to y$">$f: x \\to y$</span>'], '']);
134
+ assert.deepStrictEqual(inspect(parser, input('$k$\\-space')), [['<span class="math" translate="no" data-src="$k$">$k$</span>'], '\\-space']);
135
+ assert.deepStrictEqual(inspect(parser, input('$a{b}$')), [['<span class="math" translate="no" data-src="$a{b}$">$a{b}$</span>'], '']);
136
+ assert.deepStrictEqual(inspect(parser, input('$a\\{$\\}')), [['<span class="math" translate="no" data-src="$a\\{$">$a\\{$</span>'], '\\}']);
137
+ assert.deepStrictEqual(inspect(parser, input('${}$')), [['<span class="math" translate="no" data-src="${}$">${}$</span>'], '']);
138
+ assert.deepStrictEqual(inspect(parser, input('${ }$')), [['<span class="math" translate="no" data-src="${ }$">${ }$</span>'], '']);
139
+ assert.deepStrictEqual(inspect(parser, input('${a}$')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '']);
140
+ assert.deepStrictEqual(inspect(parser, input('${a}$$')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '$']);
141
+ assert.deepStrictEqual(inspect(parser, input('${a}$0')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '0']);
142
+ assert.deepStrictEqual(inspect(parser, input('${a}$b')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], 'b']);
143
+ assert.deepStrictEqual(inspect(parser, input('${ab}$')), [['<span class="math" translate="no" data-src="${ab}$">${ab}$</span>'], '']);
144
+ assert.deepStrictEqual(inspect(parser, input('${a b}$')), [['<span class="math" translate="no" data-src="${a b}$">${a b}$</span>'], '']);
145
+ assert.deepStrictEqual(inspect(parser, input('${a }$')), [['<span class="math" translate="no" data-src="${a }$">${a }$</span>'], '']);
146
+ assert.deepStrictEqual(inspect(parser, input('${ a}$')), [['<span class="math" translate="no" data-src="${ a}$">${ a}$</span>'], '']);
147
+ assert.deepStrictEqual(inspect(parser, input('${ a }$')), [['<span class="math" translate="no" data-src="${ a }$">${ a }$</span>'], '']);
148
+ assert.deepStrictEqual(inspect(parser, input('${``"}$')), [['<span class="math" translate="no" data-src="${``&quot;}$">${``"}$</span>'], '']);
149
+ assert.deepStrictEqual(inspect(parser, input('${\\a}$')), [['<span class="math" translate="no" data-src="${\\a}$">${\\a}$</span>'], '']);
150
+ assert.deepStrictEqual(inspect(parser, input('${\\$}$')), [['<span class="math" translate="no" data-src="${\\$}$">${\\$}$</span>'], '']);
151
+ assert.deepStrictEqual(inspect(parser, input('${\\\\}$')), [['<span class="math" translate="no" data-src="${\\\\}$">${\\\\}$</span>'], '']);
152
+ assert.deepStrictEqual(inspect(parser, input('${あ}$')), [['<span class="math" translate="no" data-src="${あ}$">${あ}$</span>'], '']);
154
153
  });
155
154
 
156
155
  it('nest', () => {
157
- assert.deepStrictEqual(inspect(parser, input('${*a*}$', new Context())), [['<span class="math" translate="no" data-src="${*a*}$">${*a*}$</span>'], '']);
158
- assert.deepStrictEqual(inspect(parser, input('${<wbr>}$', new Context())), [['<span class="math" translate="no" data-src="${&lt;wbr&gt;}$">${&lt;wbr&gt;}$</span>'], '']);
156
+ assert.deepStrictEqual(inspect(parser, input('${*a*}$')), [['<span class="math" translate="no" data-src="${*a*}$">${*a*}$</span>'], '']);
157
+ assert.deepStrictEqual(inspect(parser, input('${<wbr>}$')), [['<span class="math" translate="no" data-src="${&lt;wbr&gt;}$">${&lt;wbr&gt;}$</span>'], '']);
159
158
  });
160
159
 
161
160
  });