securemark 0.263.1 → 0.265.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/index.js +1218 -3058
- package/markdown.d.ts +1 -1
- package/package.json +18 -18
- package/src/combinator/data/parser/context.ts +3 -2
- package/src/combinator/data/parser/some.ts +2 -1
- package/src/parser/api/bind.test.ts +1 -1
- package/src/parser/api/normalize.ts +1 -1
- package/src/parser/api/parse.test.ts +3 -3
- package/src/parser/block/blockquote.test.ts +3 -3
- package/src/parser/block/blockquote.ts +1 -1
- package/src/parser/block/dlist.ts +2 -3
- package/src/parser/block/extension/aside.ts +0 -2
- package/src/parser/block/extension/example.test.ts +1 -1
- package/src/parser/block/extension/fig.ts +2 -1
- package/src/parser/block/extension/figure.test.ts +2 -2
- package/src/parser/block/extension/figure.ts +2 -3
- package/src/parser/block/extension/table.ts +2 -3
- package/src/parser/block/heading.test.ts +1 -1
- package/src/parser/block/olist.test.ts +27 -25
- package/src/parser/block/paragraph.test.ts +1 -1
- package/src/parser/block/paragraph.ts +2 -3
- package/src/parser/block/reply.ts +2 -3
- package/src/parser/block/sidefence.ts +1 -1
- package/src/parser/block/ulist.test.ts +23 -23
- package/src/parser/context.ts +15 -19
- package/src/parser/inline/annotation.ts +1 -1
- package/src/parser/inline/bracket.test.ts +1 -1
- package/src/parser/inline/bracket.ts +1 -1
- package/src/parser/inline/deletion.test.ts +2 -2
- package/src/parser/inline/emphasis.test.ts +2 -2
- package/src/parser/inline/emphasis.ts +2 -2
- package/src/parser/inline/extension/index.test.ts +28 -32
- package/src/parser/inline/extension/index.ts +1 -1
- package/src/parser/inline/extension/indexee.ts +23 -15
- package/src/parser/inline/extension/placeholder.test.ts +10 -12
- package/src/parser/inline/extension/placeholder.ts +7 -7
- package/src/parser/inline/html.test.ts +1 -1
- package/src/parser/inline/html.ts +2 -2
- package/src/parser/inline/insertion.test.ts +2 -2
- package/src/parser/inline/link.test.ts +32 -27
- package/src/parser/inline/link.ts +52 -56
- package/src/parser/inline/mark.test.ts +11 -11
- package/src/parser/inline/mark.ts +12 -6
- package/src/parser/inline/strong.test.ts +2 -2
- package/src/parser/inline/strong.ts +2 -2
- package/src/parser/inline.test.ts +11 -9
- package/src/parser/processor/figure.ts +0 -2
- package/src/parser/processor/footnote.ts +0 -4
- package/src/parser/source/escapable.test.ts +1 -1
- package/src/parser/source/escapable.ts +7 -1
- package/src/parser/source/text.test.ts +24 -35
- package/src/parser/source/text.ts +2 -15
- package/src/parser/visibility.ts +1 -6
- package/src/util/toc.ts +0 -2
- package/src/parser/locale/ja.test.ts +0 -14
- package/src/parser/locale/ja.ts +0 -3
- package/src/parser/locale.test.ts +0 -26
- package/src/parser/locale.ts +0 -61
package/markdown.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "securemark",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.265.0",
|
|
4
4
|
"description": "Secure markdown renderer working on browsers for user input data.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"homepage": "https://github.com/falsandtru/securemark",
|
|
@@ -28,35 +28,35 @@
|
|
|
28
28
|
"LICENSE"
|
|
29
29
|
],
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@types/dompurify": "2.
|
|
32
|
-
"@types/jquery": "3.5.
|
|
31
|
+
"@types/dompurify": "2.4.0",
|
|
32
|
+
"@types/jquery": "3.5.16",
|
|
33
33
|
"@types/mathjax": "0.0.37",
|
|
34
|
-
"@types/mocha": "10.0.
|
|
34
|
+
"@types/mocha": "10.0.1",
|
|
35
35
|
"@types/power-assert": "1.5.8",
|
|
36
36
|
"@types/prismjs": "1.26.0",
|
|
37
|
-
"@typescript-eslint/parser": "^5.
|
|
38
|
-
"babel-loader": "^
|
|
37
|
+
"@typescript-eslint/parser": "^5.49.0",
|
|
38
|
+
"babel-loader": "^9.1.2",
|
|
39
39
|
"babel-plugin-unassert": "^3.2.0",
|
|
40
|
-
"concurrently": "^7.
|
|
41
|
-
"eslint": "^8.
|
|
42
|
-
"eslint-plugin-redos": "^4.4.
|
|
40
|
+
"concurrently": "^7.6.0",
|
|
41
|
+
"eslint": "^8.32.0",
|
|
42
|
+
"eslint-plugin-redos": "^4.4.3",
|
|
43
43
|
"eslint-webpack-plugin": "^3.2.0",
|
|
44
|
-
"glob": "^8.0
|
|
44
|
+
"glob": "^8.1.0",
|
|
45
45
|
"karma": "^6.4.1",
|
|
46
46
|
"karma-chrome-launcher": "^3.1.1",
|
|
47
47
|
"karma-coverage": "^2.2.0",
|
|
48
48
|
"karma-firefox-launcher": "^2.1.2",
|
|
49
49
|
"karma-mocha": "^2.0.1",
|
|
50
50
|
"karma-power-assert": "^1.0.0",
|
|
51
|
-
"mocha": "^10.
|
|
52
|
-
"npm-check-updates": "^16.3
|
|
51
|
+
"mocha": "^10.2.0",
|
|
52
|
+
"npm-check-updates": "^16.6.3",
|
|
53
53
|
"semver": "^7.3.8",
|
|
54
|
-
"spica": "0.0.
|
|
55
|
-
"ts-loader": "^9.4.
|
|
56
|
-
"typed-dom": "^0.0.
|
|
57
|
-
"typescript": "4.
|
|
58
|
-
"webpack": "^5.
|
|
59
|
-
"webpack-cli": "^
|
|
54
|
+
"spica": "0.0.719",
|
|
55
|
+
"ts-loader": "^9.4.2",
|
|
56
|
+
"typed-dom": "^0.0.315",
|
|
57
|
+
"typescript": "4.9.4",
|
|
58
|
+
"webpack": "^5.75.0",
|
|
59
|
+
"webpack-cli": "^5.0.1",
|
|
60
60
|
"webpack-merge": "^5.8.0"
|
|
61
61
|
},
|
|
62
62
|
"scripts": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { hasOwnProperty, ObjectCreate } from 'spica/alias';
|
|
2
|
-
import { Parser, Result, Ctx, Context, eval, exec
|
|
2
|
+
import { Parser, Result, Ctx, Tree, Context, eval, exec } from '../../data/parser';
|
|
3
3
|
import { Memo } from './context/memo';
|
|
4
4
|
|
|
5
5
|
export function reset<P extends Parser<unknown>>(base: Context<P>, parser: P): P;
|
|
@@ -38,10 +38,11 @@ function apply<T>(parser: Parser<T>, source: string, context: Ctx, changes: [str
|
|
|
38
38
|
if (prop in context && !hasOwnProperty(context, prop)) break;
|
|
39
39
|
context[prop as string] = ObjectCreate(change[1]);
|
|
40
40
|
break;
|
|
41
|
+
// @ts-expect-error
|
|
41
42
|
case 'memo':
|
|
42
43
|
if (!reset) break;
|
|
43
44
|
context.memo = new Memo({ targets: context.memo?.targets });
|
|
44
|
-
|
|
45
|
+
// fallthrough
|
|
45
46
|
default:
|
|
46
47
|
values[i] = context[prop];
|
|
47
48
|
context[prop] = change[1];
|
|
@@ -4,7 +4,8 @@ import { unshift, push } from 'spica/array';
|
|
|
4
4
|
|
|
5
5
|
type DelimiterOption = readonly [delimiter: string | RegExp, precedence: number];
|
|
6
6
|
|
|
7
|
-
export function some<P extends Parser<unknown>>(parser: P,
|
|
7
|
+
export function some<P extends Parser<unknown>>(parser: P, limit?: number): P;
|
|
8
|
+
export function some<P extends Parser<unknown>>(parser: P, end?: string | RegExp, delimiters?: readonly DelimiterOption[], limit?: number): P;
|
|
8
9
|
export function some<T>(parser: Parser<T>, end?: string | RegExp | number, delimiters: readonly DelimiterOption[] = [], limit = -1): Parser<T> {
|
|
9
10
|
if (typeof end === 'number') return some(parser, undefined, delimiters, end);
|
|
10
11
|
assert(parser);
|
|
@@ -126,7 +126,7 @@ describe('Unit: parser/api/bind', () => {
|
|
|
126
126
|
});
|
|
127
127
|
|
|
128
128
|
it('normalize', () => {
|
|
129
|
-
assert.deepStrictEqual(inspect(bind(html('div'), cfgs).parse('a\\\r\nb')), ['<p>a<
|
|
129
|
+
assert.deepStrictEqual(inspect(bind(html('div'), cfgs).parse('a\\\r\nb')), ['<p>a<br>b</p>']);
|
|
130
130
|
});
|
|
131
131
|
|
|
132
132
|
it('reentrant', () => {
|
|
@@ -15,7 +15,7 @@ function format(source: string): string {
|
|
|
15
15
|
|
|
16
16
|
function sanitize(source: string): string {
|
|
17
17
|
return source
|
|
18
|
-
.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]|[\u2006\u200B-\u200F\u202A-\u202F\u2060\uFEFF]|(
|
|
18
|
+
.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]|[\u2006\u200B-\u200F\u202A-\u202F\u2060\uFEFF]|(?<![\u1820\u1821])\u180E/g, UNICODE_REPLACEMENT_CHARACTER)
|
|
19
19
|
.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]?|[\uDC00-\uDFFF]/g, char =>
|
|
20
20
|
char.length === 1
|
|
21
21
|
? UNICODE_REPLACEMENT_CHARACTER
|
|
@@ -71,7 +71,7 @@ describe('Unit: parser/api/parse', () => {
|
|
|
71
71
|
['<p>a <br>b</p>']);
|
|
72
72
|
assert.deepStrictEqual(
|
|
73
73
|
[...parse('a\\\nb').children].map(el => el.outerHTML),
|
|
74
|
-
['<p>a<
|
|
74
|
+
['<p>a<br>b</p>']);
|
|
75
75
|
assert.deepStrictEqual(
|
|
76
76
|
[...parse('a\n\\ \nb').children].map(el => el.outerHTML),
|
|
77
77
|
['<p>a<br>\\<br>b</p>']);
|
|
@@ -209,7 +209,7 @@ describe('Unit: parser/api/parse', () => {
|
|
|
209
209
|
[...parse('$-a\n$$\n$$\n\n(($-a[[b]][[c_d_]]))', { footnotes }).children].map(el => el.outerHTML),
|
|
210
210
|
[
|
|
211
211
|
'<figure data-type="math" data-label="$-a" data-group="$" data-number="1" id="label:$-a"><figcaption><span class="figindex">(1)</span><span class="figtext"></span></figcaption><div><div class="math" translate="no">$$\n$$</div></div></figure>',
|
|
212
|
-
'<p><sup class="annotation" id="annotation:ref:1" title="(1)
|
|
212
|
+
'<p><sup class="annotation" id="annotation:ref:1" title="(1)"><span hidden=""><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference:ref:1" title="b"><span hidden="">b</span><a href="#reference:def:1">[1]</a></sup><sup class="reference" id="reference:ref:2" title="cd"><span hidden="">c<em>d</em></span><a href="#reference:def:2">[2]</a></sup></span><a href="#annotation:def:1">*1</a></sup></p>',
|
|
213
213
|
'<ol class="annotations"><li id="annotation:def:1" data-marker="*1"><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference:ref:1" title="b"><span hidden="">b</span><a href="#reference:def:1">[1]</a></sup><sup class="reference" id="reference:ref:2" title="cd"><span hidden="">c<em>d</em></span><a href="#reference:def:2">[2]</a></sup><sup><a href="#annotation:ref:1">^1</a></sup></li></ol>',
|
|
214
214
|
]);
|
|
215
215
|
assert.deepStrictEqual(
|
|
@@ -220,7 +220,7 @@ describe('Unit: parser/api/parse', () => {
|
|
|
220
220
|
it('normalize', () => {
|
|
221
221
|
assert.deepStrictEqual(
|
|
222
222
|
[...parse('a\\\r\nb').children].map(el => el.outerHTML),
|
|
223
|
-
['<p>a<
|
|
223
|
+
['<p>a<br>b</p>']);
|
|
224
224
|
});
|
|
225
225
|
|
|
226
226
|
it('backtrack', () => {
|
|
@@ -69,9 +69,9 @@ describe('Unit: parser/block/blockquote', () => {
|
|
|
69
69
|
assert.deepStrictEqual(inspect(parser('!> \\\n')), [['<blockquote><section><p>\\</p><h2>References</h2><ol class="references"></ol></section></blockquote>'], '']);
|
|
70
70
|
assert.deepStrictEqual(inspect(parser('!> a')), [['<blockquote><section><p>a</p><h2>References</h2><ol class="references"></ol></section></blockquote>'], '']);
|
|
71
71
|
assert.deepStrictEqual(inspect(parser('!> a\n')), [['<blockquote><section><p>a</p><h2>References</h2><ol class="references"></ol></section></blockquote>'], '']);
|
|
72
|
-
assert.deepStrictEqual(inspect(parser('!> a\\\nb')), [['<blockquote><section><p>a<
|
|
73
|
-
assert.deepStrictEqual(inspect(parser('!>
|
|
74
|
-
assert.deepStrictEqual(inspect(parser('!>
|
|
72
|
+
assert.deepStrictEqual(inspect(parser('!> a\\\nb')), [['<blockquote><section><p>a<br>b</p><h2>References</h2><ol class="references"></ol></section></blockquote>'], '']);
|
|
73
|
+
assert.deepStrictEqual(inspect(parser('!> ++a\nb++')), [['<blockquote><section><p><ins>a<br>b</ins></p><h2>References</h2><ol class="references"></ol></section></blockquote>'], '']);
|
|
74
|
+
assert.deepStrictEqual(inspect(parser('!> ++a\n> b++')), [['<blockquote><section><p><ins>a<br>b</ins></p><h2>References</h2><ol class="references"></ol></section></blockquote>'], '']);
|
|
75
75
|
assert.deepStrictEqual(inspect(parser('!> a \n b c ')), [['<blockquote><section><p> a<br> b c</p><h2>References</h2><ol class="references"></ol></section></blockquote>'], '']);
|
|
76
76
|
assert.deepStrictEqual(inspect(parser('!>> a')), [['<blockquote><blockquote><section><p>a</p><h2>References</h2><ol class="references"></ol></section></blockquote></blockquote>'], '']);
|
|
77
77
|
assert.deepStrictEqual(inspect(parser('!>> a\n> b')), [['<blockquote><blockquote><section><p>a</p><h2>References</h2><ol class="references"></ol></section></blockquote><section><p>b</p><h2>References</h2><ol class="references"></ol></section></blockquote>'], '']);
|
|
@@ -16,7 +16,7 @@ export const blockquote: BlockquoteParser = lazy(() => block(rewrite(segment, un
|
|
|
16
16
|
|
|
17
17
|
const opener = /^(?=>>+(?:$|\s))/;
|
|
18
18
|
const indent = block(open(opener, some(contentline, /^>(?:$|\s)/)), false);
|
|
19
|
-
const unindent = (source: string) => source.replace(/(
|
|
19
|
+
const unindent = (source: string) => source.replace(/(?<=^|\n)>(?:[^\S\n]|(?=>*(?:$|\s)))|\n$/g, '');
|
|
20
20
|
|
|
21
21
|
const source: BlockquoteParser.SourceParser = lazy(() => fmap(
|
|
22
22
|
some(creation(1, false, union([
|
|
@@ -3,19 +3,18 @@ import { union, inits, some, creation, state, block, line, validate, rewrite, op
|
|
|
3
3
|
import { inline, indexee, indexer } from '../inline';
|
|
4
4
|
import { anyline } from '../source';
|
|
5
5
|
import { State } from '../context';
|
|
6
|
-
import { localize } from '../locale';
|
|
7
6
|
import { visualize, trimBlank } from '../visibility';
|
|
8
7
|
import { push } from 'spica/array';
|
|
9
8
|
import { html, defrag } from 'typed-dom/dom';
|
|
10
9
|
|
|
11
|
-
export const dlist: DListParser = lazy(() => block(
|
|
10
|
+
export const dlist: DListParser = lazy(() => block(fmap(validate(
|
|
12
11
|
/^~[^\S\n]+(?=\S)/,
|
|
13
12
|
some(inits([
|
|
14
13
|
state(State.annotation | State.reference | State.index | State.label | State.link | State.media,
|
|
15
14
|
some(term)),
|
|
16
15
|
some(desc),
|
|
17
16
|
]))),
|
|
18
|
-
es => [html('dl', fillTrailingDescription(es))])))
|
|
17
|
+
es => [html('dl', fillTrailingDescription(es))])));
|
|
19
18
|
|
|
20
19
|
const term: DListParser.TermParser = creation(1, false, line(indexee(fmap(open(
|
|
21
20
|
/^~[^\S\n]+(?=\S)/,
|
|
@@ -26,8 +26,6 @@ export const aside: ExtensionParser.AsideParser = block(validate('~~~', fmap(
|
|
|
26
26
|
},
|
|
27
27
|
}, context);
|
|
28
28
|
assert(!document.querySelector('[id]'));
|
|
29
|
-
// Bug: Firefox
|
|
30
|
-
//const heading = document.querySelector(':scope > h1:first-child');
|
|
31
29
|
const heading = 'H1 H2 H3 H4 H5 H6'.split(' ').includes(document.firstElementChild?.tagName!) && document.firstElementChild as HTMLHeadingElement;
|
|
32
30
|
if (!heading) return [html('pre', {
|
|
33
31
|
class: 'invalid',
|
|
@@ -18,7 +18,7 @@ describe('Unit: parser/block/extension/example', () => {
|
|
|
18
18
|
assert.deepStrictEqual(inspect(parser('~~~example/markdown\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no"></pre><hr><section><h2>References</h2><ol class="references"></ol></section></aside>'], '']);
|
|
19
19
|
assert.deepStrictEqual(inspect(parser('~~~example/markdown\n\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no"></pre><hr><section><h2>References</h2><ol class="references"></ol></section></aside>'], '']);
|
|
20
20
|
assert.deepStrictEqual(inspect(parser('~~~example/markdown\na\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">a</pre><hr><section><p>a</p><h2>References</h2><ol class="references"></ol></section></aside>'], '']);
|
|
21
|
-
assert.deepStrictEqual(inspect(parser('~~~example/markdown\
|
|
21
|
+
assert.deepStrictEqual(inspect(parser('~~~example/markdown\n++a\nb++\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">++a\nb++</pre><hr><section><p><ins>a<br>b</ins></p><h2>References</h2><ol class="references"></ol></section></aside>'], '']);
|
|
22
22
|
assert.deepStrictEqual(inspect(parser('~~~example/markdown\n$fig-a\n!https://host\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">$fig-a\n!https://host</pre><hr><section><figure data-type="media" data-label="fig-a" data-group="fig" data-number="1"><figcaption><span class="figindex">Fig. 1. </span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure><h2>References</h2><ol class="references"></ol></section></aside>'], '']);
|
|
23
23
|
assert.deepStrictEqual(inspect(parser('~~~example/markdown\n[$fig-a]\n!https://host\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">[$fig-a]\n!https://host</pre><hr><section><figure data-type="media" data-label="fig-a" data-group="fig" data-number="1"><figcaption><span class="figindex">Fig. 1. </span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure><h2>References</h2><ol class="references"></ol></section></aside>'], '']);
|
|
24
24
|
assert.deepStrictEqual(inspect(parser('~~~example/markdown\n## a\n~~~')), [['<aside class="example" data-type="markdown"><pre translate="no">## a</pre><hr><section><h2>a</h2><h2>References</h2><ol class="references"></ol></section></aside>'], '']);
|
|
@@ -27,7 +27,8 @@ export const segment: FigParser.SegmentParser = block(validate(['[$', '$'],
|
|
|
27
27
|
|
|
28
28
|
export const fig: FigParser = block(rewrite(segment, verify(convert(
|
|
29
29
|
(source, context) => {
|
|
30
|
-
|
|
30
|
+
// Bug: TypeScript
|
|
31
|
+
const fence = (/^[^\n]*\n!?>+\s/.test(source) && source.match(/^~{3,}(?=[^\S\n]*$)/mg) as string[] || [])
|
|
31
32
|
.reduce((max, fence) => fence > max ? fence : max, '~~') + '~';
|
|
32
33
|
return parser({ source, context })
|
|
33
34
|
? `${fence}figure ${source.replace(/^(.+\n.+\n)([\S\s]+?)\n?$/, '$1\n$2')}\n${fence}`
|
|
@@ -44,8 +44,8 @@ describe('Unit: parser/block/extension/figure', () => {
|
|
|
44
44
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
45
45
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\\\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">\\</span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
46
46
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n!https://caption\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">!<a class="url" href="https://caption" target="_blank">https://caption</a></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
47
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n- a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><ul><li>a</li></ul></div></figure>'], '']);
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n1. a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><ol><li>a</li></ol></div></figure>'], '']);
|
|
47
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n- a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><ul><li id="index:a">a</li></ul></div></figure>'], '']);
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n1. a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><ol><li id="index:a">a</li></ol></div></figure>'], '']);
|
|
49
49
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n|\n|-\n|\n~~~')), [['<figure data-type="table" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><table><thead><tr></tr></thead><tbody><tr></tr></tbody></table></div></figure>'], '']);
|
|
50
50
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n\n```\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><pre class="text"></pre></div></figure>'], '']);
|
|
51
51
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n~~~\n```\n\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><pre class="text">~~~</pre></div></figure>'], '']);
|
|
@@ -13,7 +13,6 @@ import { blockquote, segment as seg_blockquote } from '../blockquote';
|
|
|
13
13
|
import { placeholder, segment_ as seg_placeholder } from './placeholder';
|
|
14
14
|
import { inline, media, shortmedia } from '../../inline';
|
|
15
15
|
import { State } from '../../context';
|
|
16
|
-
import { localize } from '../../locale';
|
|
17
16
|
import { visualize, trimBlank } from '../../visibility';
|
|
18
17
|
import { memoize } from 'spica/memoize';
|
|
19
18
|
import { html, defrag } from 'typed-dom/dom';
|
|
@@ -65,9 +64,9 @@ export const figure: FigureParser = block(fallback(rewrite(segment, fmap(
|
|
|
65
64
|
line(shortmedia),
|
|
66
65
|
])),
|
|
67
66
|
emptyline,
|
|
68
|
-
block(
|
|
67
|
+
block(
|
|
69
68
|
state(State.media,
|
|
70
|
-
visualize(trimBlank(trimEnd(some(inline))))))
|
|
69
|
+
visualize(trimBlank(trimEnd(some(inline)))))),
|
|
71
70
|
]),
|
|
72
71
|
])),
|
|
73
72
|
([label, param, content, ...caption]: [HTMLAnchorElement, string, ...HTMLElement[]]) => [
|
|
@@ -4,7 +4,6 @@ import { Tree, eval } from '../../../combinator/data/parser';
|
|
|
4
4
|
import { union, subsequence, inits, some, creation, block, line, validate, fence, rewrite, open, clear, convert, trim, dup, lazy, fmap } from '../../../combinator';
|
|
5
5
|
import { inline } from '../../inline';
|
|
6
6
|
import { str, anyline, emptyline, contentline } from '../../source';
|
|
7
|
-
import { localize } from '../../locale';
|
|
8
7
|
import { visualize } from '../../visibility';
|
|
9
8
|
import { unshift, splice } from 'spica/array';
|
|
10
9
|
import { html, define, defrag } from 'typed-dom/dom';
|
|
@@ -52,9 +51,9 @@ export const table: TableParser = block(validate('~~~', fmap(
|
|
|
52
51
|
}
|
|
53
52
|
})));
|
|
54
53
|
|
|
55
|
-
const parser: TableParser = lazy(() => block(
|
|
54
|
+
const parser: TableParser = lazy(() => block(fmap(
|
|
56
55
|
some(union([row])),
|
|
57
|
-
rows => [html('table', format(rows))])))
|
|
56
|
+
rows => [html('table', format(rows))])));
|
|
58
57
|
|
|
59
58
|
const row: RowParser = lazy(() => dup(fmap(
|
|
60
59
|
subsequence([
|
|
@@ -75,7 +75,7 @@ describe('Unit: parser/block/heading', () => {
|
|
|
75
75
|
assert.deepStrictEqual(inspect(parser('# a [#!http://host]')), [['<h1 id="index:!http://host">a<span class="indexer" data-index="!http://host"></span></h1>'], '']);
|
|
76
76
|
assert.deepStrictEqual(inspect(parser('# a [#a((b))]')), [['<h1 id="index:a((b))">a<span class="indexer" data-index="a((b))"></span></h1>'], '']);
|
|
77
77
|
assert.deepStrictEqual(inspect(parser('# a [#a[[b]]]')), [['<h1 id="index:a[[b]]">a<span class="indexer" data-index="a[[b]]"></span></h1>'], '']);
|
|
78
|
-
assert.deepStrictEqual(inspect(parser('# a [#b
|
|
78
|
+
assert.deepStrictEqual(inspect(parser('# a [#b |c]')), [['<h1 id="index:c">a<span class="indexer" data-index="c"></span></h1>'], '']);
|
|
79
79
|
assert.deepStrictEqual(inspect(parser('# a [#b] [#c]')), [['<h1 id="index:c">a [#b]<span class="indexer" data-index="c"></span></h1>'], '']);
|
|
80
80
|
assert.deepStrictEqual(inspect(parser('# a [#b] \n')), [['<h1 id="index:b">a<span class="indexer" data-index="b"></span></h1>'], '']);
|
|
81
81
|
assert.deepStrictEqual(inspect(parser('# a \\[#b]')), [['<h1 id="index:a_[#b]">a [#b]</h1>'], '']);
|
|
@@ -39,12 +39,12 @@ describe('Unit: parser/block/olist', () => {
|
|
|
39
39
|
// filled
|
|
40
40
|
assert.deepStrictEqual(inspect(parser('1. \\')), [['<ol><li></li></ol>'], '']);
|
|
41
41
|
assert.deepStrictEqual(inspect(parser('1. \\\n')), [['<ol><li></li></ol>'], '']);
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('1. -')), [['<ol><li>-</li></ol>'], '']);
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('1. -\n')), [['<ol><li>-</li></ol>'], '']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('1. -')), [['<ol><li id="index:-">-</li></ol>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('1. -\n')), [['<ol><li id="index:-">-</li></ol>'], '']);
|
|
44
44
|
// pending
|
|
45
45
|
assert.deepStrictEqual(inspect(parser('(1) ')), [['<ol data-format="paren"><li></li></ol>'], '']);
|
|
46
46
|
// filled
|
|
47
|
-
assert.deepStrictEqual(inspect(parser('(1) a')), [['<ol data-format="paren"><li>a</li></ol>'], '']);
|
|
47
|
+
assert.deepStrictEqual(inspect(parser('(1) a')), [['<ol data-format="paren"><li id="index:a">a</li></ol>'], '']);
|
|
48
48
|
});
|
|
49
49
|
|
|
50
50
|
it('multiple', () => {
|
|
@@ -55,8 +55,8 @@ describe('Unit: parser/block/olist', () => {
|
|
|
55
55
|
assert.deepStrictEqual(inspect(parser('0.\n0. ')), [['<ol><li></li><li></li></ol>'], '']);
|
|
56
56
|
assert.deepStrictEqual(inspect(parser('0.\n0.\n')), [['<ol><li></li><li></li></ol>'], '']);
|
|
57
57
|
// filled
|
|
58
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n0. 2')), [['<ol><li>1</li><li>2</li></ol>'], '']);
|
|
59
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n0. 2\n0. 3')), [['<ol><li>1</li><li>2</li><li>3</li></ol>'], '']);
|
|
58
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n0. 2')), [['<ol><li id="index:1">1</li><li id="index:2">2</li></ol>'], '']);
|
|
59
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n0. 2\n0. 3')), [['<ol><li id="index:1">1</li><li id="index:2">2</li><li id="index:3">3</li></ol>'], '']);
|
|
60
60
|
// pending
|
|
61
61
|
assert.deepStrictEqual(inspect(parser('(1) \n(')), [['<ol data-format="paren"><li></li><li></li></ol>'], '']);
|
|
62
62
|
assert.deepStrictEqual(inspect(parser('(1) \n(\n')), [['<ol data-format="paren"><li></li><li></li></ol>'], '']);
|
|
@@ -67,21 +67,21 @@ describe('Unit: parser/block/olist', () => {
|
|
|
67
67
|
// filled
|
|
68
68
|
assert.deepStrictEqual(inspect(parser('(1) \n(1) ')), [['<ol data-format="paren"><li></li><li></li></ol>'], '']);
|
|
69
69
|
// invalid
|
|
70
|
-
assert.deepStrictEqual(inspect(parser('0. \n0 ')), [['<ol><li></li><li><span class="invalid">0 </span></li></ol>'], '']);
|
|
70
|
+
assert.deepStrictEqual(inspect(parser('0. \n0 ')), [['<ol><li></li><li id="index:0"><span class="invalid">0 </span></li></ol>'], '']);
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
it('nest', () => {
|
|
74
74
|
assert.deepStrictEqual(inspect(parser('0.\n 0')), [['<ol><li><br><ol><li></li></ol></li></ol>'], '']);
|
|
75
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n 0')), [['<ol><li>1<ol><li></li></ol></li></ol>'], '']);
|
|
76
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n 0.')), [['<ol><li>1<ol><li></li></ol></li></ol>'], '']);
|
|
77
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n 0. ')), [['<ol><li>1<ol><li></li></ol></li></ol>'], '']);
|
|
78
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n 0.\n')), [['<ol><li>1<ol><li></li></ol></li></ol>'], '']);
|
|
79
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2')), [['<ol><li>1<ol><li>2</li></ol></li></ol>'], '']);
|
|
80
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n0. 3')), [['<ol><li>1<ol><li>2</li></ol></li><li>3</li></ol>'], '']);
|
|
81
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n 0. 3')), [['<ol><li>1<ol><li>2</li><li>3</li></ol></li></ol>'], '']);
|
|
82
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n 0. 3')), [['<ol><li>1<ol><li>2<ol><li>3</li></ol></li></ol></li></ol>'], '']);
|
|
83
|
-
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n 0. 3')), [['<ol><li>1<ol><li>2</li></ol></li><li><span class="invalid"> 0. 3</span></li></ol>'], '']);
|
|
84
|
-
assert.deepStrictEqual(inspect(parser('0. !http://host')), [['<ol><li>!<a class="url" href="http://host" target="_blank">http://host</a></li></ol>'], '']);
|
|
75
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n 0')), [['<ol><li id="index:1">1<ol><li></li></ol></li></ol>'], '']);
|
|
76
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n 0.')), [['<ol><li id="index:1">1<ol><li></li></ol></li></ol>'], '']);
|
|
77
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n 0. ')), [['<ol><li id="index:1">1<ol><li></li></ol></li></ol>'], '']);
|
|
78
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n 0.\n')), [['<ol><li id="index:1">1<ol><li></li></ol></li></ol>'], '']);
|
|
79
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2')), [['<ol><li id="index:1">1<ol><li id="index:2">2</li></ol></li></ol>'], '']);
|
|
80
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n0. 3')), [['<ol><li id="index:1">1<ol><li id="index:2">2</li></ol></li><li id="index:3">3</li></ol>'], '']);
|
|
81
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n 0. 3')), [['<ol><li id="index:1">1<ol><li id="index:2">2</li><li id="index:3">3</li></ol></li></ol>'], '']);
|
|
82
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n 0. 3')), [['<ol><li id="index:1">1<ol><li id="index:2">2<ol><li id="index:3">3</li></ol></li></ol></li></ol>'], '']);
|
|
83
|
+
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n 0. 3')), [['<ol><li id="index:1">1<ol><li id="index:2">2</li></ol></li><li id="index:0._3"><span class="invalid"> 0. 3</span></li></ol>'], '']);
|
|
84
|
+
assert.deepStrictEqual(inspect(parser('0. !http://host')), [['<ol><li id="index:!http://host">!<a class="url" href="http://host" target="_blank">http://host</a></li></ol>'], '']);
|
|
85
85
|
});
|
|
86
86
|
|
|
87
87
|
it('index', () => {
|
|
@@ -103,10 +103,11 @@ describe('Unit: parser/block/olist', () => {
|
|
|
103
103
|
assert.deepStrictEqual(inspect(parser('(1)-1-1 ')), [['<ol data-format="paren"><li data-marker="(1)-1-1"></li></ol>'], '']);
|
|
104
104
|
assert.deepStrictEqual(inspect(parser('(1) \n(1)-')), [['<ol data-format="paren"><li></li><li data-marker="(1)-"></li></ol>'], '']);
|
|
105
105
|
assert.deepStrictEqual(inspect(parser('(1) \n(1)-1')), [['<ol data-format="paren"><li></li><li data-marker="(1)-1"></li></ol>'], '']);
|
|
106
|
-
assert.deepStrictEqual(inspect(parser('1. \n1--')), [['<ol><li></li><li><span class="invalid">1--</span></li></ol>'], '']);
|
|
107
|
-
assert.deepStrictEqual(inspect(parser('1. \n1--. ')), [['<ol><li></li><li><span class="invalid">1--. </span></li></ol>'], '']);
|
|
108
|
-
assert.deepStrictEqual(inspect(parser('(1) \n(1)--')), [['<ol data-format="paren"><li></li><li><span class="invalid">(1)--</span></li></ol>'], '']);
|
|
109
|
-
assert.deepStrictEqual(inspect(parser('(1) \n(1)-- ')), [['<ol data-format="paren"><li></li><li><span class="invalid">(1)-- </span></li></ol>'], '']);
|
|
106
|
+
assert.deepStrictEqual(inspect(parser('1. \n1--')), [['<ol><li></li><li id="index:1--"><span class="invalid">1--</span></li></ol>'], '']);
|
|
107
|
+
assert.deepStrictEqual(inspect(parser('1. \n1--. ')), [['<ol><li></li><li id="index:1--."><span class="invalid">1--. </span></li></ol>'], '']);
|
|
108
|
+
assert.deepStrictEqual(inspect(parser('(1) \n(1)--')), [['<ol data-format="paren"><li></li><li id="index:(1)--"><span class="invalid">(1)--</span></li></ol>'], '']);
|
|
109
|
+
assert.deepStrictEqual(inspect(parser('(1) \n(1)-- ')), [['<ol data-format="paren"><li></li><li id="index:(1)--"><span class="invalid">(1)-- </span></li></ol>'], '']);
|
|
110
|
+
assert.deepStrictEqual(inspect(parser('1-1. 1')), [['<ol><li data-marker="1-1." id="index:1">1</li></ol>'], '']);
|
|
110
111
|
});
|
|
111
112
|
|
|
112
113
|
it('type', () => {
|
|
@@ -115,22 +116,23 @@ describe('Unit: parser/block/olist', () => {
|
|
|
115
116
|
assert.deepStrictEqual(inspect(parser('I. ')), [['<ol type="I" data-type="upper-roman"><li></li></ol>'], '']);
|
|
116
117
|
assert.deepStrictEqual(inspect(parser('A. ')), [['<ol type="A" data-type="upper-alpha"><li></li></ol>'], '']);
|
|
117
118
|
assert.deepStrictEqual(inspect(parser('a.\n1.\nc')), [['<ol type="a" data-type="lower-alpha"><li></li><li data-marker="1."></li><li data-marker="c."></li></ol>'], '']);
|
|
119
|
+
assert.deepStrictEqual(inspect(parser('i. 1')), [['<ol type="i" data-type="lower-roman"><li id="index:1">1</li></ol>'], '']);
|
|
118
120
|
});
|
|
119
121
|
|
|
120
122
|
it('checkbox', () => {
|
|
121
123
|
assert.deepStrictEqual(inspect(parser('1. [ ]')), [['<ol class="checklist"><li><span class="checkbox">☐</span></li></ol>'], '']);
|
|
122
124
|
assert.deepStrictEqual(inspect(parser('1. [x]')), [['<ol class="checklist"><li><span class="checkbox">☑</span></li></ol>'], '']);
|
|
123
125
|
assert.deepStrictEqual(inspect(parser('1. [X]')), [['<ol class="checklist"><li><span class="checkbox">☑</span></li></ol>'], '']);
|
|
124
|
-
assert.deepStrictEqual(inspect(parser('1. [X] 1')), [['<ol class="checklist"><li><span class="checkbox">☑</span>1</li></ol>'], '']);
|
|
126
|
+
assert.deepStrictEqual(inspect(parser('1. [X] 1')), [['<ol class="checklist"><li id="index:1"><span class="checkbox">☑</span>1</li></ol>'], '']);
|
|
125
127
|
});
|
|
126
128
|
|
|
127
129
|
it('indexer', () => {
|
|
128
|
-
assert.deepStrictEqual(inspect(parser('1. [#a]')), [['<ol><li><a class="index" href="#index:a">a</a></li></ol>'], '']);
|
|
129
|
-
assert.deepStrictEqual(inspect(parser('1. a [#]')), [['<ol><li
|
|
130
|
+
assert.deepStrictEqual(inspect(parser('1. [#a]')), [['<ol><li id="index:a"><a class="index" href="#index:a">a</a></li></ol>'], '']);
|
|
131
|
+
assert.deepStrictEqual(inspect(parser('1. a [#]')), [['<ol><li>a<span class="indexer" data-index=""></span></li></ol>'], '']);
|
|
130
132
|
assert.deepStrictEqual(inspect(parser('1. a [#b]')), [['<ol><li id="index:b">a<span class="indexer" data-index="b"></span></li></ol>'], '']);
|
|
131
|
-
assert.deepStrictEqual(inspect(parser('1. [ ] [#a]')), [['<ol class="checklist"><li><span class="checkbox">☐</span><a class="index" href="#index:a">a</a></li></ol>'], '']);
|
|
133
|
+
assert.deepStrictEqual(inspect(parser('1. [ ] [#a]')), [['<ol class="checklist"><li id="index:a"><span class="checkbox">☐</span><a class="index" href="#index:a">a</a></li></ol>'], '']);
|
|
132
134
|
assert.deepStrictEqual(inspect(parser('1. [ ] a [#b]')), [['<ol class="checklist"><li id="index:b"><span class="checkbox">☐</span>a<span class="indexer" data-index="b"></span></li></ol>'], '']);
|
|
133
|
-
assert.deepStrictEqual(inspect(parser('1. a [#]\n 1. c [#d]')), [['<ol><li
|
|
135
|
+
assert.deepStrictEqual(inspect(parser('1. a [#]\n 1. c [#d]')), [['<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>'], '']);
|
|
134
136
|
assert.deepStrictEqual(inspect(parser('1. a [#b]\n 1. c [#d]')), [['<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>'], '']);
|
|
135
137
|
});
|
|
136
138
|
|
|
@@ -19,7 +19,7 @@ describe('Unit: parser/block/paragraph', () => {
|
|
|
19
19
|
assert.deepStrictEqual(inspect(parser('a\\ ')), [['<p>a</p>'], '']);
|
|
20
20
|
assert.deepStrictEqual(inspect(parser('a\\ \n')), [['<p>a</p>'], '']);
|
|
21
21
|
assert.deepStrictEqual(inspect(parser('a\\\n')), [['<p>a</p>'], '']);
|
|
22
|
-
assert.deepStrictEqual(inspect(parser('a\\\nb')), [['<p>a<
|
|
22
|
+
assert.deepStrictEqual(inspect(parser('a\\\nb')), [['<p>a<br>b</p>'], '']);
|
|
23
23
|
assert.deepStrictEqual(inspect(parser('a
b')), [['<p>a b</p>'], '']);
|
|
24
24
|
assert.deepStrictEqual(inspect(parser('	
')), [['<p>&Tab;&NewLine;</p>'], '']);
|
|
25
25
|
assert.deepStrictEqual(inspect(parser('<wbr>')), [['<p><wbr></p>'], '']);
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { ParagraphParser } from '../block';
|
|
2
2
|
import { union, some, block, trimEnd, fmap } from '../../combinator';
|
|
3
3
|
import { inline } from '../inline';
|
|
4
|
-
import { localize } from '../locale';
|
|
5
4
|
import { visualize } from '../visibility';
|
|
6
5
|
import { html, defrag } from 'typed-dom/dom';
|
|
7
6
|
|
|
8
|
-
export const paragraph: ParagraphParser = block(
|
|
7
|
+
export const paragraph: ParagraphParser = block(fmap(
|
|
9
8
|
visualize(trimEnd(some(union([inline])))),
|
|
10
|
-
ns => [html('p', defrag(ns))]))
|
|
9
|
+
ns => [html('p', defrag(ns))]));
|
|
@@ -4,7 +4,6 @@ import { cite } from './reply/cite';
|
|
|
4
4
|
import { quote, syntax as delimiter } from './reply/quote';
|
|
5
5
|
import { inline } from '../inline';
|
|
6
6
|
import { anyline } from '../source';
|
|
7
|
-
import { localize } from '../locale';
|
|
8
7
|
import { visualize } from '../visibility';
|
|
9
8
|
import { push, pop } from 'spica/array';
|
|
10
9
|
import { html, defrag } from 'typed-dom/dom';
|
|
@@ -16,7 +15,7 @@ import { html, defrag } from 'typed-dom/dom';
|
|
|
16
15
|
対象と引用は1:N(分割)、N:1(統合)のみ可能、N:N(混合)は不可能
|
|
17
16
|
*/
|
|
18
17
|
|
|
19
|
-
export const reply: ReplyParser = block(validate('>',
|
|
18
|
+
export const reply: ReplyParser = block(validate('>', fmap(
|
|
20
19
|
inits([
|
|
21
20
|
some(inits([
|
|
22
21
|
cite,
|
|
@@ -30,4 +29,4 @@ export const reply: ReplyParser = block(validate('>', localize(fmap(
|
|
|
30
29
|
ns => push(ns, [html('br')])),
|
|
31
30
|
])),
|
|
32
31
|
]),
|
|
33
|
-
ns => [html('p', defrag(pop(ns)[0]))])))
|
|
32
|
+
ns => [html('p', defrag(pop(ns)[0]))])));
|
|
@@ -17,7 +17,7 @@ export const sidefence: SidefenceParser = lazy(() => block(fmap(focus(
|
|
|
17
17
|
])));
|
|
18
18
|
|
|
19
19
|
const opener = /^(?=\|\|+(?:$|\s))/;
|
|
20
|
-
const unindent = (source: string) => source.replace(/(
|
|
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(creation(1, false, union([
|