securemark 0.237.1 → 0.239.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 +12 -0
- package/dist/securemark.js +151 -106
- package/markdown.d.ts +3 -1
- package/package-lock.json +50 -50
- package/package.json +1 -1
- package/src/combinator/data/parser/subsequence.ts +5 -9
- package/src/combinator/data/parser/tails.ts +1 -1
- package/src/combinator/data/parser/union.ts +1 -1
- package/src/debug.test.ts +1 -1
- package/src/parser/block/codeblock.test.ts +5 -2
- package/src/parser/block/codeblock.ts +42 -24
- package/src/parser/block/extension/fig.test.ts +1 -1
- package/src/parser/block/extension/fig.ts +1 -1
- package/src/parser/block/extension/figure.test.ts +2 -0
- package/src/parser/block/extension/figure.ts +21 -24
- package/src/parser/block/olist.test.ts +2 -0
- package/src/parser/block/ulist.test.ts +2 -0
- package/src/parser/block.ts +2 -2
- package/src/parser/inline/comment.ts +1 -1
- package/src/parser/inline/extension/index.test.ts +19 -13
- package/src/parser/inline/extension/index.ts +4 -3
- package/src/parser/inline/extension/indexee.ts +7 -3
- package/src/parser/inline/extension/indexer.test.ts +2 -1
- package/src/parser/inline/extension/indexer.ts +6 -3
- package/src/parser/inline/htmlentity.ts +2 -2
- package/src/parser/inline/media.ts +2 -2
- package/src/parser/inline/ruby.ts +2 -2
- package/src/parser/processor/figure.test.ts +8 -6
- package/src/parser/processor/figure.ts +32 -19
- package/src/parser/segment.test.ts +2 -2
- package/src/parser/segment.ts +2 -2
- package/src/parser/source/str.ts +23 -4
- package/src/parser/source/text.ts +3 -0
- package/src/parser/source.ts +1 -1
- package/src/parser/util.ts +2 -2
package/package-lock.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "securemark",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.239.0",
|
|
4
4
|
"lockfileVersion": 1,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"dependencies": {
|
|
@@ -432,13 +432,13 @@
|
|
|
432
432
|
}
|
|
433
433
|
},
|
|
434
434
|
"@npmcli/git": {
|
|
435
|
-
"version": "3.0.
|
|
436
|
-
"resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.
|
|
437
|
-
"integrity": "sha512-
|
|
435
|
+
"version": "3.0.1",
|
|
436
|
+
"resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.1.tgz",
|
|
437
|
+
"integrity": "sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A==",
|
|
438
438
|
"dev": true,
|
|
439
439
|
"requires": {
|
|
440
|
-
"@npmcli/promise-spawn": "^
|
|
441
|
-
"lru-cache": "^7.
|
|
440
|
+
"@npmcli/promise-spawn": "^3.0.0",
|
|
441
|
+
"lru-cache": "^7.4.4",
|
|
442
442
|
"mkdirp": "^1.0.4",
|
|
443
443
|
"npm-pick-manifest": "^7.0.0",
|
|
444
444
|
"proc-log": "^2.0.0",
|
|
@@ -476,9 +476,9 @@
|
|
|
476
476
|
}
|
|
477
477
|
},
|
|
478
478
|
"@npmcli/move-file": {
|
|
479
|
-
"version": "
|
|
480
|
-
"resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-
|
|
481
|
-
"integrity": "sha512-
|
|
479
|
+
"version": "2.0.0",
|
|
480
|
+
"resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz",
|
|
481
|
+
"integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==",
|
|
482
482
|
"dev": true,
|
|
483
483
|
"requires": {
|
|
484
484
|
"mkdirp": "^1.0.4",
|
|
@@ -494,28 +494,28 @@
|
|
|
494
494
|
}
|
|
495
495
|
},
|
|
496
496
|
"@npmcli/node-gyp": {
|
|
497
|
-
"version": "
|
|
498
|
-
"resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-
|
|
499
|
-
"integrity": "sha512-
|
|
497
|
+
"version": "2.0.0",
|
|
498
|
+
"resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz",
|
|
499
|
+
"integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==",
|
|
500
500
|
"dev": true
|
|
501
501
|
},
|
|
502
502
|
"@npmcli/promise-spawn": {
|
|
503
|
-
"version": "
|
|
504
|
-
"resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-
|
|
505
|
-
"integrity": "sha512-
|
|
503
|
+
"version": "3.0.0",
|
|
504
|
+
"resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz",
|
|
505
|
+
"integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==",
|
|
506
506
|
"dev": true,
|
|
507
507
|
"requires": {
|
|
508
508
|
"infer-owner": "^1.0.4"
|
|
509
509
|
}
|
|
510
510
|
},
|
|
511
511
|
"@npmcli/run-script": {
|
|
512
|
-
"version": "3.0.
|
|
513
|
-
"resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-3.0.
|
|
514
|
-
"integrity": "sha512-
|
|
512
|
+
"version": "3.0.2",
|
|
513
|
+
"resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-3.0.2.tgz",
|
|
514
|
+
"integrity": "sha512-vdjD/PMBl+OX9j9C9irx5sCCIKfp2PWkpPNH9zxvlJAfSZ3Qp5aU412v+O3PFJl3R1PFNwuyChCqHg4ma6ci2Q==",
|
|
515
515
|
"dev": true,
|
|
516
516
|
"requires": {
|
|
517
|
-
"@npmcli/node-gyp": "^
|
|
518
|
-
"@npmcli/promise-spawn": "^
|
|
517
|
+
"@npmcli/node-gyp": "^2.0.0",
|
|
518
|
+
"@npmcli/promise-spawn": "^3.0.0",
|
|
519
519
|
"node-gyp": "^9.0.0",
|
|
520
520
|
"read-package-json-fast": "^2.0.3"
|
|
521
521
|
}
|
|
@@ -1777,13 +1777,13 @@
|
|
|
1777
1777
|
"dev": true
|
|
1778
1778
|
},
|
|
1779
1779
|
"cacache": {
|
|
1780
|
-
"version": "16.0.
|
|
1781
|
-
"resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.
|
|
1782
|
-
"integrity": "sha512-
|
|
1780
|
+
"version": "16.0.4",
|
|
1781
|
+
"resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.4.tgz",
|
|
1782
|
+
"integrity": "sha512-U0D4wF3/W8ZgK4qDA5fTtOVSr0gaDfd5aa7tUdAV0uukVWKsAIn6SzXQCoVlg7RWZiJa+bcsM3/pXLumGaL2Ug==",
|
|
1783
1783
|
"dev": true,
|
|
1784
1784
|
"requires": {
|
|
1785
1785
|
"@npmcli/fs": "^2.1.0",
|
|
1786
|
-
"@npmcli/move-file": "^
|
|
1786
|
+
"@npmcli/move-file": "^2.0.0",
|
|
1787
1787
|
"chownr": "^2.0.0",
|
|
1788
1788
|
"fs-minipass": "^2.1.0",
|
|
1789
1789
|
"glob": "^7.2.0",
|
|
@@ -1797,7 +1797,7 @@
|
|
|
1797
1797
|
"p-map": "^4.0.0",
|
|
1798
1798
|
"promise-inflight": "^1.0.1",
|
|
1799
1799
|
"rimraf": "^3.0.2",
|
|
1800
|
-
"ssri": "^
|
|
1800
|
+
"ssri": "^9.0.0",
|
|
1801
1801
|
"tar": "^6.1.11",
|
|
1802
1802
|
"unique-filename": "^1.1.1"
|
|
1803
1803
|
},
|
|
@@ -1923,9 +1923,9 @@
|
|
|
1923
1923
|
"dev": true
|
|
1924
1924
|
},
|
|
1925
1925
|
"caniuse-lite": {
|
|
1926
|
-
"version": "1.0.
|
|
1927
|
-
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.
|
|
1928
|
-
"integrity": "sha512
|
|
1926
|
+
"version": "1.0.30001325",
|
|
1927
|
+
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz",
|
|
1928
|
+
"integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==",
|
|
1929
1929
|
"dev": true
|
|
1930
1930
|
},
|
|
1931
1931
|
"chalk": {
|
|
@@ -4915,9 +4915,9 @@
|
|
|
4915
4915
|
}
|
|
4916
4916
|
},
|
|
4917
4917
|
"graceful-fs": {
|
|
4918
|
-
"version": "4.2.
|
|
4919
|
-
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.
|
|
4920
|
-
"integrity": "sha512-
|
|
4918
|
+
"version": "4.2.10",
|
|
4919
|
+
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
|
|
4920
|
+
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
|
|
4921
4921
|
"dev": true
|
|
4922
4922
|
},
|
|
4923
4923
|
"growl": {
|
|
@@ -7114,9 +7114,9 @@
|
|
|
7114
7114
|
}
|
|
7115
7115
|
},
|
|
7116
7116
|
"make-fetch-happen": {
|
|
7117
|
-
"version": "10.1.
|
|
7118
|
-
"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.
|
|
7119
|
-
"integrity": "sha512-
|
|
7117
|
+
"version": "10.1.2",
|
|
7118
|
+
"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.2.tgz",
|
|
7119
|
+
"integrity": "sha512-GWMGiZsKVeJACQGJ1P3Z+iNec7pLsU6YW1q11eaPn3RR8nRXHppFWfP7Eu0//55JK3hSjrAQRl8sDa5uXpq1Ew==",
|
|
7120
7120
|
"dev": true,
|
|
7121
7121
|
"requires": {
|
|
7122
7122
|
"agentkeepalive": "^4.2.1",
|
|
@@ -7134,7 +7134,7 @@
|
|
|
7134
7134
|
"negotiator": "^0.6.3",
|
|
7135
7135
|
"promise-retry": "^2.0.1",
|
|
7136
7136
|
"socks-proxy-agent": "^6.1.1",
|
|
7137
|
-
"ssri": "^
|
|
7137
|
+
"ssri": "^9.0.0"
|
|
7138
7138
|
}
|
|
7139
7139
|
},
|
|
7140
7140
|
"make-iterator": {
|
|
@@ -8127,9 +8127,9 @@
|
|
|
8127
8127
|
}
|
|
8128
8128
|
},
|
|
8129
8129
|
"npm-install-checks": {
|
|
8130
|
-
"version": "
|
|
8131
|
-
"resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-
|
|
8132
|
-
"integrity": "sha512-
|
|
8130
|
+
"version": "5.0.0",
|
|
8131
|
+
"resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz",
|
|
8132
|
+
"integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==",
|
|
8133
8133
|
"dev": true,
|
|
8134
8134
|
"requires": {
|
|
8135
8135
|
"semver": "^7.1.1"
|
|
@@ -8176,12 +8176,12 @@
|
|
|
8176
8176
|
}
|
|
8177
8177
|
},
|
|
8178
8178
|
"npm-pick-manifest": {
|
|
8179
|
-
"version": "7.0.
|
|
8180
|
-
"resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.
|
|
8181
|
-
"integrity": "sha512-
|
|
8179
|
+
"version": "7.0.1",
|
|
8180
|
+
"resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz",
|
|
8181
|
+
"integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==",
|
|
8182
8182
|
"dev": true,
|
|
8183
8183
|
"requires": {
|
|
8184
|
-
"npm-install-checks": "^
|
|
8184
|
+
"npm-install-checks": "^5.0.0",
|
|
8185
8185
|
"npm-normalize-package-bin": "^1.0.1",
|
|
8186
8186
|
"npm-package-arg": "^9.0.0",
|
|
8187
8187
|
"semver": "^7.3.5"
|
|
@@ -8497,14 +8497,14 @@
|
|
|
8497
8497
|
}
|
|
8498
8498
|
},
|
|
8499
8499
|
"pacote": {
|
|
8500
|
-
"version": "13.0
|
|
8501
|
-
"resolved": "https://registry.npmjs.org/pacote/-/pacote-13.0.
|
|
8502
|
-
"integrity": "sha512-
|
|
8500
|
+
"version": "13.1.0",
|
|
8501
|
+
"resolved": "https://registry.npmjs.org/pacote/-/pacote-13.1.0.tgz",
|
|
8502
|
+
"integrity": "sha512-Ns2chroFx26U4Bd+qm/ETxHGv+HLafoy5TVAcYHigIqANZ+kkk6PANMr1KAugNYecnrN+5lwwiWyBeu40nuU7Q==",
|
|
8503
8503
|
"dev": true,
|
|
8504
8504
|
"requires": {
|
|
8505
8505
|
"@npmcli/git": "^3.0.0",
|
|
8506
8506
|
"@npmcli/installed-package-contents": "^1.0.7",
|
|
8507
|
-
"@npmcli/promise-spawn": "^
|
|
8507
|
+
"@npmcli/promise-spawn": "^3.0.0",
|
|
8508
8508
|
"@npmcli/run-script": "^3.0.1",
|
|
8509
8509
|
"cacache": "^16.0.0",
|
|
8510
8510
|
"chownr": "^2.0.0",
|
|
@@ -8521,7 +8521,7 @@
|
|
|
8521
8521
|
"read-package-json": "^5.0.0",
|
|
8522
8522
|
"read-package-json-fast": "^2.0.3",
|
|
8523
8523
|
"rimraf": "^3.0.2",
|
|
8524
|
-
"ssri": "^
|
|
8524
|
+
"ssri": "^9.0.0",
|
|
8525
8525
|
"tar": "^6.1.11"
|
|
8526
8526
|
},
|
|
8527
8527
|
"dependencies": {
|
|
@@ -10327,9 +10327,9 @@
|
|
|
10327
10327
|
"dev": true
|
|
10328
10328
|
},
|
|
10329
10329
|
"ssri": {
|
|
10330
|
-
"version": "
|
|
10331
|
-
"resolved": "https://registry.npmjs.org/ssri/-/ssri-
|
|
10332
|
-
"integrity": "sha512-
|
|
10330
|
+
"version": "9.0.0",
|
|
10331
|
+
"resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.0.tgz",
|
|
10332
|
+
"integrity": "sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==",
|
|
10333
10333
|
"dev": true,
|
|
10334
10334
|
"requires": {
|
|
10335
10335
|
"minipass": "^3.1.1"
|
package/package.json
CHANGED
|
@@ -5,13 +5,9 @@ import { inits } from './inits';
|
|
|
5
5
|
export function subsequence<P extends Parser<unknown>>(parsers: SubParsers<P>): SubTree<P> extends Tree<P> ? P : Parser<SubTree<P>, Context<P>, SubParsers<P>>;
|
|
6
6
|
export function subsequence<T, D extends Parser<T>[]>(parsers: D): Parser<T, Ctx, D> {
|
|
7
7
|
assert(parsers.every(f => f));
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return union([inits(parsers), parsers[1]] as unknown as D);
|
|
14
|
-
default:
|
|
15
|
-
return subsequence([parsers[0], subsequence(parsers.slice(1))] as unknown as D);
|
|
16
|
-
}
|
|
8
|
+
return union(
|
|
9
|
+
parsers.map((_, i) =>
|
|
10
|
+
i < parsers.length - 1
|
|
11
|
+
? inits([parsers[i], subsequence(parsers.slice(i + 1))])
|
|
12
|
+
: parsers[i]) as D);
|
|
17
13
|
}
|
|
@@ -4,5 +4,5 @@ import { sequence } from './sequence';
|
|
|
4
4
|
|
|
5
5
|
export function tails<P extends Parser<unknown>>(parsers: SubParsers<P>): SubTree<P> extends Tree<P> ? P : Parser<SubTree<P>, Context<P>, SubParsers<P>>;
|
|
6
6
|
export function tails<T, D extends Parser<T>[]>(parsers: D): Parser<T, Ctx, D> {
|
|
7
|
-
return union(parsers.map((_, i) => sequence(parsers.slice(i))) as
|
|
7
|
+
return union(parsers.map((_, i) => sequence(parsers.slice(i))) as D);
|
|
8
8
|
}
|
package/src/debug.test.ts
CHANGED
|
@@ -19,7 +19,7 @@ export function inspect(result: Result<HTMLElement | string>, until: number | st
|
|
|
19
19
|
? until
|
|
20
20
|
: ~(~node.outerHTML.indexOf(until) || -Infinity) + until.length;
|
|
21
21
|
const el = html('div');
|
|
22
|
-
assert(!node.outerHTML.match(/[\
|
|
22
|
+
assert(!node.outerHTML.match(/[\x00-\x08\x0B-\x1F\x7F]/));
|
|
23
23
|
el.innerHTML = node.outerHTML.slice(0, until);
|
|
24
24
|
if (node.outerHTML.length <= until) {
|
|
25
25
|
assert(node.outerHTML === el.innerHTML);
|
|
@@ -47,7 +47,7 @@ describe('Unit: parser/block/codeblock', () => {
|
|
|
47
47
|
it('attribute', () => {
|
|
48
48
|
assert.deepStrictEqual(inspect(parser('```0\n```')), [['<pre class="code language-0" translate="no" data-lang="0"></pre>'], '']);
|
|
49
49
|
assert.deepStrictEqual(inspect(parser('```a\n```')), [['<pre class="code language-a" translate="no" data-lang="a"></pre>'], '']);
|
|
50
|
-
assert.deepStrictEqual(inspect(parser('```A\n```')), [['<pre class="
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('```A\n```')), [['<pre class="code language-a" translate="no" data-lang="a"></pre>'], '']);
|
|
51
51
|
assert.deepStrictEqual(inspect(parser('```a-b\n```')), [['<pre class="code language-a-b" translate="no" data-lang="a-b"></pre>'], '']);
|
|
52
52
|
assert.deepStrictEqual(inspect(parser('```a-b0\n```')), [['<pre class="code language-a-b0" translate="no" data-lang="a-b0"></pre>'], '']);
|
|
53
53
|
assert.deepStrictEqual(inspect(parser('```a--b\n```')), [['<pre class="text" translate="no" data-path="a--b"></pre>'], '']);
|
|
@@ -62,7 +62,10 @@ describe('Unit: parser/block/codeblock', () => {
|
|
|
62
62
|
assert.deepStrictEqual(inspect(parser('```.b\n```')), [['<pre class="text" translate="no" data-path=".b"></pre>'], '']);
|
|
63
63
|
assert.deepStrictEqual(inspect(parser('```b.c\n```')), [['<pre class="code language-c" translate="no" data-lang="c" data-path="b.c"></pre>'], '']);
|
|
64
64
|
assert.deepStrictEqual(inspect(parser('```a b.c\n```')), [['<pre class="code language-a" translate="no" data-lang="a" data-path="b.c"></pre>'], '']);
|
|
65
|
-
assert.deepStrictEqual(inspect(parser('```
|
|
65
|
+
assert.deepStrictEqual(inspect(parser('```a 1\n```')), [['<pre class="code language-a" translate="no" data-lang="a" data-line="1"></pre>'], '']);
|
|
66
|
+
assert.deepStrictEqual(inspect(parser('``` 1\n```')), [['<pre class="text" translate="no" data-line="1"></pre>'], '']);
|
|
67
|
+
assert.deepStrictEqual(inspect(parser('``` 1,2-3\n```')), [['<pre class="text" translate="no" data-line="1,2-3"></pre>'], '']);
|
|
68
|
+
assert.deepStrictEqual(inspect(parser('``` 1 b.c\n```')), [['<pre class="code language-c" translate="no" data-lang="c" data-line="1" data-path="b.c"></pre>'], '']);
|
|
66
69
|
});
|
|
67
70
|
|
|
68
71
|
});
|
|
@@ -3,12 +3,10 @@ import { CodeBlockParser } from '../block';
|
|
|
3
3
|
import { eval } from '../../combinator/data/parser';
|
|
4
4
|
import { some, block, validate, fence, clear, fmap } from '../../combinator';
|
|
5
5
|
import { autolink } from '../autolink';
|
|
6
|
-
import { escsource } from '../source';
|
|
7
6
|
import { html, defrag } from 'typed-dom';
|
|
8
|
-
import { join } from 'spica/array';
|
|
9
7
|
|
|
10
|
-
const opener = /^(`{3,})(?!`)(
|
|
11
|
-
const language = /^[0-9a-z]+(?:-[a-z][0-9a-z]*)
|
|
8
|
+
const opener = /^(`{3,})(?!`)([^\n]*)(?:$|\n)/;
|
|
9
|
+
const language = /^[0-9a-z]+(?:-[a-z][0-9a-z]*)*$/i;
|
|
12
10
|
|
|
13
11
|
export const segment: CodeBlockParser.SegmentParser = block(validate('```',
|
|
14
12
|
clear(fence(opener, 300))));
|
|
@@ -19,35 +17,55 @@ export const segment_: CodeBlockParser.SegmentParser = block(validate('```',
|
|
|
19
17
|
export const codeblock: CodeBlockParser = block(validate('```', fmap(
|
|
20
18
|
fence(opener, 300),
|
|
21
19
|
// Bug: Type mismatch between outer and inner.
|
|
22
|
-
([body, closer, opener, delim,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
([body, closer, opener, delim, param]: string[], _, context) => {
|
|
21
|
+
const params = param.match(/(?:\\.?|\S)+/g)?.reduce<{
|
|
22
|
+
lang?: string;
|
|
23
|
+
path?: string;
|
|
24
|
+
line?: string;
|
|
25
|
+
invalid?: string;
|
|
26
|
+
}>((params, value, i) => {
|
|
27
|
+
let name: string;
|
|
28
|
+
switch (true) {
|
|
29
|
+
case i === 0
|
|
30
|
+
&& value[0] === param[0]
|
|
31
|
+
&& language.test(value):
|
|
32
|
+
name = 'lang';
|
|
33
|
+
value = value.toLowerCase();
|
|
34
|
+
break;
|
|
35
|
+
case /^\d+(?:[,-]\d+)*$/.test(value):
|
|
36
|
+
name = 'line';
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
name = 'path';
|
|
40
|
+
if (!params.lang) {
|
|
41
|
+
const file = value.split('/').pop() ?? '';
|
|
42
|
+
params.lang = file && file.includes('.', 1)
|
|
43
|
+
? file.split('.').pop()?.match(language)?.[0].toLowerCase()
|
|
44
|
+
: params.lang;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
name in params
|
|
48
|
+
? params.invalid = `Duplicate ${name} value`
|
|
49
|
+
: params[name] = value;
|
|
50
|
+
return params;
|
|
51
|
+
}, {}) ?? {};
|
|
52
|
+
if (!closer || params.invalid) return [html('pre', {
|
|
29
53
|
class: 'invalid',
|
|
30
54
|
translate: 'no',
|
|
31
55
|
'data-invalid-syntax': 'codeblock',
|
|
32
56
|
'data-invalid-type': !closer ? 'fence' : 'argument',
|
|
33
|
-
'data-invalid-message': !closer ? `Missing the closing delimiter "${delim}"` :
|
|
57
|
+
'data-invalid-message': !closer ? `Missing the closing delimiter "${delim}"` : params.invalid,
|
|
34
58
|
}, `${opener}${body}${closer}`)];
|
|
35
|
-
const file = path.split('/').pop() ?? '';
|
|
36
|
-
const ext = file && file.includes('.', 1)
|
|
37
|
-
? file.split('.').pop()!
|
|
38
|
-
: '';
|
|
39
|
-
lang = language.test(lang || ext)
|
|
40
|
-
? lang || ext
|
|
41
|
-
: lang && 'invalid';
|
|
42
59
|
const el = html('pre',
|
|
43
60
|
{
|
|
44
|
-
class: lang ? `code language-${lang}` : 'text',
|
|
61
|
+
class: params.lang ? `code language-${params.lang}` : 'text',
|
|
45
62
|
translate: 'no',
|
|
46
|
-
'data-lang': lang || undefined,
|
|
47
|
-
'data-
|
|
63
|
+
'data-lang': params.lang || undefined,
|
|
64
|
+
'data-line': params.line || undefined,
|
|
65
|
+
'data-path': params.path || undefined,
|
|
48
66
|
},
|
|
49
|
-
lang
|
|
50
|
-
? context.caches?.code?.get(`${lang}\n${body.slice(0, -1)}`)?.cloneNode(true).childNodes ||
|
|
67
|
+
params.lang
|
|
68
|
+
? context.caches?.code?.get(`${params.lang ?? ''}\n${body.slice(0, -1)}`)?.cloneNode(true).childNodes ||
|
|
51
69
|
body.slice(0, -1) || undefined
|
|
52
70
|
: defrag(eval(some(autolink)(body.slice(0, -1), context), [])));
|
|
53
71
|
return [el];
|
|
@@ -14,7 +14,7 @@ describe('Unit: parser/block/extension/fig', () => {
|
|
|
14
14
|
assert.deepStrictEqual(inspect(parser('[$group-name]\n !https://host')), undefined);
|
|
15
15
|
assert.deepStrictEqual(inspect(parser('[$group-name]\n\n!https://host')), undefined);
|
|
16
16
|
assert.deepStrictEqual(inspect(parser('[$group-name]a\nhttps://host')), undefined);
|
|
17
|
-
assert.deepStrictEqual(inspect(parser('[$group-name]a\n!https://host')),
|
|
17
|
+
assert.deepStrictEqual(inspect(parser('[$group-name]a\n!https://host')), undefined);
|
|
18
18
|
assert.deepStrictEqual(inspect(parser('[$group-name] a\nhttps://host')), undefined);
|
|
19
19
|
assert.deepStrictEqual(inspect(parser('[$group-name] a\n!https://host')), [['<figure data-type="media" data-label="group-name" data-group="group" class="invalid"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div><figcaption><span class="figindex"></span></figcaption></figure>'], '']);
|
|
20
20
|
assert.deepStrictEqual(inspect(parser('$-a\n$-b')), undefined);
|
|
@@ -24,6 +24,8 @@ describe('Unit: parser/block/extension/figure', () => {
|
|
|
24
24
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]a\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group" class="invalid"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div><figcaption><span class="figindex"></span></figcaption></figure>'], '']);
|
|
25
25
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name] a\nhttps://host\n~~~')), undefined);
|
|
26
26
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name] a\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group" class="invalid"><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div><figcaption><span class="figindex"></span></figcaption></figure>'], '']);
|
|
27
|
+
assert.deepStrictEqual(inspect(parser('~~~figure a[$group-name]\n!https://host\n~~~')), undefined);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser('~~~figure a [$group-name]\n!https://host\n~~~')), undefined);
|
|
27
29
|
assert.deepStrictEqual(inspect(parser('~~~ [$group-name]\n!https://host\n~~~')), undefined);
|
|
28
30
|
assert.deepStrictEqual(inspect(parser('~~~ $group-name\n!https://host\n~~~')), undefined);
|
|
29
31
|
assert.deepStrictEqual(inspect(parser(' ~~~figure [$group-name]\n!https://host\n~~~')), undefined);
|
|
@@ -2,7 +2,7 @@ import { undefined } from 'spica/global';
|
|
|
2
2
|
import { ExtensionParser } from '../../block';
|
|
3
3
|
import { union, inits, sequence, some, block, line, rewrite, context, close, match, convert, trim, fmap } from '../../../combinator';
|
|
4
4
|
import { str, contentline, emptyline } from '../../source';
|
|
5
|
-
import { label
|
|
5
|
+
import { label } from '../../inline/extension/label';
|
|
6
6
|
import { ulist } from '../ulist';
|
|
7
7
|
import { olist } from '../olist';
|
|
8
8
|
import { table as styled_table } from '../table';
|
|
@@ -27,7 +27,7 @@ export const segment: FigureParser.SegmentParser = block(match(
|
|
|
27
27
|
([, fence], closer = new RegExp(String.raw`^${fence}[^\S\n]*(?:$|\n)`)) =>
|
|
28
28
|
close(
|
|
29
29
|
sequence([
|
|
30
|
-
|
|
30
|
+
contentline,
|
|
31
31
|
inits([
|
|
32
32
|
// All parsers which can include closing terms.
|
|
33
33
|
union([
|
|
@@ -85,10 +85,6 @@ export const figure: FigureParser = block(rewrite(segment, fmap(
|
|
|
85
85
|
|
|
86
86
|
function attributes(label: string, param: string, content: HTMLElement, caption: readonly HTMLElement[]): Record<string, string | undefined> {
|
|
87
87
|
const group = label.split('-', 1)[0];
|
|
88
|
-
const invalidLabel = /^[^-]+-(?:[0-9]+\.)*0$/.test(label);
|
|
89
|
-
const invalidParam = param.trimStart() !== '';
|
|
90
|
-
const invalidContent = group === '$' && (!content.classList.contains('math') || caption.length > 0);
|
|
91
|
-
const invalid = invalidLabel || invalidParam || invalidContent || undefined;
|
|
92
88
|
let type: string = content.className.split(/\s/)[0];
|
|
93
89
|
switch (type || content.tagName) {
|
|
94
90
|
case 'UL':
|
|
@@ -113,27 +109,28 @@ function attributes(label: string, param: string, content: HTMLElement, caption:
|
|
|
113
109
|
default:
|
|
114
110
|
assert(false);
|
|
115
111
|
}
|
|
112
|
+
const invalid =
|
|
113
|
+
/^[^-]+-(?:[0-9]+\.)*0$/.test(label) && {
|
|
114
|
+
'data-invalid-type': 'label',
|
|
115
|
+
'data-invalid-message': 'The last part of the fixed label numbers must not be 0',
|
|
116
|
+
} ||
|
|
117
|
+
param.trimStart() !== '' && {
|
|
118
|
+
'data-invalid-type': 'argument',
|
|
119
|
+
'data-invalid-message': 'Invalid argument',
|
|
120
|
+
} ||
|
|
121
|
+
group === '$' && (!content.classList.contains('math') || caption.length > 0) && {
|
|
122
|
+
'data-invalid-type': 'content',
|
|
123
|
+
'data-invalid-message': 'A figure labeled to define a formula number can contain only a math formula and no caption',
|
|
124
|
+
} ||
|
|
125
|
+
undefined;
|
|
116
126
|
return {
|
|
117
127
|
'data-type': type,
|
|
118
128
|
'data-label': label,
|
|
119
129
|
'data-group': group,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
'data-invalid-message': 'The last part of the fixed label numbers must not be 0',
|
|
126
|
-
} ||
|
|
127
|
-
invalidParam && {
|
|
128
|
-
'data-invalid-syntax': 'figure',
|
|
129
|
-
'data-invalid-type': 'argument',
|
|
130
|
-
'data-invalid-message': 'Invalid argument',
|
|
131
|
-
} ||
|
|
132
|
-
invalidContent && {
|
|
133
|
-
'data-invalid-syntax': 'figure',
|
|
134
|
-
'data-invalid-type': 'content',
|
|
135
|
-
'data-invalid-message': 'A figure labeled to define a formula number can contain only a math formula and no caption',
|
|
136
|
-
} ||
|
|
137
|
-
undefined,
|
|
130
|
+
...invalid && {
|
|
131
|
+
class: 'invalid',
|
|
132
|
+
'data-invalid-syntax': 'figure',
|
|
133
|
+
...invalid,
|
|
134
|
+
},
|
|
138
135
|
};
|
|
139
136
|
}
|
|
@@ -126,9 +126,11 @@ describe('Unit: parser/block/olist', () => {
|
|
|
126
126
|
|
|
127
127
|
it('indexer', () => {
|
|
128
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 id="index:a">a<span class="indexer" data-index=""></span></li></ol>'], '']);
|
|
129
130
|
assert.deepStrictEqual(inspect(parser('1. a [#b]')), [['<ol><li id="index:b">a<span class="indexer" data-index="b"></span></li></ol>'], '']);
|
|
130
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>'], '']);
|
|
131
132
|
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 id="index:a">a<span class="indexer" data-index=""></span><ol><li id="index:d">c<span class="indexer" data-index="d"></span></li></ol></li></ol>'], '']);
|
|
132
134
|
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>'], '']);
|
|
133
135
|
});
|
|
134
136
|
|
|
@@ -68,9 +68,11 @@ describe('Unit: parser/block/ulist', () => {
|
|
|
68
68
|
|
|
69
69
|
it('indexer', () => {
|
|
70
70
|
assert.deepStrictEqual(inspect(parser('- [#a]')), [['<ul><li><a class="index" href="#index:a">a</a></li></ul>'], '']);
|
|
71
|
+
assert.deepStrictEqual(inspect(parser('- a [#]')), [['<ul><li id="index:a">a<span class="indexer" data-index=""></span></li></ul>'], '']);
|
|
71
72
|
assert.deepStrictEqual(inspect(parser('- a [#b]')), [['<ul><li id="index:b">a<span class="indexer" data-index="b"></span></li></ul>'], '']);
|
|
72
73
|
assert.deepStrictEqual(inspect(parser('- [ ] [#a]')), [['<ul class="checklist"><li><span class="checkbox">☐</span><a class="index" href="#index:a">a</a></li></ul>'], '']);
|
|
73
74
|
assert.deepStrictEqual(inspect(parser('- [ ] a [#b]')), [['<ul class="checklist"><li id="index:b"><span class="checkbox">☐</span>a<span class="indexer" data-index="b"></span></li></ul>'], '']);
|
|
75
|
+
assert.deepStrictEqual(inspect(parser('- a [#]\n - c [#d]')), [['<ul><li id="index:a">a<span class="indexer" data-index=""></span><ul><li id="index:d">c<span class="indexer" data-index="d"></span></li></ul></li></ul>'], '']);
|
|
74
76
|
assert.deepStrictEqual(inspect(parser('- a [#b]\n - c [#d]')), [['<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>'], '']);
|
|
75
77
|
});
|
|
76
78
|
|
package/src/parser/block.ts
CHANGED
|
@@ -54,7 +54,7 @@ export const block: BlockParser = creator(error(
|
|
|
54
54
|
|
|
55
55
|
function error(parser: BlockParser): BlockParser {
|
|
56
56
|
return recover<BlockParser>(fallback(
|
|
57
|
-
open('\
|
|
57
|
+
open('\x07', source => { throw new Error(source.split('\n', 1)[0]); }),
|
|
58
58
|
parser),
|
|
59
59
|
(source, { id }, reason) => [[
|
|
60
60
|
html('h1',
|
|
@@ -71,7 +71,7 @@ function error(parser: BlockParser): BlockParser {
|
|
|
71
71
|
translate: 'no',
|
|
72
72
|
},
|
|
73
73
|
source
|
|
74
|
-
.replace(/^\
|
|
74
|
+
.replace(/^\x07.*\n/, '')
|
|
75
75
|
.slice(0, 1001)
|
|
76
76
|
.replace(/^(.{997}).{4}$/s, '$1...') || undefined),
|
|
77
77
|
], '']);
|
|
@@ -42,6 +42,7 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
42
42
|
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
43
43
|
assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
|
|
44
44
|
assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser('[#a \\ ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
45
46
|
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
46
47
|
assert.deepStrictEqual(inspect(parser('[#a <wbr>]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
47
48
|
assert.deepStrictEqual(inspect(parser('[#a [# b #]]')), [['<a class="index" href="#index:a">a <span class="comment"><input type="checkbox"><span>[# b #]</span></span></a>'], '']);
|
|
@@ -70,21 +71,26 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
70
71
|
assert.deepStrictEqual(inspect(parser('[#|]')), [['<a class="index" href="#index:|">|</a>'], '']);
|
|
71
72
|
assert.deepStrictEqual(inspect(parser('[#|#]')), [['<a class="index" href="#index:|#">|#</a>'], '']);
|
|
72
73
|
assert.deepStrictEqual(inspect(parser('[#|#b]')), [['<a class="index" href="#index:|#b">|#b</a>'], '']);
|
|
73
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
74
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
75
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
76
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
77
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
74
|
+
assert.deepStrictEqual(inspect(parser('[#a|]')), [['<a class="index" href="#index:a|">a|</a>'], '']);
|
|
75
|
+
assert.deepStrictEqual(inspect(parser('[#a|#]')), [['<a class="index" href="#index:a|#">a|#</a>'], '']);
|
|
76
|
+
assert.deepStrictEqual(inspect(parser('[#a|# ]')), [['<a class="index" href="#index:a|#">a|#</a>'], '']);
|
|
77
|
+
assert.deepStrictEqual(inspect(parser('[#a|#\\ ]')), [['<a class="index" href="#index:a|#">a|#</a>'], '']);
|
|
78
|
+
assert.deepStrictEqual(inspect(parser('[#a|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
79
|
+
assert.deepStrictEqual(inspect(parser('[#a|#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
80
|
+
assert.deepStrictEqual(inspect(parser('[#a|#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
81
|
+
assert.deepStrictEqual(inspect(parser('[#a|#\\b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
82
|
+
assert.deepStrictEqual(inspect(parser('[#a|#*b*]')), [['<a class="index" href="#index:*b*">a<span class="indexer" data-index="*b*"></span></a>'], '']);
|
|
83
|
+
assert.deepStrictEqual(inspect(parser('[#a|#b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
|
|
84
|
+
assert.deepStrictEqual(inspect(parser('[#a|#b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
|
|
85
|
+
assert.deepStrictEqual(inspect(parser('[#a|#[]]')), [['<a class="index" href="#index:[]">a<span class="indexer" data-index="[]"></span></a>'], '']);
|
|
86
|
+
assert.deepStrictEqual(inspect(parser('[#a|#©]')), [['<a class="index" href="#index:&copy;">a<span class="indexer" data-index="&copy;"></span></a>'], '']);
|
|
78
87
|
assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
79
|
-
assert.deepStrictEqual(inspect(parser('[#a |#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
80
|
-
assert.deepStrictEqual(inspect(parser('[#a |#b ]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
81
|
-
assert.deepStrictEqual(inspect(parser('[#a |#\\b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
82
|
-
assert.deepStrictEqual(inspect(parser('[#a |#*b*]')), [['<a class="index" href="#index:*b*">a<span class="indexer" data-index="*b*"></span></a>'], '']);
|
|
83
|
-
assert.deepStrictEqual(inspect(parser('[#a |#b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
|
|
84
|
-
assert.deepStrictEqual(inspect(parser('[#a |#b c]')), [['<a class="index" href="#index:b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
|
|
85
|
-
assert.deepStrictEqual(inspect(parser('[#a |#[]]')), [['<a class="index" href="#index:[]">a<span class="indexer" data-index="[]"></span></a>'], '']);
|
|
86
|
-
assert.deepStrictEqual(inspect(parser('[#a |#©]')), [['<a class="index" href="#index:&copy;">a<span class="indexer" data-index="&copy;"></span></a>'], '']);
|
|
87
88
|
assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
89
|
+
assert.deepStrictEqual(inspect(parser('[#a \\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
90
|
+
assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
91
|
+
assert.deepStrictEqual(inspect(parser('[#a <wbr>|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
92
|
+
assert.deepStrictEqual(inspect(parser('[#a [# b #]|#c]')), [['<a class="index" href="#index:c">a <span class="comment"><input type="checkbox"><span>[# b #]</span></span><span class="indexer" data-index="c"></span></a>'], '']);
|
|
93
|
+
assert.deepStrictEqual(inspect(parser('[#a\\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
88
94
|
});
|
|
89
95
|
|
|
90
96
|
});
|