securemark 0.248.1 → 0.250.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/dist/index.js +351 -284
  4. package/karma.conf.js +1 -1
  5. package/markdown.d.ts +11 -5
  6. package/package.json +12 -12
  7. package/src/parser/api/parse.test.ts +6 -6
  8. package/src/parser/block/blockquote.test.ts +2 -2
  9. package/src/parser/block/dlist.test.ts +2 -1
  10. package/src/parser/block/dlist.ts +4 -4
  11. package/src/parser/block/extension/figure.ts +3 -3
  12. package/src/parser/block/heading.test.ts +1 -0
  13. package/src/parser/block/heading.ts +4 -4
  14. package/src/parser/block/olist.ts +3 -2
  15. package/src/parser/block/paragraph.test.ts +10 -10
  16. package/src/parser/block/paragraph.ts +2 -2
  17. package/src/parser/block/reply.ts +2 -2
  18. package/src/parser/block/ulist.ts +4 -3
  19. package/src/parser/inline/annotation.test.ts +2 -2
  20. package/src/parser/inline/annotation.ts +3 -4
  21. package/src/parser/inline/comment.test.ts +44 -44
  22. package/src/parser/inline/comment.ts +3 -3
  23. package/src/parser/inline/deletion.ts +3 -3
  24. package/src/parser/inline/emphasis.test.ts +5 -4
  25. package/src/parser/inline/emphasis.ts +8 -3
  26. package/src/parser/inline/emstrong.ts +14 -6
  27. package/src/parser/inline/extension/index.test.ts +4 -4
  28. package/src/parser/inline/extension/placeholder.test.ts +4 -4
  29. package/src/parser/inline/html.test.ts +5 -2
  30. package/src/parser/inline/html.ts +10 -14
  31. package/src/parser/inline/insertion.ts +3 -3
  32. package/src/parser/inline/link.test.ts +2 -2
  33. package/src/parser/inline/link.ts +3 -4
  34. package/src/parser/inline/mark.test.ts +5 -4
  35. package/src/parser/inline/mark.ts +3 -3
  36. package/src/parser/inline/reference.test.ts +5 -5
  37. package/src/parser/inline/reference.ts +7 -9
  38. package/src/parser/inline/strong.test.ts +5 -4
  39. package/src/parser/inline/strong.ts +7 -3
  40. package/src/parser/inline.test.ts +2 -2
  41. package/src/parser/source/escapable.test.ts +4 -3
  42. package/src/parser/source/escapable.ts +3 -3
  43. package/src/parser/source/text.test.ts +4 -4
  44. package/src/parser/source/text.ts +3 -3
  45. package/src/parser/source/unescapable.test.ts +4 -3
  46. package/src/parser/source/unescapable.ts +3 -3
  47. package/src/parser/util.ts +26 -13
  48. package/src/renderer/render/media/image.ts +3 -3
  49. package/src/renderer/render/media/video.ts +2 -2
package/karma.conf.js CHANGED
@@ -12,7 +12,7 @@ module.exports = function (config) {
12
12
  { pattern: 'https://cdnjs.cloudflare.com/ajax/libs/dompurify/2.3.8/purify.js', watched: false, served: false, included: true, integrity: 'sha512-QaF+0tDlqVmwZaQSc0kImgYmw+Cd66TxA5D9X70I5V9BNSqk6yBTbyqw2VEUsVYV5OTbxw8HD9d45on1wvYv7g==' },
13
13
  { pattern: 'dist/**/*.{js,map}', watched: true, served: true, included: true },
14
14
  ],
15
- reporters: ['dots', 'coverage'],
15
+ reporters: ['dots'],
16
16
  preprocessors: {
17
17
  'dist/**/*.js': ['coverage'],
18
18
  },
package/markdown.d.ts CHANGED
@@ -736,7 +736,7 @@ export namespace MarkdownParser {
736
736
  }
737
737
  }
738
738
  export interface CommentParser extends
739
- // [# comment #]
739
+ // [% comment %]
740
740
  Inline<'comment'>,
741
741
  Parser<HTMLElement | string, Context, [
742
742
  InlineParser,
@@ -994,7 +994,6 @@ export namespace MarkdownParser {
994
994
  Inline<'html/tag'>,
995
995
  Parser<HTMLElement | string, Context, [
996
996
  InlineParser,
997
- InlineParser,
998
997
  ]> {
999
998
  }
1000
999
  export namespace TagParser {
@@ -1027,7 +1026,7 @@ export namespace MarkdownParser {
1027
1026
  Inline<'mark'>,
1028
1027
  Parser<HTMLElement | string, Context, [
1029
1028
  InlineParser,
1030
- InlineParser,
1029
+ MarkParser,
1031
1030
  ]> {
1032
1031
  }
1033
1032
  export interface EmStrongParser extends
@@ -1043,7 +1042,10 @@ export namespace MarkdownParser {
1043
1042
  Inline<'strong'>,
1044
1043
  Parser<HTMLElement | string, Context, [
1045
1044
  InlineParser,
1046
- InlineParser,
1045
+ Parser<HTMLElement | string, Context, [
1046
+ EmStrongParser,
1047
+ StrongParser,
1048
+ ]>,
1047
1049
  ]> {
1048
1050
  }
1049
1051
  export interface EmphasisParser extends
@@ -1052,7 +1054,11 @@ export namespace MarkdownParser {
1052
1054
  Parser<HTMLElement | string, Context, [
1053
1055
  StrongParser,
1054
1056
  InlineParser,
1055
- InlineParser,
1057
+ Parser<HTMLElement | string, Context, [
1058
+ EmStrongParser,
1059
+ StrongParser,
1060
+ EmphasisParser,
1061
+ ]>,
1056
1062
  ]> {
1057
1063
  }
1058
1064
  export interface CodeParser extends
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.248.1",
3
+ "version": "0.250.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",
@@ -34,11 +34,11 @@
34
34
  "@types/mocha": "9.1.1",
35
35
  "@types/power-assert": "1.5.8",
36
36
  "@types/prismjs": "1.26.0",
37
- "@typescript-eslint/parser": "^5.25.0",
37
+ "@typescript-eslint/parser": "^5.27.1",
38
38
  "babel-loader": "^8.2.5",
39
39
  "babel-plugin-unassert": "^3.2.0",
40
- "concurrently": "^7.2.0",
41
- "eslint": "^8.16.0",
40
+ "concurrently": "^7.2.1",
41
+ "eslint": "^8.17.0",
42
42
  "eslint-plugin-redos": "^4.4.0",
43
43
  "eslint-webpack-plugin": "^3.1.1",
44
44
  "glob": "^8.0.3",
@@ -49,22 +49,22 @@
49
49
  "karma-mocha": "^2.0.1",
50
50
  "karma-power-assert": "^1.0.0",
51
51
  "mocha": "^10.0.0",
52
- "npm-check-updates": "^13.0.3",
52
+ "npm-check-updates": "^13.1.2",
53
53
  "semver": "^7.3.7",
54
- "spica": "0.0.551",
54
+ "spica": "0.0.567",
55
55
  "ts-loader": "^9.3.0",
56
- "typed-dom": "^0.0.295",
57
- "typescript": "4.6.4",
58
- "webpack": "^5.72.1",
56
+ "typed-dom": "^0.0.298",
57
+ "typescript": "4.7.3",
58
+ "webpack": "^5.73.0",
59
59
  "webpack-cli": "^4.9.2",
60
60
  "webpack-merge": "^5.8.0"
61
61
  },
62
62
  "scripts": {
63
63
  "update": "ncu -u && npm i --no-shrinkwrap && bundle update",
64
- "dev": "concurrently \"webpack --env mode=test -w\" \"karma start --auto-watch --reporters dots\" \"webpack --env mode=dist -w --output-path ./gh-pages/assets/dist\" \"bundle exec jekyll serve -s ./gh-pages -d ./gh-pages/_site --incremental\"",
65
- "test": "webpack --env mode=test && karma start --single-run --concurrency 1",
64
+ "dev": "concurrently \"webpack --env mode=test -w\" \"karma start --auto-watch\" \"webpack --env mode=dist -w --output-path ./gh-pages/assets/dist\" \"bundle exec jekyll serve -s ./gh-pages -d ./gh-pages/_site --incremental\"",
65
+ "test": "webpack --env mode=test && karma start --single-run --concurrency 1 --reporters dots,coverage",
66
66
  "lint": "webpack --env mode=lint",
67
- "bench": "webpack --env mode=bench && karma start --single-run --concurrency 1 --reporters dots",
67
+ "bench": "webpack --env mode=bench && karma start --single-run --concurrency 1",
68
68
  "dist": "webpack --env mode=dist"
69
69
  },
70
70
  "author": "falsandtru",
@@ -52,11 +52,11 @@ describe('Unit: parser/api/parse', () => {
52
52
  [...parse('<wbr>\na').children].map(el => el.outerHTML),
53
53
  ['<p>&lt;wbr&gt;<br>a</p>']);
54
54
  assert.deepStrictEqual(
55
- [...parse('[#\n<wbr>\n#]').children].map(el => el.outerHTML),
56
- ['<p><span class="comment"><input type="checkbox"><span>[#<br>&lt;wbr&gt;<br>#]</span></span></p>']);
55
+ [...parse('[%\n<wbr>\n%]').children].map(el => el.outerHTML),
56
+ ['<p><span class="comment"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span></p>']);
57
57
  assert.deepStrictEqual(
58
- [...parse('[#\n<wbr>\n#]\na').children].map(el => el.outerHTML),
59
- ['<p><span class="comment"><input type="checkbox"><span>[#<br>&lt;wbr&gt;<br>#]</span></span><br>a</p>']);
58
+ [...parse('[%\n<wbr>\n%]\na').children].map(el => el.outerHTML),
59
+ ['<p><span class="comment"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span><br>a</p>']);
60
60
  });
61
61
 
62
62
  it('linebreak', () => {
@@ -220,8 +220,8 @@ describe('Unit: parser/api/parse', () => {
220
220
 
221
221
  it('creation', () => {
222
222
  assert.deepStrictEqual(
223
- [...parse('"[# '.repeat(100)).children].map(el => el.outerHTML),
224
- [`<p>${'"[# '.repeat(100).trim()}</p>`]);
223
+ [...parse('"[% '.repeat(100)).children].map(el => el.outerHTML),
224
+ [`<p>${'"[% '.repeat(100).trim()}</p>`]);
225
225
  });
226
226
 
227
227
  it('recursion', () => {
@@ -72,7 +72,7 @@ describe('Unit: parser/block/blockquote', () => {
72
72
  assert.deepStrictEqual(inspect(parser('!> a\\\nb')), [['<blockquote><section><p>a<span class="linebreak"> </span>b</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
73
73
  assert.deepStrictEqual(inspect(parser('!> *a\nb*')), [['<blockquote><section><p><em>a<br>b</em></p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
74
74
  assert.deepStrictEqual(inspect(parser('!> *a\n> b*')), [['<blockquote><section><p><em>a<br>b</em></p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
75
- assert.deepStrictEqual(inspect(parser('!> a \n b c ')), [['<blockquote><section><p>a<br> b c</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
75
+ assert.deepStrictEqual(inspect(parser('!> a \n b c ')), [['<blockquote><section><p> a<br> b c</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
76
76
  assert.deepStrictEqual(inspect(parser('!>> a')), [['<blockquote><blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote></blockquote>'], '']);
77
77
  assert.deepStrictEqual(inspect(parser('!>> a\n> b')), [['<blockquote><blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote><section><p>b</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
78
78
  assert.deepStrictEqual(inspect(parser('!> - a')), [['<blockquote><section><ul><li>a</li></ul><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
@@ -90,7 +90,7 @@ describe('Unit: parser/block/blockquote', () => {
90
90
  assert.deepStrictEqual(inspect(parser('!> \na')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
91
91
  assert.deepStrictEqual(inspect(parser('!>\n')), undefined);
92
92
  assert.deepStrictEqual(inspect(parser('!>\na')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
93
- assert.deepStrictEqual(inspect(parser('!>\n a')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
93
+ assert.deepStrictEqual(inspect(parser('!>\n a')), [['<blockquote><section><p> a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
94
94
  assert.deepStrictEqual(inspect(parser('!>\n>')), [['<blockquote><section><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
95
95
  assert.deepStrictEqual(inspect(parser('!>\n> a')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
96
96
  assert.deepStrictEqual(inspect(parser('!>> ## a\n> ## a')), [['<blockquote><blockquote><section><h2>a</h2><ol class="annotations"></ol><ol class="references"></ol></section></blockquote><section><h2>a</h2><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
@@ -33,6 +33,7 @@ describe('Unit: parser/block/dlist', () => {
33
33
  it('single', () => {
34
34
  assert.deepStrictEqual(inspect(parser('~ a')), [['<dl><dt id="index:a">a</dt><dd></dd></dl>'], '']);
35
35
  assert.deepStrictEqual(inspect(parser('~ \\')), [['<dl><dt id="index:\\">\\</dt><dd></dd></dl>'], '']);
36
+ assert.deepStrictEqual(inspect(parser('~ \\ a')), [['<dl><dt id="index:a">a</dt><dd></dd></dl>'], '']);
36
37
  assert.deepStrictEqual(inspect(parser('~ a\nb')), [['<dl><dt id="index:a">a</dt><dd>b</dd></dl>'], '']);
37
38
  assert.deepStrictEqual(inspect(parser('~ a\nb\n')), [['<dl><dt id="index:a">a</dt><dd>b</dd></dl>'], '']);
38
39
  assert.deepStrictEqual(inspect(parser('~ a\nb\nc')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd></dl>'], '']);
@@ -57,7 +58,7 @@ describe('Unit: parser/block/dlist', () => {
57
58
 
58
59
  it('multiple', () => {
59
60
  assert.deepStrictEqual(inspect(parser('~ a\n: b\n~ c\n: d')), [['<dl><dt id="index:a">a</dt><dd>b</dd><dt id="index:c">c</dt><dd>d</dd></dl>'], '']);
60
- assert.deepStrictEqual(inspect(parser('~ a\n b\nc\n d')), [['<dl><dt id="index:a">a</dt><dd>b<br>c<br> d</dd></dl>'], '']);
61
+ assert.deepStrictEqual(inspect(parser('~ a\n b\nc\n d')), [['<dl><dt id="index:a">a</dt><dd> b<br>c<br> d</dd></dl>'], '']);
61
62
  assert.deepStrictEqual(inspect(parser('~ a\n: b\nc\n: d')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd><dd>d</dd></dl>'], '']);
62
63
  assert.deepStrictEqual(inspect(parser('~ a\n: b\nc\n~ d\n: e')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd><dt id="index:d">d</dt><dd>e</dd></dl>'], '']);
63
64
  assert.deepStrictEqual(inspect(parser('~ a\n: b\n~ c\n: d\n~ e\n: f')), [['<dl><dt id="index:a">a</dt><dd>b</dd><dt id="index:c">c</dt><dd>d</dd><dt id="index:e">e</dt><dd>f</dd></dl>'], '']);
@@ -1,9 +1,9 @@
1
1
  import { DListParser } from '../block';
2
- import { union, inits, some, block, line, validate, rewrite, context, creator, open, trim, lazy, fmap } from '../../combinator';
2
+ import { union, inits, some, block, line, validate, rewrite, context, creator, open, trimEnd, lazy, fmap } from '../../combinator';
3
3
  import { inline, indexee, indexer } from '../inline';
4
4
  import { anyline } from '../source';
5
5
  import { localize } from '../locale';
6
- import { visualize } from '../util';
6
+ import { visualize, trimBlank } from '../util';
7
7
  import { html, defrag } from 'typed-dom/dom';
8
8
  import { push } from 'spica/array';
9
9
 
@@ -25,7 +25,7 @@ export const dlist: DListParser = lazy(() => block(localize(fmap(validate(
25
25
 
26
26
  const term: DListParser.TermParser = creator(line(indexee(fmap(open(
27
27
  /^~[^\S\n]+(?=\S)/,
28
- trim(visualize(some(union([indexer, inline])))),
28
+ visualize(trimBlank(some(union([indexer, inline])))),
29
29
  true),
30
30
  ns => [html('dt', defrag(ns))]))));
31
31
 
@@ -33,7 +33,7 @@ const desc: DListParser.DescriptionParser = creator(block(fmap(open(
33
33
  /^:[^\S\n]+(?=\S)|/,
34
34
  rewrite(
35
35
  some(anyline, /^[~:][^\S\n]+\S/),
36
- trim(visualize(some(union([inline]))))),
36
+ visualize(trimEnd(some(union([inline]))))),
37
37
  true),
38
38
  ns => [html('dd', defrag(ns))]),
39
39
  false));
@@ -1,6 +1,6 @@
1
1
  import { undefined } from 'spica/global';
2
2
  import { ExtensionParser } from '../../block';
3
- import { union, inits, sequence, some, block, line, fence, rewrite, context, close, match, convert, trim, fallback, fmap } from '../../../combinator';
3
+ import { union, inits, sequence, some, block, line, fence, rewrite, context, close, match, convert, trimEnd, fallback, fmap } from '../../../combinator';
4
4
  import { str, contentline, emptyline } from '../../source';
5
5
  import { label, segment as seg_label } from '../../inline/extension/label';
6
6
  import { ulist } from '../ulist';
@@ -15,7 +15,7 @@ import { blockquote, segment as seg_blockquote } from '../blockquote';
15
15
  import { placeholder, segment_ as seg_placeholder } from './placeholder';
16
16
  import { inline, media, shortmedia } from '../../inline';
17
17
  import { localize } from '../../locale';
18
- import { visualize } from '../../util';
18
+ import { visualize, trimBlank } from '../../util';
19
19
  import { html, defrag } from 'typed-dom/dom';
20
20
  import { memoize } from 'spica/memoize';
21
21
  import { unshift } from 'spica/array';
@@ -70,7 +70,7 @@ export const figure: FigureParser = block(fallback(rewrite(segment, fmap(
70
70
  emptyline,
71
71
  block(localize(
72
72
  context({ syntax: { inline: { media: false } } },
73
- trim(visualize(some(inline)))))),
73
+ visualize(trimBlank(trimEnd(some(inline))))))),
74
74
  ]),
75
75
  ])),
76
76
  ([label, param, content, ...caption]: [HTMLAnchorElement, string, ...HTMLElement[]]) => [
@@ -40,6 +40,7 @@ describe('Unit: parser/block/heading', () => {
40
40
  assert.deepStrictEqual(inspect(parser('# a\\')), [['<h1 id="index:a">a</h1>'], '']);
41
41
  assert.deepStrictEqual(inspect(parser('# a\\\n')), [['<h1 id="index:a">a</h1>'], '']);
42
42
  assert.deepStrictEqual(inspect(parser('# \\')), [['<h1 id="index:\\">\\</h1>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('# \\ a')), [['<h1 id="index:a">a</h1>'], '']);
43
44
  assert.deepStrictEqual(inspect(parser('## \\')), [['<h2 id="index:\\">\\</h2>'], '']);
44
45
  assert.deepStrictEqual(inspect(parser('# @a')), [['<h1 id="index:@a">@a</h1>'], '']);
45
46
  assert.deepStrictEqual(inspect(parser('## @a')), [['<h2 id="index:@a"><a href="/@a" class="account">@a</a></h2>'], '']);
@@ -1,8 +1,8 @@
1
1
  import { HeadingParser } from '../block';
2
- import { union, some, block, line, validate, focus, rewrite, context, open, trim, fmap } from '../../combinator';
2
+ import { union, some, block, line, validate, focus, rewrite, context, open, fmap } from '../../combinator';
3
3
  import { inline, indexee, indexer } from '../inline';
4
4
  import { str } from '../source';
5
- import { visualize } from '../util';
5
+ import { visualize, trimBlank } from '../util';
6
6
  import { html, defrag } from 'typed-dom/dom';
7
7
 
8
8
  export const segment: HeadingParser.SegmentParser = block(validate('#', focus(
@@ -21,13 +21,13 @@ export const heading: HeadingParser = block(rewrite(segment,
21
21
  line(indexee(fmap(union([
22
22
  open(
23
23
  str(/^##+/),
24
- trim(visualize(some(union([indexer, inline])))), true),
24
+ visualize(trimBlank(some(union([indexer, inline])))), true),
25
25
  open(
26
26
  str('#'),
27
27
  context({ syntax: { inline: {
28
28
  autolink: false,
29
29
  }}},
30
- trim(visualize(some(union([indexer, inline]))))), true),
30
+ visualize(trimBlank(some(union([indexer, inline]))))), true),
31
31
  ]),
32
32
  ([h, ...ns]: [string, ...(HTMLElement | string)[]]) => [
33
33
  h.length <= 6
@@ -1,10 +1,11 @@
1
1
  import { undefined } from 'spica/global';
2
2
  import { OListParser } from '../block';
3
- import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, match, trim, trimStart, fallback, lazy, fmap } from '../../combinator';
3
+ import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, match, trim, fallback, lazy, fmap } from '../../combinator';
4
4
  import { checkbox, ulist_, fillFirstLine } from './ulist';
5
5
  import { ilist_ } from './ilist';
6
6
  import { inline, indexee, indexer } from '../inline';
7
7
  import { contentline } from '../source';
8
+ import { trimBlank } from '../util';
8
9
  import { html, define, defrag } from 'typed-dom/dom';
9
10
  import { memoize } from 'spica/memoize';
10
11
  import { shift } from 'spica/array';
@@ -35,7 +36,7 @@ const list = (type: string, form: string): OListParser.ListParser => fmap(
35
36
  some(creator(union([
36
37
  indexee(fmap(fallback(
37
38
  inits([
38
- line(open(heads[form], trim(subsequence([checkbox, trimStart(some(union([indexer, inline])))])), true)),
39
+ line(open(heads[form], trim(subsequence([checkbox, trimBlank(some(union([indexer, inline])))])), true)),
39
40
  indent(union([ulist_, olist_, ilist_])),
40
41
  ]),
41
42
  invalid),
@@ -33,7 +33,7 @@ describe('Unit: parser/block/paragraph', () => {
33
33
  assert.deepStrictEqual(inspect(parser('***a*b\n<wbr>**\nc')), [['<p>**<em>a</em>b<br><wbr>**<br>c</p>'], '']);
34
34
  assert.deepStrictEqual(inspect(parser('***a**b\n<wbr>*\nc')), [['<p>*<strong>a</strong>b<br><wbr>*<br>c</p>'], '']);
35
35
  assert.deepStrictEqual(inspect(parser('==a\n<wbr>==\nb')), [['<p>==a<br><wbr>==<br>b</p>'], '']);
36
- assert.deepStrictEqual(inspect(parser(' a')), [['<p>a</p>'], '']);
36
+ assert.deepStrictEqual(inspect(parser(' a')), [['<p> a</p>'], '']);
37
37
  });
38
38
 
39
39
  it('anchor', () => {
@@ -50,18 +50,18 @@ describe('Unit: parser/block/paragraph', () => {
50
50
  assert.deepStrictEqual(inspect(parser('a\n>>1')), [['<p>a<br><a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
51
51
  assert.deepStrictEqual(inspect(parser('a\n>>1\nb')), [['<p>a<br><a href="?at=1" class="anchor">&gt;&gt;1</a><br>b</p>'], '']);
52
52
  assert.deepStrictEqual(inspect(parser('a\n>> b\nc')), [['<p>a<br>&gt;&gt; b<br>c</p>'], '']);
53
- assert.deepStrictEqual(inspect(parser(' >>1')), [['<p><a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
54
- assert.deepStrictEqual(inspect(parser(' >>>1')), [['<p>&gt;<a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
53
+ assert.deepStrictEqual(inspect(parser(' >>1')), [['<p> <a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
54
+ assert.deepStrictEqual(inspect(parser(' >>>1')), [['<p> &gt;<a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
55
55
  });
56
56
 
57
57
  it('comment', () => {
58
- assert.deepStrictEqual(inspect(parser('[# a #]')), [['<p><span class="comment"><input type="checkbox"><span>[# a #]</span></span></p>'], '']);
59
- assert.deepStrictEqual(inspect(parser('[# a #]b')), [['<p><span class="comment"><input type="checkbox"><span>[# a #]</span></span>b</p>'], '']);
60
- assert.deepStrictEqual(inspect(parser('[# a #]\nb')), [['<p><span class="comment"><input type="checkbox"><span>[# a #]</span></span><br>b</p>'], '']);
61
- assert.deepStrictEqual(inspect(parser('[## a ##]')), [['<p><span class="comment"><input type="checkbox"><span>[## a ##]</span></span></p>'], '']);
62
- assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]')), [['<p><span class="comment"><input type="checkbox"><span>[#<br>&lt;wbr&gt;<br>#]</span></span></p>'], '']);
63
- assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]a')), [['<p><span class="comment"><input type="checkbox"><span>[#<br>&lt;wbr&gt;<br>#]</span></span>a</p>'], '']);
64
- assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]\na')), [['<p><span class="comment"><input type="checkbox"><span>[#<br>&lt;wbr&gt;<br>#]</span></span><br>a</p>'], '']);
58
+ assert.deepStrictEqual(inspect(parser('[% a %]')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span></p>'], '']);
59
+ assert.deepStrictEqual(inspect(parser('[% a %]b')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span>b</p>'], '']);
60
+ assert.deepStrictEqual(inspect(parser('[% a %]\nb')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span><br>b</p>'], '']);
61
+ assert.deepStrictEqual(inspect(parser('[%% a %%]')), [['<p><span class="comment"><input type="checkbox"><span>[%% a %%]</span></span></p>'], '']);
62
+ assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]')), [['<p><span class="comment"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span></p>'], '']);
63
+ assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]a')), [['<p><span class="comment"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span>a</p>'], '']);
64
+ assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]\na')), [['<p><span class="comment"><input type="checkbox"><span>[%<br>&lt;wbr&gt;<br>%]</span></span><br>a</p>'], '']);
65
65
  });
66
66
 
67
67
  it('template', () => {
@@ -1,10 +1,10 @@
1
1
  import { ParagraphParser } from '../block';
2
- import { union, some, block, trim, fmap } from '../../combinator';
2
+ import { union, some, block, trimEnd, fmap } from '../../combinator';
3
3
  import { inline } from '../inline';
4
4
  import { localize } from '../locale';
5
5
  import { visualize } from '../util';
6
6
  import { html, defrag } from 'typed-dom/dom';
7
7
 
8
8
  export const paragraph: ParagraphParser = block(localize(fmap(
9
- trim(visualize(some(union([inline])))),
9
+ visualize(trimEnd(some(union([inline])))),
10
10
  ns => [html('p', defrag(ns))])));
@@ -1,5 +1,5 @@
1
1
  import { ReplyParser } from '../block';
2
- import { inits, subsequence, some, block, validate, rewrite, trim, fmap } from '../../combinator';
2
+ import { inits, subsequence, some, block, validate, rewrite, trimEnd, fmap } from '../../combinator';
3
3
  import { cite } from './reply/cite';
4
4
  import { quote, syntax as delimiter } from './reply/quote';
5
5
  import { inline } from '../inline';
@@ -26,7 +26,7 @@ export const reply: ReplyParser = block(validate('>', localize(fmap(
26
26
  some(quote),
27
27
  fmap(rewrite(
28
28
  some(anyline, delimiter),
29
- trim(visualize(some(inline)))),
29
+ visualize(trimEnd(some(inline)))),
30
30
  ns => push(ns, [html('br')])),
31
31
  ])),
32
32
  ]),
@@ -1,11 +1,12 @@
1
1
  import { UListParser } from '../block';
2
- import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, trim, trimStart, fallback, lazy, fmap } from '../../combinator';
2
+ import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, trim, fallback, lazy, fmap } from '../../combinator';
3
3
  import { olist_ } from './olist';
4
4
  import { ilist_ } from './ilist';
5
5
  import { inline, indexer, indexee } from '../inline';
6
+ import { contentline } from '../source';
7
+ import { trimBlank } from '../util';
6
8
  import { html, defrag } from 'typed-dom/dom';
7
9
  import { unshift } from 'spica/array';
8
- import { contentline } from '../source';
9
10
 
10
11
  export const ulist: UListParser = lazy(() => block(validate(
11
12
  /^-(?=[^\S\n]|\n[^\S\n]*\S)/,
@@ -17,7 +18,7 @@ export const ulist_: UListParser = lazy(() => block(fmap(validate(
17
18
  some(creator(union([
18
19
  indexee(fmap(fallback(
19
20
  inits([
20
- line(open(/^-(?:$|\s)/, trim(subsequence([checkbox, trimStart(some(union([indexer, inline])))])), true)),
21
+ line(open(/^-(?:$|\s)/, trim(subsequence([checkbox, trimBlank(some(union([indexer, inline])))])), true)),
21
22
  indent(union([ulist_, olist_, ilist_])),
22
23
  ]),
23
24
  invalid),
@@ -16,9 +16,7 @@ describe('Unit: parser/inline/annotation', () => {
16
16
  assert.deepStrictEqual(inspect(parser('(( ))')), undefined);
17
17
  assert.deepStrictEqual(inspect(parser('((\n))')), undefined);
18
18
  assert.deepStrictEqual(inspect(parser('((\na))')), undefined);
19
- assert.deepStrictEqual(inspect(parser('((\\ a))')), undefined);
20
19
  assert.deepStrictEqual(inspect(parser('((\\\na))')), undefined);
21
- assert.deepStrictEqual(inspect(parser('((<wbr>a))')), undefined);
22
20
  assert.deepStrictEqual(inspect(parser('((a\n))')), undefined);
23
21
  assert.deepStrictEqual(inspect(parser('((a\\\n))')), undefined);
24
22
  assert.deepStrictEqual(inspect(parser('((a\nb))')), undefined);
@@ -33,6 +31,8 @@ describe('Unit: parser/inline/annotation', () => {
33
31
  it('basic', () => {
34
32
  assert.deepStrictEqual(inspect(parser('(( a))')), [['<sup class="annotation">a</sup>'], '']);
35
33
  assert.deepStrictEqual(inspect(parser('(( a ))')), [['<sup class="annotation">a</sup>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('((\\ a))')), [['<sup class="annotation">a</sup>'], '']);
35
+ assert.deepStrictEqual(inspect(parser('((<wbr>a))')), [['<sup class="annotation">a</sup>'], '']);
36
36
  assert.deepStrictEqual(inspect(parser('((a))')), [['<sup class="annotation">a</sup>'], '']);
37
37
  assert.deepStrictEqual(inspect(parser('((a ))')), [['<sup class="annotation">a</sup>'], '']);
38
38
  assert.deepStrictEqual(inspect(parser('((a ))')), [['<sup class="annotation">a</sup>'], '']);
@@ -2,13 +2,12 @@ import { undefined } from 'spica/global';
2
2
  import { AnnotationParser } from '../inline';
3
3
  import { union, some, validate, guard, context, creator, surround, lazy, fmap } from '../../combinator';
4
4
  import { inline } from '../inline';
5
- import { startLoose, trimSpaceStart, trimNodeEnd } from '../util';
5
+ import { trimBlank } from '../util';
6
6
  import { html, defrag } from 'typed-dom/dom';
7
7
 
8
8
  export const annotation: AnnotationParser = lazy(() => creator(validate('((', '))', '\n', fmap(surround(
9
9
  '((',
10
10
  guard(context => context.syntax?.inline?.annotation ?? true,
11
- startLoose(
12
11
  context({ syntax: { inline: {
13
12
  annotation: false,
14
13
  // Redundant
@@ -20,6 +19,6 @@ export const annotation: AnnotationParser = lazy(() => creator(validate('((', ')
20
19
  //link: true,
21
20
  //autolink: true,
22
21
  }}, delimiters: undefined },
23
- trimSpaceStart(union([some(inline, ')', /^\\?\n/)]))))),
22
+ trimBlank(some(union([inline]), ')', /^\\?\n/)))),
24
23
  '))'),
25
- ns => [html('sup', { class: 'annotation' }, trimNodeEnd(defrag(ns)))]))));
24
+ ns => [html('sup', { class: 'annotation' }, defrag(ns))]))));
@@ -9,53 +9,53 @@ describe('Unit: parser/inline/comment', () => {
9
9
  it('invalid', () => {
10
10
  assert.deepStrictEqual(inspect(parser('')), undefined);
11
11
  assert.deepStrictEqual(inspect(parser('<')), undefined);
12
- assert.deepStrictEqual(inspect(parser('[#')), undefined);
13
- assert.deepStrictEqual(inspect(parser('[#[#')), undefined);
14
- assert.deepStrictEqual(inspect(parser('[#a#]')), undefined);
15
- assert.deepStrictEqual(inspect(parser('[#a b#]')), undefined);
16
- assert.deepStrictEqual(inspect(parser('[# ')), [['[#'], '']);
17
- assert.deepStrictEqual(inspect(parser('[# \n a')), [['[#', '<br>', ' ', 'a'], '']);
18
- assert.deepStrictEqual(inspect(parser('[##]')), undefined);
19
- assert.deepStrictEqual(inspect(parser('[# [#')), [['[#', ' ', '[', '#'], '']);
20
- assert.deepStrictEqual(inspect(parser('[# [# ')), [['[#', ' ', '[#'], '']);
21
- assert.deepStrictEqual(inspect(parser('[# [# a')), [['[#', ' ', '[#', ' ', 'a'], '']);
22
- assert.deepStrictEqual(inspect(parser('[# [# a #]')), [['[#', ' ', '<span class="comment"><input type="checkbox"><span>[# a #]</span></span>'], '']);
23
- assert.deepStrictEqual(inspect(parser('[# a[#')), [['[#', ' ', 'a', '[', '#'], '']);
24
- assert.deepStrictEqual(inspect(parser('[# a [#')), [['[#', ' ', 'a', ' ', '[', '#'], '']);
25
- assert.deepStrictEqual(inspect(parser('[# a [# ')), [['[#', ' ', 'a', ' ', '[#'], '']);
26
- assert.deepStrictEqual(inspect(parser('[# a [# b')), [['[#', ' ', 'a', ' ', '[#', ' ', 'b'], '']);
27
- assert.deepStrictEqual(inspect(parser('[# a [## b')), [['[#', ' ', 'a', ' ', '[##', ' ', 'b'], '']);
28
- assert.deepStrictEqual(inspect(parser('[## a [# b')), [['[##', ' ', 'a', ' ', '[#', ' ', 'b'], '']);
29
- assert.deepStrictEqual(inspect(parser('[#\\ a #]')), undefined);
30
- assert.deepStrictEqual(inspect(parser('[# a\\ #]')), [['[#', ' ', 'a', ' ', '#', ']'], '']);
31
- assert.deepStrictEqual(inspect(parser('[# a#]')), [['[#', ' ', 'a#', ']'], '']);
32
- assert.deepStrictEqual(inspect(parser('[# a ##]')), [['[#', ' ', 'a', ' ', '##', ']'], '']);
33
- assert.deepStrictEqual(inspect(parser('[# [## #]')), [['[#', ' ', '[##', ' ', '#', ']'], '']);
34
- assert.deepStrictEqual(inspect(parser('[## [# ##]')), [['[##', ' ', '[#', ' ', '##', ']'], '']);
35
- assert.deepStrictEqual(inspect(parser('[## a #]')), [['[##', ' ', 'a', ' ', '#', ']'], '']);
36
- assert.deepStrictEqual(inspect(parser(' [# a #]')), undefined);
12
+ assert.deepStrictEqual(inspect(parser('[%')), undefined);
13
+ assert.deepStrictEqual(inspect(parser('[%[%')), undefined);
14
+ assert.deepStrictEqual(inspect(parser('[%a%]')), undefined);
15
+ assert.deepStrictEqual(inspect(parser('[%a b%]')), undefined);
16
+ assert.deepStrictEqual(inspect(parser('[% ')), [['[%'], '']);
17
+ assert.deepStrictEqual(inspect(parser('[% \n a')), [['[%', '<br>', ' ', 'a'], '']);
18
+ assert.deepStrictEqual(inspect(parser('[%%]')), undefined);
19
+ assert.deepStrictEqual(inspect(parser('[% [%')), [['[%', ' ', '[', '%'], '']);
20
+ assert.deepStrictEqual(inspect(parser('[% [% ')), [['[%', ' ', '[%'], '']);
21
+ assert.deepStrictEqual(inspect(parser('[% [% a')), [['[%', ' ', '[%', ' ', 'a'], '']);
22
+ assert.deepStrictEqual(inspect(parser('[% [% a %]')), [['[%', ' ', '<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], '']);
23
+ assert.deepStrictEqual(inspect(parser('[% a[%')), [['[%', ' ', 'a', '[', '%'], '']);
24
+ assert.deepStrictEqual(inspect(parser('[% a [%')), [['[%', ' ', 'a', ' ', '[', '%'], '']);
25
+ assert.deepStrictEqual(inspect(parser('[% a [% ')), [['[%', ' ', 'a', ' ', '[%'], '']);
26
+ assert.deepStrictEqual(inspect(parser('[% a [% b')), [['[%', ' ', 'a', ' ', '[%', ' ', 'b'], '']);
27
+ assert.deepStrictEqual(inspect(parser('[% a [%% b')), [['[%', ' ', 'a', ' ', '[%%', ' ', 'b'], '']);
28
+ assert.deepStrictEqual(inspect(parser('[%% a [% b')), [['[%%', ' ', 'a', ' ', '[%', ' ', 'b'], '']);
29
+ assert.deepStrictEqual(inspect(parser('[%\\ a %]')), undefined);
30
+ assert.deepStrictEqual(inspect(parser('[% a\\ %]')), [['[%', ' ', 'a', ' ', '%', ']'], '']);
31
+ assert.deepStrictEqual(inspect(parser('[% a%]')), [['[%', ' ', 'a', '%', ']'], '']);
32
+ assert.deepStrictEqual(inspect(parser('[% a %%]')), [['[%', ' ', 'a', ' ', '%', '%', ']'], '']);
33
+ assert.deepStrictEqual(inspect(parser('[% [%% %]')), [['[%', ' ', '[%%', ' ', '%', ']'], '']);
34
+ assert.deepStrictEqual(inspect(parser('[%% [% %%]')), [['[%%', ' ', '[%', ' ', '%', '%', ']'], '']);
35
+ assert.deepStrictEqual(inspect(parser('[%% a %]')), [['[%%', ' ', 'a', ' ', '%', ']'], '']);
36
+ assert.deepStrictEqual(inspect(parser(' [% a %]')), undefined);
37
37
  });
38
38
 
39
39
  it('basic', () => {
40
- assert.deepStrictEqual(inspect(parser('[# #]')), [['<span class="comment"><input type="checkbox"><span>[# #]</span></span>'], '']);
41
- assert.deepStrictEqual(inspect(parser('[# #]')), [['<span class="comment"><input type="checkbox"><span>[# #]</span></span>'], '']);
42
- assert.deepStrictEqual(inspect(parser('[# #]')), [['<span class="comment"><input type="checkbox"><span>[# #]</span></span>'], '']);
43
- assert.deepStrictEqual(inspect(parser('[# a #]')), [['<span class="comment"><input type="checkbox"><span>[# a #]</span></span>'], '']);
44
- assert.deepStrictEqual(inspect(parser('[# a b #]')), [['<span class="comment"><input type="checkbox"><span>[# a b #]</span></span>'], '']);
45
- assert.deepStrictEqual(inspect(parser('[# a\nb #]')), [['<span class="comment"><input type="checkbox"><span>[# a<br>b #]</span></span>'], '']);
46
- assert.deepStrictEqual(inspect(parser('[# a #] #]')), [['<span class="comment"><input type="checkbox"><span>[# a #]</span></span>'], ' #]']);
47
- assert.deepStrictEqual(inspect(parser('[# ##] #]')), [['<span class="comment"><input type="checkbox"><span>[# ##] #]</span></span>'], '']);
48
- assert.deepStrictEqual(inspect(parser('[# [# a #] #]')), [['<span class="comment"><input type="checkbox"><span>[# <span class="comment"><input type="checkbox"><span>[# a #]</span></span> #]</span></span>'], '']);
49
- assert.deepStrictEqual(inspect(parser('[# [## a ##] #]')), [['<span class="comment"><input type="checkbox"><span>[# <span class="comment"><input type="checkbox"><span>[## a ##]</span></span> #]</span></span>'], '']);
50
- assert.deepStrictEqual(inspect(parser('[## a ##]')), [['<span class="comment"><input type="checkbox"><span>[## a ##]</span></span>'], '']);
51
- assert.deepStrictEqual(inspect(parser('[## #] ##]')), [['<span class="comment"><input type="checkbox"><span>[## #] ##]</span></span>'], '']);
52
- assert.deepStrictEqual(inspect(parser('[## [# a #] ##]')), [['<span class="comment"><input type="checkbox"><span>[## <span class="comment"><input type="checkbox"><span>[# a #]</span></span> ##]</span></span>'], '']);
53
- assert.deepStrictEqual(inspect(parser('[# a #]b')), [['<span class="comment"><input type="checkbox"><span>[# a #]</span></span>'], 'b']);
54
- assert.deepStrictEqual(inspect(parser('[#\na\n#]')), [['<span class="comment"><input type="checkbox"><span>[#<br>a<br>#]</span></span>'], '']);
55
- assert.deepStrictEqual(inspect(parser('[# &a; #]')), [['<span class="comment"><input type="checkbox"><span>[# <span class="invalid">&amp;a;</span> #]</span></span>'], '']);
56
- assert.deepStrictEqual(inspect(parser('[# &copy; #]')), [['<span class="comment"><input type="checkbox"><span>[# © #]</span></span>'], '']);
57
- assert.deepStrictEqual(inspect(parser('[# &amp;copy; #]')), [['<span class="comment"><input type="checkbox"><span>[# &amp;copy; #]</span></span>'], '']);
58
- assert.deepStrictEqual(inspect(parser('[# \\ a #]')), [['<span class="comment"><input type="checkbox"><span>[# a #]</span></span>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('[% %]')), [['<span class="comment"><input type="checkbox"><span>[% %]</span></span>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('[% %]')), [['<span class="comment"><input type="checkbox"><span>[% %]</span></span>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('[% %]')), [['<span class="comment"><input type="checkbox"><span>[% %]</span></span>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('[% a %]')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], '']);
44
+ assert.deepStrictEqual(inspect(parser('[% a b %]')), [['<span class="comment"><input type="checkbox"><span>[% a b %]</span></span>'], '']);
45
+ assert.deepStrictEqual(inspect(parser('[% a\nb %]')), [['<span class="comment"><input type="checkbox"><span>[% a<br>b %]</span></span>'], '']);
46
+ assert.deepStrictEqual(inspect(parser('[% a %] %]')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], ' %]']);
47
+ assert.deepStrictEqual(inspect(parser('[% %%] %]')), [['<span class="comment"><input type="checkbox"><span>[% %%] %]</span></span>'], '']);
48
+ assert.deepStrictEqual(inspect(parser('[% [% a %] %]')), [['<span class="comment"><input type="checkbox"><span>[% <span class="comment"><input type="checkbox"><span>[% a %]</span></span> %]</span></span>'], '']);
49
+ assert.deepStrictEqual(inspect(parser('[% [%% a %%] %]')), [['<span class="comment"><input type="checkbox"><span>[% <span class="comment"><input type="checkbox"><span>[%% a %%]</span></span> %]</span></span>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('[%% a %%]')), [['<span class="comment"><input type="checkbox"><span>[%% a %%]</span></span>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('[%% %] %%]')), [['<span class="comment"><input type="checkbox"><span>[%% %] %%]</span></span>'], '']);
52
+ assert.deepStrictEqual(inspect(parser('[%% [% a %] %%]')), [['<span class="comment"><input type="checkbox"><span>[%% <span class="comment"><input type="checkbox"><span>[% a %]</span></span> %%]</span></span>'], '']);
53
+ assert.deepStrictEqual(inspect(parser('[% a %]b')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], 'b']);
54
+ assert.deepStrictEqual(inspect(parser('[%\na\n%]')), [['<span class="comment"><input type="checkbox"><span>[%<br>a<br>%]</span></span>'], '']);
55
+ assert.deepStrictEqual(inspect(parser('[% &a; %]')), [['<span class="comment"><input type="checkbox"><span>[% <span class="invalid">&amp;a;</span> %]</span></span>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('[% &copy; %]')), [['<span class="comment"><input type="checkbox"><span>[% © %]</span></span>'], '']);
57
+ assert.deepStrictEqual(inspect(parser('[% &amp;copy; %]')), [['<span class="comment"><input type="checkbox"><span>[% &amp;copy; %]</span></span>'], '']);
58
+ assert.deepStrictEqual(inspect(parser('[% \\ a %]')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], '']);
59
59
  });
60
60
 
61
61
  });
@@ -6,13 +6,13 @@ import { html, defrag } from 'typed-dom/dom';
6
6
  import { memoize } from 'spica/memoize';
7
7
  import { unshift, push } from 'spica/array';
8
8
 
9
- export const comment: CommentParser = lazy(() => creator(validate('[#', match(
10
- /^(?=\[(#+)\s)/,
9
+ export const comment: CommentParser = lazy(() => creator(validate('[%', match(
10
+ /^(?=\[(%+)\s)/,
11
11
  memoize(
12
12
  ([, fence]) =>
13
13
  surround(
14
14
  open(str(`[${fence}`), some(text, new RegExp(String.raw`^\s+${fence}\]|^\S`)), true),
15
- union([some(inline, new RegExp(String.raw`^\s+${fence}\]`))]),
15
+ some(union([inline]), new RegExp(String.raw`^\s+${fence}\]`)),
16
16
  close(some(text, /^\S/), str(`${fence}]`)), true,
17
17
  ([as, bs = [], cs], rest) => [[
18
18
  html('span', { class: 'comment' }, [