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,6 @@
1
1
  import { placeholder } from './placeholder';
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/extension/placeholder', () => {
@@ -9,50 +8,50 @@ describe('Unit: parser/inline/extension/placeholder', () => {
9
8
  const parser = some(placeholder);
10
9
 
11
10
  it('invalid', () => {
12
- assert.deepStrictEqual(inspect(parser, input('[]', new Context())), undefined);
13
- assert.deepStrictEqual(inspect(parser, input('[a]', new Context())), undefined);
14
- assert.deepStrictEqual(inspect(parser, input('[ab]', new Context())), undefined);
15
- assert.deepStrictEqual(inspect(parser, input('[^]', new Context())), undefined);
16
- assert.deepStrictEqual(inspect(parser, input('[^]]', new Context())), undefined);
17
- assert.deepStrictEqual(inspect(parser, input('[^\\]', new Context())), [['[^', ']'], '']);
18
- assert.deepStrictEqual(inspect(parser, input('[^ ]', new Context())), undefined);
19
- assert.deepStrictEqual(inspect(parser, input('[^ a]', new Context())), undefined);
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('[^\n]', new Context())), undefined);
23
- assert.deepStrictEqual(inspect(parser, input('[^\na]', new Context())), undefined);
24
- assert.deepStrictEqual(inspect(parser, input('[^\\\na]', new Context())), undefined);
25
- assert.deepStrictEqual(inspect(parser, input('[^ !http://host]', new Context())), undefined);
26
- assert.deepStrictEqual(inspect(parser, input('[^a', new Context())), [['[^', 'a'], '']);
27
- assert.deepStrictEqual(inspect(parser, input('[[]', new Context())), undefined);
28
- assert.deepStrictEqual(inspect(parser, input('[]]', new Context())), undefined);
29
- assert.deepStrictEqual(inspect(parser, input('[[]]', new Context())), undefined);
30
- assert.deepStrictEqual(inspect(parser, input('[[ ]]', new Context())), undefined);
31
- assert.deepStrictEqual(inspect(parser, input('[[a]]', new Context())), undefined);
32
- assert.deepStrictEqual(inspect(parser, input(' [^a]', new Context())), undefined);
11
+ assert.deepStrictEqual(inspect(parser, input('[]')), undefined);
12
+ assert.deepStrictEqual(inspect(parser, input('[a]')), undefined);
13
+ assert.deepStrictEqual(inspect(parser, input('[ab]')), undefined);
14
+ assert.deepStrictEqual(inspect(parser, input('[^]')), undefined);
15
+ assert.deepStrictEqual(inspect(parser, input('[^]]')), undefined);
16
+ assert.deepStrictEqual(inspect(parser, input('[^\\]')), [['[^', ']'], '']);
17
+ assert.deepStrictEqual(inspect(parser, input('[^ ]')), undefined);
18
+ assert.deepStrictEqual(inspect(parser, input('[^ a]')), undefined);
19
+ assert.deepStrictEqual(inspect(parser, input('[^\\ ]')), undefined);
20
+ assert.deepStrictEqual(inspect(parser, input('[^\\ a]')), undefined);
21
+ assert.deepStrictEqual(inspect(parser, input('[^\n]')), undefined);
22
+ assert.deepStrictEqual(inspect(parser, input('[^\na]')), undefined);
23
+ assert.deepStrictEqual(inspect(parser, input('[^\\\na]')), undefined);
24
+ assert.deepStrictEqual(inspect(parser, input('[^ !http://host]')), undefined);
25
+ assert.deepStrictEqual(inspect(parser, input('[^a')), [['[^', 'a'], '']);
26
+ assert.deepStrictEqual(inspect(parser, input('[[]')), undefined);
27
+ assert.deepStrictEqual(inspect(parser, input('[]]')), undefined);
28
+ assert.deepStrictEqual(inspect(parser, input('[[]]')), undefined);
29
+ assert.deepStrictEqual(inspect(parser, input('[[ ]]')), undefined);
30
+ assert.deepStrictEqual(inspect(parser, input('[[a]]')), undefined);
31
+ assert.deepStrictEqual(inspect(parser, input(' [^a]')), undefined);
33
32
  });
34
33
 
35
34
  it('valid', () => {
36
- assert.deepStrictEqual(inspect(parser, input('[^a]', new Context())), [['<span class="invalid">[^a]</span>'], '']);
37
- assert.deepStrictEqual(inspect(parser, input('[^a b]', new Context())), [['<span class="invalid">[^a b]</span>'], '']);
38
- assert.deepStrictEqual(inspect(parser, input('[^a ]', new Context())), [['<span class="invalid">[^a ]</span>'], '']);
39
- assert.deepStrictEqual(inspect(parser, input('[^a ]', new Context())), [['<span class="invalid">[^a ]</span>'], '']);
40
- assert.deepStrictEqual(inspect(parser, input('[^a\\ ]', new Context())), [['<span class="invalid">[^a\\ ]</span>'], '']);
41
- assert.deepStrictEqual(inspect(parser, input('[^a\\ \\ ]', new Context())), [['<span class="invalid">[^a\\ \\ ]</span>'], '']);
42
- assert.deepStrictEqual(inspect(parser, input('[^a\n]', new Context())), [['<span class="invalid">[^a\n]</span>'], '']);
43
- assert.deepStrictEqual(inspect(parser, input('[^a\\\n]', new Context())), [['<span class="invalid">[^a\\\n]</span>'], '']);
44
- assert.deepStrictEqual(inspect(parser, input('[^a\nb]', new Context())), [['<span class="invalid">[^a\nb]</span>'], '']);
45
- assert.deepStrictEqual(inspect(parser, input('[^a\\\nb]', new Context())), [['<span class="invalid">[^a\\\nb]</span>'], '']);
46
- assert.deepStrictEqual(inspect(parser, input('[^a<wbr>]', new Context())), [['<span class="invalid">[^a&lt;wbr&gt;]</span>'], '']);
47
- assert.deepStrictEqual(inspect(parser, input('[^a<wbr><wbr>]', new Context())), [['<span class="invalid">[^a&lt;wbr&gt;&lt;wbr&gt;]</span>'], '']);
48
- assert.deepStrictEqual(inspect(parser, input('[^==]', new Context())), [['<span class="invalid">[^==]</span>'], '']);
49
- assert.deepStrictEqual(inspect(parser, input('[^a[% b %]]', new Context())), [['<span class="invalid">[^a[% b %]]</span>'], '']);
50
- assert.deepStrictEqual(inspect(parser, input('[^a[% b %][% c %]]', new Context())), [['<span class="invalid">[^a[% b %][% c %]]</span>'], '']);
51
- assert.deepStrictEqual(inspect(parser, input('[^\\]]', new Context())), [['<span class="invalid">[^\\]]</span>'], '']);
52
- assert.deepStrictEqual(inspect(parser, input('[^(])]', new Context())), [['<span class="invalid">[^(])]</span>'], '']);
53
- assert.deepStrictEqual(inspect(parser, input('[^!http://host]', new Context())), [['<span class="invalid">[^!http://host]</span>'], '']);
54
- assert.deepStrictEqual(inspect(parser, input('[^[% a %]]', new Context())), [['<span class="invalid">[^[% a %]]</span>'], '']);
55
- assert.deepStrictEqual(inspect(parser, input('[^[% a %]b]', new Context())), [['<span class="invalid">[^[% a %]b]</span>'], '']);
35
+ assert.deepStrictEqual(inspect(parser, input('[^a]')), [['<span class="invalid">[^a]</span>'], '']);
36
+ assert.deepStrictEqual(inspect(parser, input('[^a b]')), [['<span class="invalid">[^a b]</span>'], '']);
37
+ assert.deepStrictEqual(inspect(parser, input('[^a ]')), [['<span class="invalid">[^a ]</span>'], '']);
38
+ assert.deepStrictEqual(inspect(parser, input('[^a ]')), [['<span class="invalid">[^a ]</span>'], '']);
39
+ assert.deepStrictEqual(inspect(parser, input('[^a\\ ]')), [['<span class="invalid">[^a\\ ]</span>'], '']);
40
+ assert.deepStrictEqual(inspect(parser, input('[^a\\ \\ ]')), [['<span class="invalid">[^a\\ \\ ]</span>'], '']);
41
+ assert.deepStrictEqual(inspect(parser, input('[^a\n]')), [['<span class="invalid">[^a\n]</span>'], '']);
42
+ assert.deepStrictEqual(inspect(parser, input('[^a\\\n]')), [['<span class="invalid">[^a\\\n]</span>'], '']);
43
+ assert.deepStrictEqual(inspect(parser, input('[^a\nb]')), [['<span class="invalid">[^a\nb]</span>'], '']);
44
+ assert.deepStrictEqual(inspect(parser, input('[^a\\\nb]')), [['<span class="invalid">[^a\\\nb]</span>'], '']);
45
+ assert.deepStrictEqual(inspect(parser, input('[^a<wbr>]')), [['<span class="invalid">[^a&lt;wbr&gt;]</span>'], '']);
46
+ assert.deepStrictEqual(inspect(parser, input('[^a<wbr><wbr>]')), [['<span class="invalid">[^a&lt;wbr&gt;&lt;wbr&gt;]</span>'], '']);
47
+ assert.deepStrictEqual(inspect(parser, input('[^==]')), [['<span class="invalid">[^==]</span>'], '']);
48
+ assert.deepStrictEqual(inspect(parser, input('[^a[% b %]]')), [['<span class="invalid">[^a[% b %]]</span>'], '']);
49
+ assert.deepStrictEqual(inspect(parser, input('[^a[% b %][% c %]]')), [['<span class="invalid">[^a[% b %][% c %]]</span>'], '']);
50
+ assert.deepStrictEqual(inspect(parser, input('[^\\]]')), [['<span class="invalid">[^\\]]</span>'], '']);
51
+ assert.deepStrictEqual(inspect(parser, input('[^(])]')), [['<span class="invalid">[^(])]</span>'], '']);
52
+ assert.deepStrictEqual(inspect(parser, input('[^!http://host]')), [['<span class="invalid">[^!http://host]</span>'], '']);
53
+ assert.deepStrictEqual(inspect(parser, input('[^[% a %]]')), [['<span class="invalid">[^[% a %]]</span>'], '']);
54
+ assert.deepStrictEqual(inspect(parser, input('[^[% a %]b]')), [['<span class="invalid">[^[% a %]b]</span>'], '']);
56
55
  });
57
56
 
58
57
  });
@@ -1,7 +1,7 @@
1
1
  import { ExtensionParser } from '../../inline';
2
2
  import { Recursion, Backtrack } 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 { str } from '../../source';
7
7
  import { beforeNonblank } from '../../visibility';
@@ -12,20 +12,19 @@ import { html } from 'typed-dom/dom';
12
12
 
13
13
  // All syntax surrounded by square brackets shouldn't contain line breaks.
14
14
 
15
- export const placeholder: ExtensionParser.PlaceholderParser = lazy(() => surround(
15
+ export const placeholder: ExtensionParser.PlaceholderParser = lazy(() => backtrack(surround(
16
16
  // ^はabbrで使用済みだが^:などのようにして分離使用可能
17
17
  str(/\[[:^|]/y, beforeNonblank),
18
- precedence(1, recursion(Recursion.bracket,
18
+ precedence(1, recursion(Recursion.inline,
19
19
  some(union([inline]), ']', [[']', 1]]))),
20
20
  str(']'),
21
21
  false,
22
22
  [3 | Backtrack.common],
23
- (_, context) => new List([
24
- new Node(html('span',
23
+ (_, input, output) =>
24
+ output.append(new Node(html('span',
25
25
  {
26
26
  class: 'invalid',
27
27
  ...invalid('extension', 'syntax', `Invalid start symbol or linebreak`),
28
28
  },
29
- context.source.slice(context.position - context.range, context.position)))
30
- ]),
31
- ([as, bs]) => bs && as.import(bs as List<Node<string>>)));
29
+ input.source.slice(input.position - input.range, input.position)))),
30
+ ([as, bs], _, output) => bs && output.import(as.import(bs as List<Node<string>>)))));
@@ -1,7 +1,7 @@
1
1
  import { html, TAGS } from './html';
2
+ import { Output } from '../../combinator/parser';
2
3
  import { some } from '../../combinator';
3
- import { input } from '../../combinator/data/parser';
4
- import { Context } from '../context';
4
+ import { input } from '../context';
5
5
  import { inspect } from '../../debug.test';
6
6
 
7
7
  describe('Unit: parser/inline/html', () => {
@@ -9,131 +9,131 @@ describe('Unit: parser/inline/html', () => {
9
9
  const parser = some(html);
10
10
 
11
11
  it('hash', () => {
12
- assert(TAGS.every(tag => parser(input(`<${tag}>`, new Context()))));
12
+ assert(TAGS.every(tag => parser(input(`<${tag}>`), new Output())));
13
13
  });
14
14
 
15
15
  it('xss', () => {
16
- assert.deepStrictEqual(inspect(parser, input('<script>', new Context())), [['<span class="invalid">&lt;script&gt;</span>'], '']);
17
- assert.deepStrictEqual(inspect(parser, input('<script>alert()<script>', new Context())), [['<span class="invalid">&lt;script&gt;alert()&lt;script&gt;</span>'], '']);
18
- assert.deepStrictEqual(inspect(parser, input('<script>alert()</script>', new Context())), [['<span class="invalid">&lt;script&gt;alert()&lt;/script&gt;</span>'], '']);
19
- assert.deepStrictEqual(inspect(parser, input('<bdi onclick="alert()">', new Context())), [['<span class="invalid">&lt;bdi onclick="alert()"&gt;</span>'], '']);
20
- assert.deepStrictEqual(inspect(parser, input('<bdi onclick="alert()"></bdi>', new Context())), [['<span class="invalid">&lt;bdi onclick="alert()"&gt;&lt;/bdi&gt;</span>'], '']);
21
- assert.deepStrictEqual(inspect(parser, input('<bdi onclick="alert()">a</bdi>', new Context())), [['<span class="invalid">&lt;bdi onclick="alert()"&gt;a&lt;/bdi&gt;</span>'], '']);
22
- assert.deepStrictEqual(inspect(parser, input('<bdi><bdi onclick="alert()">a</bdi></bdi>', new Context())), [['<bdi><span class="invalid">&lt;bdi onclick="alert()"&gt;a&lt;/bdi&gt;</span></bdi>'], '']);
16
+ assert.deepStrictEqual(inspect(parser, input('<script>')), [['<span class="invalid">&lt;script&gt;</span>'], '']);
17
+ assert.deepStrictEqual(inspect(parser, input('<script>alert()<script>')), [['<span class="invalid">&lt;script&gt;alert()&lt;script&gt;</span>'], '']);
18
+ assert.deepStrictEqual(inspect(parser, input('<script>alert()</script>')), [['<span class="invalid">&lt;script&gt;alert()&lt;/script&gt;</span>'], '']);
19
+ assert.deepStrictEqual(inspect(parser, input('<bdi onclick="alert()">')), [['<span class="invalid">&lt;bdi onclick="alert()"&gt;</span>'], '']);
20
+ assert.deepStrictEqual(inspect(parser, input('<bdi onclick="alert()"></bdi>')), [['<span class="invalid">&lt;bdi onclick="alert()"&gt;&lt;/bdi&gt;</span>'], '']);
21
+ assert.deepStrictEqual(inspect(parser, input('<bdi onclick="alert()">a</bdi>')), [['<span class="invalid">&lt;bdi onclick="alert()"&gt;a&lt;/bdi&gt;</span>'], '']);
22
+ assert.deepStrictEqual(inspect(parser, input('<bdi><bdi onclick="alert()">a</bdi></bdi>')), [['<bdi><span class="invalid">&lt;bdi onclick="alert()"&gt;a&lt;/bdi&gt;</span></bdi>'], '']);
23
23
  });
24
24
 
25
25
  it('invalid', () => {
26
- assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
27
- assert.deepStrictEqual(inspect(parser, input('<0>', new Context())), undefined);
28
- assert.deepStrictEqual(inspect(parser, input('<aT>', new Context())), [['<span class="invalid">&lt;aT&gt;</span>'], '']);
29
- assert.deepStrictEqual(inspect(parser, input('<a,b>', new Context())), undefined);
30
- assert.deepStrictEqual(inspect(parser, input('<a, b>', new Context())), undefined);
31
- assert.deepStrictEqual(inspect(parser, input('<T>', new Context())), [['<span class="invalid">&lt;T&gt;</span>'], '']);
32
- assert.deepStrictEqual(inspect(parser, input('<wbr/>', new Context())), undefined);
33
- assert.deepStrictEqual(inspect(parser, input('<wbr />', new Context())), [['<span class="invalid">&lt;wbr /&gt;</span>'], '']);
34
- assert.deepStrictEqual(inspect(parser, input('<bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt;</span>'], '']);
35
- assert.deepStrictEqual(inspect(parser, input('<bdi>z', new Context())), [['<span class="invalid">&lt;bdi&gt;z</span>'], '']);
36
- assert.deepStrictEqual(inspect(parser, input('<bdi></bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt;&lt;/bdi&gt;</span>'], '']);
37
- assert.deepStrictEqual(inspect(parser, input('<bdi> </bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt; &lt;/bdi&gt;</span>'], '']);
38
- assert.deepStrictEqual(inspect(parser, input('<bdi> \n</bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt; \n&lt;/bdi&gt;</span>'], '']);
39
- assert.deepStrictEqual(inspect(parser, input('<bdi> \na</bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt; \na&lt;/bdi&gt;</span>'], '']);
40
- assert.deepStrictEqual(inspect(parser, input('<bdi>\\ </bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt;\\ &lt;/bdi&gt;</span>'], '']);
41
- assert.deepStrictEqual(inspect(parser, input('<bdi>&Tab;</bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt;&amp;Tab;&lt;/bdi&gt;</span>'], '']);
42
- assert.deepStrictEqual(inspect(parser, input('<bdi><wbr></bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt;&lt;wbr&gt;&lt;/bdi&gt;</span>'], '']);
43
- assert.deepStrictEqual(inspect(parser, input('<bdi>\n</bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt;\n&lt;/bdi&gt;</span>'], '']);
44
- assert.deepStrictEqual(inspect(parser, input('<bdi>\na</bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt;\na&lt;/bdi&gt;</span>'], '']);
45
- assert.deepStrictEqual(inspect(parser, input('<bdi>\\\na</bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt;\\\na&lt;/bdi&gt;</span>'], '']);
46
- assert.deepStrictEqual(inspect(parser, input('<bdi>a', new Context())), [['<span class="invalid">&lt;bdi&gt;a</span>'], '']);
47
- assert.deepStrictEqual(inspect(parser, input('<bdi>a</BDI>', new Context())), [['<span class="invalid">&lt;bdi&gt;a&lt;/BDI&gt;</span>'], '']);
48
- assert.deepStrictEqual(inspect(parser, input('<BDI>a</BDI>', new Context())), [['<span class="invalid">&lt;BDI&gt;</span>'], 'a</BDI>']);
49
- assert.deepStrictEqual(inspect(parser, input('<BDI>a</bdi>', new Context())), [['<span class="invalid">&lt;BDI&gt;</span>'], 'a</bdi>']);
50
- assert.deepStrictEqual(inspect(parser, input('</bdi>', new Context())), undefined);
51
- assert.deepStrictEqual(inspect(parser, input('<bdi/>', new Context())), undefined);
52
- assert.deepStrictEqual(inspect(parser, input('<bdi />', new Context())), [['<span class="invalid">&lt;bdi /&gt;</span>'], '']);
53
- assert.deepStrictEqual(inspect(parser, input('<b><b><b>a</b></b></b>', new Context())), [['<span class="invalid">&lt;b&gt;&lt;b&gt;&lt;b&gt;a&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;</span>'], '']);
54
- assert.deepStrictEqual(inspect(parser, input('<bdi><bdi><bdi>a</bdi></bdi></bdi>', new Context())), [['<bdi><bdi><bdi>a</bdi></bdi></bdi>'], '']);
55
- assert.deepStrictEqual(inspect(parser, input('<x a="*b*"', new Context())), [['<span class="invalid">&lt;x a="*b*"</span>'], '']);
56
- assert.deepStrictEqual(inspect(parser, input('<x a="*b*">', new Context())), [['<span class="invalid">&lt;x a="*b*"&gt;</span>'], '']);
57
- assert.deepStrictEqual(inspect(parser, input('<x a="*b*">c', new Context())), [['<span class="invalid">&lt;x a="*b*"&gt;</span>'], 'c']);
58
- assert.deepStrictEqual(inspect(parser, input('<bdi a="*b*"', new Context())), [['<span class="invalid">&lt;bdi a="*b*"</span>'], '']);
59
- assert.deepStrictEqual(inspect(parser, input('<bdi a="*b*">', new Context())), [['<span class="invalid">&lt;bdi a="*b*"&gt;</span>'], '']);
60
- assert.deepStrictEqual(inspect(parser, input('<bdi a="*b*">c', new Context())), [['<span class="invalid">&lt;bdi a="*b*"&gt;c</span>'], '']);
61
- assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *c*', new Context())), [['<span class="invalid">&lt;bdi a b="*" *c*</span>'], '']);
62
- assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *c*>', new Context())), [['<span class="invalid">&lt;bdi a b="*" *c*&gt;</span>'], '']);
63
- assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *c*>d</bdi>', new Context())), [['<span class="invalid">&lt;bdi a b="*" *c*&gt;d&lt;/bdi&gt;</span>'], '']);
64
- assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *>*c*', new Context())), [['<span class="invalid">&lt;bdi a b="*" *&gt;*c*</span>'], '']);
65
- assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *>*c*</bdi>', new Context())), [['<span class="invalid">&lt;bdi a b="*" *&gt;*c*&lt;/bdi&gt;</span>'], '']);
66
- assert.deepStrictEqual(inspect(parser, input(' <bdi>a</bdi>', new Context())), undefined);
26
+ assert.deepStrictEqual(inspect(parser, input('')), undefined);
27
+ assert.deepStrictEqual(inspect(parser, input('<0>')), undefined);
28
+ assert.deepStrictEqual(inspect(parser, input('<aT>')), [['<span class="invalid">&lt;aT&gt;</span>'], '']);
29
+ assert.deepStrictEqual(inspect(parser, input('<a,b>')), undefined);
30
+ assert.deepStrictEqual(inspect(parser, input('<a, b>')), undefined);
31
+ assert.deepStrictEqual(inspect(parser, input('<T>')), [['<span class="invalid">&lt;T&gt;</span>'], '']);
32
+ assert.deepStrictEqual(inspect(parser, input('<wbr/>')), undefined);
33
+ assert.deepStrictEqual(inspect(parser, input('<wbr />')), [['<span class="invalid">&lt;wbr /&gt;</span>'], '']);
34
+ assert.deepStrictEqual(inspect(parser, input('<bdi>')), [['<span class="invalid">&lt;bdi&gt;</span>'], '']);
35
+ assert.deepStrictEqual(inspect(parser, input('<bdi>z')), [['<span class="invalid">&lt;bdi&gt;z</span>'], '']);
36
+ assert.deepStrictEqual(inspect(parser, input('<bdi></bdi>')), [['<span class="invalid">&lt;bdi&gt;&lt;/bdi&gt;</span>'], '']);
37
+ assert.deepStrictEqual(inspect(parser, input('<bdi> </bdi>')), [['<span class="invalid">&lt;bdi&gt; &lt;/bdi&gt;</span>'], '']);
38
+ assert.deepStrictEqual(inspect(parser, input('<bdi> \n</bdi>')), [['<span class="invalid">&lt;bdi&gt; \n&lt;/bdi&gt;</span>'], '']);
39
+ assert.deepStrictEqual(inspect(parser, input('<bdi> \na</bdi>')), [['<span class="invalid">&lt;bdi&gt; \na&lt;/bdi&gt;</span>'], '']);
40
+ assert.deepStrictEqual(inspect(parser, input('<bdi>\\ </bdi>')), [['<span class="invalid">&lt;bdi&gt;\\ &lt;/bdi&gt;</span>'], '']);
41
+ assert.deepStrictEqual(inspect(parser, input('<bdi>&Tab;</bdi>')), [['<span class="invalid">&lt;bdi&gt;&amp;Tab;&lt;/bdi&gt;</span>'], '']);
42
+ assert.deepStrictEqual(inspect(parser, input('<bdi><wbr></bdi>')), [['<span class="invalid">&lt;bdi&gt;&lt;wbr&gt;&lt;/bdi&gt;</span>'], '']);
43
+ assert.deepStrictEqual(inspect(parser, input('<bdi>\n</bdi>')), [['<span class="invalid">&lt;bdi&gt;\n&lt;/bdi&gt;</span>'], '']);
44
+ assert.deepStrictEqual(inspect(parser, input('<bdi>\na</bdi>')), [['<span class="invalid">&lt;bdi&gt;\na&lt;/bdi&gt;</span>'], '']);
45
+ assert.deepStrictEqual(inspect(parser, input('<bdi>\\\na</bdi>')), [['<span class="invalid">&lt;bdi&gt;\\\na&lt;/bdi&gt;</span>'], '']);
46
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a')), [['<span class="invalid">&lt;bdi&gt;a</span>'], '']);
47
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a</BDI>')), [['<span class="invalid">&lt;bdi&gt;a&lt;/BDI&gt;</span>'], '']);
48
+ assert.deepStrictEqual(inspect(parser, input('<BDI>a</BDI>')), [['<span class="invalid">&lt;BDI&gt;</span>'], 'a</BDI>']);
49
+ assert.deepStrictEqual(inspect(parser, input('<BDI>a</bdi>')), [['<span class="invalid">&lt;BDI&gt;</span>'], 'a</bdi>']);
50
+ assert.deepStrictEqual(inspect(parser, input('</bdi>')), undefined);
51
+ assert.deepStrictEqual(inspect(parser, input('<bdi/>')), undefined);
52
+ assert.deepStrictEqual(inspect(parser, input('<bdi />')), [['<span class="invalid">&lt;bdi /&gt;</span>'], '']);
53
+ assert.deepStrictEqual(inspect(parser, input('<b><b><b>a</b></b></b>')), [['<span class="invalid">&lt;b&gt;&lt;b&gt;&lt;b&gt;a&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;</span>'], '']);
54
+ assert.deepStrictEqual(inspect(parser, input('<bdi><bdi><bdi>a</bdi></bdi></bdi>')), [['<bdi><bdi><bdi>a</bdi></bdi></bdi>'], '']);
55
+ assert.deepStrictEqual(inspect(parser, input('<x a="*b*"')), [['<span class="invalid">&lt;x a="*b*"</span>'], '']);
56
+ assert.deepStrictEqual(inspect(parser, input('<x a="*b*">')), [['<span class="invalid">&lt;x a="*b*"&gt;</span>'], '']);
57
+ assert.deepStrictEqual(inspect(parser, input('<x a="*b*">c')), [['<span class="invalid">&lt;x a="*b*"&gt;</span>'], 'c']);
58
+ assert.deepStrictEqual(inspect(parser, input('<bdi a="*b*"')), [['<span class="invalid">&lt;bdi a="*b*"</span>'], '']);
59
+ assert.deepStrictEqual(inspect(parser, input('<bdi a="*b*">')), [['<span class="invalid">&lt;bdi a="*b*"&gt;</span>'], '']);
60
+ assert.deepStrictEqual(inspect(parser, input('<bdi a="*b*">c')), [['<span class="invalid">&lt;bdi a="*b*"&gt;c</span>'], '']);
61
+ assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *c*')), [['<span class="invalid">&lt;bdi a b="*" *c*</span>'], '']);
62
+ assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *c*>')), [['<span class="invalid">&lt;bdi a b="*" *c*&gt;</span>'], '']);
63
+ assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *c*>d</bdi>')), [['<span class="invalid">&lt;bdi a b="*" *c*&gt;d&lt;/bdi&gt;</span>'], '']);
64
+ assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *>*c*')), [['<span class="invalid">&lt;bdi a b="*" *&gt;*c*</span>'], '']);
65
+ assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *>*c*</bdi>')), [['<span class="invalid">&lt;bdi a b="*" *&gt;*c*&lt;/bdi&gt;</span>'], '']);
66
+ assert.deepStrictEqual(inspect(parser, input(' <bdi>a</bdi>')), undefined);
67
67
  });
68
68
 
69
69
  it('basic', () => {
70
- assert.deepStrictEqual(inspect(parser, input('<wbr>', new Context())), [['<wbr>'], '']);
71
- assert.deepStrictEqual(inspect(parser, input('<wbr >', new Context())), [['<wbr>'], '']);
72
- assert.deepStrictEqual(inspect(parser, input('<wbr >', new Context())), [['<span class="invalid">&lt;wbr </span>'], ' >']);
73
- assert.deepStrictEqual(inspect(parser, input('<wbr>a', new Context())), [['<wbr>'], 'a']);
74
- assert.deepStrictEqual(inspect(parser, input('<bdi >a</bdi>', new Context())), [['<bdi>a</bdi>'], '']);
75
- assert.deepStrictEqual(inspect(parser, input('<bdi >a</bdi>', new Context())), [['<span class="invalid">&lt;bdi &gt;a&lt;/bdi&gt;</span>'], '']);
76
- assert.deepStrictEqual(inspect(parser, input('<bdi> a</bdi>', new Context())), [['<bdi> a</bdi>'], '']);
77
- assert.deepStrictEqual(inspect(parser, input('<bdi> a </bdi>', new Context())), [['<bdi> a </bdi>'], '']);
78
- assert.deepStrictEqual(inspect(parser, input('<bdi> a </bdi>', new Context())), [['<bdi> a </bdi>'], '']);
79
- assert.deepStrictEqual(inspect(parser, input('<bdi>\\ a</bdi>', new Context())), [['<bdi> a</bdi>'], '']);
80
- assert.deepStrictEqual(inspect(parser, input('<bdi><wbr>a</bdi>', new Context())), [['<bdi><wbr>a</bdi>'], '']);
81
- assert.deepStrictEqual(inspect(parser, input('<bdi>a</bdi>', new Context())), [['<bdi>a</bdi>'], '']);
82
- assert.deepStrictEqual(inspect(parser, input('<bdi>a</bdi>a', new Context())), [['<bdi>a</bdi>'], 'a']);
83
- assert.deepStrictEqual(inspect(parser, input('<bdi>a </bdi>', new Context())), [['<bdi>a </bdi>'], '']);
84
- assert.deepStrictEqual(inspect(parser, input('<bdi>a \n </bdi>', new Context())), [['<bdi>a </bdi>'], '']);
85
- assert.deepStrictEqual(inspect(parser, input('<bdi>a\n</bdi>', new Context())), [['<bdi>a</bdi>'], '']);
86
- assert.deepStrictEqual(inspect(parser, input('<bdi>a\n </bdi>', new Context())), [['<bdi>a </bdi>'], '']);
87
- assert.deepStrictEqual(inspect(parser, input('<bdi>a\n<wbr></bdi>', new Context())), [['<bdi>a<wbr></bdi>'], '']);
88
- assert.deepStrictEqual(inspect(parser, input('<bdi>a\nb</bdi>', new Context())), [['<bdi>a<br>b</bdi>'], '']);
70
+ assert.deepStrictEqual(inspect(parser, input('<wbr>')), [['<wbr>'], '']);
71
+ assert.deepStrictEqual(inspect(parser, input('<wbr >')), [['<wbr>'], '']);
72
+ assert.deepStrictEqual(inspect(parser, input('<wbr >')), [['<span class="invalid">&lt;wbr </span>'], ' >']);
73
+ assert.deepStrictEqual(inspect(parser, input('<wbr>a')), [['<wbr>'], 'a']);
74
+ assert.deepStrictEqual(inspect(parser, input('<bdi >a</bdi>')), [['<bdi>a</bdi>'], '']);
75
+ assert.deepStrictEqual(inspect(parser, input('<bdi >a</bdi>')), [['<span class="invalid">&lt;bdi &gt;a&lt;/bdi&gt;</span>'], '']);
76
+ assert.deepStrictEqual(inspect(parser, input('<bdi> a</bdi>')), [['<bdi> a</bdi>'], '']);
77
+ assert.deepStrictEqual(inspect(parser, input('<bdi> a </bdi>')), [['<bdi> a </bdi>'], '']);
78
+ assert.deepStrictEqual(inspect(parser, input('<bdi> a </bdi>')), [['<bdi> a </bdi>'], '']);
79
+ assert.deepStrictEqual(inspect(parser, input('<bdi>\\ a</bdi>')), [['<bdi> a</bdi>'], '']);
80
+ assert.deepStrictEqual(inspect(parser, input('<bdi><wbr>a</bdi>')), [['<bdi><wbr>a</bdi>'], '']);
81
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a</bdi>')), [['<bdi>a</bdi>'], '']);
82
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a</bdi>a')), [['<bdi>a</bdi>'], 'a']);
83
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a </bdi>')), [['<bdi>a </bdi>'], '']);
84
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a \n </bdi>')), [['<bdi>a </bdi>'], '']);
85
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a\n</bdi>')), [['<bdi>a</bdi>'], '']);
86
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a\n </bdi>')), [['<bdi>a </bdi>'], '']);
87
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a\n<wbr></bdi>')), [['<bdi>a<wbr></bdi>'], '']);
88
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a\nb</bdi>')), [['<bdi>a<br>b</bdi>'], '']);
89
89
  });
90
90
 
91
91
  it('nest', () => {
92
- assert.deepStrictEqual(inspect(parser, input('<bdi>[% </bdi>', new Context())), [['<span class="invalid">&lt;bdi&gt;[% &lt;/bdi&gt;</span>'], '']);
93
- assert.deepStrictEqual(inspect(parser, input('<bdi><bdi>a</bdi></bdi>', new Context())), [['<bdi><bdi>a</bdi></bdi>'], '']);
94
- assert.deepStrictEqual(inspect(parser, input('<bdi>a<bdi>b</bdi>c</bdi>', new Context())), [['<bdi>a<bdi>b</bdi>c</bdi>'], '']);
95
- assert.deepStrictEqual(inspect(parser, input('<bdi>`a`</bdi>', new Context())), [['<bdi><code data-src="`a`">a</code></bdi>'], '']);
92
+ assert.deepStrictEqual(inspect(parser, input('<bdi>[% </bdi>')), [['<span class="invalid">&lt;bdi&gt;[% &lt;/bdi&gt;</span>'], '']);
93
+ assert.deepStrictEqual(inspect(parser, input('<bdi><bdi>a</bdi></bdi>')), [['<bdi><bdi>a</bdi></bdi>'], '']);
94
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a<bdi>b</bdi>c</bdi>')), [['<bdi>a<bdi>b</bdi>c</bdi>'], '']);
95
+ assert.deepStrictEqual(inspect(parser, input('<bdi>`a`</bdi>')), [['<bdi><code data-src="`a`">a</code></bdi>'], '']);
96
96
  });
97
97
 
98
98
  it('escape', () => {
99
- assert.deepStrictEqual(inspect(parser, input('<a>', new Context())), [['<span class="invalid">&lt;a&gt;</span>'], '']);
100
- assert.deepStrictEqual(inspect(parser, input('<bdi><a>a</a></bdi>', new Context())), [['<bdi><span class="invalid">&lt;a&gt;a&lt;/a&gt;</span></bdi>'], '']);
101
- assert.deepStrictEqual(inspect(parser, input('<bdi>a<a>b</a>c</bdi>', new Context())), [['<bdi>a<span class="invalid">&lt;a&gt;b&lt;/a&gt;</span>c</bdi>'], '']);
102
- assert.deepStrictEqual(inspect(parser, input('<img>', new Context())), [['<span class="invalid">&lt;img&gt;</span>'], '']);
103
- assert.deepStrictEqual(inspect(parser, input('<bdi><img></bdi>', new Context())), [['<bdi><span class="invalid">&lt;img&gt;</span></bdi>'], '']);
99
+ assert.deepStrictEqual(inspect(parser, input('<a>')), [['<span class="invalid">&lt;a&gt;</span>'], '']);
100
+ assert.deepStrictEqual(inspect(parser, input('<bdi><a>a</a></bdi>')), [['<bdi><span class="invalid">&lt;a&gt;a&lt;/a&gt;</span></bdi>'], '']);
101
+ assert.deepStrictEqual(inspect(parser, input('<bdi>a<a>b</a>c</bdi>')), [['<bdi>a<span class="invalid">&lt;a&gt;b&lt;/a&gt;</span>c</bdi>'], '']);
102
+ assert.deepStrictEqual(inspect(parser, input('<img>')), [['<span class="invalid">&lt;img&gt;</span>'], '']);
103
+ assert.deepStrictEqual(inspect(parser, input('<bdi><img></bdi>')), [['<bdi><span class="invalid">&lt;img&gt;</span></bdi>'], '']);
104
104
  });
105
105
 
106
106
  it('attribute', () => {
107
- assert.deepStrictEqual(inspect(parser, input('<bdi\n>a</bdi>', new Context())), undefined);
108
- assert.deepStrictEqual(inspect(parser, input('<bdi \n>a</bdi>', new Context())), [['<span class="invalid">&lt;bdi \n&gt;a&lt;/bdi&gt;</span>'], '']);
109
- assert.deepStrictEqual(inspect(parser, input('<bdi __proto__>a</bdi>', new Context())), [['<span class="invalid">&lt;bdi __proto__&gt;a&lt;/bdi&gt;</span>'], '']);
110
- assert.deepStrictEqual(inspect(parser, input('<bdi constructor>a</bdi>', new Context())), [['<span class="invalid">&lt;bdi constructor&gt;a&lt;/bdi&gt;</span>'], '']);
111
- assert.deepStrictEqual(inspect(parser, input('<bdi toString>a</bdi>', new Context())), [['<span class="invalid">&lt;bdi toString&gt;a&lt;/bdi&gt;</span>'], '']);
112
- assert.deepStrictEqual(inspect(parser, input('<bdi X>a</bdi>', new Context())), [['<span class="invalid">&lt;bdi X&gt;a&lt;/bdi&gt;</span>'], '']);
113
- assert.deepStrictEqual(inspect(parser, input('<bdi x>a</bdi>', new Context())), [['<span class="invalid">&lt;bdi x&gt;a&lt;/bdi&gt;</span>'], '']);
114
- assert.deepStrictEqual(inspect(parser, input('<bdo>a</bdo>', new Context())), [['<span class="invalid">&lt;bdo&gt;a&lt;/bdo&gt;</span>'], '']);
115
- assert.deepStrictEqual(inspect(parser, input('<bdo >a</bdo>', new Context())), [['<span class="invalid">&lt;bdo &gt;a&lt;/bdo&gt;</span>'], '']);
116
- assert.deepStrictEqual(inspect(parser, input('<bdo __proto__>a</bdo>', new Context())), [['<span class="invalid">&lt;bdo __proto__&gt;a&lt;/bdo&gt;</span>'], '']);
117
- assert.deepStrictEqual(inspect(parser, input('<bdo constructor>a</bdo>', new Context())), [['<span class="invalid">&lt;bdo constructor&gt;a&lt;/bdo&gt;</span>'], '']);
118
- assert.deepStrictEqual(inspect(parser, input('<bdo toString>a</bdo>', new Context())), [['<span class="invalid">&lt;bdo toString&gt;a&lt;/bdo&gt;</span>'], '']);
119
- assert.deepStrictEqual(inspect(parser, input('<bdo X>a</bdo>', new Context())), [['<span class="invalid">&lt;bdo X&gt;a&lt;/bdo&gt;</span>'], '']);
120
- assert.deepStrictEqual(inspect(parser, input('<bdo x>a</bdo>', new Context())), [['<span class="invalid">&lt;bdo x&gt;a&lt;/bdo&gt;</span>'], '']);
121
- assert.deepStrictEqual(inspect(parser, input('<bdo dir>a</bdo>', new Context())), [['<span class="invalid">&lt;bdo dir&gt;a&lt;/bdo&gt;</span>'], '']);
122
- assert.deepStrictEqual(inspect(parser, input('<bdo dir=>a</bdo>', new Context())), [['<span class="invalid">&lt;bdo dir=&gt;a&lt;/bdo&gt;</span>'], '']);
123
- assert.deepStrictEqual(inspect(parser, input('<bdo dir=rtl>a</bdo>', new Context())), [['<span class="invalid">&lt;bdo dir=rtl&gt;a&lt;/bdo&gt;</span>'], '']);
124
- assert.deepStrictEqual(inspect(parser, input('<bdo dir=">a</bdo>', new Context())), [['<span class="invalid">&lt;bdo dir="&gt;a&lt;/bdo&gt;</span>'], '']);
125
- assert.deepStrictEqual(inspect(parser, input('<bdo dir="">a</bdo>', new Context())), [['<span class="invalid">&lt;bdo dir=""&gt;a&lt;/bdo&gt;</span>'], '']);
126
- assert.deepStrictEqual(inspect(parser, input('<bdo dir="rtl" dir="rtl">a</bdo>', new Context())), [['<span class="invalid">&lt;bdo dir="rtl" dir="rtl"&gt;a&lt;/bdo&gt;</span>'], '']);
127
- assert.deepStrictEqual(inspect(parser, input('<bdo diR="rtl">a</bdo>', new Context())), [['<span class="invalid">&lt;bdo diR="rtl"&gt;a&lt;/bdo&gt;</span>'], '']);
128
- assert.deepStrictEqual(inspect(parser, input('<bdo dir="rtl">a</bdo>', new Context())), [['<bdo dir="rtl">a</bdo>'], '']);
129
- assert.deepStrictEqual(inspect(parser, input('<bdo dir="rtl" >a</bdo>', new Context())), [['<bdo dir="rtl">a</bdo>'], '']);
130
- assert.deepStrictEqual(inspect(parser, input('<bdo dir="rtl" >a</bdo>', new Context())), [['<span class="invalid">&lt;bdo dir="rtl" &gt;a&lt;/bdo&gt;</span>'], '']);
131
- assert.deepStrictEqual(inspect(parser, input('<bdo dir="rtl">a</bdo>', new Context())), [['<span class="invalid">&lt;bdo dir="rtl"&gt;a&lt;/bdo&gt;</span>'], '']);
132
- assert.deepStrictEqual(inspect(parser, input('<wbr\n>', new Context())), undefined);
133
- assert.deepStrictEqual(inspect(parser, input('<wbr \n>', new Context())), [['<span class="invalid">&lt;wbr </span>'], '\n>']);
134
- assert.deepStrictEqual(inspect(parser, input('<wbr constructor>', new Context())), [['<span class="invalid">&lt;wbr constructor&gt;</span>'], '']);
135
- assert.deepStrictEqual(inspect(parser, input('<wbr X>', new Context())), [['<span class="invalid">&lt;wbr X&gt;</span>'], '']);
136
- assert.deepStrictEqual(inspect(parser, input('<wbr x>', new Context())), [['<span class="invalid">&lt;wbr x&gt;</span>'], '']);
107
+ assert.deepStrictEqual(inspect(parser, input('<bdi\n>a</bdi>')), undefined);
108
+ assert.deepStrictEqual(inspect(parser, input('<bdi \n>a</bdi>')), [['<span class="invalid">&lt;bdi \n&gt;a&lt;/bdi&gt;</span>'], '']);
109
+ assert.deepStrictEqual(inspect(parser, input('<bdi __proto__>a</bdi>')), [['<span class="invalid">&lt;bdi __proto__&gt;a&lt;/bdi&gt;</span>'], '']);
110
+ assert.deepStrictEqual(inspect(parser, input('<bdi constructor>a</bdi>')), [['<span class="invalid">&lt;bdi constructor&gt;a&lt;/bdi&gt;</span>'], '']);
111
+ assert.deepStrictEqual(inspect(parser, input('<bdi toString>a</bdi>')), [['<span class="invalid">&lt;bdi toString&gt;a&lt;/bdi&gt;</span>'], '']);
112
+ assert.deepStrictEqual(inspect(parser, input('<bdi X>a</bdi>')), [['<span class="invalid">&lt;bdi X&gt;a&lt;/bdi&gt;</span>'], '']);
113
+ assert.deepStrictEqual(inspect(parser, input('<bdi x>a</bdi>')), [['<span class="invalid">&lt;bdi x&gt;a&lt;/bdi&gt;</span>'], '']);
114
+ assert.deepStrictEqual(inspect(parser, input('<bdo>a</bdo>')), [['<span class="invalid">&lt;bdo&gt;a&lt;/bdo&gt;</span>'], '']);
115
+ assert.deepStrictEqual(inspect(parser, input('<bdo >a</bdo>')), [['<span class="invalid">&lt;bdo &gt;a&lt;/bdo&gt;</span>'], '']);
116
+ assert.deepStrictEqual(inspect(parser, input('<bdo __proto__>a</bdo>')), [['<span class="invalid">&lt;bdo __proto__&gt;a&lt;/bdo&gt;</span>'], '']);
117
+ assert.deepStrictEqual(inspect(parser, input('<bdo constructor>a</bdo>')), [['<span class="invalid">&lt;bdo constructor&gt;a&lt;/bdo&gt;</span>'], '']);
118
+ assert.deepStrictEqual(inspect(parser, input('<bdo toString>a</bdo>')), [['<span class="invalid">&lt;bdo toString&gt;a&lt;/bdo&gt;</span>'], '']);
119
+ assert.deepStrictEqual(inspect(parser, input('<bdo X>a</bdo>')), [['<span class="invalid">&lt;bdo X&gt;a&lt;/bdo&gt;</span>'], '']);
120
+ assert.deepStrictEqual(inspect(parser, input('<bdo x>a</bdo>')), [['<span class="invalid">&lt;bdo x&gt;a&lt;/bdo&gt;</span>'], '']);
121
+ assert.deepStrictEqual(inspect(parser, input('<bdo dir>a</bdo>')), [['<span class="invalid">&lt;bdo dir&gt;a&lt;/bdo&gt;</span>'], '']);
122
+ assert.deepStrictEqual(inspect(parser, input('<bdo dir=>a</bdo>')), [['<span class="invalid">&lt;bdo dir=&gt;a&lt;/bdo&gt;</span>'], '']);
123
+ assert.deepStrictEqual(inspect(parser, input('<bdo dir=rtl>a</bdo>')), [['<span class="invalid">&lt;bdo dir=rtl&gt;a&lt;/bdo&gt;</span>'], '']);
124
+ assert.deepStrictEqual(inspect(parser, input('<bdo dir=">a</bdo>')), [['<span class="invalid">&lt;bdo dir="&gt;a&lt;/bdo&gt;</span>'], '']);
125
+ assert.deepStrictEqual(inspect(parser, input('<bdo dir="">a</bdo>')), [['<span class="invalid">&lt;bdo dir=""&gt;a&lt;/bdo&gt;</span>'], '']);
126
+ assert.deepStrictEqual(inspect(parser, input('<bdo dir="rtl" dir="rtl">a</bdo>')), [['<span class="invalid">&lt;bdo dir="rtl" dir="rtl"&gt;a&lt;/bdo&gt;</span>'], '']);
127
+ assert.deepStrictEqual(inspect(parser, input('<bdo diR="rtl">a</bdo>')), [['<span class="invalid">&lt;bdo diR="rtl"&gt;a&lt;/bdo&gt;</span>'], '']);
128
+ assert.deepStrictEqual(inspect(parser, input('<bdo dir="rtl">a</bdo>')), [['<bdo dir="rtl">a</bdo>'], '']);
129
+ assert.deepStrictEqual(inspect(parser, input('<bdo dir="rtl" >a</bdo>')), [['<bdo dir="rtl">a</bdo>'], '']);
130
+ assert.deepStrictEqual(inspect(parser, input('<bdo dir="rtl" >a</bdo>')), [['<span class="invalid">&lt;bdo dir="rtl" &gt;a&lt;/bdo&gt;</span>'], '']);
131
+ assert.deepStrictEqual(inspect(parser, input('<bdo dir="rtl">a</bdo>')), [['<span class="invalid">&lt;bdo dir="rtl"&gt;a&lt;/bdo&gt;</span>'], '']);
132
+ assert.deepStrictEqual(inspect(parser, input('<wbr\n>')), undefined);
133
+ assert.deepStrictEqual(inspect(parser, input('<wbr \n>')), [['<span class="invalid">&lt;wbr </span>'], '\n>']);
134
+ assert.deepStrictEqual(inspect(parser, input('<wbr constructor>')), [['<span class="invalid">&lt;wbr constructor&gt;</span>'], '']);
135
+ assert.deepStrictEqual(inspect(parser, input('<wbr X>')), [['<span class="invalid">&lt;wbr X&gt;</span>'], '']);
136
+ assert.deepStrictEqual(inspect(parser, input('<wbr x>')), [['<span class="invalid">&lt;wbr x&gt;</span>'], '']);
137
137
  });
138
138
 
139
139
  });
@@ -1,6 +1,6 @@
1
1
  import { HTMLParser } from '../inline';
2
- import { Recursion } from '../context';
3
- import { List, Node, Context } from '../../combinator/data/parser';
2
+ import { Input, Recursion } from '../context';
3
+ import { List, Node } from '../../combinator/parser';
4
4
  import { Flag } from '../node';
5
5
  import { union, some, recursion, precedence, surround, open, match, lazy } from '../../combinator';
6
6
  import { inline } from '../inline';
@@ -27,22 +27,22 @@ export const html: HTMLParser = lazy(() => union([
27
27
  precedence(9, some(union([attribute]))),
28
28
  open(str(/ ?/y), str('>'), true),
29
29
  true, [],
30
- ([as, bs = new List(), cs], context) =>
31
- new List([new Node(elem(as.head!.value.slice(1), false, [...unwrap(as.import(bs).import(cs))], new List(), new List(), context), as.head!.value === '<wbr' ? Flag.blank : Flag.none)]),
32
- ([as, bs = new List()], context) =>
33
- new List([new Node(elem(as.head!.value.slice(1), false, [...unwrap(as.import(bs))], new List(), new List(), context))])),
30
+ ([as, bs = new List(), cs], input, output) =>
31
+ output.append(new Node(elem(as.head!.value.slice(1), false, [...unwrap(as.import(bs).import(cs))], new List(), new List(), input), as.head!.value === '<wbr' ? Flag.blank : Flag.none)),
32
+ ([as, bs = new List()], input, output) =>
33
+ output.append(new Node(elem(as.head!.value.slice(1), false, [...unwrap(as.import(bs))], new List(), new List(), input)))),
34
34
  match(
35
35
  new RegExp(String.raw`<(${TAGS.join('|')})(?=[ >])`, 'y'),
36
36
  memoize(
37
37
  ([, tag]) =>
38
- surround<HTMLParser.TagParser, string>(
39
- surround(
38
+ surround<HTMLParser.TagParser>(
39
+ surround<HTMLParser.VoidTagParser>(
40
40
  str(`<${tag}`),
41
41
  precedence(9, some(attribute)),
42
42
  open(str(/ ?/y), str('>'), true),
43
43
  true, [],
44
- ([as, bs = new List(), cs]) => as.import(bs).import(cs),
45
- ([as, bs = new List()]) => as.import(bs)),
44
+ ([as, bs = new List(), cs], _, output) => output.import(as.import(bs).import(cs)),
45
+ ([as, bs = new List()], _, output) => output.import(as.import(bs))),
46
46
  // 不可視のHTML構造が可視構造を変化させるべきでない。
47
47
  // 可視のHTMLは優先度変更を検討する。
48
48
  // このため`<>`記号は将来的に共通構造を変化させる可能性があり
@@ -54,10 +54,10 @@ export const html: HTMLParser = lazy(() => union([
54
54
  ])))),
55
55
  str(`</${tag}>`),
56
56
  true, [],
57
- ([as, bs = new List(), cs], context) =>
58
- new List([new Node(elem(tag, true, [...unwrap(as)], bs, cs, context))]),
59
- ([as, bs = new List()], context) =>
60
- new List([new Node(elem(tag, true, [...unwrap(as)], bs, new List(), context))])),
57
+ ([as, bs = new List(), cs], input, output) =>
58
+ output.append(new Node(elem(tag, true, [...unwrap(as)], bs, cs, input))),
59
+ ([as, bs = new List()], input, output) =>
60
+ output.append(new Node(elem(tag, true, [...unwrap(as)], bs, new List(), input)))),
61
61
  ([, tag]) => tag2index(tag),
62
62
  Array(TAGS.length))),
63
63
  surround(
@@ -66,10 +66,10 @@ export const html: HTMLParser = lazy(() => union([
66
66
  precedence(9, some(union([attribute]))),
67
67
  open(str(/ ?/y), str('>'), true),
68
68
  true, [],
69
- ([as, bs = new List(), cs], context) =>
70
- new List([new Node(elem(as.head!.value.slice(1), false, [...unwrap(as.import(bs).import(cs))], new List(), new List(), context))]),
71
- ([as, bs = new List()], context) =>
72
- new List([new Node(elem(as.head!.value.slice(1), false, [...unwrap(as.import(bs))], new List(), new List(), context))])),
69
+ ([as, bs = new List(), cs], input, output) =>
70
+ output.append(new Node(elem(as.head!.value.slice(1), false, [...unwrap(as.import(bs).import(cs))], new List(), new List(), input))),
71
+ ([as, bs = new List()], input, output) =>
72
+ output.append(new Node(elem(as.head!.value.slice(1), false, [...unwrap(as.import(bs))], new List(), new List(), input)))),
73
73
  ]));
74
74
 
75
75
  export const attribute: HTMLParser.AttributeParser = union([
@@ -77,25 +77,25 @@ export const attribute: HTMLParser.AttributeParser = union([
77
77
  str(/ [^\s<>]+/y),
78
78
  ]);
79
79
 
80
- function elem(tag: string, content: boolean, as: readonly string[], bs: List<Node<HTMLElement | string>>, cs: List<Node<string>>, context: Context): HTMLElement {
80
+ function elem(tag: string, content: boolean, as: readonly string[], bs: List<Node<HTMLElement | string>>, cs: List<Node<string>>, input: Input): HTMLElement {
81
81
  assert(as.length > 0);
82
82
  assert(as[0][0] === '<');
83
- if (!tags.includes(tag)) return ielem('tag', `Invalid HTML tag name "${tag}"`, context);
83
+ if (!tags.includes(tag)) return ielem('tag', `Invalid HTML tag name "${tag}"`, input);
84
84
  if (content) {
85
- if (cs.length === 0) return ielem('tag', `Missing the closing HTML tag "</${tag}>"`, context);
86
- if (bs.length === 0) return ielem('content', `Missing the content`, context);
87
- if (!isNonblankFirstLine(bs)) return ielem('content', `Missing the visible content in the same line`, context);
85
+ if (cs.length === 0) return ielem('tag', `Missing the closing HTML tag "</${tag}>"`, input);
86
+ if (bs.length === 0) return ielem('content', `Missing the content`, input);
87
+ if (!isNonblankFirstLine(bs)) return ielem('content', `Missing the visible content in the same line`, input);
88
88
  }
89
89
  const [attrs] = attributes('html', attrspecs[tag], as.slice(1, as.at(-1) === '>' ? -1 : as.length));
90
- if (/(?<!\S)invalid(?!\S)/.test(attrs['class'] ?? '')) return ielem('attribute', 'Invalid HTML attribute', context)
91
- if (as.at(-1) !== '>') return ielem('tag', `Missing the closing symbol ">"`, context);
90
+ if (/(?<!\S)invalid(?!\S)/.test(attrs['class'] ?? '')) return ielem('attribute', 'Invalid HTML attribute', input)
91
+ if (as.at(-1) !== '>') return ielem('tag', `Missing the closing symbol ">"`, input);
92
92
  return h(tag as 'span', attrs, defrag(unwrap(bs)));
93
93
  }
94
94
 
95
- function ielem(type: string, message: string, context: Context): HTMLElement {
95
+ function ielem(type: string, message: string, input: Input): HTMLElement {
96
96
  return h('span',
97
97
  { class: 'invalid', ...invalid('html', type, message) },
98
- context.source.slice(context.position - context.range, context.position));
98
+ input.source.slice(input.position - input.range, input.position));
99
99
  }
100
100
 
101
101
  const requiredAttributes = memoize(