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.
- package/CHANGELOG.md +8 -0
- package/dist/index.js +597 -416
- package/markdown.d.ts +35 -60
- package/package.json +1 -1
- package/src/combinator/control/constraint/contract.ts +6 -15
- package/src/combinator/control/manipulation/clear.ts +3 -4
- package/src/combinator/control/manipulation/fence.ts +3 -1
- package/src/combinator/control/manipulation/indent.ts +5 -11
- package/src/combinator/control/manipulation/match.ts +3 -2
- package/src/combinator/control/manipulation/recovery.ts +1 -1
- package/src/combinator/control/manipulation/scope.ts +3 -10
- package/src/combinator/control/manipulation/surround.ts +4 -24
- package/src/combinator/data/parser/context/delimiter.ts +10 -9
- package/src/combinator/data/parser/context.ts +31 -0
- package/src/combinator/data/parser/inits.ts +1 -1
- package/src/combinator/data/parser/sequence.ts +1 -1
- package/src/combinator/data/parser/some.test.ts +1 -1
- package/src/combinator/data/parser/some.ts +4 -5
- package/src/combinator/data/parser.ts +0 -1
- package/src/combinator.ts +0 -1
- package/src/parser/api/parse.test.ts +16 -8
- package/src/parser/api/parse.ts +1 -2
- package/src/parser/autolink.test.ts +7 -7
- package/src/parser/autolink.ts +2 -4
- package/src/parser/block/blockquote.test.ts +1 -1
- package/src/parser/block/blockquote.ts +7 -7
- package/src/parser/block/codeblock.ts +8 -8
- package/src/parser/block/dlist.test.ts +1 -1
- package/src/parser/block/dlist.ts +5 -6
- package/src/parser/block/extension/aside.ts +4 -4
- package/src/parser/block/extension/example.ts +4 -4
- package/src/parser/block/extension/fig.ts +5 -5
- package/src/parser/block/extension/figbase.ts +1 -1
- package/src/parser/block/extension/figure.test.ts +1 -1
- package/src/parser/block/extension/figure.ts +6 -6
- package/src/parser/block/extension/message.ts +4 -4
- package/src/parser/block/extension/placeholder.ts +8 -8
- package/src/parser/block/extension/table.test.ts +1 -1
- package/src/parser/block/extension/table.ts +32 -22
- package/src/parser/block/extension.ts +3 -3
- package/src/parser/block/heading.test.ts +1 -1
- package/src/parser/block/heading.ts +2 -2
- package/src/parser/block/ilist.test.ts +3 -3
- package/src/parser/block/ilist.ts +5 -5
- package/src/parser/block/mathblock.ts +8 -8
- package/src/parser/block/mediablock.ts +6 -6
- package/src/parser/block/olist.test.ts +16 -14
- package/src/parser/block/olist.ts +13 -13
- package/src/parser/block/pagebreak.ts +1 -1
- package/src/parser/block/paragraph.test.ts +3 -4
- package/src/parser/block/paragraph.ts +1 -2
- package/src/parser/block/reply/cite.ts +7 -9
- package/src/parser/block/reply/quote.ts +6 -6
- package/src/parser/block/reply.ts +3 -3
- package/src/parser/block/sidefence.ts +3 -3
- package/src/parser/block/table.ts +13 -13
- package/src/parser/block/ulist.test.ts +8 -7
- package/src/parser/block/ulist.ts +6 -7
- package/src/parser/block.ts +48 -15
- package/src/parser/context.ts +4 -4
- package/src/parser/header.ts +3 -3
- package/src/parser/inline/annotation.ts +1 -1
- package/src/parser/inline/autolink/account.test.ts +8 -7
- package/src/parser/inline/autolink/account.ts +11 -8
- package/src/parser/inline/autolink/anchor.test.ts +1 -1
- package/src/parser/inline/autolink/anchor.ts +21 -17
- package/src/parser/inline/autolink/channel.test.ts +8 -8
- package/src/parser/inline/autolink/channel.ts +40 -15
- package/src/parser/inline/autolink/email.test.ts +15 -15
- package/src/parser/inline/autolink/email.ts +5 -7
- package/src/parser/inline/autolink/hashnum.test.ts +4 -9
- package/src/parser/inline/autolink/hashnum.ts +8 -4
- package/src/parser/inline/autolink/hashtag.test.ts +9 -10
- package/src/parser/inline/autolink/hashtag.ts +9 -6
- package/src/parser/inline/autolink/url.test.ts +72 -74
- package/src/parser/inline/autolink/url.ts +19 -24
- package/src/parser/inline/autolink.ts +21 -24
- package/src/parser/inline/bracket.ts +3 -3
- package/src/parser/inline/code.ts +2 -2
- package/src/parser/inline/deletion.test.ts +2 -2
- package/src/parser/inline/deletion.ts +1 -1
- package/src/parser/inline/emphasis.test.ts +5 -5
- package/src/parser/inline/emphasis.ts +2 -7
- package/src/parser/inline/emstrong.test.ts +14 -14
- package/src/parser/inline/emstrong.ts +4 -16
- package/src/parser/inline/extension/index.test.ts +5 -3
- package/src/parser/inline/extension/index.ts +8 -10
- package/src/parser/inline/extension/indexer.test.ts +1 -2
- package/src/parser/inline/extension/indexer.ts +3 -3
- package/src/parser/inline/extension/label.ts +1 -1
- package/src/parser/inline/extension/placeholder.ts +1 -1
- package/src/parser/inline/html.test.ts +2 -2
- package/src/parser/inline/html.ts +21 -20
- package/src/parser/inline/htmlentity.ts +4 -4
- package/src/parser/inline/insertion.test.ts +2 -2
- package/src/parser/inline/insertion.ts +1 -1
- package/src/parser/inline/italic.test.ts +9 -9
- package/src/parser/inline/italic.ts +1 -1
- package/src/parser/inline/link.ts +14 -19
- package/src/parser/inline/mark.test.ts +5 -5
- package/src/parser/inline/mark.ts +1 -1
- package/src/parser/inline/math.test.ts +6 -6
- package/src/parser/inline/math.ts +9 -13
- package/src/parser/inline/media.ts +9 -14
- package/src/parser/inline/reference.test.ts +4 -4
- package/src/parser/inline/reference.ts +5 -5
- package/src/parser/inline/remark.test.ts +19 -23
- package/src/parser/inline/remark.ts +17 -19
- package/src/parser/inline/ruby.ts +5 -3
- package/src/parser/inline/shortmedia.ts +6 -9
- package/src/parser/inline/strong.test.ts +5 -5
- package/src/parser/inline/strong.ts +2 -7
- package/src/parser/inline.test.ts +25 -23
- package/src/parser/inline.ts +21 -9
- package/src/parser/segment.ts +23 -5
- package/src/parser/source/escapable.test.ts +6 -6
- package/src/parser/source/escapable.ts +20 -5
- package/src/parser/source/line.ts +28 -4
- package/src/parser/source/str.ts +5 -27
- package/src/parser/source/text.test.ts +60 -60
- package/src/parser/source/text.ts +121 -6
- package/src/parser/source/unescapable.test.ts +8 -8
- package/src/parser/source/unescapable.ts +19 -3
- package/src/parser/util.ts +3 -3
- package/src/parser/visibility.ts +45 -40
- package/src/combinator/control/manipulation/trim.test.ts +0 -23
- 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
|
-
|
|
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('
|
|
19
|
-
assert(parser('
|
|
20
|
-
assert(parser('
|
|
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,
|
|
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 {
|
|
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
|
-
|
|
14
|
+
/[-+*] /y,
|
|
15
15
|
ilist_)));
|
|
16
16
|
|
|
17
17
|
export const ilist_: IListParser = lazy(() => block(fmap(validate(
|
|
18
|
-
|
|
18
|
+
/[-+*](?:$|[ \n])/y,
|
|
19
19
|
some(recursion(Recursion.listitem, union([
|
|
20
20
|
fmap(fallback(
|
|
21
21
|
inits([
|
|
22
|
-
line(open(
|
|
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,
|
|
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 =
|
|
6
|
+
const opener = /(\${2,})(?!\$)([^\n]*)(?:$|\n)/y;
|
|
7
7
|
|
|
8
|
-
export const segment: MathBlockParser.SegmentParser = block(
|
|
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(
|
|
12
|
-
clear(fence(opener, 300, false))
|
|
11
|
+
export const segment_: MathBlockParser.SegmentParser = block(
|
|
12
|
+
clear(fence(opener, 300, false)), false);
|
|
13
13
|
|
|
14
|
-
export const mathblock: MathBlockParser = block(
|
|
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,
|
|
3
|
-
import { medialink, media,
|
|
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(
|
|
7
|
+
export const mediablock: MediaBlockParser = block(fmap(
|
|
8
8
|
inits([
|
|
9
9
|
line(union([
|
|
10
10
|
medialink,
|
|
11
11
|
media,
|
|
12
|
-
|
|
12
|
+
lineshortmedia,
|
|
13
13
|
])),
|
|
14
14
|
some(line(fallback(union([
|
|
15
15
|
medialink,
|
|
16
16
|
media,
|
|
17
|
-
|
|
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
|
|
55
|
-
assert.deepStrictEqual(inspect(parser('0
|
|
56
|
-
assert.deepStrictEqual(inspect(parser('0
|
|
57
|
-
assert.deepStrictEqual(inspect(parser('0
|
|
58
|
-
assert.deepStrictEqual(inspect(parser('0
|
|
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
|
|
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
|
|
97
|
-
assert.deepStrictEqual(inspect(parser('8
|
|
98
|
-
assert.deepStrictEqual(inspect(parser('9
|
|
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
|
|
105
|
-
assert.deepStrictEqual(inspect(parser('1
|
|
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
|
|
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,
|
|
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
|
|
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
|
-
'.':
|
|
14
|
-
'(':
|
|
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
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
|
104
|
+
return /\(?i[).]?$/y;
|
|
105
105
|
case 'a':
|
|
106
|
-
return
|
|
106
|
+
return /\(?a[).]?$/y;
|
|
107
107
|
case 'I':
|
|
108
|
-
return
|
|
108
|
+
return /\(?I[).]?$/y;
|
|
109
109
|
case 'A':
|
|
110
|
-
return
|
|
110
|
+
return /\(?A[).]?$/y;
|
|
111
111
|
default:
|
|
112
|
-
return
|
|
112
|
+
return /\(?[01][).]?$/y;
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
|
|
@@ -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
b'), ctx), [['<p>a b</p>'], '']);
|
|
26
|
-
assert.deepStrictEqual(inspect(parser('	
'), ctx), [['<p>&
|
|
26
|
+
assert.deepStrictEqual(inspect(parser('	
'), ctx), [['<p>&NewLine;</p>'], '']);
|
|
27
27
|
assert.deepStrictEqual(inspect(parser('<wbr>'), ctx), [['<p><wbr></p>'], '']);
|
|
28
28
|
assert.deepStrictEqual(inspect(parser('<wbr>\n'), ctx), [['<p><wbr></p>'], '']);
|
|
29
29
|
assert.deepStrictEqual(inspect(parser('<wbr>\na'), ctx), [['<p><wbr><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
|
|
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
|
|
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><wbr><br>%]</span></span></p>'], '']);
|
|
72
71
|
assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]a'), ctx), [['<p><span class="remark"><input type="checkbox"><span>[%<br><wbr><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><wbr><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(
|
|
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,
|
|
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 =
|
|
8
|
+
export const syntax = />*(?=>>[^>\s]\S*[^\S\n]*(?:$|\n))/y;
|
|
9
9
|
|
|
10
|
-
export const cite: ReplyParser.CiteParser = line(fmap(
|
|
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(
|
|
19
|
-
focus(
|
|
20
|
-
focus(
|
|
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 =
|
|
9
|
+
export const syntax = />+[^\S\n]/y;
|
|
9
10
|
|
|
10
|
-
export const quote: ReplyParser.QuoteParser = lazy(() => block(fmap(
|
|
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')
|
|
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 {
|
|
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(
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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(
|
|
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(
|
|
42
|
+
focus(/:-+:?/y, ({ context: { source } }) =>
|
|
43
43
|
[[source.at(-1) === ':' ? 'center' : 'start']], false),
|
|
44
|
-
focus(
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
close(medialink,
|
|
53
|
-
close(media,
|
|
54
|
-
close(shortmedia,
|
|
55
|
-
trimBlank(some(inline,
|
|
56
|
-
])
|
|
57
|
-
|
|
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('
|
|
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('
|
|
45
|
-
assert.deepStrictEqual(inspect(parser('
|
|
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('
|
|
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('
|
|
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,
|
|
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
|
-
|
|
12
|
+
/- /y,
|
|
14
13
|
ulist_)));
|
|
15
14
|
|
|
16
15
|
export const ulist_: UListParser = lazy(() => block(fmap(validate(
|
|
17
|
-
|
|
16
|
+
/-(?=$|[ \n])/y,
|
|
18
17
|
some(recursion(Recursion.listitem, union([
|
|
19
18
|
indexee(fmap(fallback(
|
|
20
19
|
inits([
|
|
21
|
-
line(open(
|
|
20
|
+
line(open(/-(?:$|[ \n])/y, subsequence([
|
|
22
21
|
checkbox,
|
|
23
|
-
|
|
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
|
-
|
|
32
|
+
/\[[xX ]\](?=$|[ \n])/y,
|
|
34
33
|
({ context: { source } }) => [[
|
|
35
34
|
html('span', { class: 'checkbox' }, source[1].trimStart() ? '☑' : '☐'),
|
|
36
35
|
]]);
|