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,6 +1,6 @@
1
- import { BracketParser } from '../inline';
2
- import { Context, State, Recursion, Backtrack } from '../context';
3
- import { List, Node } from '../../combinator/data/parser';
1
+ import { BracketParser, InlineParser } from '../inline';
2
+ import { Input, State, Recursion, Backtrack } from '../context';
3
+ import { List, Node, Result } from '../../combinator/parser';
4
4
  import { union, some, recursion, precedence, surround, isBacktrack, setBacktrack, lazy } from '../../combinator';
5
5
  import { inline } from '../inline';
6
6
  import { textlink } from './link';
@@ -8,127 +8,152 @@ import { str } from '../source';
8
8
  import { unwrap } from '../util';
9
9
  import { html, defrag } from 'typed-dom/dom';
10
10
 
11
- export function bracketname(context: Context, opener: number, closer: number): string {
12
- const { range, linebreak } = context;
11
+ export function bracketname(input: Input, opener: number, closer: number): string {
12
+ const { range, linebreak } = input;
13
13
  return range - opener - closer === 0 || linebreak === 0 && range - opener - closer <= 16
14
14
  ? 'paren'
15
15
  : 'bracket';
16
16
  }
17
17
 
18
18
  export const bracket: BracketParser = lazy(() => union([
19
- input => {
19
+ (input, output) => {
20
20
  const { source, position } = input;
21
21
  switch (source[position]) {
22
22
  case '(':
23
- return p1(input);
23
+ return p1(input, output);
24
24
  case '(':
25
- return p2(input);
25
+ return p2(input, output);
26
26
  case '[':
27
- return s1(input);
27
+ return s1(input, output);
28
28
  case '[':
29
- return s2(input);
29
+ return s2(input, output);
30
30
  case '{':
31
- return c1(input);
31
+ return c1(input, output);
32
32
  case '{':
33
- return c2(input);
33
+ return c2(input, output);
34
34
  case '"':
35
- return d1(input);
35
+ return d1(input, output);
36
36
  }
37
37
  }
38
38
  ]));
39
39
 
40
- const p1 = lazy(() => surround(
40
+ const p1 = lazy(() => surround<InlineParser>(
41
41
  str('('),
42
- precedence(1, recursion(Recursion.bracket, some(inline, ')', [[')', 1]]))),
42
+ precedence(1, recursion(Recursion.inline, some(inline, ')', [[')', 1]]))),
43
43
  str(')'),
44
44
  true, [],
45
- ([as, bs = new List(), cs], context) => new List([
46
- new Node(html('span',
47
- { class: bracketname(context, 1, 1) },
48
- defrag(unwrap(as.import(bs as List<Node<string>>).import(cs)))))
49
- ]),
50
- ([as, bs = new List()], context) => new List([
51
- new Node(html('span',
52
- { class: bracketname(context, 1, 0) },
53
- defrag(unwrap(as.import(bs as List<Node<string>>)))))
54
- ])));
45
+ ([as, bs = new List(), cs], input, output) =>
46
+ output.append(new Node(html('span',
47
+ { class: bracketname(input, 1, 1) },
48
+ defrag(unwrap(as.import(bs as List<Node<string>>).import(cs)))))),
49
+ ([as, bs = new List()], input, output) =>
50
+ output.append(new Node(html('span',
51
+ { class: bracketname(input, 1, 0) },
52
+ defrag(unwrap(as.import(bs as List<Node<string>>))))))));
55
53
 
56
- const p2 = lazy(() => surround(
54
+ const p2 = lazy(() => surround<InlineParser>(
57
55
  str('('),
58
- precedence(1, recursion(Recursion.bracket, some(inline, ')', [[')', 1]]))),
56
+ precedence(1, recursion(Recursion.inline, some(inline, ')', [[')', 1]]))),
59
57
  str(')'),
60
58
  true, [],
61
- ([as, bs = new List(), cs], context) => new List([
62
- new Node(html('span',
63
- { class: bracketname(context, 1, 1) },
64
- defrag(unwrap(as.import(bs as List<Node<string>>).import(cs)))))
65
- ]),
66
- ([as, bs = new List()], context) => new List([
67
- new Node(html('span',
68
- { class: bracketname(context, 1, 0) },
69
- defrag(unwrap(as.import(bs as List<Node<string>>)))))
70
- ])));
59
+ ([as, bs = new List(), cs], input, output) =>
60
+ output.append(new Node(html('span',
61
+ { class: bracketname(input, 1, 1) },
62
+ defrag(unwrap(as.import(bs as List<Node<string>>).import(cs)))))),
63
+ ([as, bs = new List()], input, output) =>
64
+ output.append(new Node(html('span',
65
+ { class: bracketname(input, 1, 0) },
66
+ defrag(unwrap(as.import(bs as List<Node<string>>))))))));
71
67
 
72
- const s1 = lazy(() => surround(
68
+ const s1 = lazy(() => surround<InlineParser>(
73
69
  str('['),
74
- precedence(1, recursion(Recursion.bracket, some(inline, ']', [[']', 1]]))),
70
+ precedence(1, recursion(Recursion.inline, some(inline, ']', [[']', 1]]))),
75
71
  str(']'),
76
72
  true,
77
73
  [2 | Backtrack.common],
78
- ([as, bs = new List(), cs], context) => {
79
- const { source, position, range, linebreak } = context;
74
+ ([as, bs = new List(), cs], input, output) => {
75
+ output.import(as.import(bs as List<Node<string>>).import(cs));
76
+ const { source, position, range, linebreak } = input;
80
77
  const head = position - range;
81
78
  if (source[head + 1] === '[' && (linebreak !== 0 || source[position - 2] !== ']')) {
82
- setBacktrack(context, 2 | Backtrack.doublebracket, head);
79
+ setBacktrack(input, 2 | Backtrack.doublebracket, head);
83
80
  }
84
- if (context.state & State.link) {
81
+ if (input.state & State.link) {
85
82
  if (linebreak !== 0) {
86
- setBacktrack(context, 2 | Backtrack.link | Backtrack.ruby, head);
83
+ setBacktrack(input, 2 | Backtrack.link | Backtrack.ruby, head);
87
84
  }
88
85
  else if (source[position] !== '{') {
89
- setBacktrack(context, 2 | Backtrack.link, head);
86
+ setBacktrack(input, 2 | Backtrack.link, head);
90
87
  }
91
88
  else {
92
- if (!isBacktrack(context, 1 | Backtrack.link) && !textlink(context)) {
93
- setBacktrack(context, 2 | Backtrack.link, head);
89
+ if (!isBacktrack(input, 1 | Backtrack.link)) {
90
+ input.memory = {
91
+ position,
92
+ range,
93
+ head,
94
+ };
95
+ return cont;
94
96
  }
95
- context.position = position;
96
- context.range = range;
97
+ input.position = position;
98
+ input.range = range;
97
99
  }
98
100
  }
99
- return as.import(bs as List<Node<string>>).import(cs);
101
+ return output.context;
100
102
  },
101
- ([as, bs = new List()]) => as.import(bs as List<Node<string>>)));
103
+ ([as, bs = new List()], _, output) => output.import(as.import(bs as List<Node<string>>))));
102
104
 
103
- const s2 = lazy(() => surround(
105
+ interface Memory {
106
+ readonly position: number;
107
+ readonly range: number;
108
+ readonly head: number;
109
+ }
110
+ const cont: Result<HTMLElement | string, Input<Memory>> = [
111
+ (_, output) => {
112
+ output.push();
113
+ return output.context;
114
+ },
115
+ lazy(() => textlink),
116
+ (input, output) => {
117
+ const { memory: { position, range, head } } = input;
118
+ if (output.state) {
119
+ setBacktrack(input, 2 | Backtrack.link, head);
120
+ }
121
+ input.position = position;
122
+ input.range = range;
123
+ output.pop();
124
+ return output.context;
125
+ },
126
+ ];
127
+
128
+ const s2 = lazy(() => surround<InlineParser>(
104
129
  str('['),
105
- precedence(1, recursion(Recursion.bracket, some(inline, ']', [[']', 1]]))),
130
+ precedence(1, recursion(Recursion.inline, some(inline, ']', [[']', 1]]))),
106
131
  str(']'),
107
132
  true, [],
108
133
  undefined,
109
- ([as, bs = new List()]) => as.import(bs as List<Node<string>>)));
134
+ ([as, bs = new List()], _, output) => output.import(as.import(bs as List<Node<string>>))));
110
135
 
111
- const c1 = lazy(() => surround(
136
+ const c1 = lazy(() => surround<InlineParser>(
112
137
  str('{'),
113
- precedence(1, recursion(Recursion.bracket, some(inline, '}', [['}', 1]]))),
138
+ precedence(1, recursion(Recursion.inline, some(inline, '}', [['}', 1]]))),
114
139
  str('}'),
115
140
  true, [],
116
141
  undefined,
117
- ([as, bs = new List()]) => as.import(bs as List<Node<string>>)));
142
+ ([as, bs = new List()], _, output) => output.import(as.import(bs as List<Node<string>>))));
118
143
 
119
- const c2 = lazy(() => surround(
144
+ const c2 = lazy(() => surround<InlineParser>(
120
145
  str('{'),
121
- precedence(1, recursion(Recursion.bracket, some(inline, '}', [['}', 1]]))),
146
+ precedence(1, recursion(Recursion.inline, some(inline, '}', [['}', 1]]))),
122
147
  str('}'),
123
148
  true, [],
124
149
  undefined,
125
- ([as, bs = new List()]) => as.import(bs as List<Node<string>>)));
150
+ ([as, bs = new List()], _, output) => output.import(as.import(bs as List<Node<string>>))));
126
151
 
127
- const d1 = lazy(() => surround(
152
+ const d1 = lazy(() => surround<InlineParser>(
128
153
  str('"'),
129
154
  // 改行の優先度を構文ごとに変える場合シグネチャの優先度対応が必要
130
- precedence(2, recursion(Recursion.bracket, some(inline, /["\n]/y, [['"', 2], ['\n', 3]]))),
155
+ precedence(2, recursion(Recursion.inline, some(inline, /["\n]/y, [['"', 2], ['\n', 3]]))),
131
156
  str('"'),
132
157
  true, [],
133
158
  undefined,
134
- ([as, bs = new List()]) => as.import(bs as List<Node<string>>)));
159
+ ([as, bs = new List()], _, output) => output.import(as.import(bs as List<Node<string>>))));
@@ -1,7 +1,6 @@
1
1
  import { code } from './code';
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/code', () => {
@@ -9,47 +8,47 @@ describe('Unit: parser/inline/code', () => {
9
8
  const parser = some(code);
10
9
 
11
10
  it('invalid', () => {
12
- assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
13
- assert.deepStrictEqual(inspect(parser, input('`', new Context())), [['`'], '']);
14
- assert.deepStrictEqual(inspect(parser, input('``', new Context())), [['``'], '']);
15
- assert.deepStrictEqual(inspect(parser, input('``a`', new Context())), [['<code class="invalid">``a`</code>'], '']);
16
- assert.deepStrictEqual(inspect(parser, input('`a``', new Context())), [ [ '<code class="invalid">`a``</code>' ], '' ]);
17
- assert.deepStrictEqual(inspect(parser, input('`\n`', new Context())), [['`'], '\n`']);
18
- assert.deepStrictEqual(inspect(parser, input('`a\nb`', new Context())), [['<code class="invalid">`a</code>'], '\nb`']);
19
- assert.deepStrictEqual(inspect(parser, input('`a\\\nb`', new Context())), [['<code class="invalid">`a\\</code>'], '\nb`']);
20
- assert.deepStrictEqual(inspect(parser, input(' ` `', new Context())), undefined);
11
+ assert.deepStrictEqual(inspect(parser, input('')), undefined);
12
+ assert.deepStrictEqual(inspect(parser, input('`')), [['`'], '']);
13
+ assert.deepStrictEqual(inspect(parser, input('``')), [['``'], '']);
14
+ assert.deepStrictEqual(inspect(parser, input('``a`')), [['<code class="invalid">``a`</code>'], '']);
15
+ assert.deepStrictEqual(inspect(parser, input('`a``')), [ [ '<code class="invalid">`a``</code>' ], '' ]);
16
+ assert.deepStrictEqual(inspect(parser, input('`\n`')), [['`'], '\n`']);
17
+ assert.deepStrictEqual(inspect(parser, input('`a\nb`')), [['<code class="invalid">`a</code>'], '\nb`']);
18
+ assert.deepStrictEqual(inspect(parser, input('`a\\\nb`')), [['<code class="invalid">`a\\</code>'], '\nb`']);
19
+ assert.deepStrictEqual(inspect(parser, input(' ` `')), undefined);
21
20
  });
22
21
 
23
22
  it('basic', () => {
24
- assert.deepStrictEqual(inspect(parser, input('` `', new Context())), [['<code data-src="` `"> </code>'], '']);
25
- assert.deepStrictEqual(inspect(parser, input('` `', new Context())), [['<code data-src="` `"> </code>'], '']);
26
- assert.deepStrictEqual(inspect(parser, input('` `', new Context())), [['<code data-src="` `"> </code>'], '']);
27
- assert.deepStrictEqual(inspect(parser, input('`a`', new Context())), [['<code data-src="`a`">a</code>'], '']);
28
- assert.deepStrictEqual(inspect(parser, input('`ab`', new Context())), [['<code data-src="`ab`">ab</code>'], '']);
29
- assert.deepStrictEqual(inspect(parser, input('`a`b', new Context())), [['<code data-src="`a`">a</code>'], 'b']);
30
- assert.deepStrictEqual(inspect(parser, input('`a`b`', new Context())), [['<code data-src="`a`">a</code>'], 'b`']);
31
- assert.deepStrictEqual(inspect(parser, input('`a`\n', new Context())), [['<code data-src="`a`">a</code>'], '\n']);
23
+ assert.deepStrictEqual(inspect(parser, input('` `')), [['<code data-src="` `"> </code>'], '']);
24
+ assert.deepStrictEqual(inspect(parser, input('` `')), [['<code data-src="` `"> </code>'], '']);
25
+ assert.deepStrictEqual(inspect(parser, input('` `')), [['<code data-src="` `"> </code>'], '']);
26
+ assert.deepStrictEqual(inspect(parser, input('`a`')), [['<code data-src="`a`">a</code>'], '']);
27
+ assert.deepStrictEqual(inspect(parser, input('`ab`')), [['<code data-src="`ab`">ab</code>'], '']);
28
+ assert.deepStrictEqual(inspect(parser, input('`a`b')), [['<code data-src="`a`">a</code>'], 'b']);
29
+ assert.deepStrictEqual(inspect(parser, input('`a`b`')), [['<code data-src="`a`">a</code>'], 'b`']);
30
+ assert.deepStrictEqual(inspect(parser, input('`a`\n')), [['<code data-src="`a`">a</code>'], '\n']);
32
31
  });
33
32
 
34
33
  it('escape', () => {
35
- assert.deepStrictEqual(inspect(parser, input('`\\`', new Context())), [['<code data-src="`\\`">\\</code>'], '']);
36
- assert.deepStrictEqual(inspect(parser, input('`\\\\`', new Context())), [['<code data-src="`\\\\`">\\\\</code>'], '']);
37
- assert.deepStrictEqual(inspect(parser, input('`&nbsp;`', new Context())), [['<code data-src="`&amp;nbsp;`">&amp;nbsp;</code>'], '']);
38
- assert.deepStrictEqual(inspect(parser, input('` `` `', new Context())), [['<code data-src="` `` `">``</code>'], '']);
39
- assert.deepStrictEqual(inspect(parser, input('`` ` ``', new Context())), [['<code data-src="`` ` ``">`</code>'], '']);
34
+ assert.deepStrictEqual(inspect(parser, input('`\\`')), [['<code data-src="`\\`">\\</code>'], '']);
35
+ assert.deepStrictEqual(inspect(parser, input('`\\\\`')), [['<code data-src="`\\\\`">\\\\</code>'], '']);
36
+ assert.deepStrictEqual(inspect(parser, input('`&nbsp;`')), [['<code data-src="`&amp;nbsp;`">&amp;nbsp;</code>'], '']);
37
+ assert.deepStrictEqual(inspect(parser, input('` `` `')), [['<code data-src="` `` `">``</code>'], '']);
38
+ assert.deepStrictEqual(inspect(parser, input('`` ` ``')), [['<code data-src="`` ` ``">`</code>'], '']);
40
39
  });
41
40
 
42
41
  it('nest', () => {
43
- assert.deepStrictEqual(inspect(parser, input('`<wbr>`', new Context())), [['<code data-src="`&lt;wbr&gt;`">&lt;wbr&gt;</code>'], '']);
44
- assert.deepStrictEqual(inspect(parser, input('`*u*`', new Context())), [['<code data-src="`*u*`">*u*</code>'], '']);
42
+ assert.deepStrictEqual(inspect(parser, input('`<wbr>`')), [['<code data-src="`&lt;wbr&gt;`">&lt;wbr&gt;</code>'], '']);
43
+ assert.deepStrictEqual(inspect(parser, input('`*u*`')), [['<code data-src="`*u*`">*u*</code>'], '']);
45
44
  });
46
45
 
47
46
  it('trim', () => {
48
- assert.deepStrictEqual(inspect(parser, input('`a `', new Context())), [['<code data-src="`a `">a </code>'], '']);
49
- assert.deepStrictEqual(inspect(parser, input('` a`', new Context())), [['<code data-src="` a`"> a</code>'], '']);
50
- assert.deepStrictEqual(inspect(parser, input('` a `', new Context())), [['<code data-src="` a `"> a </code>'], '']);
51
- assert.deepStrictEqual(inspect(parser, input('` a `', new Context())), [['<code data-src="` a `"> a </code>'], '']);
52
- assert.deepStrictEqual(inspect(parser, input('`\ta\t`', new Context())), [['<code data-src="`\ta\t`">\ta\t</code>'], '']);
47
+ assert.deepStrictEqual(inspect(parser, input('`a `')), [['<code data-src="`a `">a </code>'], '']);
48
+ assert.deepStrictEqual(inspect(parser, input('` a`')), [['<code data-src="` a`"> a</code>'], '']);
49
+ assert.deepStrictEqual(inspect(parser, input('` a `')), [['<code data-src="` a `"> a </code>'], '']);
50
+ assert.deepStrictEqual(inspect(parser, input('` a `')), [['<code data-src="` a `"> a </code>'], '']);
51
+ assert.deepStrictEqual(inspect(parser, input('`\ta\t`')), [['<code data-src="`\ta\t`">\ta\t</code>'], '']);
53
52
  });
54
53
 
55
54
  });
@@ -1,20 +1,20 @@
1
1
  import { CodeParser } from '../inline';
2
- import { List, Node } from '../../combinator/data/parser';
2
+ import { Node } from '../../combinator/parser';
3
3
  import { match } from '../../combinator';
4
4
  import { invalid } from '../util';
5
5
  import { html } from 'typed-dom/dom';
6
6
 
7
7
  export const code: CodeParser = match(
8
8
  /(`+)(?!`)([^\r\n]*?)(?:((?<!`)\1(?!`))|(?=$|\r?\n))/y,
9
- ([whole, opener, body, closer]) => () =>
9
+ ([whole, opener, body, closer]) => (_, output) =>
10
10
  closer
11
- ? new List([new Node(html('code', { 'data-src': whole }, format(body)))])
11
+ ? output.append(new Node(html('code', { 'data-src': whole }, format(body))))
12
12
  : body
13
- ? new List([new Node(html('code', {
13
+ ? output.append(new Node(html('code', {
14
14
  class: 'invalid',
15
15
  ...invalid('code', 'syntax', `Missing the closing symbol "${opener}"`)
16
- }, whole))])
17
- : new List([new Node(opener)]));
16
+ }, whole)))
17
+ : output.append(new Node(opener)));
18
18
 
19
19
  function format(text: string): string {
20
20
  return text.length > 2
@@ -1,7 +1,6 @@
1
1
  import { deletion } from './deletion';
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/deletion', () => {
@@ -9,38 +8,38 @@ describe('Unit: parser/inline/deletion', () => {
9
8
  const parser = some(deletion);
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())), 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~~')), undefined);
18
17
  });
19
18
 
20
19
  it('basic', () => {
21
- assert.deepStrictEqual(inspect(parser, input('~~a~~', new Context())), [['<del>a</del>'], '']);
22
- assert.deepStrictEqual(inspect(parser, input('~~a~b~~', new Context())), [['<del>a~b</del>'], '']);
23
- assert.deepStrictEqual(inspect(parser, input('~~ ~~', new Context())), [['<del> </del>'], '']);
24
- assert.deepStrictEqual(inspect(parser, input('~~ a~~', new Context())), [['<del> a</del>'], '']);
25
- assert.deepStrictEqual(inspect(parser, input('~~ a ~~', new Context())), [['<del> a </del>'], '']);
26
- assert.deepStrictEqual(inspect(parser, input('~~ a ~~', new Context())), [['<del> a </del>'], '']);
27
- assert.deepStrictEqual(inspect(parser, input('~~\na~~', new Context())), [['<del><br>a</del>'], '']);
28
- assert.deepStrictEqual(inspect(parser, input('~~\\\na~~', new Context())), [['<del><br>a</del>'], '']);
29
- assert.deepStrictEqual(inspect(parser, input('~~<wbr>a~~', new Context())), [['<del><wbr>a</del>'], '']);
30
- assert.deepStrictEqual(inspect(parser, input('~~a ~~', new Context())), [['<del>a </del>'], '']);
31
- assert.deepStrictEqual(inspect(parser, input('~~a \n ~~', new Context())), [['<del>a </del>'], '']);
32
- assert.deepStrictEqual(inspect(parser, input('~~a\n~~', new Context())), [['<del>a</del>'], '']);
33
- assert.deepStrictEqual(inspect(parser, input('~~a\n ~~', new Context())), [['<del>a </del>'], '']);
34
- assert.deepStrictEqual(inspect(parser, input('~~a\n<wbr>~~', new Context())), [['<del>a<wbr></del>'], '']);
35
- assert.deepStrictEqual(inspect(parser, input('~~a\nb~~', new Context())), [['<del>a<br>b</del>'], '']);
36
- assert.deepStrictEqual(inspect(parser, input('~~a\\\nb~~', new Context())), [['<del>a<br>b</del>'], '']);
37
- assert.deepStrictEqual(inspect(parser, input('~~\\~~~', new Context())), [['<del>~</del>'], '']);
38
- assert.deepStrictEqual(inspect(parser, input('~~a~~~', new Context())), [['<del>a</del>'], '~']);
20
+ assert.deepStrictEqual(inspect(parser, input('~~a~~')), [['<del>a</del>'], '']);
21
+ assert.deepStrictEqual(inspect(parser, input('~~a~b~~')), [['<del>a~b</del>'], '']);
22
+ assert.deepStrictEqual(inspect(parser, input('~~ ~~')), [['<del> </del>'], '']);
23
+ assert.deepStrictEqual(inspect(parser, input('~~ a~~')), [['<del> a</del>'], '']);
24
+ assert.deepStrictEqual(inspect(parser, input('~~ a ~~')), [['<del> a </del>'], '']);
25
+ assert.deepStrictEqual(inspect(parser, input('~~ a ~~')), [['<del> a </del>'], '']);
26
+ assert.deepStrictEqual(inspect(parser, input('~~\na~~')), [['<del><br>a</del>'], '']);
27
+ assert.deepStrictEqual(inspect(parser, input('~~\\\na~~')), [['<del><br>a</del>'], '']);
28
+ assert.deepStrictEqual(inspect(parser, input('~~<wbr>a~~')), [['<del><wbr>a</del>'], '']);
29
+ assert.deepStrictEqual(inspect(parser, input('~~a ~~')), [['<del>a </del>'], '']);
30
+ assert.deepStrictEqual(inspect(parser, input('~~a \n ~~')), [['<del>a </del>'], '']);
31
+ assert.deepStrictEqual(inspect(parser, input('~~a\n~~')), [['<del>a</del>'], '']);
32
+ assert.deepStrictEqual(inspect(parser, input('~~a\n ~~')), [['<del>a </del>'], '']);
33
+ assert.deepStrictEqual(inspect(parser, input('~~a\n<wbr>~~')), [['<del>a<wbr></del>'], '']);
34
+ assert.deepStrictEqual(inspect(parser, input('~~a\nb~~')), [['<del>a<br>b</del>'], '']);
35
+ assert.deepStrictEqual(inspect(parser, input('~~a\\\nb~~')), [['<del>a<br>b</del>'], '']);
36
+ assert.deepStrictEqual(inspect(parser, input('~~\\~~~')), [['<del>~</del>'], '']);
37
+ assert.deepStrictEqual(inspect(parser, input('~~a~~~')), [['<del>a</del>'], '~']);
39
38
  });
40
39
 
41
40
  it('nest', () => {
42
- assert.deepStrictEqual(inspect(parser, input('~~*~~a~~*~~', new Context())), [['<del><em><del>a</del></em></del>'], '']);
43
- assert.deepStrictEqual(inspect(parser, input('~~*++a++*~~', new Context())), [['<del><em><ins>a</ins></em></del>'], '']);
41
+ assert.deepStrictEqual(inspect(parser, input('~~*~~a~~*~~')), [['<del><em><del>a</del></em></del>'], '']);
42
+ assert.deepStrictEqual(inspect(parser, input('~~*++a++*~~')), [['<del><em><ins>a</ins></em></del>'], '']);
44
43
  });
45
44
 
46
45
  });
@@ -1,7 +1,7 @@
1
1
  import { DeletionParser } from '../inline';
2
2
  import { Recursion, Command } from '../context';
3
- import { List, Node } from '../../combinator/data/parser';
4
- import { union, some, precedence, surround, open, lazy } from '../../combinator';
3
+ import { List, Node } from '../../combinator/parser';
4
+ import { union, some, precedence, backtrack, surround, open, lazy } from '../../combinator';
5
5
  import { inline } from '../inline';
6
6
  import { repeat } from '../repeat';
7
7
  import { blankWith } from '../visibility';
@@ -9,7 +9,7 @@ import { unwrap } from '../util';
9
9
  import { html, defrag } from 'typed-dom/dom';
10
10
 
11
11
  export const deletion: DeletionParser = lazy(() =>
12
- repeat('~~', '', '~~', Recursion.inline, precedence(0, surround(
12
+ repeat('~~', '', '~~', Recursion.inline, precedence(0, backtrack(surround(
13
13
  '',
14
14
  some(union([
15
15
  some(inline, blankWith('\n', '~~')),
@@ -17,6 +17,6 @@ export const deletion: DeletionParser = lazy(() =>
17
17
  ])),
18
18
  '~~',
19
19
  false, [],
20
- ([, bs], { buffer }) => buffer.import(bs),
21
- ([, bs], { buffer }) => bs && buffer.import(bs).push(new Node(Command.Cancel)) && buffer)),
20
+ ([, bs], _, output) => output.import(bs),
21
+ ([, bs], _, output) => bs && output.import(bs.push(new Node(Command.Cancel)))))),
22
22
  nodes => new List([new Node(html('del', defrag(unwrap(nodes))))])));
@@ -1,7 +1,6 @@
1
1
  import { emphasis } from './emphasis';
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/emphasis', () => {
@@ -9,50 +8,50 @@ describe('Unit: parser/inline/emphasis', () => {
9
8
  const parser = some(emphasis);
10
9
 
11
10
  it('invalid', () => {
12
- assert.deepStrictEqual(inspect(parser, input('*', new Context())), undefined);
13
- assert.deepStrictEqual(inspect(parser, input('*a', new Context())), [['*', 'a'], '']);
14
- assert.deepStrictEqual(inspect(parser, input('*a *', new Context())), [['*', 'a ', '*'], '']);
15
- assert.deepStrictEqual(inspect(parser, input('*a *', new Context())), [['*', 'a', ' ', '*'], '']);
16
- assert.deepStrictEqual(inspect(parser, input('*a\n*', new Context())), [['*', 'a', '<br>', '*'], '']);
17
- assert.deepStrictEqual(inspect(parser, input('*a\\ *', new Context())), [['*', 'a', ' ', '*'], '']);
18
- assert.deepStrictEqual(inspect(parser, input('*a\\\n*', new Context())), [['*', 'a', '<br>', '*'], '']);
19
- assert.deepStrictEqual(inspect(parser, input('*a**b', new Context())), [['*', 'a', '**', 'b'], '']);
20
- assert.deepStrictEqual(inspect(parser, input('* *', new Context())), undefined);
21
- assert.deepStrictEqual(inspect(parser, input('* a*', new Context())), undefined);
22
- assert.deepStrictEqual(inspect(parser, input('* a *', new Context())), undefined);
23
- assert.deepStrictEqual(inspect(parser, input('*\n*', new Context())), undefined);
24
- assert.deepStrictEqual(inspect(parser, input('*\na*', new Context())), undefined);
25
- assert.deepStrictEqual(inspect(parser, input('*\\ a*', 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);
29
- assert.deepStrictEqual(inspect(parser, input('***a***', new Context())), undefined);
30
- assert.deepStrictEqual(inspect(parser, input(' *a*', new Context())), undefined);
11
+ assert.deepStrictEqual(inspect(parser, input('*')), undefined);
12
+ assert.deepStrictEqual(inspect(parser, input('*a')), [['*', 'a'], '']);
13
+ assert.deepStrictEqual(inspect(parser, input('*a *')), [['*', 'a ', '*'], '']);
14
+ assert.deepStrictEqual(inspect(parser, input('*a *')), [['*', 'a', ' ', '*'], '']);
15
+ assert.deepStrictEqual(inspect(parser, input('*a\n*')), [['*', 'a', '<br>', '*'], '']);
16
+ assert.deepStrictEqual(inspect(parser, input('*a\\ *')), [['*', 'a', ' ', '*'], '']);
17
+ assert.deepStrictEqual(inspect(parser, input('*a\\\n*')), [['*', 'a', '<br>', '*'], '']);
18
+ assert.deepStrictEqual(inspect(parser, input('*a**b')), [['*', 'a', '**', 'b'], '']);
19
+ assert.deepStrictEqual(inspect(parser, input('* *')), undefined);
20
+ assert.deepStrictEqual(inspect(parser, input('* a*')), undefined);
21
+ assert.deepStrictEqual(inspect(parser, input('* a *')), undefined);
22
+ assert.deepStrictEqual(inspect(parser, input('*\n*')), undefined);
23
+ assert.deepStrictEqual(inspect(parser, input('*\na*')), undefined);
24
+ assert.deepStrictEqual(inspect(parser, input('*\\ a*')), 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);
28
+ assert.deepStrictEqual(inspect(parser, input('***a***')), undefined);
29
+ assert.deepStrictEqual(inspect(parser, input(' *a*')), undefined);
31
30
  });
32
31
 
33
32
  it('basic', () => {
34
- assert.deepStrictEqual(inspect(parser, input('*a*', new Context())), [['<em>a</em>'], '']);
35
- assert.deepStrictEqual(inspect(parser, input('*ab*', new Context())), [['<em>ab</em>'], '']);
36
- assert.deepStrictEqual(inspect(parser, input('*a**', new Context())), [['<em>a</em>'], '*']);
37
- assert.deepStrictEqual(inspect(parser, input('*a\nb*', new Context())), [['<em>a<br>b</em>'], '']);
38
- assert.deepStrictEqual(inspect(parser, input('*a\\\nb*', new Context())), [['<em>a<br>b</em>'], '']);
33
+ assert.deepStrictEqual(inspect(parser, input('*a*')), [['<em>a</em>'], '']);
34
+ assert.deepStrictEqual(inspect(parser, input('*ab*')), [['<em>ab</em>'], '']);
35
+ assert.deepStrictEqual(inspect(parser, input('*a**')), [['<em>a</em>'], '*']);
36
+ assert.deepStrictEqual(inspect(parser, input('*a\nb*')), [['<em>a<br>b</em>'], '']);
37
+ assert.deepStrictEqual(inspect(parser, input('*a\\\nb*')), [['<em>a<br>b</em>'], '']);
39
38
  });
40
39
 
41
40
  it('nest', () => {
42
- assert.deepStrictEqual(inspect(parser, input('*a *b**', new Context())), [['<em>a <em>b</em></em>'], '']);
43
- assert.deepStrictEqual(inspect(parser, input('*- *b**', new Context())), [['<em>- <em>b</em></em>'], '']);
44
- assert.deepStrictEqual(inspect(parser, input('*a **b***', new Context())), [['<em>a <strong>b</strong></em>'], '']);
45
- assert.deepStrictEqual(inspect(parser, input('*a\\ *b**', new Context())), [['<em>a <em>b</em></em>'], '']);
46
- assert.deepStrictEqual(inspect(parser, input('*a&Tab;*b**', new Context())), [['<em>a\t<em>b</em></em>'], '']);
47
- assert.deepStrictEqual(inspect(parser, input('*a<wbr>*b**', new Context())), [['<em>a<wbr><em>b</em></em>'], '']);
48
- assert.deepStrictEqual(inspect(parser, input('*a**b*', new Context())), [['<em>a**b</em>'], '']);
49
- assert.deepStrictEqual(inspect(parser, input('*a**b**', new Context())), [[ '*', 'a', '<strong>b</strong>'], '']);
50
- assert.deepStrictEqual(inspect(parser, input('*a**b**c', new Context())), [['*', 'a', '<strong>b</strong>', 'c'], '']);
51
- assert.deepStrictEqual(inspect(parser, input('*a**b**c*', new Context())), [['<em>a<strong>b</strong>c</em>'], '']);
52
- assert.deepStrictEqual(inspect(parser, input('*a**b**c*d', new Context())), [['<em>a<strong>b</strong>c</em>'], 'd']);
53
- assert.deepStrictEqual(inspect(parser, input('*`a`*', new Context())), [['<em><code data-src="`a`">a</code></em>'], '']);
54
- assert.deepStrictEqual(inspect(parser, input('*(*a*)*', new Context())), [['<em><span class="paren">(<em>a</em>)</span></em>'], '']);
55
- assert.deepStrictEqual(inspect(parser, input('*(**a**)*', new Context())), [['<em><span class="paren">(<strong>a</strong>)</span></em>'], '']);
41
+ assert.deepStrictEqual(inspect(parser, input('*a *b**')), [['<em>a <em>b</em></em>'], '']);
42
+ assert.deepStrictEqual(inspect(parser, input('*- *b**')), [['<em>- <em>b</em></em>'], '']);
43
+ assert.deepStrictEqual(inspect(parser, input('*a **b***')), [['<em>a <strong>b</strong></em>'], '']);
44
+ assert.deepStrictEqual(inspect(parser, input('*a\\ *b**')), [['<em>a <em>b</em></em>'], '']);
45
+ assert.deepStrictEqual(inspect(parser, input('*a&Tab;*b**')), [['<em>a\t<em>b</em></em>'], '']);
46
+ assert.deepStrictEqual(inspect(parser, input('*a<wbr>*b**')), [['<em>a<wbr><em>b</em></em>'], '']);
47
+ assert.deepStrictEqual(inspect(parser, input('*a**b*')), [['<em>a**b</em>'], '']);
48
+ assert.deepStrictEqual(inspect(parser, input('*a**b**')), [[ '*', 'a', '<strong>b</strong>'], '']);
49
+ assert.deepStrictEqual(inspect(parser, input('*a**b**c')), [['*', 'a', '<strong>b</strong>', 'c'], '']);
50
+ assert.deepStrictEqual(inspect(parser, input('*a**b**c*')), [['<em>a<strong>b</strong>c</em>'], '']);
51
+ assert.deepStrictEqual(inspect(parser, input('*a**b**c*d')), [['<em>a<strong>b</strong>c</em>'], 'd']);
52
+ assert.deepStrictEqual(inspect(parser, input('*`a`*')), [['<em><code data-src="`a`">a</code></em>'], '']);
53
+ assert.deepStrictEqual(inspect(parser, input('*(*a*)*')), [['<em><span class="paren">(<em>a</em>)</span></em>'], '']);
54
+ assert.deepStrictEqual(inspect(parser, input('*(**a**)*')), [['<em><span class="paren">(<strong>a</strong>)</span></em>'], '']);
56
55
  });
57
56
 
58
57
  });
@@ -1,7 +1,7 @@
1
1
  import { EmphasisParser } from '../inline';
2
2
  import { Recursion } from '../context';
3
- import { List, Node } from '../../combinator/data/parser';
4
- import { union, some, recursion, precedence, surround, lazy } from '../../combinator';
3
+ import { List, Node } from '../../combinator/parser';
4
+ import { union, some, recursion, precedence, backtrack, surround, lazy } from '../../combinator';
5
5
  import { inline } from '../inline';
6
6
  import { strong } from './strong';
7
7
  import { str } from '../source';
@@ -9,7 +9,7 @@ import { beforeNonblankWith, afterNonblank } from '../visibility';
9
9
  import { unwrap } from '../util';
10
10
  import { html, defrag } from 'typed-dom/dom';
11
11
 
12
- export const emphasis: EmphasisParser = lazy(() => surround(
12
+ export const emphasis: EmphasisParser = lazy(() => backtrack(surround(
13
13
  str('*', beforeNonblankWith(/(?!\*)/)),
14
14
  precedence(0, recursion(Recursion.inline,
15
15
  some(union([
@@ -18,5 +18,5 @@ export const emphasis: EmphasisParser = lazy(() => surround(
18
18
  ])))),
19
19
  str('*'),
20
20
  false, [],
21
- ([, bs]) => new List([new Node(html('em', defrag(unwrap(bs))))]),
22
- ([as, bs]) => bs && as.import(bs as List<Node<string>>)));
21
+ ([, bs], _, output) => output.append(new Node(html('em', defrag(unwrap(bs))))),
22
+ ([as, bs], _, output) => bs && output.import(as.import(bs as List<Node<string>>)))));