securemark 0.292.0 → 0.293.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 (127) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/index.js +597 -416
  3. package/markdown.d.ts +35 -60
  4. package/package.json +1 -1
  5. package/src/combinator/control/constraint/contract.ts +6 -15
  6. package/src/combinator/control/manipulation/clear.ts +3 -4
  7. package/src/combinator/control/manipulation/fence.ts +3 -1
  8. package/src/combinator/control/manipulation/indent.ts +5 -11
  9. package/src/combinator/control/manipulation/match.ts +3 -2
  10. package/src/combinator/control/manipulation/recovery.ts +1 -1
  11. package/src/combinator/control/manipulation/scope.ts +3 -10
  12. package/src/combinator/control/manipulation/surround.ts +4 -24
  13. package/src/combinator/data/parser/context/delimiter.ts +10 -9
  14. package/src/combinator/data/parser/context.ts +31 -0
  15. package/src/combinator/data/parser/inits.ts +1 -1
  16. package/src/combinator/data/parser/sequence.ts +1 -1
  17. package/src/combinator/data/parser/some.test.ts +1 -1
  18. package/src/combinator/data/parser/some.ts +4 -5
  19. package/src/combinator/data/parser.ts +0 -1
  20. package/src/combinator.ts +0 -1
  21. package/src/parser/api/parse.test.ts +16 -8
  22. package/src/parser/api/parse.ts +1 -2
  23. package/src/parser/autolink.test.ts +7 -7
  24. package/src/parser/autolink.ts +2 -4
  25. package/src/parser/block/blockquote.test.ts +1 -1
  26. package/src/parser/block/blockquote.ts +7 -7
  27. package/src/parser/block/codeblock.ts +8 -8
  28. package/src/parser/block/dlist.test.ts +1 -1
  29. package/src/parser/block/dlist.ts +5 -6
  30. package/src/parser/block/extension/aside.ts +4 -4
  31. package/src/parser/block/extension/example.ts +4 -4
  32. package/src/parser/block/extension/fig.ts +5 -5
  33. package/src/parser/block/extension/figbase.ts +1 -1
  34. package/src/parser/block/extension/figure.test.ts +1 -1
  35. package/src/parser/block/extension/figure.ts +6 -6
  36. package/src/parser/block/extension/message.ts +4 -4
  37. package/src/parser/block/extension/placeholder.ts +8 -8
  38. package/src/parser/block/extension/table.test.ts +1 -1
  39. package/src/parser/block/extension/table.ts +32 -22
  40. package/src/parser/block/extension.ts +3 -3
  41. package/src/parser/block/heading.test.ts +1 -1
  42. package/src/parser/block/heading.ts +2 -2
  43. package/src/parser/block/ilist.test.ts +3 -3
  44. package/src/parser/block/ilist.ts +5 -5
  45. package/src/parser/block/mathblock.ts +8 -8
  46. package/src/parser/block/mediablock.ts +6 -6
  47. package/src/parser/block/olist.test.ts +16 -14
  48. package/src/parser/block/olist.ts +13 -13
  49. package/src/parser/block/pagebreak.ts +1 -1
  50. package/src/parser/block/paragraph.test.ts +3 -4
  51. package/src/parser/block/paragraph.ts +1 -2
  52. package/src/parser/block/reply/cite.ts +7 -9
  53. package/src/parser/block/reply/quote.ts +6 -6
  54. package/src/parser/block/reply.ts +3 -3
  55. package/src/parser/block/sidefence.ts +3 -3
  56. package/src/parser/block/table.ts +13 -13
  57. package/src/parser/block/ulist.test.ts +8 -7
  58. package/src/parser/block/ulist.ts +6 -7
  59. package/src/parser/block.ts +48 -15
  60. package/src/parser/context.ts +4 -4
  61. package/src/parser/header.ts +3 -3
  62. package/src/parser/inline/annotation.ts +1 -1
  63. package/src/parser/inline/autolink/account.test.ts +8 -7
  64. package/src/parser/inline/autolink/account.ts +11 -8
  65. package/src/parser/inline/autolink/anchor.test.ts +1 -1
  66. package/src/parser/inline/autolink/anchor.ts +21 -17
  67. package/src/parser/inline/autolink/channel.test.ts +8 -8
  68. package/src/parser/inline/autolink/channel.ts +40 -15
  69. package/src/parser/inline/autolink/email.test.ts +15 -15
  70. package/src/parser/inline/autolink/email.ts +5 -7
  71. package/src/parser/inline/autolink/hashnum.test.ts +4 -9
  72. package/src/parser/inline/autolink/hashnum.ts +8 -4
  73. package/src/parser/inline/autolink/hashtag.test.ts +9 -10
  74. package/src/parser/inline/autolink/hashtag.ts +9 -6
  75. package/src/parser/inline/autolink/url.test.ts +72 -74
  76. package/src/parser/inline/autolink/url.ts +19 -24
  77. package/src/parser/inline/autolink.ts +21 -24
  78. package/src/parser/inline/bracket.ts +3 -3
  79. package/src/parser/inline/code.ts +2 -2
  80. package/src/parser/inline/deletion.test.ts +2 -2
  81. package/src/parser/inline/deletion.ts +1 -1
  82. package/src/parser/inline/emphasis.test.ts +5 -5
  83. package/src/parser/inline/emphasis.ts +2 -7
  84. package/src/parser/inline/emstrong.test.ts +14 -14
  85. package/src/parser/inline/emstrong.ts +4 -16
  86. package/src/parser/inline/extension/index.test.ts +5 -3
  87. package/src/parser/inline/extension/index.ts +8 -10
  88. package/src/parser/inline/extension/indexer.test.ts +1 -2
  89. package/src/parser/inline/extension/indexer.ts +3 -3
  90. package/src/parser/inline/extension/label.ts +1 -1
  91. package/src/parser/inline/extension/placeholder.ts +1 -1
  92. package/src/parser/inline/html.test.ts +2 -2
  93. package/src/parser/inline/html.ts +21 -20
  94. package/src/parser/inline/htmlentity.ts +4 -4
  95. package/src/parser/inline/insertion.test.ts +2 -2
  96. package/src/parser/inline/insertion.ts +1 -1
  97. package/src/parser/inline/italic.test.ts +9 -9
  98. package/src/parser/inline/italic.ts +1 -1
  99. package/src/parser/inline/link.ts +14 -19
  100. package/src/parser/inline/mark.test.ts +5 -5
  101. package/src/parser/inline/mark.ts +1 -1
  102. package/src/parser/inline/math.test.ts +6 -6
  103. package/src/parser/inline/math.ts +9 -13
  104. package/src/parser/inline/media.ts +9 -14
  105. package/src/parser/inline/reference.test.ts +4 -4
  106. package/src/parser/inline/reference.ts +5 -5
  107. package/src/parser/inline/remark.test.ts +19 -23
  108. package/src/parser/inline/remark.ts +17 -19
  109. package/src/parser/inline/ruby.ts +5 -3
  110. package/src/parser/inline/shortmedia.ts +6 -9
  111. package/src/parser/inline/strong.test.ts +5 -5
  112. package/src/parser/inline/strong.ts +2 -7
  113. package/src/parser/inline.test.ts +25 -23
  114. package/src/parser/inline.ts +21 -9
  115. package/src/parser/segment.ts +23 -5
  116. package/src/parser/source/escapable.test.ts +6 -6
  117. package/src/parser/source/escapable.ts +20 -5
  118. package/src/parser/source/line.ts +28 -4
  119. package/src/parser/source/str.ts +5 -27
  120. package/src/parser/source/text.test.ts +60 -60
  121. package/src/parser/source/text.ts +121 -6
  122. package/src/parser/source/unescapable.test.ts +8 -8
  123. package/src/parser/source/unescapable.ts +19 -3
  124. package/src/parser/util.ts +3 -3
  125. package/src/parser/visibility.ts +45 -40
  126. package/src/combinator/control/manipulation/trim.test.ts +0 -23
  127. package/src/combinator/control/manipulation/trim.ts +0 -17
@@ -8,7 +8,7 @@ import { invalid } from '../util';
8
8
  import { html, defrag } from 'typed-dom/dom';
9
9
 
10
10
  export const segment: HeadingParser.SegmentParser = block(validate('#', focus(
11
- /^#+[^\S\n]+\S[^\n]*(?:\n#+(?!\S)[^\n]*)*(?:$|\n)/,
11
+ /#+[^\S\n]+\S[^\n]*(?:\n#+(?!\S)[^\n]*)*(?:$|\n)/y,
12
12
  some(line(({ context: { source } }) => [[source]])))));
13
13
 
14
14
  export const heading: HeadingParser = block(rewrite(segment,
@@ -16,7 +16,7 @@ export const heading: HeadingParser = block(rewrite(segment,
16
16
  state(State.annotation | State.reference | State.index | State.label | State.link,
17
17
  line(indexee(fmap(union([
18
18
  open(
19
- str(/^##+/),
19
+ str(/##+/y),
20
20
  visualize(trimBlank(some(union([indexer, inline])))), true),
21
21
  open(
22
22
  str('#'),
@@ -15,9 +15,9 @@ describe('Unit: parser/block/ilist', () => {
15
15
  assert(parser('- '));
16
16
  assert(parser('+ '));
17
17
  assert(parser('* '));
18
- assert(parser('-\n-'));
19
- assert(parser('+\n+'));
20
- assert(parser('*\n*'));
18
+ assert(parser('- \n-'));
19
+ assert(parser('+ \n+'));
20
+ assert(parser('* \n*'));
21
21
  });
22
22
 
23
23
  });
@@ -1,25 +1,25 @@
1
1
  import { IListParser } from '../block';
2
2
  import { Parser } from '../../combinator/data/parser';
3
3
  import { Recursion } from '../context';
4
- import { union, inits, some, recursion, block, line, validate, indent, rewrite, open, trim, fallback, lazy, fmap } from '../../combinator';
4
+ import { union, inits, some, recursion, block, line, validate, indent, rewrite, open, fallback, lazy, fmap } from '../../combinator';
5
5
  import { ulist_, fillFirstLine } from './ulist';
6
6
  import { olist_ } from './olist';
7
7
  import { inline } from '../inline';
8
8
  import { contentline } from '../source';
9
9
  import { visualize, trimBlank } from '../visibility';
10
- import { lineable, invalid } from '../util';
10
+ import { invalid } from '../util';
11
11
  import { html, defrag } from 'typed-dom/dom';
12
12
 
13
13
  export const ilist: IListParser = lazy(() => block(validate(
14
- /^[-+*](?=[^\S\n]|\n[^\S\n]*\S)/,
14
+ /[-+*] /y,
15
15
  ilist_)));
16
16
 
17
17
  export const ilist_: IListParser = lazy(() => block(fmap(validate(
18
- /^[-+*](?:$|\s)/,
18
+ /[-+*](?:$|[ \n])/y,
19
19
  some(recursion(Recursion.listitem, union([
20
20
  fmap(fallback(
21
21
  inits([
22
- line(open(/^[-+*](?:$|\s)/, trim(visualize(trimBlank(lineable(some(inline))))), true)),
22
+ line(open(/[-+*](?:$|[ \n])/y, visualize(trimBlank(some(inline))), true)),
23
23
  indent(union([ulist_, olist_, ilist_])),
24
24
  ]),
25
25
  ilistitem),
@@ -1,17 +1,17 @@
1
1
  import { MathBlockParser } from '../block';
2
- import { block, validate, fence, clear, fmap } from '../../combinator';
2
+ import { block, fence, clear, fmap } from '../../combinator';
3
3
  import { invalid } from '../util';
4
4
  import { html } from 'typed-dom/dom';
5
5
 
6
- const opener = /^(\${2,})(?!\$)([^\n]*)(?:$|\n)/;
6
+ const opener = /(\${2,})(?!\$)([^\n]*)(?:$|\n)/y;
7
7
 
8
- export const segment: MathBlockParser.SegmentParser = block(validate('$$',
9
- clear(fence(opener, 300))));
8
+ export const segment: MathBlockParser.SegmentParser = block(
9
+ clear(fence(opener, 300)));
10
10
 
11
- export const segment_: MathBlockParser.SegmentParser = block(validate('$$',
12
- clear(fence(opener, 300, false))), false);
11
+ export const segment_: MathBlockParser.SegmentParser = block(
12
+ clear(fence(opener, 300, false)), false);
13
13
 
14
- export const mathblock: MathBlockParser = block(validate('$$', fmap(
14
+ export const mathblock: MathBlockParser = block(fmap(
15
15
  fence(opener, 300),
16
16
  // Bug: Type mismatch between outer and inner.
17
17
  ([body, overflow, closer, opener, delim, param]: string[], { caches: { math: cache = undefined } = {} }) => [
@@ -29,4 +29,4 @@ export const mathblock: MathBlockParser = block(validate('$$', fmap(
29
29
  overflow ? `Invalid trailing line after the closing delimiter "${delim}"` :
30
30
  'Invalid argument'),
31
31
  }, `${opener}${body}${overflow || closer}`),
32
- ])));
32
+ ]));
@@ -1,23 +1,23 @@
1
1
  import { MediaBlockParser } from '../block';
2
- import { union, inits, some, block, line, validate, fallback, fmap } from '../../combinator';
3
- import { medialink, media, shortmedia } from '../inline';
2
+ import { union, inits, some, block, line, fallback, fmap } from '../../combinator';
3
+ import { medialink, media, lineshortmedia } from '../inline';
4
4
  import { invalid } from '../util';
5
5
  import { html } from 'typed-dom/dom';
6
6
 
7
- export const mediablock: MediaBlockParser = block(validate(['[!', '!'], fmap(
7
+ export const mediablock: MediaBlockParser = block(fmap(
8
8
  inits([
9
9
  line(union([
10
10
  medialink,
11
11
  media,
12
- shortmedia,
12
+ lineshortmedia,
13
13
  ])),
14
14
  some(line(fallback(union([
15
15
  medialink,
16
16
  media,
17
- shortmedia,
17
+ lineshortmedia,
18
18
  ]), ({ context: { source } }) => [[html('span', {
19
19
  class: 'invalid',
20
20
  ...invalid('mediablock', 'syntax', 'Not media syntax'),
21
21
  }, source.replace('\n', ''))]]))),
22
22
  ]),
23
- ns => [html('div', ns)])));
23
+ ns => [html('div', ns)]));
@@ -28,8 +28,10 @@ describe('Unit: parser/block/olist', () => {
28
28
  assert.deepStrictEqual(inspect(parser('1.1.'), ctx), undefined);
29
29
  assert.deepStrictEqual(inspect(parser('1.a'), ctx), undefined);
30
30
  assert.deepStrictEqual(inspect(parser('1.\n'), ctx), undefined);
31
+ assert.deepStrictEqual(inspect(parser('1.\n1. a'), ctx), undefined);
31
32
  assert.deepStrictEqual(inspect(parser('(1)'), ctx), undefined);
32
33
  assert.deepStrictEqual(inspect(parser('(1)\n'), ctx), undefined);
34
+ assert.deepStrictEqual(inspect(parser('(1)\n(1) a'), ctx), undefined);
33
35
  assert.deepStrictEqual(inspect(parser('(I) '), ctx), undefined);
34
36
  assert.deepStrictEqual(inspect(parser('(A) '), ctx), undefined);
35
37
  assert.deepStrictEqual(inspect(parser(' 1. '), ctx), undefined);
@@ -51,11 +53,11 @@ describe('Unit: parser/block/olist', () => {
51
53
 
52
54
  it('multiple', () => {
53
55
  // pending
54
- assert.deepStrictEqual(inspect(parser('0.\n0'), ctx), [['<ol><li></li><li></li></ol>'], '']);
55
- assert.deepStrictEqual(inspect(parser('0.\n0\n'), ctx), [['<ol><li></li><li></li></ol>'], '']);
56
- assert.deepStrictEqual(inspect(parser('0.\n0.'), ctx), [['<ol><li></li><li></li></ol>'], '']);
57
- assert.deepStrictEqual(inspect(parser('0.\n0. '), ctx), [['<ol><li></li><li></li></ol>'], '']);
58
- assert.deepStrictEqual(inspect(parser('0.\n0.\n'), ctx), [['<ol><li></li><li></li></ol>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('0. \n0'), ctx), [['<ol><li></li><li></li></ol>'], '']);
57
+ assert.deepStrictEqual(inspect(parser('0. \n0\n'), ctx), [['<ol><li></li><li></li></ol>'], '']);
58
+ assert.deepStrictEqual(inspect(parser('0. \n0.'), ctx), [['<ol><li></li><li></li></ol>'], '']);
59
+ assert.deepStrictEqual(inspect(parser('0. \n0. '), ctx), [['<ol><li></li><li></li></ol>'], '']);
60
+ assert.deepStrictEqual(inspect(parser('0. \n0.\n'), ctx), [['<ol><li></li><li></li></ol>'], '']);
59
61
  // filled
60
62
  assert.deepStrictEqual(inspect(parser('0. 1\n0. 2'), ctx), [['<ol><li id="index::1">1</li><li id="index::2">2</li></ol>'], '']);
61
63
  assert.deepStrictEqual(inspect(parser('0. 1\n0. 2\n0. 3'), ctx), [['<ol><li id="index::1">1</li><li id="index::2">2</li><li id="index::3">3</li></ol>'], '']);
@@ -73,7 +75,7 @@ describe('Unit: parser/block/olist', () => {
73
75
  });
74
76
 
75
77
  it('nest', () => {
76
- assert.deepStrictEqual(inspect(parser('0.\n 0'), ctx), [['<ol><li><br><ol><li></li></ol></li></ol>'], '']);
78
+ assert.deepStrictEqual(inspect(parser('0. \n 0'), ctx), [['<ol><li><br><ol><li></li></ol></li></ol>'], '']);
77
79
  assert.deepStrictEqual(inspect(parser('0. 1\n 0'), ctx), [['<ol><li id="index::1">1<ol><li></li></ol></li></ol>'], '']);
78
80
  assert.deepStrictEqual(inspect(parser('0. 1\n 0.'), ctx), [['<ol><li id="index::1">1<ol><li></li></ol></li></ol>'], '']);
79
81
  assert.deepStrictEqual(inspect(parser('0. 1\n 0. '), ctx), [['<ol><li id="index::1">1<ol><li></li></ol></li></ol>'], '']);
@@ -93,16 +95,16 @@ describe('Unit: parser/block/olist', () => {
93
95
  assert.deepStrictEqual(inspect(parser('9. '), ctx), [['<ol><li data-marker="9."></li></ol>'], '']);
94
96
  assert.deepStrictEqual(inspect(parser('00. '), ctx), [['<ol><li data-marker="00."></li></ol>'], '']);
95
97
  assert.deepStrictEqual(inspect(parser('01. '), ctx), [['<ol><li data-marker="01."></li></ol>'], '']);
96
- assert.deepStrictEqual(inspect(parser('0.\n1'), ctx), [['<ol><li></li><li data-marker="1."></li></ol>'], '']);
97
- assert.deepStrictEqual(inspect(parser('8.\n9'), ctx), [['<ol><li data-marker="8."></li><li data-marker="9."></li></ol>'], '']);
98
- assert.deepStrictEqual(inspect(parser('9.\n9'), ctx), [['<ol><li data-marker="9."></li><li data-marker="9." class="invalid"></li></ol>'], '']);
98
+ assert.deepStrictEqual(inspect(parser('0. \n1'), ctx), [['<ol><li></li><li data-marker="1."></li></ol>'], '']);
99
+ assert.deepStrictEqual(inspect(parser('8. \n9'), ctx), [['<ol><li data-marker="8."></li><li data-marker="9."></li></ol>'], '']);
100
+ assert.deepStrictEqual(inspect(parser('9. \n9'), ctx), [['<ol><li data-marker="9."></li><li data-marker="9." class="invalid"></li></ol>'], '']);
99
101
  });
100
102
 
101
103
  it('branch', () => {
102
104
  assert.deepStrictEqual(inspect(parser('1-1. '), ctx), [['<ol><li data-marker="1-1."></li></ol>'], '']);
103
105
  assert.deepStrictEqual(inspect(parser('1-1-1. '), ctx), [['<ol><li data-marker="1-1-1."></li></ol>'], '']);
104
- assert.deepStrictEqual(inspect(parser('1.\n1-'), ctx), [['<ol><li></li><li data-marker="1-."></li></ol>'], '']);
105
- assert.deepStrictEqual(inspect(parser('1.\n1-1'), ctx), [['<ol><li></li><li data-marker="1-1."></li></ol>'], '']);
106
+ assert.deepStrictEqual(inspect(parser('1. \n1-'), ctx), [['<ol><li></li><li data-marker="1-."></li></ol>'], '']);
107
+ assert.deepStrictEqual(inspect(parser('1. \n1-1'), ctx), [['<ol><li></li><li data-marker="1-1."></li></ol>'], '']);
106
108
  assert.deepStrictEqual(inspect(parser('(1)-1 '), ctx), [['<ol data-format="paren"><li data-marker="(1)-1"></li></ol>'], '']);
107
109
  assert.deepStrictEqual(inspect(parser('(1)-1-1 '), ctx), [['<ol data-format="paren"><li data-marker="(1)-1-1"></li></ol>'], '']);
108
110
  assert.deepStrictEqual(inspect(parser('(1) \n(1)-'), ctx), [['<ol data-format="paren"><li></li><li data-marker="(1)-"></li></ol>'], '']);
@@ -119,7 +121,7 @@ describe('Unit: parser/block/olist', () => {
119
121
  assert.deepStrictEqual(inspect(parser('a. '), ctx), [['<ol type="a" data-type="lower-alpha"><li></li></ol>'], '']);
120
122
  assert.deepStrictEqual(inspect(parser('I. '), ctx), [['<ol type="I" data-type="upper-roman"><li></li></ol>'], '']);
121
123
  assert.deepStrictEqual(inspect(parser('A. '), ctx), [['<ol type="A" data-type="upper-alpha"><li></li></ol>'], '']);
122
- assert.deepStrictEqual(inspect(parser('a.\n1.\nc'), ctx), [['<ol type="a" data-type="lower-alpha"><li></li><li data-marker="1."></li><li data-marker="c."></li></ol>'], '']);
124
+ assert.deepStrictEqual(inspect(parser('a. \n1.\nc'), ctx), [['<ol type="a" data-type="lower-alpha"><li></li><li data-marker="1."></li><li data-marker="c."></li></ol>'], '']);
123
125
  assert.deepStrictEqual(inspect(parser('i. 1'), ctx), [['<ol type="i" data-type="lower-roman"><li id="index::1">1</li></ol>'], '']);
124
126
  });
125
127
 
@@ -131,10 +133,10 @@ describe('Unit: parser/block/olist', () => {
131
133
  });
132
134
 
133
135
  it('indexer', () => {
134
- assert.deepStrictEqual(inspect(parser('1. [|a]'), ctx), [['<ol><li id="index::[|a]">[|a]</li></ol>'], '']);
136
+ assert.deepStrictEqual(inspect(parser('1. [|a]'), ctx), [['<ol><li id="index::[|a]"><span class="invalid">[|a]</span></li></ol>'], '']);
135
137
  assert.deepStrictEqual(inspect(parser('1. a [|]'), ctx), [['<ol><li>a<span class="indexer" data-index=""></span></li></ol>'], '']);
136
138
  assert.deepStrictEqual(inspect(parser('1. a [|b]'), ctx), [['<ol><li id="index::b">a<span class="indexer" data-index="b"></span></li></ol>'], '']);
137
- assert.deepStrictEqual(inspect(parser('1. [ ] [|a]'), ctx), [['<ol class="checklist"><li id="index::[|a]"><span class="checkbox">☐</span>[|a]</li></ol>'], '']);
139
+ assert.deepStrictEqual(inspect(parser('1. [ ] [|a]'), ctx), [['<ol class="checklist"><li id="index::[|a]"><span class="checkbox">☐</span><span class="invalid">[|a]</span></li></ol>'], '']);
138
140
  assert.deepStrictEqual(inspect(parser('1. [ ] a [|b]'), ctx), [['<ol class="checklist"><li id="index::b"><span class="checkbox">☐</span>a<span class="indexer" data-index="b"></span></li></ol>'], '']);
139
141
  assert.deepStrictEqual(inspect(parser('1. a [|]\n 1. c [|d]'), ctx), [['<ol><li>a<span class="indexer" data-index=""></span><ol><li id="index::d">c<span class="indexer" data-index="d"></span></li></ol></li></ol>'], '']);
140
142
  assert.deepStrictEqual(inspect(parser('1. a [|b]\n 1. c [|d]'), ctx), [['<ol><li id="index::b">a<span class="indexer" data-index="b"></span><ol><li id="index::d">c<span class="indexer" data-index="d"></span></li></ol></li></ol>'], '']);
@@ -1,24 +1,24 @@
1
1
  import { OListParser } from '../block';
2
2
  import { Recursion } from '../context';
3
- import { union, inits, subsequence, some, recursion, block, line, validate, indent, focus, open, match, trim, fallback, lazy, fmap } from '../../combinator';
3
+ import { union, inits, subsequence, some, recursion, block, line, validate, indent, focus, open, match, fallback, lazy, fmap } from '../../combinator';
4
4
  import { ulist_, checkbox, fillFirstLine } from './ulist';
5
5
  import { ilist_, ilistitem } from './ilist';
6
6
  import { inline, indexee, indexer, dataindex } from '../inline';
7
- import { invalid, lineable } from '../util';
7
+ import { invalid } from '../util';
8
8
  import { visualize, trimBlank } from '../visibility';
9
9
  import { memoize } from 'spica/memoize';
10
10
  import { html, define, defrag } from 'typed-dom/dom';
11
11
 
12
12
  const openers = {
13
- '.': /^([0-9]+|[a-z]+|[A-Z]+)(?:-(?!-)[0-9]*)*(?![^\S\n])\.?(?:$|\s)/,
14
- '(': /^\(([0-9]*|[a-z]*)(?![^)\n])\)?(?:-(?!-)[0-9]*)*(?:$|\s)/,
13
+ '.': /([0-9]+|[a-z]+|[A-Z]+)(?:-(?=$|[0-9\n])[0-9]*)*(?:\.?(?:$|[\n])|\. )/y,
14
+ '(': /\((?=$|[0-9a-z\n])([0-9]*|[a-z]*)(?=$|[)\n])\)?(?:-(?=$|[0-9\n])[0-9]*)*(?:$|[ \n])/y,
15
15
  } as const;
16
16
 
17
17
  export const olist: OListParser = lazy(() => block(validate(
18
18
  new RegExp([
19
- /^([0-9]+|[a-z]+|[A-Z]+)(?:-[0-9]+)*\.(?=[^\S\n]|\n[^\S\n]*\S)/.source,
20
- /^\(([0-9]+|[a-z]+)\)(?:-[0-9]+)*(?=[^\S\n]|\n[^\S\n]*\S)/.source,
21
- ].join('|')),
19
+ /([0-9]+|[a-z]+|[A-Z]+)(?:-[0-9]+)*\. /y.source,
20
+ /\(([0-9]+|[a-z]+)\)(?:-[0-9]+)* /y.source,
21
+ ].join('|'), 'y'),
22
22
  olist_)));
23
23
 
24
24
  export const olist_: OListParser = lazy(() => block(union([
@@ -36,7 +36,7 @@ const list = (type: string, form: string): OListParser.ListParser => fmap(
36
36
  inits([
37
37
  line(open(heads[form], subsequence([
38
38
  checkbox,
39
- trim(visualize(lineable(trimBlank(some(union([indexer, inline]))))))]), true)),
39
+ visualize(trimBlank(some(union([indexer, inline]))))]), true)),
40
40
  indent(union([ulist_, olist_, ilist_])),
41
41
  ]),
42
42
  ilistitem),
@@ -101,15 +101,15 @@ function style(type: string): string {
101
101
  function pattern(type: string): RegExp {
102
102
  switch (type) {
103
103
  case 'i':
104
- return /^\(?i[).]?$/;
104
+ return /\(?i[).]?$/y;
105
105
  case 'a':
106
- return /^\(?a[).]?$/;
106
+ return /\(?a[).]?$/y;
107
107
  case 'I':
108
- return /^\(?I[).]?$/;
108
+ return /\(?I[).]?$/y;
109
109
  case 'A':
110
- return /^\(?A[).]?$/;
110
+ return /\(?A[).]?$/y;
111
111
  default:
112
- return /^\(?[01][).]?$/;
112
+ return /\(?[01][).]?$/y;
113
113
  }
114
114
  }
115
115
 
@@ -3,5 +3,5 @@ import { block, line, focus } from '../../combinator';
3
3
  import { html } from 'typed-dom/dom';
4
4
 
5
5
  export const pagebreak: PagebreakParser = block(line(focus(
6
- /^={3,}[^\S\n]*(?:$|\n)/,
6
+ /={3,}[^\S\n]*(?:$|\n)/y,
7
7
  () => [[html('hr')]])));
@@ -23,7 +23,7 @@ describe('Unit: parser/block/paragraph', () => {
23
23
  assert.deepStrictEqual(inspect(parser('a\\\n'), ctx), [['<p>a</p>'], '']);
24
24
  assert.deepStrictEqual(inspect(parser('a\\\nb'), ctx), [['<p>a<br>b</p>'], '']);
25
25
  assert.deepStrictEqual(inspect(parser('a&NewLine;b'), ctx), [['<p>a b</p>'], '']);
26
- assert.deepStrictEqual(inspect(parser('&Tab;&NewLine;'), ctx), [['<p>&amp;Tab;&amp;NewLine;</p>'], '']);
26
+ assert.deepStrictEqual(inspect(parser('&Tab;&NewLine;'), ctx), [['<p>&amp;NewLine;</p>'], '']);
27
27
  assert.deepStrictEqual(inspect(parser('<wbr>'), ctx), [['<p>&lt;wbr&gt;</p>'], '']);
28
28
  assert.deepStrictEqual(inspect(parser('<wbr>\n'), ctx), [['<p>&lt;wbr&gt;</p>'], '']);
29
29
  assert.deepStrictEqual(inspect(parser('<wbr>\na'), ctx), [['<p>&lt;wbr&gt;<br>a</p>'], '']);
@@ -36,9 +36,9 @@ describe('Unit: parser/block/paragraph', () => {
36
36
  assert.deepStrictEqual(inspect(parser('***a**b\n<wbr>*\nc'), ctx), [['<p>*<strong>a</strong>b<br><wbr>*<br>c</p>'], '']);
37
37
  assert.deepStrictEqual(inspect(parser('==a\n<wbr>==\nb'), ctx), [['<p>==a<br><wbr>==<br>b</p>'], '']);
38
38
  assert.deepStrictEqual(inspect(parser('http://host)'), ctx), [['<p><a class="url" href="http://host)" target="_blank">http://host)</a></p>'], '']);
39
- assert.deepStrictEqual(inspect(parser('a\nhttp://host) \nb'), ctx), [['<p>a<br><a class="url" href="http://host)" target="_blank">http://host)</a> <br>b</p>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('a\nhttp://host) \nb'), ctx), [['<p>a<br><a class="url" href="http://host)" target="_blank">http://host)</a><br>b</p>'], '']);
40
40
  assert.deepStrictEqual(inspect(parser('!http://host)'), ctx), [['<p>!<a class="url" href="http://host)" target="_blank">http://host)</a></p>'], '']);
41
- assert.deepStrictEqual(inspect(parser('a\n!http://host) \nb'), ctx), [['<p>a<br>!<a class="url" href="http://host)" target="_blank">http://host)</a> <br>b</p>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('a\n!http://host) \nb'), ctx), [['<p>a<br>!<a class="url" href="http://host)" target="_blank">http://host)</a><br>b</p>'], '']);
42
42
  assert.deepStrictEqual(inspect(parser('\ta'), ctx), [['<p>\ta</p>'], '']);
43
43
  assert.deepStrictEqual(inspect(parser('[[^A]]'), ctx), [['<p><sup class="reference" data-abbr="A"><span></span></sup></p>'], '']);
44
44
  });
@@ -67,7 +67,6 @@ describe('Unit: parser/block/paragraph', () => {
67
67
  assert.deepStrictEqual(inspect(parser('[% a %]'), ctx), [['<p><span class="remark"><input type="checkbox"><span>[% a %]</span></span></p>'], '']);
68
68
  assert.deepStrictEqual(inspect(parser('[% a %]b'), ctx), [['<p><span class="remark"><input type="checkbox"><span>[% a %]</span></span>b</p>'], '']);
69
69
  assert.deepStrictEqual(inspect(parser('[% a %]\nb'), ctx), [['<p><span class="remark"><input type="checkbox"><span>[% a %]</span></span><br>b</p>'], '']);
70
- assert.deepStrictEqual(inspect(parser('[%% a %%]'), ctx), [['<p><span class="remark"><input type="checkbox"><span>[%% a %%]</span></span></p>'], '']);
71
70
  assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]'), ctx), [['<p><span class="remark"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span></p>'], '']);
72
71
  assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]a'), ctx), [['<p><span class="remark"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span>a</p>'], '']);
73
72
  assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]\na'), ctx), [['<p><span class="remark"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span><br>a</p>'], '']);
@@ -1,10 +1,9 @@
1
1
  import { ParagraphParser } from '../block';
2
2
  import { union, some, block, fmap } from '../../combinator';
3
3
  import { inline } from '../inline';
4
- import { lineable } from '../util';
5
4
  import { visualize, trimBlankEnd } from '../visibility';
6
5
  import { html, defrag } from 'typed-dom/dom';
7
6
 
8
7
  export const paragraph: ParagraphParser = block(fmap(
9
- visualize(trimBlankEnd(lineable(some(union([inline]))))),
8
+ visualize(trimBlankEnd(some(union([inline])))),
10
9
  ns => [html('p', defrag(ns))]));
@@ -1,25 +1,23 @@
1
1
  import { ReplyParser } from '../../block';
2
- import { union, line, validate, focus, open, fmap } from '../../../combinator';
2
+ import { union, line, focus, open, fmap } from '../../../combinator';
3
3
  import { anchor } from '../../inline/autolink/anchor';
4
4
  import { str } from '../../source';
5
5
  import { invalid } from '../../util';
6
6
  import { html, define, defrag } from 'typed-dom/dom';
7
7
 
8
- export const syntax = /^>*(?=>>[^>\s]\S*[^\S\n]*(?:$|\n))/;
8
+ export const syntax = />*(?=>>[^>\s]\S*[^\S\n]*(?:$|\n))/y;
9
9
 
10
- export const cite: ReplyParser.CiteParser = line(fmap(validate(
11
- '>>',
10
+ export const cite: ReplyParser.CiteParser = line(fmap(
12
11
  open(
13
12
  str(syntax),
14
13
  union([
15
14
  anchor,
16
15
  // Subject page representation.
17
16
  // リンクの実装は後で検討
18
- focus(/^>>#\S*(?=\s*$)/, ({ context: { source } }) => [[html('a', { class: 'anchor' }, source)]]),
19
- focus(/^>>https?:\/\/\S+(?=\s*$)/, ({ context: { source } }) => [[html('a', { class: 'anchor', href: source.slice(2).trimEnd(), target: '_blank' }, source)]]),
20
- focus(/^>>.+(?=\s*$)/, ({ context: { source } }) => [[source]]),
21
- ]),
22
- )),
17
+ focus(/>>#\S*(?=\s*$)/y, ({ context: { source } }) => [[html('a', { class: 'anchor' }, source)]]),
18
+ focus(/>>https?:\/\/\S+(?=\s*$)/y, ({ context: { source } }) => [[html('a', { class: 'anchor', href: source.slice(2).trimEnd(), target: '_blank' }, source)]]),
19
+ focus(/>>.+(?=\s*$)/y, ({ context: { source } }) => [[source]]),
20
+ ])),
23
21
  ([quotes, node]: [string, HTMLElement | string]) => [
24
22
  html('span',
25
23
  typeof node === 'object'
@@ -3,16 +3,16 @@ import { union, some, block, validate, rewrite, convert, lazy, fmap } from '../.
3
3
  import { math } from '../../inline/math';
4
4
  import { autolink } from '../../inline/autolink';
5
5
  import { linebreak, unescsource, anyline } from '../../source';
6
+ import { linearize } from '../../util';
6
7
  import { html, defrag } from 'typed-dom/dom';
7
8
 
8
- export const syntax = /^>+[^\S\n]/;
9
+ export const syntax = />+[^\S\n]/y;
9
10
 
10
- export const quote: ReplyParser.QuoteParser = lazy(() => block(fmap(validate(
11
- '>',
11
+ export const quote: ReplyParser.QuoteParser = lazy(() => block(fmap(
12
12
  rewrite(
13
13
  some(validate(syntax, anyline)),
14
- convert(
15
- source => source.replace(/(?<=^>+[^\S\n])/mg, '\r').replace(/\n$/, ''),
14
+ linearize(convert(
15
+ source => source.replace(/(?<=^>+[^\S\n])/mg, '\r'),
16
16
  some(union([
17
17
  // quote補助関数が残した数式をパースする。
18
18
  math,
@@ -20,7 +20,7 @@ export const quote: ReplyParser.QuoteParser = lazy(() => block(fmap(validate(
20
20
  linebreak,
21
21
  unescsource,
22
22
  ])),
23
- false))),
23
+ false), -1)),
24
24
  (ns: [string, ...(string | HTMLElement)[]]) => [
25
25
  html('span', { class: 'quote' }, defrag(ns)),
26
26
  html('br'),
@@ -4,11 +4,11 @@ import { cite, syntax as csyntax } from './reply/cite';
4
4
  import { quote, syntax as qsyntax } from './reply/quote';
5
5
  import { inline } from '../inline';
6
6
  import { anyline } from '../source';
7
- import { lineable } from '../util';
7
+ import { linearize } from '../util';
8
8
  import { visualize, trimBlankNodeEnd } from '../visibility';
9
9
  import { html, defrag } from 'typed-dom/dom';
10
10
 
11
- const delimiter = new RegExp(`${csyntax.source}|${qsyntax.source}`);
11
+ const delimiter = new RegExp(`${csyntax.source}|${qsyntax.source}`, 'y');
12
12
 
13
13
  export const reply: ReplyParser = block(validate(csyntax, fmap(
14
14
  some(union([
@@ -16,6 +16,6 @@ export const reply: ReplyParser = block(validate(csyntax, fmap(
16
16
  quote,
17
17
  rewrite(
18
18
  some(anyline, delimiter),
19
- visualize(lineable(some(inline), 1))),
19
+ visualize(linearize(some(inline), 1))),
20
20
  ])),
21
21
  ns => [html('p', trimBlankNodeEnd(defrag(ns)))])));
@@ -7,7 +7,7 @@ import { invalid } from '../util';
7
7
  import { html, define, defrag } from 'typed-dom/dom';
8
8
 
9
9
  export const sidefence: SidefenceParser = lazy(() => block(fmap(focus(
10
- /^(?=\|+(?:[^\S\n]|\n\|))(?:\|+(?:[^\S\n][^\n]*)?(?:$|\n))+$/,
10
+ /(?=\|+(?:[^\S\n]|\n\|))(?:\|+(?:[^\S\n][^\n]*)?(?:$|\n))+$/y,
11
11
  union([source]), false),
12
12
  ([el]) => [
13
13
  define(el, {
@@ -16,13 +16,13 @@ export const sidefence: SidefenceParser = lazy(() => block(fmap(focus(
16
16
  }),
17
17
  ])));
18
18
 
19
- const opener = /^(?=\|\|+(?:$|\s))/;
19
+ const opener = /(?=\|\|+(?:$|\s))/y;
20
20
  const unindent = (source: string) => source.replace(/(?<=^|\n)\|(?:[^\S\n]|(?=\|*(?:$|\s)))|\n$/g, '');
21
21
 
22
22
  const source: SidefenceParser.SourceParser = lazy(() => fmap(
23
23
  some(recursion(Recursion.block, union([
24
24
  focus(
25
- /^(?:\|\|+(?:[^\S\n][^\n]*)?(?:$|\n))+/,
25
+ /(?:\|\|+(?:[^\S\n][^\n]*)?(?:$|\n))+/y,
26
26
  convert(unindent, source, false, true), false),
27
27
  rewrite(
28
28
  some(contentline, opener),
@@ -1,5 +1,5 @@
1
1
  import { TableParser } from '../block';
2
- import { union, sequence, some, block, line, validate, focus, rewrite, surround, open, close, trimStart, fallback, lazy, fmap } from '../../combinator';
2
+ import { union, sequence, some, block, line, validate, focus, rewrite, surround, open, close, fallback, lazy, fmap } from '../../combinator';
3
3
  import { inline, media, medialink, shortmedia } from '../inline';
4
4
  import { contentline } from '../source';
5
5
  import { trimBlank } from '../visibility';
@@ -13,7 +13,7 @@ import AlignParser = TableParser.AlignParser;
13
13
  import CellParser = TableParser.CellParser;
14
14
 
15
15
  export const table: TableParser = lazy(() => block(fmap(validate(
16
- /^\|[^\n]*(?:\n\|[^\n]*){2}/,
16
+ /\|[^\n]*(?:\n\|[^\n]*){2}/y,
17
17
  sequence([
18
18
  row(some(head), true),
19
19
  row(some(align), false),
@@ -27,7 +27,7 @@ export const table: TableParser = lazy(() => block(fmap(validate(
27
27
  ])));
28
28
 
29
29
  const row = <P extends CellParser | AlignParser>(parser: P, optional: boolean): RowParser<P> => fallback(fmap(
30
- line(surround(/^(?=\|)/, some(union([parser])), /^[|\\]?\s*$/, optional)),
30
+ line(surround(/(?=\|)/y, some(union([parser])), /[|\\]?\s*$/y, optional)),
31
31
  es => [html('tr', es)]),
32
32
  rewrite(contentline, ({ context: { source } }) => [[
33
33
  html('tr', {
@@ -39,22 +39,22 @@ const row = <P extends CellParser | AlignParser>(parser: P, optional: boolean):
39
39
  const align: AlignParser = fmap(open(
40
40
  '|',
41
41
  union([
42
- focus(/^:-+:?/, ({ context: { source } }) =>
42
+ focus(/:-+:?/y, ({ context: { source } }) =>
43
43
  [[source.at(-1) === ':' ? 'center' : 'start']], false),
44
- focus(/^-+:?/, ({ context: { source } }) =>
44
+ focus(/-+:?/y, ({ context: { source } }) =>
45
45
  [[source.at(-1) === ':' ? 'end' : '']], false),
46
46
  ])),
47
47
  ns => [html('td', defrag(ns))]);
48
48
 
49
49
  const cell: CellParser = surround(
50
- /^\|\s*(?=\S)/,
51
- trimStart(union([
52
- close(medialink, /^\s*(?=\||$)/),
53
- close(media, /^\s*(?=\||$)/),
54
- close(shortmedia, /^\s*(?=\||$)/),
55
- trimBlank(some(inline, /^\|/, [[/^[|\\]?\s*$/, 9]])),
56
- ])),
57
- /^[^|]*/, true);
50
+ /\|\s*(?=\S)/y,
51
+ union([
52
+ close(medialink, /\s*(?=\||$)/y),
53
+ close(media, /\s*(?=\||$)/y),
54
+ close(shortmedia, /\s*(?=\||$)/y),
55
+ trimBlank(some(inline, /\|/y, [[/[|\\]?\s*$/y, 9]])),
56
+ ]),
57
+ /[^|]*/y, true);
58
58
 
59
59
  const head: CellParser.HeadParser = fmap(
60
60
  cell,
@@ -19,6 +19,7 @@ describe('Unit: parser/block/ulist', () => {
19
19
  assert.deepStrictEqual(inspect(parser('-[ ]'), ctx), undefined);
20
20
  assert.deepStrictEqual(inspect(parser('-[x]'), ctx), undefined);
21
21
  assert.deepStrictEqual(inspect(parser('-\n'), ctx), undefined);
22
+ assert.deepStrictEqual(inspect(parser('-\n- a'), ctx), undefined);
22
23
  assert.deepStrictEqual(inspect(parser(' - '), ctx), undefined);
23
24
  assert.deepStrictEqual(inspect(parser('+'), ctx), undefined);
24
25
  assert.deepStrictEqual(inspect(parser('*'), ctx), undefined);
@@ -36,23 +37,23 @@ describe('Unit: parser/block/ulist', () => {
36
37
 
37
38
  it('multiple', () => {
38
39
  // pending
39
- assert.deepStrictEqual(inspect(parser('-\n-'), ctx), [['<ul><li></li><li></li></ul>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('- \n-'), ctx), [['<ul><li></li><li></li></ul>'], '']);
40
41
  // filled
41
42
  assert.deepStrictEqual(inspect(parser('- 1\n- 2'), ctx), [['<ul><li id="index::1">1</li><li id="index::2">2</li></ul>'], '']);
42
43
  assert.deepStrictEqual(inspect(parser('- 1\n- 2\n- 3'), ctx), [['<ul><li id="index::1">1</li><li id="index::2">2</li><li id="index::3">3</li></ul>'], '']);
43
44
  // invalid
44
- assert.deepStrictEqual(inspect(parser('-\n+'), ctx), [['<ul><li></li><li id="index::+"><span class="invalid">+</span></li></ul>'], '']);
45
- assert.deepStrictEqual(inspect(parser('-\n0'), ctx), [['<ul><li></li><li id="index::0"><span class="invalid">0</span></li></ul>'], '']);
45
+ assert.deepStrictEqual(inspect(parser('- \n+'), ctx), [['<ul><li></li><li id="index::+"><span class="invalid">+</span></li></ul>'], '']);
46
+ assert.deepStrictEqual(inspect(parser('- \n0'), ctx), [['<ul><li></li><li id="index::0"><span class="invalid">0</span></li></ul>'], '']);
46
47
  });
47
48
 
48
49
  it('nest', () => {
49
- assert.deepStrictEqual(inspect(parser('-\n -'), ctx), [['<ul><li><br><ul><li></li></ul></li></ul>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('- \n -'), ctx), [['<ul><li><br><ul><li></li></ul></li></ul>'], '']);
50
51
  assert.deepStrictEqual(inspect(parser('- 1\n - 2'), ctx), [['<ul><li id="index::1">1<ul><li id="index::2">2</li></ul></li></ul>'], '']);
51
52
  assert.deepStrictEqual(inspect(parser('- 1\n - 2\n- 3'), ctx), [['<ul><li id="index::1">1<ul><li id="index::2">2</li></ul></li><li id="index::3">3</li></ul>'], '']);
52
53
  assert.deepStrictEqual(inspect(parser('- 1\n - 2\n - 3'), ctx), [['<ul><li id="index::1">1<ul><li id="index::2">2</li><li id="index::3">3</li></ul></li></ul>'], '']);
53
54
  assert.deepStrictEqual(inspect(parser('- 1\n - 2\n - 3'), ctx), [['<ul><li id="index::1">1<ul><li id="index::2">2<ul><li id="index::3">3</li></ul></li></ul></li></ul>'], '']);
54
55
  assert.deepStrictEqual(inspect(parser('- 1\n - 2\n - 3'), ctx), [['<ul><li id="index::1">1<ul><li id="index::2">2</li></ul></li><li id="index::-_3"><span class="invalid"> - 3</span></li></ul>'], '']);
55
- assert.deepStrictEqual(inspect(parser('-\n -\n +\n -\n +\n+'), ctx), [['<ul><li><br><ul><li></li><li id="index::+"><span class="invalid">+</span></li><li></li><li id="index::+"><span class="invalid">+</span></li></ul></li><li id="index::+"><span class="invalid">+</span></li></ul>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('- \n -\n +\n -\n +\n+'), ctx), [['<ul><li><br><ul><li></li><li id="index::+"><span class="invalid">+</span></li><li></li><li id="index::+"><span class="invalid">+</span></li></ul></li><li id="index::+"><span class="invalid">+</span></li></ul>'], '']);
56
57
  assert.deepStrictEqual(inspect(parser('- 1\n + 2'), ctx), [['<ul><li id="index::1">1<ul class="invalid"><li>2</li></ul></li></ul>'], '']);
57
58
  assert.deepStrictEqual(inspect(parser('- 1\n 0'), ctx), [['<ul><li id="index::1">1<ol><li></li></ol></li></ul>'], '']);
58
59
  assert.deepStrictEqual(inspect(parser('- 1\n 0.'), ctx), [['<ul><li id="index::1">1<ol><li></li></ol></li></ul>'], '']);
@@ -71,10 +72,10 @@ describe('Unit: parser/block/ulist', () => {
71
72
  });
72
73
 
73
74
  it('indexer', () => {
74
- assert.deepStrictEqual(inspect(parser('- [|a]'), ctx), [['<ul><li id="index::[|a]">[|a]</li></ul>'], '']);
75
+ assert.deepStrictEqual(inspect(parser('- [|a]'), ctx), [['<ul><li id="index::[|a]"><span class="invalid">[|a]</span></li></ul>'], '']);
75
76
  assert.deepStrictEqual(inspect(parser('- a [|]'), ctx), [['<ul><li>a<span class="indexer" data-index=""></span></li></ul>'], '']);
76
77
  assert.deepStrictEqual(inspect(parser('- a [|b]'), ctx), [['<ul><li id="index::b">a<span class="indexer" data-index="b"></span></li></ul>'], '']);
77
- assert.deepStrictEqual(inspect(parser('- [ ] [|a]'), ctx), [['<ul class="checklist"><li id="index::[|a]"><span class="checkbox">☐</span>[|a]</li></ul>'], '']);
78
+ assert.deepStrictEqual(inspect(parser('- [ ] [|a]'), ctx), [['<ul class="checklist"><li id="index::[|a]"><span class="checkbox">☐</span><span class="invalid">[|a]</span></li></ul>'], '']);
78
79
  assert.deepStrictEqual(inspect(parser('- [ ] a [|b]'), ctx), [['<ul class="checklist"><li id="index::b"><span class="checkbox">☐</span>a<span class="indexer" data-index="b"></span></li></ul>'], '']);
79
80
  assert.deepStrictEqual(inspect(parser('- a [|]\n - c [|d]'), ctx), [['<ul><li>a<span class="indexer" data-index=""></span><ul><li id="index::d">c<span class="indexer" data-index="d"></span></li></ul></li></ul>'], '']);
80
81
  assert.deepStrictEqual(inspect(parser('- a [|b]\n - c [|d]'), ctx), [['<ul><li id="index::b">a<span class="indexer" data-index="b"></span><ul><li id="index::d">c<span class="indexer" data-index="d"></span></li></ul></li></ul>'], '']);
@@ -1,26 +1,25 @@
1
1
  import { UListParser } from '../block';
2
2
  import { Recursion } from '../context';
3
- import { union, inits, subsequence, some, recursion, block, line, validate, indent, focus, open, trim, fallback, lazy, fmap } from '../../combinator';
3
+ import { union, inits, subsequence, some, recursion, block, line, validate, indent, focus, open, fallback, lazy, fmap } from '../../combinator';
4
4
  import { olist_ } from './olist';
5
5
  import { ilist_, ilistitem } from './ilist';
6
6
  import { inline, indexer, indexee, dataindex } from '../inline';
7
- import { lineable } from '../util';
8
7
  import { visualize, trimBlank } from '../visibility';
9
8
  import { unshift } from 'spica/array';
10
9
  import { html, defrag } from 'typed-dom/dom';
11
10
 
12
11
  export const ulist: UListParser = lazy(() => block(validate(
13
- /^-(?=[^\S\n]|\n[^\S\n]*\S)/,
12
+ /- /y,
14
13
  ulist_)));
15
14
 
16
15
  export const ulist_: UListParser = lazy(() => block(fmap(validate(
17
- /^-(?=$|\s)/,
16
+ /-(?=$|[ \n])/y,
18
17
  some(recursion(Recursion.listitem, union([
19
18
  indexee(fmap(fallback(
20
19
  inits([
21
- line(open(/^-(?:$|\s)/, subsequence([
20
+ line(open(/-(?:$|[ \n])/y, subsequence([
22
21
  checkbox,
23
- trim(visualize(lineable(trimBlank(some(union([indexer, inline])))))),
22
+ visualize(trimBlank(some(union([indexer, inline])))),
24
23
  ]), true)),
25
24
  indent(union([ulist_, olist_, ilist_])),
26
25
  ]),
@@ -30,7 +29,7 @@ export const ulist_: UListParser = lazy(() => block(fmap(validate(
30
29
  es => [format(html('ul', es))])));
31
30
 
32
31
  export const checkbox = focus(
33
- /^\[[xX ]\](?=$|\s)/,
32
+ /\[[xX ]\](?=$|[ \n])/y,
34
33
  ({ context: { source } }) => [[
35
34
  html('span', { class: 'checkbox' }, source[1].trimStart() ? '☑' : '☐'),
36
35
  ]]);