securemark 0.299.4 → 0.300.1

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 (233) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/design.md +0 -6
  3. package/dist/index.js +2847 -1993
  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 +35 -0
  15. package/src/combinator/control/sequence.test.ts +38 -0
  16. package/src/combinator/control/sequence.ts +19 -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 +33 -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 +31 -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 +303 -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 +273 -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 +54 -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 +7 -9
  63. package/src/parser/block/extension/aside.ts +76 -47
  64. package/src/parser/block/extension/example.test.ts +16 -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 +58 -63
  71. package/src/parser/block/extension/figure.ts +23 -21
  72. package/src/parser/block/extension/message.test.ts +12 -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 +69 -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 +29 -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 +40 -40
  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 +17 -18
  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 +7 -8
  159. package/src/parser/inline/media.test.ts +92 -93
  160. package/src/parser/inline/media.ts +35 -41
  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 +100 -52
  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 +17 -20
  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 +19 -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 +32 -62
  186. package/src/parser/source/unescapable.test.ts +23 -24
  187. package/src/parser/source/unescapable.ts +15 -16
  188. package/src/parser/source/whitespace.ts +36 -0
  189. package/src/parser/source.ts +1 -0
  190. package/src/parser/util.ts +1 -1
  191. package/src/parser/visibility.ts +37 -15
  192. package/src/processor/figure.test.ts +20 -20
  193. package/src/processor/figure.ts +18 -10
  194. package/src/processor/note.test.ts +13 -13
  195. package/src/processor/note.ts +4 -2
  196. package/src/renderer/render/media/pdf.ts +2 -2
  197. package/src/renderer/render/media/twitter.ts +2 -2
  198. package/src/renderer/render/media.test.ts +12 -12
  199. package/src/renderer/render.test.ts +11 -11
  200. package/src/util/info.test.ts +2 -2
  201. package/src/util/quote.test.ts +3 -3
  202. package/src/util/quote.ts +6 -5
  203. package/src/util/toc.test.ts +12 -12
  204. package/src/combinator/control/constraint/block.test.ts +0 -20
  205. package/src/combinator/control/constraint/block.ts +0 -28
  206. package/src/combinator/control/constraint/contract.ts +0 -27
  207. package/src/combinator/control/constraint/line.test.ts +0 -21
  208. package/src/combinator/control/constraint/line.ts +0 -42
  209. package/src/combinator/control/manipulation/clear.ts +0 -5
  210. package/src/combinator/control/manipulation/convert.ts +0 -22
  211. package/src/combinator/control/manipulation/duplicate.ts +0 -7
  212. package/src/combinator/control/manipulation/fence.ts +0 -54
  213. package/src/combinator/control/manipulation/indent.test.ts +0 -31
  214. package/src/combinator/control/manipulation/indent.ts +0 -39
  215. package/src/combinator/control/manipulation/lazy.ts +0 -8
  216. package/src/combinator/control/manipulation/match.ts +0 -27
  217. package/src/combinator/control/manipulation/recovery.ts +0 -18
  218. package/src/combinator/control/manipulation/reverse.ts +0 -8
  219. package/src/combinator/control/manipulation/scope.ts +0 -61
  220. package/src/combinator/control/manipulation/surround.ts +0 -223
  221. package/src/combinator/control/monad/bind.ts +0 -26
  222. package/src/combinator/control/monad/fmap.ts +0 -10
  223. package/src/combinator/data/parser/context.ts +0 -96
  224. package/src/combinator/data/parser/inits.ts +0 -20
  225. package/src/combinator/data/parser/sequence.test.ts +0 -33
  226. package/src/combinator/data/parser/sequence.ts +0 -20
  227. package/src/combinator/data/parser/some.test.ts +0 -37
  228. package/src/combinator/data/parser/subsequence.test.ts +0 -41
  229. package/src/combinator/data/parser/subsequence.ts +0 -13
  230. package/src/combinator/data/parser/tails.ts +0 -8
  231. package/src/combinator/data/parser/union.test.ts +0 -33
  232. package/src/combinator/data/parser/union.ts +0 -18
  233. package/src/combinator/data/parser.ts +0 -144
@@ -1,7 +1,6 @@
1
1
  import { autolink } from '../autolink';
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/autolink/email', () => {
@@ -9,44 +8,44 @@ describe('Unit: parser/inline/autolink/email', () => {
9
8
  const parser = some(autolink);
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('a@+', new Context())), undefined);
15
- assert.deepStrictEqual(inspect(parser, input('a@_', new Context())), undefined);
16
- assert.deepStrictEqual(inspect(parser, input('a@-', new Context())), undefined);
17
- assert.deepStrictEqual(inspect(parser, input('a@.', new Context())), undefined);
18
- assert.deepStrictEqual(inspect(parser, input('a@b@', new Context())), undefined);
19
- assert.deepStrictEqual(inspect(parser, input('a@bc@', new Context())), undefined);
20
- assert.deepStrictEqual(inspect(parser, input('a@b@c', new Context())), undefined);
21
- assert.deepStrictEqual(inspect(parser, input('a@b#', new Context())), undefined);
22
- assert.deepStrictEqual(inspect(parser, input('a@b#1', new Context())), undefined);
23
- assert.deepStrictEqual(inspect(parser, input('a@@', new Context())), undefined);
24
- assert.deepStrictEqual(inspect(parser, input('a@@b', new Context())), undefined);
25
- assert.deepStrictEqual(inspect(parser, input('a+@b', new Context())), undefined);
26
- assert.deepStrictEqual(inspect(parser, input('a__b@c', new Context())), undefined);
27
- assert.deepStrictEqual(inspect(parser, input('a..b@c', new Context())), undefined);
28
- assert.deepStrictEqual(inspect(parser, input('a++b@c', new Context())), undefined);
29
- assert.deepStrictEqual(inspect(parser, input('a@b_c', new Context())), undefined);
30
- assert.deepStrictEqual(inspect(parser, input('a@b.c:d', new Context())), undefined);
31
- assert.deepStrictEqual(inspect(parser, input('a@b.domain.com:c', new Context())), undefined);
32
- assert.deepStrictEqual(inspect(parser, input('a@http://host', new Context())), undefined);
33
- assert.deepStrictEqual(inspect(parser, input(' a@b', new Context())), undefined);
11
+ assert.deepStrictEqual(inspect(parser, input('')), undefined);
12
+ assert.deepStrictEqual(inspect(parser, input('a@')), undefined);
13
+ assert.deepStrictEqual(inspect(parser, input('a@+')), undefined);
14
+ assert.deepStrictEqual(inspect(parser, input('a@_')), undefined);
15
+ assert.deepStrictEqual(inspect(parser, input('a@-')), undefined);
16
+ assert.deepStrictEqual(inspect(parser, input('a@.')), undefined);
17
+ assert.deepStrictEqual(inspect(parser, input('a@b@')), undefined);
18
+ assert.deepStrictEqual(inspect(parser, input('a@bc@')), undefined);
19
+ assert.deepStrictEqual(inspect(parser, input('a@b@c')), undefined);
20
+ assert.deepStrictEqual(inspect(parser, input('a@b#')), undefined);
21
+ assert.deepStrictEqual(inspect(parser, input('a@b#1')), undefined);
22
+ assert.deepStrictEqual(inspect(parser, input('a@@')), undefined);
23
+ assert.deepStrictEqual(inspect(parser, input('a@@b')), undefined);
24
+ assert.deepStrictEqual(inspect(parser, input('a+@b')), undefined);
25
+ assert.deepStrictEqual(inspect(parser, input('a__b@c')), undefined);
26
+ assert.deepStrictEqual(inspect(parser, input('a..b@c')), undefined);
27
+ assert.deepStrictEqual(inspect(parser, input('a++b@c')), undefined);
28
+ assert.deepStrictEqual(inspect(parser, input('a@b_c')), undefined);
29
+ assert.deepStrictEqual(inspect(parser, input('a@b.c:d')), undefined);
30
+ assert.deepStrictEqual(inspect(parser, input('a@b.domain.com:c')), undefined);
31
+ assert.deepStrictEqual(inspect(parser, input('a@http://host')), undefined);
32
+ assert.deepStrictEqual(inspect(parser, input(' a@b')), undefined);
34
33
  });
35
34
 
36
35
  it('valid', () => {
37
- assert.deepStrictEqual(inspect(parser, input('a@0', new Context())), [['<a class="email" href="mailto:a@0">a@0</a>'], '']);
38
- assert.deepStrictEqual(inspect(parser, input('a@b', new Context())), [['<a class="email" href="mailto:a@b">a@b</a>'], '']);
39
- assert.deepStrictEqual(inspect(parser, input('a@A', new Context())), [['<a class="email" href="mailto:a@A">a@A</a>'], '']);
40
- assert.deepStrictEqual(inspect(parser, input('a@b+', new Context())), [['<a class="email" href="mailto:a@b">a@b</a>'], '+']);
41
- assert.deepStrictEqual(inspect(parser, input('a@b+c', new Context())), [['<a class="email" href="mailto:a@b">a@b</a>'], '+c']);
42
- assert.deepStrictEqual(inspect(parser, input('a@b-', new Context())), [['<a class="email" href="mailto:a@b">a@b</a>'], '-']);
43
- assert.deepStrictEqual(inspect(parser, input('a@b-c', new Context())), [['<a class="email" href="mailto:a@b-c">a@b-c</a>'], '']);
44
- assert.deepStrictEqual(inspect(parser, input('a@b--c', new Context())), [['<a class="email" href="mailto:a@b">a@b</a>'], '--c']);
45
- assert.deepStrictEqual(inspect(parser, input('a@b_', new Context())), [['<a class="email" href="mailto:a@b">a@b</a>'], '_']);
46
- assert.deepStrictEqual(inspect(parser, input('a@b.', new Context())), [['<a class="email" href="mailto:a@b">a@b</a>'], '.']);
47
- assert.deepStrictEqual(inspect(parser, input('a@b.c', new Context())), [['<a class="email" href="mailto:a@b.c">a@b.c</a>'], '']);
48
- assert.deepStrictEqual(inspect(parser, input('a@b..c', new Context())), [['<a class="email" href="mailto:a@b">a@b</a>'], '..c']);
49
- assert.deepStrictEqual(inspect(parser, input('ab+cd@0', new Context())), [['<a class="email" href="mailto:ab+cd@0">ab+cd@0</a>'], '']);
36
+ assert.deepStrictEqual(inspect(parser, input('a@0')), [['<a class="email" href="mailto:a@0">a@0</a>'], '']);
37
+ assert.deepStrictEqual(inspect(parser, input('a@b')), [['<a class="email" href="mailto:a@b">a@b</a>'], '']);
38
+ assert.deepStrictEqual(inspect(parser, input('a@A')), [['<a class="email" href="mailto:a@A">a@A</a>'], '']);
39
+ assert.deepStrictEqual(inspect(parser, input('a@b+')), [['<a class="email" href="mailto:a@b">a@b</a>'], '+']);
40
+ assert.deepStrictEqual(inspect(parser, input('a@b+c')), [['<a class="email" href="mailto:a@b">a@b</a>'], '+c']);
41
+ assert.deepStrictEqual(inspect(parser, input('a@b-')), [['<a class="email" href="mailto:a@b">a@b</a>'], '-']);
42
+ assert.deepStrictEqual(inspect(parser, input('a@b-c')), [['<a class="email" href="mailto:a@b-c">a@b-c</a>'], '']);
43
+ assert.deepStrictEqual(inspect(parser, input('a@b--c')), [['<a class="email" href="mailto:a@b">a@b</a>'], '--c']);
44
+ assert.deepStrictEqual(inspect(parser, input('a@b_')), [['<a class="email" href="mailto:a@b">a@b</a>'], '_']);
45
+ assert.deepStrictEqual(inspect(parser, input('a@b.')), [['<a class="email" href="mailto:a@b">a@b</a>'], '.']);
46
+ assert.deepStrictEqual(inspect(parser, input('a@b.c')), [['<a class="email" href="mailto:a@b.c">a@b.c</a>'], '']);
47
+ assert.deepStrictEqual(inspect(parser, input('a@b..c')), [['<a class="email" href="mailto:a@b">a@b</a>'], '..c']);
48
+ assert.deepStrictEqual(inspect(parser, input('ab+cd@0')), [['<a class="email" href="mailto:ab+cd@0">ab+cd@0</a>'], '']);
50
49
  });
51
50
 
52
51
  });
@@ -1,20 +1,20 @@
1
1
  import { AutolinkParser } from '../../inline';
2
2
  import { State, Backtrack } from '../../context';
3
- import { List, Node } from '../../../combinator/data/parser';
4
- import { state, constraint, verify, surround } from '../../../combinator';
3
+ import { Node } from '../../../combinator/parser';
4
+ import { state, constraint, backtrack, verify, surround } from '../../../combinator';
5
5
  import { str } from '../../source';
6
6
  import { html } from 'typed-dom/dom';
7
7
 
8
8
  // https://html.spec.whatwg.org/multipage/input.html
9
9
 
10
10
  export const email: AutolinkParser.EmailParser = constraint(State.autolink, state(State.autolink,
11
- surround(
11
+ backtrack(surround(
12
12
  /(?<![0-9a-z][_.+-]?|[@#])(?=[0-9a-z])/yi,
13
13
  verify(
14
14
  str(/[0-9a-z](?:[_.+-](?=[0-9a-z])|[0-9a-z]){0,63}@[0-9a-z](?:[.-](?=[0-9a-z])|[0-9a-z]){0,254}(?![_.-]?[0-9a-z@#]|>>|:\S)/yi),
15
- ([{ value }]) => value.length <= 254),
15
+ (_, output) => output.peek().head!.value.length <= 254),
16
16
  '',
17
17
  false,
18
18
  [3 | Backtrack.unescapable],
19
- ([, [{ value }]]) =>
20
- new List([new Node(html('a', { class: 'email', href: `mailto:${value}` }, value))]))));
19
+ ([, [{ value }]], _, output) =>
20
+ output.append(new Node(html('a', { class: 'email', href: `mailto:${value}` }, value)))))));
@@ -1,7 +1,6 @@
1
1
  import { autolink } from '../autolink';
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/autolink/hashnum', () => {
@@ -9,40 +8,40 @@ describe('Unit: parser/inline/autolink/hashnum', () => {
9
8
  const parser = some(autolink);
10
9
 
11
10
  it('invalid', () => {
12
- assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
13
- assert.deepStrictEqual(inspect(parser, input('#', new Context())), undefined);
14
- assert.deepStrictEqual(inspect(parser, input('# ', new Context())), undefined);
15
- assert.deepStrictEqual(inspect(parser, input('#1#', new Context())), undefined);
16
- assert.deepStrictEqual(inspect(parser, input('#1#2', new Context())), undefined);
17
- assert.deepStrictEqual(inspect(parser, input('#1#2#3', new Context())), undefined);
18
- assert.deepStrictEqual(inspect(parser, input('#1@2', new Context())), undefined);
19
- assert.deepStrictEqual(inspect(parser, input('#\\', new Context())), undefined);
20
- assert.deepStrictEqual(inspect(parser, input('#\\ ', new Context())), undefined);
21
- assert.deepStrictEqual(inspect(parser, input('#\\\n', new Context())), undefined);
22
- assert.deepStrictEqual(inspect(parser, input('##', new Context())), undefined);
23
- assert.deepStrictEqual(inspect(parser, input('##1', new Context())), undefined);
24
- assert.deepStrictEqual(inspect(parser, input('###1', new Context())), undefined);
25
- assert.deepStrictEqual(inspect(parser, input('#{}', new Context())), undefined);
26
- assert.deepStrictEqual(inspect(parser, input('#{{}', new Context())), undefined);
27
- assert.deepStrictEqual(inspect(parser, input('#{}}', new Context())), undefined);
28
- assert.deepStrictEqual(inspect(parser, input('#{#}', new Context())), undefined);
29
- assert.deepStrictEqual(inspect(parser, input('#{1}', new Context())), undefined);
30
- assert.deepStrictEqual(inspect(parser, input(`#${'1'.repeat(10)}`, new Context())), undefined);
31
- assert.deepStrictEqual(inspect(parser, input(`#${'1'.repeat(10)}a`, new Context())), undefined);
32
- assert.deepStrictEqual(inspect(parser, input('# ', new Context())), undefined);
33
- assert.deepStrictEqual(inspect(parser, input(' #1', new Context())), undefined);
11
+ assert.deepStrictEqual(inspect(parser, input('')), undefined);
12
+ assert.deepStrictEqual(inspect(parser, input('#')), undefined);
13
+ assert.deepStrictEqual(inspect(parser, input('# ')), undefined);
14
+ assert.deepStrictEqual(inspect(parser, input('#1#')), undefined);
15
+ assert.deepStrictEqual(inspect(parser, input('#1#2')), undefined);
16
+ assert.deepStrictEqual(inspect(parser, input('#1#2#3')), undefined);
17
+ assert.deepStrictEqual(inspect(parser, input('#1@2')), undefined);
18
+ assert.deepStrictEqual(inspect(parser, input('#\\')), undefined);
19
+ assert.deepStrictEqual(inspect(parser, input('#\\ ')), undefined);
20
+ assert.deepStrictEqual(inspect(parser, input('#\\\n')), undefined);
21
+ assert.deepStrictEqual(inspect(parser, input('##')), undefined);
22
+ assert.deepStrictEqual(inspect(parser, input('##1')), undefined);
23
+ assert.deepStrictEqual(inspect(parser, input('###1')), undefined);
24
+ assert.deepStrictEqual(inspect(parser, input('#{}')), undefined);
25
+ assert.deepStrictEqual(inspect(parser, input('#{{}')), undefined);
26
+ assert.deepStrictEqual(inspect(parser, input('#{}}')), undefined);
27
+ assert.deepStrictEqual(inspect(parser, input('#{#}')), undefined);
28
+ assert.deepStrictEqual(inspect(parser, input('#{1}')), undefined);
29
+ assert.deepStrictEqual(inspect(parser, input(`#${'1'.repeat(10)}`)), undefined);
30
+ assert.deepStrictEqual(inspect(parser, input(`#${'1'.repeat(10)}a`)), undefined);
31
+ assert.deepStrictEqual(inspect(parser, input('# ')), undefined);
32
+ assert.deepStrictEqual(inspect(parser, input(' #1')), undefined);
34
33
  });
35
34
 
36
35
  it('valid', () => {
37
- assert.deepStrictEqual(inspect(parser, input('#1', new Context())), [['<a class="hashnum">#1</a>'], '']);
38
- assert.deepStrictEqual(inspect(parser, input('#1 ', new Context())), [['<a class="hashnum">#1</a>'], ' ']);
39
- assert.deepStrictEqual(inspect(parser, input('#1\n', new Context())), [['<a class="hashnum">#1</a>'], '\n']);
40
- assert.deepStrictEqual(inspect(parser, input('#1\\', new Context())), [['<a class="hashnum">#1</a>'], '\\']);
41
- assert.deepStrictEqual(inspect(parser, input('#1\\ ', new Context())), [['<a class="hashnum">#1</a>'], '\\ ']);
42
- assert.deepStrictEqual(inspect(parser, input('#1\\\n', new Context())), [['<a class="hashnum">#1</a>'], '\\\n']);
43
- assert.deepStrictEqual(inspect(parser, input(`#1'`, new Context())), [[`<a class="hashnum">#1</a>`], `'`]);
44
- assert.deepStrictEqual(inspect(parser, input(`#1''`, new Context())), [[`<a class="hashnum">#1</a>`], `''`]);
45
- assert.deepStrictEqual(inspect(parser, input('#123456789', new Context())), [['<a class="hashnum">#123456789</a>'], '']);
36
+ assert.deepStrictEqual(inspect(parser, input('#1')), [['<a class="hashnum">#1</a>'], '']);
37
+ assert.deepStrictEqual(inspect(parser, input('#1 ')), [['<a class="hashnum">#1</a>'], ' ']);
38
+ assert.deepStrictEqual(inspect(parser, input('#1\n')), [['<a class="hashnum">#1</a>'], '\n']);
39
+ assert.deepStrictEqual(inspect(parser, input('#1\\')), [['<a class="hashnum">#1</a>'], '\\']);
40
+ assert.deepStrictEqual(inspect(parser, input('#1\\ ')), [['<a class="hashnum">#1</a>'], '\\ ']);
41
+ assert.deepStrictEqual(inspect(parser, input('#1\\\n')), [['<a class="hashnum">#1</a>'], '\\\n']);
42
+ assert.deepStrictEqual(inspect(parser, input(`#1'`)), [[`<a class="hashnum">#1</a>`], `'`]);
43
+ assert.deepStrictEqual(inspect(parser, input(`#1''`)), [[`<a class="hashnum">#1</a>`], `''`]);
44
+ assert.deepStrictEqual(inspect(parser, input('#123456789')), [['<a class="hashnum">#123456789</a>'], '']);
46
45
  });
47
46
 
48
47
  });
@@ -1,14 +1,14 @@
1
1
  import { AutolinkParser } from '../../inline';
2
2
  import { State, Backtrack } from '../../context';
3
- import { List, Node } from '../../../combinator/data/parser';
4
- import { state, constraint, surround, lazy } from '../../../combinator';
3
+ import { List, Node } from '../../../combinator/parser';
4
+ import { state, constraint, backtrack, surround, lazy } from '../../../combinator';
5
5
  import { parse } from '../link';
6
6
  import { emoji } from './hashtag';
7
7
  import { str } from '../../source';
8
8
  import { define } from 'typed-dom/dom';
9
9
 
10
10
  export const hashnum: AutolinkParser.HashnumParser = lazy(() => constraint(State.autolink, state(State.autolink,
11
- surround(
11
+ backtrack(surround(
12
12
  new RegExp([
13
13
  /(?<![^\p{C}\p{S}\p{P}\s]|emoji|[@#])#/yu.source,
14
14
  ].join('|').replace(/emoji/g, emoji.source), 'yu'),
@@ -19,11 +19,10 @@ export const hashnum: AutolinkParser.HashnumParser = lazy(() => constraint(State
19
19
  false,
20
20
  // unescapableを使用するべきだがhashtagとの重複を回避するためescapableを使用する。
21
21
  [3 | Backtrack.escapable],
22
- ([, [{ value }]], context) =>
23
- new List([
22
+ ([, [{ value }]], input, output) =>
23
+ output.append(
24
24
  new Node(define(parse(
25
25
  new List([new Node(`#${value}`)]),
26
26
  new List([new Node(value)]),
27
- context),
28
- { class: 'hashnum', href: null }))
29
- ])))));
27
+ input),
28
+ { class: 'hashnum', href: null }))))))));
@@ -1,7 +1,6 @@
1
1
  import { autolink } from '../autolink';
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/autolink/hashtag', () => {
@@ -9,67 +8,67 @@ describe('Unit: parser/inline/autolink/hashtag', () => {
9
8
  const parser = some(autolink);
10
9
 
11
10
  it('invalid', () => {
12
- assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
13
- assert.deepStrictEqual(inspect(parser, input('#', new Context())), undefined);
14
- assert.deepStrictEqual(inspect(parser, input('# ', new Context())), undefined);
15
- assert.deepStrictEqual(inspect(parser, input('#a#', new Context())), undefined);
16
- assert.deepStrictEqual(inspect(parser, input('#a#b', new Context())), undefined);
17
- assert.deepStrictEqual(inspect(parser, input('#a#b#c', new Context())), undefined);
18
- assert.deepStrictEqual(inspect(parser, input('#a@b', new Context())), undefined);
19
- assert.deepStrictEqual(inspect(parser, input('#@', new Context())), undefined);
20
- assert.deepStrictEqual(inspect(parser, input('#@a', new Context())), undefined);
21
- assert.deepStrictEqual(inspect(parser, input('#\\', new Context())), undefined);
22
- assert.deepStrictEqual(inspect(parser, input('#\\ ', new Context())), undefined);
23
- assert.deepStrictEqual(inspect(parser, input('#\\\n', new Context())), undefined);
24
- assert.deepStrictEqual(inspect(parser, input('##', new Context())), undefined);
25
- assert.deepStrictEqual(inspect(parser, input('##a', new Context())), undefined);
26
- assert.deepStrictEqual(inspect(parser, input('###a', new Context())), undefined);
27
- assert.deepStrictEqual(inspect(parser, input(`#'`, new Context())), undefined);
28
- assert.deepStrictEqual(inspect(parser, input(`#'0`, new Context())), undefined);
29
- assert.deepStrictEqual(inspect(parser, input(`#'00`, 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);
33
- assert.deepStrictEqual(inspect(parser, input('#{}', new Context())), undefined);
34
- assert.deepStrictEqual(inspect(parser, input('#{{}', new Context())), undefined);
35
- assert.deepStrictEqual(inspect(parser, input('#{}}', new Context())), undefined);
36
- assert.deepStrictEqual(inspect(parser, input('#{#}', new Context())), undefined);
37
- assert.deepStrictEqual(inspect(parser, input('#{a}', new Context())), undefined);
38
- assert.deepStrictEqual(inspect(parser, input('#12345a', new Context())), undefined);
39
- assert.deepStrictEqual(inspect(parser, input('# ', new Context())), undefined);
40
- assert.deepStrictEqual(inspect(parser, input(' #a', new Context())), undefined);
11
+ assert.deepStrictEqual(inspect(parser, input('')), undefined);
12
+ assert.deepStrictEqual(inspect(parser, input('#')), undefined);
13
+ assert.deepStrictEqual(inspect(parser, input('# ')), undefined);
14
+ assert.deepStrictEqual(inspect(parser, input('#a#')), undefined);
15
+ assert.deepStrictEqual(inspect(parser, input('#a#b')), undefined);
16
+ assert.deepStrictEqual(inspect(parser, input('#a#b#c')), undefined);
17
+ assert.deepStrictEqual(inspect(parser, input('#a@b')), undefined);
18
+ assert.deepStrictEqual(inspect(parser, input('#@')), undefined);
19
+ assert.deepStrictEqual(inspect(parser, input('#@a')), undefined);
20
+ assert.deepStrictEqual(inspect(parser, input('#\\')), undefined);
21
+ assert.deepStrictEqual(inspect(parser, input('#\\ ')), undefined);
22
+ assert.deepStrictEqual(inspect(parser, input('#\\\n')), undefined);
23
+ assert.deepStrictEqual(inspect(parser, input('##')), undefined);
24
+ assert.deepStrictEqual(inspect(parser, input('##a')), undefined);
25
+ assert.deepStrictEqual(inspect(parser, input('###a')), undefined);
26
+ assert.deepStrictEqual(inspect(parser, input(`#'`)), undefined);
27
+ assert.deepStrictEqual(inspect(parser, input(`#'0`)), undefined);
28
+ assert.deepStrictEqual(inspect(parser, input(`#'00`)), undefined);
29
+ assert.deepStrictEqual(inspect(parser, input('#_')), undefined);
30
+ assert.deepStrictEqual(inspect(parser, input('#_a')), undefined);
31
+ assert.deepStrictEqual(inspect(parser, input('#(a)')), undefined);
32
+ assert.deepStrictEqual(inspect(parser, input('#{}')), undefined);
33
+ assert.deepStrictEqual(inspect(parser, input('#{{}')), undefined);
34
+ assert.deepStrictEqual(inspect(parser, input('#{}}')), undefined);
35
+ assert.deepStrictEqual(inspect(parser, input('#{#}')), undefined);
36
+ assert.deepStrictEqual(inspect(parser, input('#{a}')), undefined);
37
+ assert.deepStrictEqual(inspect(parser, input('#12345a')), undefined);
38
+ assert.deepStrictEqual(inspect(parser, input('# ')), undefined);
39
+ assert.deepStrictEqual(inspect(parser, input(' #a')), undefined);
41
40
  });
42
41
 
43
42
  it('valid', () => {
44
- assert.deepStrictEqual(inspect(parser, input('#a', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
45
- assert.deepStrictEqual(inspect(parser, input('#a ', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], ' ']);
46
- assert.deepStrictEqual(inspect(parser, input('#a\n', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\n']);
47
- assert.deepStrictEqual(inspect(parser, input('#a\\', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\\']);
48
- assert.deepStrictEqual(inspect(parser, input('#a\\ ', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\\ ']);
49
- assert.deepStrictEqual(inspect(parser, input('#a\\\n', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\\\n']);
50
- assert.deepStrictEqual(inspect(parser, input('#a)', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], ')']);
51
- assert.deepStrictEqual(inspect(parser, input('#a(b', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '(b']);
52
- assert.deepStrictEqual(inspect(parser, input('#a(b)', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '(b)']);
53
- assert.deepStrictEqual(inspect(parser, input('#a_', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '_']);
54
- assert.deepStrictEqual(inspect(parser, input('#a_b', new Context())), [['<a class="hashtag" href="/hashtags/a_b">#a_b</a>'], '']);
55
- assert.deepStrictEqual(inspect(parser, input('#a__b', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '__b']);
56
- assert.deepStrictEqual(inspect(parser, input('#あ', new Context())), [['<a class="hashtag" href="/hashtags/あ">#あ</a>'], '']);
57
- assert.deepStrictEqual(inspect(parser, input('#😀', new Context())), [['<a class="hashtag" href="/hashtags/😀">#😀</a>'], '']);
58
- assert.deepStrictEqual(inspect(parser, input('#🤚🏽', new Context())), [['<a class="hashtag" href="/hashtags/🤚🏽">#🤚🏽</a>'], '']);
59
- assert.deepStrictEqual(inspect(parser, input('#👨‍👩‍👧', new Context())), [['<a class="hashtag" href="/hashtags/👨‍👩‍👧">#👨‍👩‍👧</a>'], '']);
60
- assert.deepStrictEqual(inspect(parser, input('#🇺🇳', new Context())), [['<a class="hashtag" href="/hashtags/🇺🇳">#🇺🇳</a>'], '']);
61
- assert.deepStrictEqual(inspect(parser, input('##️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣', new Context())), [['<a class="hashtag" href="/hashtags/#️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣">##️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣</a>'], '']);
62
- assert.deepStrictEqual(inspect(parser, input('#1a', new Context())), [['<a class="hashtag" href="/hashtags/1a">#1a</a>'], '']);
63
- assert.deepStrictEqual(inspect(parser, input('#1あ', new Context())), [['<a class="hashtag" href="/hashtags/1あ">#1あ</a>'], '']);
64
- assert.deepStrictEqual(inspect(parser, input('#1😀', new Context())), [['<a class="hashtag" href="/hashtags/1😀">#1😀</a>'], '']);
65
- assert.deepStrictEqual(inspect(parser, input(`#a'`, new Context())), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `'`]);
66
- assert.deepStrictEqual(inspect(parser, input(`#a''`, new Context())), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `''`]);
67
- assert.deepStrictEqual(inspect(parser, input(`#a'b`, new Context())), [[`<a class="hashtag" href="/hashtags/a'b">#a'b</a>`], '']);
68
- assert.deepStrictEqual(inspect(parser, input(`#a'0`, new Context())), [[`<a class="hashtag" href="/hashtags/a'0">#a'0</a>`], '']);
69
- assert.deepStrictEqual(inspect(parser, input(`#a'_b`, new Context())), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `'_b`]);
70
- assert.deepStrictEqual(inspect(parser, input(`#a_'b`, new Context())), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `_'b`]);
71
- assert.deepStrictEqual(inspect(parser, input('#1234a', new Context())), [['<a class="hashtag" href="/hashtags/1234a">#1234a</a>'], '']);
72
- assert.deepStrictEqual(inspect(parser, input('#a+b', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '+b']);
43
+ assert.deepStrictEqual(inspect(parser, input('#a')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
44
+ assert.deepStrictEqual(inspect(parser, input('#a ')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], ' ']);
45
+ assert.deepStrictEqual(inspect(parser, input('#a\n')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\n']);
46
+ assert.deepStrictEqual(inspect(parser, input('#a\\')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\\']);
47
+ assert.deepStrictEqual(inspect(parser, input('#a\\ ')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\\ ']);
48
+ assert.deepStrictEqual(inspect(parser, input('#a\\\n')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\\\n']);
49
+ assert.deepStrictEqual(inspect(parser, input('#a)')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], ')']);
50
+ assert.deepStrictEqual(inspect(parser, input('#a(b')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '(b']);
51
+ assert.deepStrictEqual(inspect(parser, input('#a(b)')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '(b)']);
52
+ assert.deepStrictEqual(inspect(parser, input('#a_')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '_']);
53
+ assert.deepStrictEqual(inspect(parser, input('#a_b')), [['<a class="hashtag" href="/hashtags/a_b">#a_b</a>'], '']);
54
+ assert.deepStrictEqual(inspect(parser, input('#a__b')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '__b']);
55
+ assert.deepStrictEqual(inspect(parser, input('#あ')), [['<a class="hashtag" href="/hashtags/あ">#あ</a>'], '']);
56
+ assert.deepStrictEqual(inspect(parser, input('#😀')), [['<a class="hashtag" href="/hashtags/😀">#😀</a>'], '']);
57
+ assert.deepStrictEqual(inspect(parser, input('#🤚🏽')), [['<a class="hashtag" href="/hashtags/🤚🏽">#🤚🏽</a>'], '']);
58
+ assert.deepStrictEqual(inspect(parser, input('#👨‍👩‍👧')), [['<a class="hashtag" href="/hashtags/👨‍👩‍👧">#👨‍👩‍👧</a>'], '']);
59
+ assert.deepStrictEqual(inspect(parser, input('#🇺🇳')), [['<a class="hashtag" href="/hashtags/🇺🇳">#🇺🇳</a>'], '']);
60
+ assert.deepStrictEqual(inspect(parser, input('##️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣')), [['<a class="hashtag" href="/hashtags/#️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣">##️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣</a>'], '']);
61
+ assert.deepStrictEqual(inspect(parser, input('#1a')), [['<a class="hashtag" href="/hashtags/1a">#1a</a>'], '']);
62
+ assert.deepStrictEqual(inspect(parser, input('#1あ')), [['<a class="hashtag" href="/hashtags/1あ">#1あ</a>'], '']);
63
+ assert.deepStrictEqual(inspect(parser, input('#1😀')), [['<a class="hashtag" href="/hashtags/1😀">#1😀</a>'], '']);
64
+ assert.deepStrictEqual(inspect(parser, input(`#a'`)), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `'`]);
65
+ assert.deepStrictEqual(inspect(parser, input(`#a''`)), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `''`]);
66
+ assert.deepStrictEqual(inspect(parser, input(`#a'b`)), [[`<a class="hashtag" href="/hashtags/a'b">#a'b</a>`], '']);
67
+ assert.deepStrictEqual(inspect(parser, input(`#a'0`)), [[`<a class="hashtag" href="/hashtags/a'0">#a'0</a>`], '']);
68
+ assert.deepStrictEqual(inspect(parser, input(`#a'_b`)), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `'_b`]);
69
+ assert.deepStrictEqual(inspect(parser, input(`#a_'b`)), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `_'b`]);
70
+ assert.deepStrictEqual(inspect(parser, input('#1234a')), [['<a class="hashtag" href="/hashtags/1234a">#1234a</a>'], '']);
71
+ assert.deepStrictEqual(inspect(parser, input('#a+b')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '+b']);
73
72
  });
74
73
 
75
74
  });
@@ -1,7 +1,7 @@
1
1
  import { AutolinkParser } from '../../inline';
2
2
  import { State, Backtrack } from '../../context';
3
- import { List, Node } from '../../../combinator/data/parser';
4
- import { state, constraint, verify, surround, lazy } from '../../../combinator';
3
+ import { List, Node } from '../../../combinator/parser';
4
+ import { state, constraint, backtrack, verify, surround, lazy } from '../../../combinator';
5
5
  import { parse } from '../link';
6
6
  import { str } from '../../source';
7
7
  import { define } from 'typed-dom/dom';
@@ -12,7 +12,7 @@ import { define } from 'typed-dom/dom';
12
12
  export const emoji = /\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F|\u200D/u;
13
13
 
14
14
  export const hashtag: AutolinkParser.HashtagParser = lazy(() => constraint(State.autolink, state(State.autolink,
15
- surround(
15
+ backtrack(surround(
16
16
  new RegExp([
17
17
  /(?<![^\p{C}\p{S}\p{P}\s]|emoji|[@#])#/yu.source,
18
18
  ].join('|').replace(/emoji/g, emoji.source), 'yu'),
@@ -20,17 +20,16 @@ export const hashtag: AutolinkParser.HashtagParser = lazy(() => constraint(State
20
20
  str(new RegExp([
21
21
  /(?!['_])(?:[^\p{C}\p{S}\p{P}\s]|emoji|'(?=[0-9A-Za-z])|_(?=[^\p{C}\p{S}\p{P}\s]|emoji))+/yu.source,
22
22
  ].join('|').replace(/emoji/g, emoji.source), 'yu')),
23
- ([{ value }]) => /^[0-9]{0,4}[^0-9]/.test(value)),
23
+ (_, output) => /^[0-9]{0,4}[^0-9]/.test(output.peek().head!.value)),
24
24
  new RegExp([
25
25
  /(?![_.-]?[0-9a-z@#]|>>|:\S|[^\p{C}\p{S}\p{P}\s]|emoji)/yu.source,
26
26
  ].join('|').replace(/emoji/g, emoji.source), 'yu'),
27
27
  false,
28
28
  [3 | Backtrack.unescapable],
29
- ([, [{ value }]], context) =>
30
- new List([
29
+ ([, [{ value }]], input, output) =>
30
+ output.append(
31
31
  new Node(define(parse(
32
32
  new List([new Node(`#${value}`)]),
33
33
  new List([new Node(`/hashtags/${value}`)]),
34
- context),
35
- { class: 'hashtag' }))
36
- ])))));
34
+ input),
35
+ { class: 'hashtag' }))))))));