securemark 0.240.2 → 0.243.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 (98) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/securemark.js +1082 -2461
  3. package/global.dev.d.ts +6 -2
  4. package/index.d.ts +0 -1
  5. package/markdown.d.ts +61 -32
  6. package/package-lock.json +169 -77
  7. package/package.json +5 -4
  8. package/src/combinator/control/manipulation/fallback.ts +0 -1
  9. package/src/combinator/control/manipulation/indent.test.ts +3 -1
  10. package/src/combinator/control/manipulation/indent.ts +7 -6
  11. package/src/debug.test.ts +1 -1
  12. package/src/parser/api/bind.test.ts +1 -1
  13. package/src/parser/api/parse.test.ts +1 -1
  14. package/src/parser/api/parse.ts +1 -1
  15. package/src/parser/block/blockquote.test.ts +4 -4
  16. package/src/parser/block/blockquote.ts +2 -8
  17. package/src/parser/block/codeblock.test.ts +27 -27
  18. package/src/parser/block/codeblock.ts +2 -2
  19. package/src/parser/block/dlist.ts +1 -1
  20. package/src/parser/block/extension/aside.ts +1 -1
  21. package/src/parser/block/extension/example.ts +1 -1
  22. package/src/parser/block/extension/fig.test.ts +3 -3
  23. package/src/parser/block/extension/fig.ts +7 -6
  24. package/src/parser/block/extension/figbase.ts +1 -1
  25. package/src/parser/block/extension/figure.test.ts +10 -10
  26. package/src/parser/block/extension/figure.ts +16 -6
  27. package/src/parser/block/extension/message.test.ts +7 -7
  28. package/src/parser/block/extension/message.ts +6 -2
  29. package/src/parser/block/extension/placeholder.ts +9 -3
  30. package/src/parser/block/extension/table.test.ts +1 -1
  31. package/src/parser/block/extension/table.ts +1 -1
  32. package/src/parser/block/heading.ts +1 -1
  33. package/src/parser/block/horizontalrule.ts +1 -1
  34. package/src/parser/block/ilist.ts +1 -1
  35. package/src/parser/block/indentblock.test.ts +30 -0
  36. package/src/parser/block/indentblock.ts +13 -0
  37. package/src/parser/block/mathblock.ts +1 -1
  38. package/src/parser/block/olist.ts +6 -6
  39. package/src/parser/block/paragraph.ts +1 -1
  40. package/src/parser/block/reply/cite.ts +1 -1
  41. package/src/parser/block/reply/quote.ts +1 -1
  42. package/src/parser/block/reply.ts +1 -1
  43. package/src/parser/block/sidefence.test.ts +66 -0
  44. package/src/parser/block/sidefence.ts +31 -0
  45. package/src/parser/block/table.ts +1 -1
  46. package/src/parser/block/ulist.ts +1 -1
  47. package/src/parser/block.ts +8 -2
  48. package/src/parser/header.ts +1 -1
  49. package/src/parser/inline/annotation.ts +1 -1
  50. package/src/parser/inline/autolink/account.ts +1 -1
  51. package/src/parser/inline/autolink/anchor.ts +1 -1
  52. package/src/parser/inline/autolink/channel.ts +1 -1
  53. package/src/parser/inline/autolink/email.ts +1 -1
  54. package/src/parser/inline/autolink/hashnum.ts +1 -1
  55. package/src/parser/inline/autolink/hashtag.ts +1 -1
  56. package/src/parser/inline/bracket.ts +1 -1
  57. package/src/parser/inline/code.ts +1 -1
  58. package/src/parser/inline/comment.ts +1 -1
  59. package/src/parser/inline/deletion.ts +1 -1
  60. package/src/parser/inline/emphasis.ts +1 -1
  61. package/src/parser/inline/emstrong.ts +1 -1
  62. package/src/parser/inline/extension/index.ts +1 -1
  63. package/src/parser/inline/extension/indexee.ts +1 -1
  64. package/src/parser/inline/extension/indexer.ts +1 -1
  65. package/src/parser/inline/extension/label.ts +1 -1
  66. package/src/parser/inline/extension/placeholder.ts +3 -3
  67. package/src/parser/inline/html.ts +1 -1
  68. package/src/parser/inline/htmlentity.ts +1 -1
  69. package/src/parser/inline/insertion.ts +1 -1
  70. package/src/parser/inline/link.ts +1 -1
  71. package/src/parser/inline/mark.ts +1 -1
  72. package/src/parser/inline/math.ts +1 -1
  73. package/src/parser/inline/media.ts +1 -1
  74. package/src/parser/inline/reference.ts +1 -1
  75. package/src/parser/inline/ruby.ts +1 -1
  76. package/src/parser/inline/strong.ts +1 -1
  77. package/src/parser/inline/template.ts +1 -1
  78. package/src/parser/locale.ts +1 -1
  79. package/src/parser/processor/figure.test.ts +1 -1
  80. package/src/parser/processor/figure.ts +4 -4
  81. package/src/parser/processor/footnote.test.ts +1 -1
  82. package/src/parser/processor/footnote.ts +6 -5
  83. package/src/parser/source/text.ts +1 -1
  84. package/src/renderer/render/math.ts +1 -1
  85. package/src/renderer/render/media/audio.ts +1 -1
  86. package/src/renderer/render/media/image.ts +1 -1
  87. package/src/renderer/render/media/pdf.ts +1 -1
  88. package/src/renderer/render/media/twitter.ts +21 -23
  89. package/src/renderer/render/media/video.ts +1 -1
  90. package/src/renderer/render/media/youtube.ts +1 -1
  91. package/src/renderer/render/media.test.ts +1 -1
  92. package/src/renderer/render.ts +3 -5
  93. package/src/util/info.ts +3 -7
  94. package/src/util/quote.ts +1 -1
  95. package/src/util/toc.test.ts +1 -1
  96. package/src/util/toc.ts +1 -1
  97. package/src/util.ts +0 -1
  98. package/src/util/sync.ts +0 -57
@@ -1,22 +1,23 @@
1
1
  import { undefined } from 'spica/global';
2
2
  import { Parser, eval, exec } from '../../data/parser';
3
3
  import { some } from '../../data/parser/some';
4
+ import { block } from '../constraint/block';
4
5
  import { line } from '../constraint/line';
5
6
  import { bind } from '../monad/bind';
6
7
  import { match } from './match';
7
8
  import { open } from './surround';
8
- import { reduce } from 'spica/memoize';
9
+ import { memoize } from 'spica/memoize';
9
10
  import { join } from 'spica/array';
10
11
 
11
- export function indent<P extends Parser<unknown>>(parser: P): P;
12
- export function indent<T>(parser: Parser<T>): Parser<T> {
12
+ export function indent<P extends Parser<unknown>>(parser: P, separation?: boolean): P;
13
+ export function indent<T>(parser: Parser<T>, separation = false): Parser<T> {
13
14
  assert(parser);
14
- return bind(match(
15
+ return bind(block(match(
15
16
  /^(?=(([ \t])\2*))/,
16
- reduce<string[], Parser<string>, string>(
17
+ memoize(
17
18
  ([, indent]) =>
18
19
  some(line(open(indent, source => [[unline(source)], '']))),
19
- ([, indent]) => indent)),
20
+ ([, indent]) => indent.length * 2 + +(indent[0] === ' '), [])), separation),
20
21
  (nodes, rest, context) => {
21
22
  const result = parser(join(nodes, '\n'), context);
22
23
  return result && exec(result) === ''
package/src/debug.test.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Result, eval, exec } from './combinator/data/parser';
2
- import { html, define } from 'typed-dom';
2
+ import { html, define } from 'typed-dom/dom';
3
3
 
4
4
  export function inspect(result: Result<HTMLElement | string>, until: number | string = Infinity): Result<string> {
5
5
  return result && [
@@ -1,6 +1,6 @@
1
1
  import { ParserSettings, Progress } from '../../..';
2
2
  import { bind } from './bind';
3
- import { frag, html } from 'typed-dom';
3
+ import { frag, html } from 'typed-dom/dom';
4
4
 
5
5
  describe('Unit: parser/api/bind', () => {
6
6
  describe('bind', () => {
@@ -1,5 +1,5 @@
1
1
  import { parse } from './parse';
2
- import { html } from 'typed-dom';
2
+ import { html } from 'typed-dom/dom';
3
3
 
4
4
  describe('Unit: parser/api/parse', () => {
5
5
  describe('parse', () => {
@@ -9,7 +9,7 @@ import { normalize } from './normalize';
9
9
  import { headers } from './header';
10
10
  import { figure } from '../processor/figure';
11
11
  import { footnote } from '../processor/footnote';
12
- import { frag } from 'typed-dom';
12
+ import { frag } from 'typed-dom/dom';
13
13
  import { ReadonlyURL } from 'spica/url';
14
14
 
15
15
  interface Options extends ParserOptions {
@@ -76,10 +76,10 @@ describe('Unit: parser/block/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>'], '']);
79
- assert.deepStrictEqual(inspect(parser('!> ```\na\n```')), [['<blockquote><section><pre class="text" translate="no">a</pre><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
80
- assert.deepStrictEqual(inspect(parser('!> ```\n> a\n```')), [['<blockquote><section><pre class="text" translate="no">a</pre><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
81
- assert.deepStrictEqual(inspect(parser('!> ```\n> a\n> ```')), [['<blockquote><section><pre class="text" translate="no">a</pre><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
82
- assert.deepStrictEqual(inspect(parser('!> ```\n> a\n> \n> b\n> ```')), [['<blockquote><section><pre class="text" translate="no">a<br><br>b</pre><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
79
+ assert.deepStrictEqual(inspect(parser('!> ```\na\n```')), [['<blockquote><section><pre class="text">a</pre><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
80
+ assert.deepStrictEqual(inspect(parser('!> ```\n> a\n```')), [['<blockquote><section><pre class="text">a</pre><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
81
+ assert.deepStrictEqual(inspect(parser('!> ```\n> a\n> ```')), [['<blockquote><section><pre class="text">a</pre><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
82
+ assert.deepStrictEqual(inspect(parser('!> ```\n> a\n> \n> b\n> ```')), [['<blockquote><section><pre class="text">a<br><br>b</pre><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
83
83
  assert.deepStrictEqual(inspect(parser('!> a\n>\n> b')), [['<blockquote><section><p>a</p><p>b</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
84
84
  assert.deepStrictEqual(inspect(parser('!> > a')), [['<blockquote><section><blockquote><pre>a</pre></blockquote><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
85
85
  assert.deepStrictEqual(inspect(parser('!> > a\n> b')), [['<blockquote><section><blockquote><pre>a<br>b</pre></blockquote><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
@@ -3,7 +3,7 @@ import { union, some, block, validate, rewrite, creator, open, convert, lazy, fm
3
3
  import { autolink } from '../autolink';
4
4
  import { contentline } from '../source';
5
5
  import { parse } from '../api/parse';
6
- import { html, defrag } from 'typed-dom';
6
+ import { html, defrag } from 'typed-dom/dom';
7
7
 
8
8
  export const segment: BlockquoteParser.SegmentParser = block(validate(['!>', '>'], union([
9
9
  validate(/^!?>+(?=[^\S\n]|\n[^\S\n]*\S)/, some(contentline)),
@@ -15,14 +15,8 @@ export const blockquote: BlockquoteParser = lazy(() => block(rewrite(segment, un
15
15
  ]))));
16
16
 
17
17
  const opener = /^(?=>>+(?:$|\s))/;
18
-
19
18
  const indent = block(open(opener, some(contentline, /^>(?:$|\s)/)), false);
20
-
21
- function unindent(source: string): string {
22
- return source
23
- .replace(/\n$/, '')
24
- .replace(/^>(?:$|\s|(?=>+(?:$|\s)))/mg, '');
25
- }
19
+ const unindent = (source: string) => source.replace(/(^|\n)>(?:[^\S\n]|(?=>*(?:$|\s)))|\n$/g, '$1');
26
20
 
27
21
  const source: BlockquoteParser.SourceParser = lazy(() => fmap(
28
22
  some(creator(union([
@@ -24,24 +24,24 @@ describe('Unit: parser/block/codeblock', () => {
24
24
  });
25
25
 
26
26
  it('basic', () => {
27
- assert.deepStrictEqual(inspect(parser('```\n```')), [['<pre class="text" translate="no"></pre>'], '']);
28
- assert.deepStrictEqual(inspect(parser('```\n\n```')), [['<pre class="text" translate="no"></pre>'], '']);
29
- assert.deepStrictEqual(inspect(parser('```\na\n```')), [['<pre class="text" translate="no">a</pre>'], '']);
30
- assert.deepStrictEqual(inspect(parser('```\na\nb\n```')), [['<pre class="text" translate="no">a<br>b</pre>'], '']);
31
- assert.deepStrictEqual(inspect(parser('```\n\\\n```')), [['<pre class="text" translate="no">\\</pre>'], '']);
32
- assert.deepStrictEqual(inspect(parser('```\n`\n```')), [['<pre class="text" translate="no">`</pre>'], '']);
33
- assert.deepStrictEqual(inspect(parser('```\n```\n```')), [['<pre class="text" translate="no">```</pre>'], '']);
34
- assert.deepStrictEqual(inspect(parser('```\n```\n\n```')), [['<pre class="text" translate="no"></pre>'], '\n```']);
35
- assert.deepStrictEqual(inspect(parser('```\n````\n```')), [['<pre class="text" translate="no">````</pre>'], '']);
36
- assert.deepStrictEqual(inspect(parser('```\n````\n\n```')), [['<pre class="text" translate="no">````<br></pre>'], '']);
37
- assert.deepStrictEqual(inspect(parser('````\n```\n````')), [['<pre class="text" translate="no">```</pre>'], '']);
38
- assert.deepStrictEqual(inspect(parser('````\n```\n\n````')), [['<pre class="text" translate="no">```<br></pre>'], '']);
39
- assert.deepStrictEqual(inspect(parser('```\n\n```\n')), [['<pre class="text" translate="no"></pre>'], '']);
40
- assert.deepStrictEqual(inspect(parser('```\nhttp://host\n```')), [['<pre class="text" translate="no"><a href="http://host" target="_blank">http://host</a></pre>'], '']);
41
- assert.deepStrictEqual(inspect(parser('```\n!http://host\n```')), [['<pre class="text" translate="no">!<a href="http://host" target="_blank">http://host</a></pre>'], '']);
42
- assert.deepStrictEqual(inspect(parser('```\n#a\n```')), [['<pre class="text" translate="no"><a href="/hashtags/a" class="hashtag">#a</a></pre>'], '']);
43
- assert.deepStrictEqual(inspect(parser('```\n@a#b\n```')), [['<pre class="text" translate="no"><a href="/@a?ch=b" class="channel">@a#b</a></pre>'], '']);
44
- assert.deepStrictEqual(inspect(parser(`\`\`\`\n0${'\n'.repeat(300)}\`\`\``), '>'), [['<pre class="text" translate="no">'], '']);
27
+ assert.deepStrictEqual(inspect(parser('```\n```')), [['<pre class="text"></pre>'], '']);
28
+ assert.deepStrictEqual(inspect(parser('```\n\n```')), [['<pre class="text"></pre>'], '']);
29
+ assert.deepStrictEqual(inspect(parser('```\na\n```')), [['<pre class="text">a</pre>'], '']);
30
+ assert.deepStrictEqual(inspect(parser('```\na\nb\n```')), [['<pre class="text">a<br>b</pre>'], '']);
31
+ assert.deepStrictEqual(inspect(parser('```\n\\\n```')), [['<pre class="text">\\</pre>'], '']);
32
+ assert.deepStrictEqual(inspect(parser('```\n`\n```')), [['<pre class="text">`</pre>'], '']);
33
+ assert.deepStrictEqual(inspect(parser('```\n```\n```')), [['<pre class="text">```</pre>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('```\n```\n\n```')), [['<pre class="text"></pre>'], '\n```']);
35
+ assert.deepStrictEqual(inspect(parser('```\n````\n```')), [['<pre class="text">````</pre>'], '']);
36
+ assert.deepStrictEqual(inspect(parser('```\n````\n\n```')), [['<pre class="text">````<br></pre>'], '']);
37
+ assert.deepStrictEqual(inspect(parser('````\n```\n````')), [['<pre class="text">```</pre>'], '']);
38
+ assert.deepStrictEqual(inspect(parser('````\n```\n\n````')), [['<pre class="text">```<br></pre>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('```\n\n```\n')), [['<pre class="text"></pre>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('```\nhttp://host\n```')), [['<pre class="text"><a href="http://host" target="_blank">http://host</a></pre>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('```\n!http://host\n```')), [['<pre class="text">!<a href="http://host" target="_blank">http://host</a></pre>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('```\n#a\n```')), [['<pre class="text"><a href="/hashtags/a" class="hashtag">#a</a></pre>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('```\n@a#b\n```')), [['<pre class="text"><a href="/@a?ch=b" class="channel">@a#b</a></pre>'], '']);
44
+ assert.deepStrictEqual(inspect(parser(`\`\`\`\n0${'\n'.repeat(300)}\`\`\``), '>'), [['<pre class="text">'], '']);
45
45
  });
46
46
 
47
47
  it('attribute', () => {
@@ -50,21 +50,21 @@ describe('Unit: parser/block/codeblock', () => {
50
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
- assert.deepStrictEqual(inspect(parser('```a--b\n```')), [['<pre class="text" translate="no" data-path="a--b"></pre>'], '']);
54
- assert.deepStrictEqual(inspect(parser('``` b\n```')), [['<pre class="text" translate="no" data-path="b"></pre>'], '']);
53
+ assert.deepStrictEqual(inspect(parser('```a--b\n```')), [['<pre class="text" data-path="a--b"></pre>'], '']);
54
+ assert.deepStrictEqual(inspect(parser('``` b\n```')), [['<pre class="text" data-path="b"></pre>'], '']);
55
55
  assert.deepStrictEqual(inspect(parser('``` b c\n```')), [['<pre class="invalid" translate="no">``` b c\n```</pre>'], '']);
56
- assert.deepStrictEqual(inspect(parser('``` b\\ c\n```')), [['<pre class="text" translate="no" data-path="b\\ c"></pre>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('``` b\\ c\n```')), [['<pre class="text" data-path="b\\ c"></pre>'], '']);
57
57
  assert.deepStrictEqual(inspect(parser('``` b.c\n```')), [['<pre class="code language-c" translate="no" data-lang="c" data-path="b.c"></pre>'], '']);
58
- assert.deepStrictEqual(inspect(parser('``` .b\n```')), [['<pre class="text" translate="no" data-path=".b"></pre>'], '']);
59
- assert.deepStrictEqual(inspect(parser('``` b \n```')), [['<pre class="text" translate="no" data-path="b"></pre>'], '']);
60
- assert.deepStrictEqual(inspect(parser('``` ~/.b\n```')), [['<pre class="text" translate="no" data-path="~/.b"></pre>'], '']);
58
+ assert.deepStrictEqual(inspect(parser('``` .b\n```')), [['<pre class="text" data-path=".b"></pre>'], '']);
59
+ assert.deepStrictEqual(inspect(parser('``` b \n```')), [['<pre class="text" data-path="b"></pre>'], '']);
60
+ assert.deepStrictEqual(inspect(parser('``` ~/.b\n```')), [['<pre class="text" data-path="~/.b"></pre>'], '']);
61
61
  assert.deepStrictEqual(inspect(parser('``` ~/b.c\n```')), [['<pre class="code language-c" translate="no" data-lang="c" data-path="~/b.c"></pre>'], '']);
62
- assert.deepStrictEqual(inspect(parser('```.b\n```')), [['<pre class="text" translate="no" data-path=".b"></pre>'], '']);
62
+ assert.deepStrictEqual(inspect(parser('```.b\n```')), [['<pre class="text" 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
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>'], '']);
66
+ assert.deepStrictEqual(inspect(parser('``` 1\n```')), [['<pre class="text" data-line="1"></pre>'], '']);
67
+ assert.deepStrictEqual(inspect(parser('``` 1,2-3\n```')), [['<pre class="text" data-line="1,2-3"></pre>'], '']);
68
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>'], '']);
69
69
  });
70
70
 
@@ -3,7 +3,7 @@ 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 { html, defrag } from 'typed-dom';
6
+ import { html, defrag } from 'typed-dom/dom';
7
7
 
8
8
  const opener = /^(`{3,})(?!`)([^\n]*)(?:$|\n)/;
9
9
  const language = /^[0-9a-z]+(?:-[a-z][0-9a-z]*)*$/i;
@@ -59,7 +59,7 @@ export const codeblock: CodeBlockParser = block(validate('```', fmap(
59
59
  const el = html('pre',
60
60
  {
61
61
  class: params.lang ? `code language-${params.lang}` : 'text',
62
- translate: 'no',
62
+ translate: params.lang ? 'no' : undefined,
63
63
  'data-lang': params.lang || undefined,
64
64
  'data-line': params.line || undefined,
65
65
  'data-path': params.path || undefined,
@@ -4,7 +4,7 @@ import { inline, indexee, indexer } from '../inline';
4
4
  import { anyline } from '../source';
5
5
  import { localize } from '../locale';
6
6
  import { visualize } from '../util';
7
- import { html, defrag } from 'typed-dom';
7
+ import { html, defrag } from 'typed-dom/dom';
8
8
  import { push } from 'spica/array';
9
9
 
10
10
  export const dlist: DListParser = lazy(() => block(localize(fmap(validate(
@@ -2,7 +2,7 @@ import { ExtensionParser } from '../../block';
2
2
  import { block, validate, fence, creator, fmap } from '../../../combinator';
3
3
  import { identity, text } from '../../inline/extension/indexee';
4
4
  import { parse } from '../../api/parse';
5
- import { html } from 'typed-dom';
5
+ import { html } from 'typed-dom/dom';
6
6
 
7
7
  export const aside: ExtensionParser.AsideParser = creator(100, block(validate('~~~', fmap(
8
8
  fence(/^(~{3,})aside(?!\S)([^\n]*)(?:$|\n)/, 300),
@@ -3,7 +3,7 @@ import { eval } from '../../../combinator/data/parser';
3
3
  import { block, validate, fence, creator, fmap } from '../../../combinator';
4
4
  import { parse } from '../../api/parse';
5
5
  import { mathblock } from '../mathblock';
6
- import { html } from 'typed-dom';
6
+ import { html } from 'typed-dom/dom';
7
7
 
8
8
  const opener = /^(~{3,})(?:example\/(\S+)|(?!\S))([^\n]*)(?:$|\n)/;
9
9
 
@@ -26,9 +26,9 @@ describe('Unit: parser/block/extension/fig', () => {
26
26
  assert.deepStrictEqual(inspect(parser('[$group-name]\n!https://host\n')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
27
27
  assert.deepStrictEqual(inspect(parser('[$group-name]\n|\n|-\n|')), [['<figure data-type="table" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><table><thead><tr></tr></thead><tbody><tr></tr></tbody></table></div></figure>'], '']);
28
28
  assert.deepStrictEqual(inspect(parser('[$group-name]\n|\n|-\n|\n')), [['<figure data-type="table" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><table><thead><tr></tr></thead><tbody><tr></tr></tbody></table></div></figure>'], '']);
29
- assert.deepStrictEqual(inspect(parser('[$group-name]\n```\n\n```')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><pre class="text" translate="no"></pre></div></figure>'], '']);
30
- assert.deepStrictEqual(inspect(parser('[$group-name]\n```\n\n```\n')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><pre class="text" translate="no"></pre></div></figure>'], '']);
31
- assert.deepStrictEqual(inspect(parser('[$group-name]\n```\n~~~\n```')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><pre class="text" translate="no">~~~</pre></div></figure>'], '']);
29
+ assert.deepStrictEqual(inspect(parser('[$group-name]\n```\n\n```')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><pre class="text"></pre></div></figure>'], '']);
30
+ assert.deepStrictEqual(inspect(parser('[$group-name]\n```\n\n```\n')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><pre class="text"></pre></div></figure>'], '']);
31
+ assert.deepStrictEqual(inspect(parser('[$group-name]\n```\n~~~\n```')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><pre class="text">~~~</pre></div></figure>'], '']);
32
32
  assert.deepStrictEqual(inspect(parser('[$group-name]\n$$\n\n$$')), [['<figure data-type="math" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
33
33
  assert.deepStrictEqual(inspect(parser('[$group-name]\n$$\n\n$$\n')), [['<figure data-type="math" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
34
34
  assert.deepStrictEqual(inspect(parser('[$group-name]\n~~~example/markdown\n~~~')), [['<figure data-type="example" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><aside class="example" data-type="markdown"><pre translate="no"></pre><hr><section><ol class="annotations"></ol><ol class="references"></ol></section></aside></div></figure>'], '']);
@@ -1,12 +1,12 @@
1
1
  import { ExtensionParser } from '../../block';
2
- import { union, sequence, some, block, line, validate, rewrite, close, convert } from '../../../combinator';
2
+ import { union, sequence, some, block, line, validate, verify, rewrite, close, convert } from '../../../combinator';
3
3
  import { contentline } from '../../source';
4
4
  import { figure } from './figure';
5
5
  import { segment as seg_label } from '../../inline/extension/label';
6
6
  import { segment as seg_code } from '../codeblock';
7
7
  import { segment as seg_math } from '../mathblock';
8
- import { segment as seg_blockquote } from '../blockquote';
9
8
  import { segment as seg_table } from './table';
9
+ import { segment as seg_blockquote } from '../blockquote';
10
10
  import { segment as seg_placeholder } from './placeholder';
11
11
 
12
12
  import FigParser = ExtensionParser.FigParser;
@@ -17,17 +17,18 @@ export const segment: FigParser.SegmentParser = block(validate(['[$', '$'],
17
17
  union([
18
18
  seg_code,
19
19
  seg_math,
20
- seg_blockquote,
21
20
  seg_table,
21
+ seg_blockquote,
22
22
  seg_placeholder,
23
23
  some(contentline),
24
24
  ]),
25
25
  ])));
26
26
 
27
- export const fig: FigParser = block(rewrite(segment, convert(
27
+ export const fig: FigParser = block(rewrite(segment, verify(convert(
28
28
  source => {
29
- const fence = (/^[^\n]*\n!?>+\s/.test(source) && source.match(/^~{3,}(?=\s*$)/mg) || [])
29
+ const fence = (/^[^\n]*\n!?>+\s/.test(source) && source.match(/^~{3,}(?=[^\S\n]*$)/mg) || [])
30
30
  .reduce((max, fence) => fence > max ? fence : max, '~~') + '~';
31
31
  return `${fence}figure ${source}\n\n${fence}`;
32
32
  },
33
- union([figure]))));
33
+ union([figure])),
34
+ ([el]) => el.className !== 'invalid' || el.getAttribute('data-invalid-type') !== 'content')));
@@ -1,7 +1,7 @@
1
1
  import { ExtensionParser } from '../../block';
2
2
  import { union, block, line, validate, fmap } from '../../../combinator';
3
3
  import { label } from '../../inline/extension/label';
4
- import { html } from 'typed-dom';
4
+ import { html } from 'typed-dom/dom';
5
5
 
6
6
  export const figbase: ExtensionParser.FigbaseParser = block(fmap(
7
7
  validate(/^\[?\$-(?:[0-9]+\.)*0\]?[^\S\n]*(?!\S|\n[^\S\n]*\S)/,
@@ -10,19 +10,19 @@ describe('Unit: parser/block/extension/figure', () => {
10
10
  assert.deepStrictEqual(inspect(parser('~~~figure\n!https://host\n~~~')), undefined);
11
11
  assert.deepStrictEqual(inspect(parser('~~~figure $group-name]\n!https://host\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
12
12
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name\n!https://host\n~~~')), undefined);
13
- assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\nhttps://host\n~~~')), undefined);
14
- assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\\\n~~~')), undefined);
15
- assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\\\n~~~')), undefined);
16
- assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\na\n~~~')), undefined);
13
+ assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\nhttps://host\n~~~')), [['<figure data-type="invalid" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><br></div></figure>'], '']);
14
+ assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\\\n~~~')), [['<figure data-type="invalid" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><br></div></figure>'], '']);
15
+ assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\\\n~~~')), [['<figure data-type="invalid" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><br></div></figure>'], '']);
16
+ assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\na\n~~~')), [['<figure data-type="invalid" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><br></div></figure>'], '']);
17
17
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\n\n~~~')), undefined);
18
- assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n !https://host\n~~~')), undefined);
18
+ assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n !https://host\n~~~')), [['<figure data-type="invalid" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><br></div></figure>'], '']);
19
19
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n\n!https://host\n~~~')), undefined);
20
20
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n~~~\n~~~')), undefined);
21
21
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n~~~~')), undefined);
22
22
  assert.deepStrictEqual(inspect(parser('~~~~figure [$group-name]\n!https://host\n~~~')), undefined);
23
- assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]a\nhttps://host\n~~~')), undefined);
23
+ assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]a\nhttps://host\n~~~')), [['<figure data-type="invalid" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><br></div></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"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
25
- assert.deepStrictEqual(inspect(parser('~~~figure [$group-name] a\nhttps://host\n~~~')), undefined);
25
+ assert.deepStrictEqual(inspect(parser('~~~figure [$group-name] a\nhttps://host\n~~~')), [['<figure data-type="invalid" data-label="group-name" data-group="group" class="invalid"><figcaption><span class="figindex"></span></figcaption><div><br></div></figure>'], '']);
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"><figcaption><span class="figindex"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
27
27
  assert.deepStrictEqual(inspect(parser('~~~figure a[$group-name]\n!https://host\n~~~')), undefined);
28
28
  assert.deepStrictEqual(inspect(parser('~~~figure a [$group-name]\n!https://host\n~~~')), undefined);
@@ -46,9 +46,9 @@ describe('Unit: parser/block/extension/figure', () => {
46
46
  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></figcaption><div><ul><li>a</li></ul></div></figure>'], '']);
47
47
  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></figcaption><div><ol><li>a</li></ol></div></figure>'], '']);
48
48
  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></figcaption><div><table><thead><tr></tr></thead><tbody><tr></tr></tbody></table></div></figure>'], '']);
49
- 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></figcaption><div><pre class="text" translate="no"></pre></div></figure>'], '']);
50
- 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></figcaption><div><pre class="text" translate="no">~~~</pre></div></figure>'], '']);
51
- assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n```\n\ncaption\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span>caption</figcaption><div><pre class="text" translate="no"></pre></div></figure>'], '']);
49
+ 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></figcaption><div><pre class="text"></pre></div></figure>'], '']);
50
+ 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></figcaption><div><pre class="text">~~~</pre></div></figure>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n```\n\ncaption\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span>caption</figcaption><div><pre class="text"></pre></div></figure>'], '']);
52
52
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n$$\n\n$$\n~~~')), [['<figure data-type="math" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
53
53
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n$$\n~~~\n$$\n~~~')), [['<figure data-type="math" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span></figcaption><div><div class="math" translate="no">$$\n~~~\n$$</div></div></figure>'], '']);
54
54
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n$$\n\n$$\n\ncaption\n~~~')), [['<figure data-type="math" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span>caption</figcaption><div><div class="math" translate="no">$$\n\n$$</div></div></figure>'], '']);
@@ -6,16 +6,17 @@ 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';
9
+ import { indentblock } from '../indentblock';
9
10
  import { codeblock, segment_ as seg_code } from '../codeblock';
10
11
  import { mathblock, segment_ as seg_math } from '../mathblock';
11
- import { blockquote, segment as seg_blockquote } from '../blockquote';
12
12
  import { example } from './example';
13
13
  import { table, segment_ as seg_table } from './table';
14
+ import { blockquote, segment as seg_blockquote } from '../blockquote';
14
15
  import { placeholder, segment_ as seg_placeholder } from './placeholder';
15
16
  import { inline, media, shortmedia } from '../../inline';
16
17
  import { localize } from '../../locale';
17
18
  import { visualize } from '../../util';
18
- import { html, defrag } from 'typed-dom';
19
+ import { html, defrag } from 'typed-dom/dom';
19
20
  import { memoize } from 'spica/memoize';
20
21
  import { unshift } from 'spica/array';
21
22
 
@@ -33,8 +34,8 @@ export const segment: FigureParser.SegmentParser = block(match(
33
34
  union([
34
35
  seg_code,
35
36
  seg_math,
36
- seg_blockquote,
37
37
  seg_table,
38
+ seg_blockquote,
38
39
  seg_placeholder,
39
40
  some(contentline, closer),
40
41
  ]),
@@ -57,14 +58,16 @@ export const figure: FigureParser = block(rewrite(segment, fmap(
57
58
  ulist,
58
59
  olist,
59
60
  styled_table,
61
+ indentblock,
60
62
  codeblock,
61
63
  mathblock,
62
- blockquote,
63
64
  example,
64
65
  table,
66
+ blockquote,
65
67
  placeholder,
66
- line(media),
67
- line(shortmedia),
68
+ block(line(media)),
69
+ block(line(shortmedia)),
70
+ fmap(some(contentline), () => [html('br')]),
68
71
  ])),
69
72
  emptyline,
70
73
  block(localize(
@@ -101,6 +104,9 @@ function attributes(label: string, param: string, content: HTMLElement, caption:
101
104
  case 'A':
102
105
  type = 'media';
103
106
  break;
107
+ case 'BR':
108
+ type = 'invalid';
109
+ break;
104
110
  case 'text':
105
111
  case 'code':
106
112
  case 'math':
@@ -111,6 +117,10 @@ function attributes(label: string, param: string, content: HTMLElement, caption:
111
117
  assert(false);
112
118
  }
113
119
  const invalid =
120
+ type === 'invalid' && content.tagName === 'BR' && {
121
+ 'data-invalid-type': 'content',
122
+ 'data-invalid-message': 'Invalid content',
123
+ } ||
114
124
  /^[^-]+-(?:[0-9]+\.)*0$/.test(label) && {
115
125
  'data-invalid-type': 'label',
116
126
  'data-invalid-message': 'The last part of the fixed label numbers must not be 0',
@@ -15,13 +15,13 @@ describe('Unit: parser/block/extension/message', () => {
15
15
  });
16
16
 
17
17
  it('valid', () => {
18
- assert.deepStrictEqual(inspect(parser('~~~message/note\n~~~')), [['<div class="message type-note"><h6>Note</h6></div>'], '']);
19
- assert.deepStrictEqual(inspect(parser('~~~message/note\n\n~~~')), [['<div class="message type-note"><h6>Note</h6></div>'], '']);
20
- assert.deepStrictEqual(inspect(parser('~~~message/note\na\n~~~')), [['<div class="message type-note"><h6>Note</h6><p>a</p></div>'], '']);
21
- assert.deepStrictEqual(inspect(parser('~~~message/note\na\n\n- \n~~~')), [['<div class="message type-note"><h6>Note</h6><p>a</p><ul><li></li></ul></div>'], '']);
22
- assert.deepStrictEqual(inspect(parser('~~~message/note\n# a\n~~~')), [['<div class="message type-note"><h6>Note</h6><p># a</p></div>'], '']);
23
- assert.deepStrictEqual(inspect(parser('~~~message/caution\n~~~')), [['<div class="message type-caution"><h6>Caution!</h6></div>'], '']);
24
- assert.deepStrictEqual(inspect(parser('~~~message/warning\n~~~')), [['<div class="message type-warning"><h6>WARNING!!</h6></div>'], '']);
18
+ assert.deepStrictEqual(inspect(parser('~~~message/note\n~~~')), [['<div class="message" data-type="note"><h6>Note</h6></div>'], '']);
19
+ assert.deepStrictEqual(inspect(parser('~~~message/note\n\n~~~')), [['<div class="message" data-type="note"><h6>Note</h6></div>'], '']);
20
+ assert.deepStrictEqual(inspect(parser('~~~message/note\na\n~~~')), [['<div class="message" data-type="note"><h6>Note</h6><p>a</p></div>'], '']);
21
+ assert.deepStrictEqual(inspect(parser('~~~message/note\na\n\n- \n~~~')), [['<div class="message" data-type="note"><h6>Note</h6><p>a</p><ul><li></li></ul></div>'], '']);
22
+ assert.deepStrictEqual(inspect(parser('~~~message/note\n# a\n~~~')), [['<div class="message" data-type="note"><h6>Note</h6><p># a</p></div>'], '']);
23
+ assert.deepStrictEqual(inspect(parser('~~~message/caution\n~~~')), [['<div class="message" data-type="caution"><h6>Caution!</h6></div>'], '']);
24
+ assert.deepStrictEqual(inspect(parser('~~~message/warning\n~~~')), [['<div class="message" data-type="warning"><h6>WARNING!!</h6></div>'], '']);
25
25
  });
26
26
 
27
27
  });
@@ -7,11 +7,13 @@ import { ulist } from '../ulist';
7
7
  import { olist } from '../olist';
8
8
  import { ilist } from '../ilist';
9
9
  import { table } from '../table';
10
+ import { indentblock } from '../indentblock';
10
11
  import { codeblock } from '../codeblock';
11
12
  import { mathblock } from '../mathblock';
13
+ import { sidefence } from '../sidefence';
12
14
  import { blockquote } from '../blockquote';
13
15
  import { paragraph } from '../paragraph';
14
- import { html } from 'typed-dom';
16
+ import { html } from 'typed-dom/dom';
15
17
  import { unshift, push } from 'spica/array';
16
18
 
17
19
  import MessageParser = ExtensionParser.MessageParser;
@@ -41,7 +43,7 @@ export const message: MessageParser = block(validate('~~~', fmap(
41
43
  }, `${opener}${body}${closer}`)];
42
44
  }
43
45
  return [
44
- html('div', { class: `message type-${type}` }, unshift(
46
+ html('div', { class: `message`, 'data-type': type }, unshift(
45
47
  [html('h6', title(type))],
46
48
  [...segment(body)].reduce((acc, seg) => push(acc, eval(content(seg, context), [])), []))),
47
49
  ];
@@ -65,8 +67,10 @@ const content: MessageParser.ContentParser = union([
65
67
  olist,
66
68
  ilist,
67
69
  table,
70
+ indentblock,
68
71
  codeblock,
69
72
  mathblock,
73
+ sidefence,
70
74
  blockquote,
71
75
  paragraph,
72
76
  ]);
@@ -1,6 +1,7 @@
1
1
  import { ExtensionParser } from '../../block';
2
2
  import { block, validate, fence, clear, fmap } from '../../../combinator';
3
- import { html } from 'typed-dom';
3
+ import { segment as label } from '../../inline/extension/label';
4
+ import { html } from 'typed-dom/dom';
4
5
 
5
6
  const opener = /^(~{3,})(?!~)[^\n]*(?:$|\n)/;
6
7
 
@@ -12,12 +13,17 @@ export const segment_: ExtensionParser.PlaceholderParser.SegmentParser = block(v
12
13
 
13
14
  export const placeholder: ExtensionParser.PlaceholderParser = block(validate('~~~', fmap(
14
15
  fence(opener, Infinity),
15
- ([body, closer, opener, delim]) => [
16
+ ([body, closer, opener, delim]: string[], _, context) => [
16
17
  html('pre', {
17
18
  class: 'invalid',
18
19
  translate: 'no',
19
20
  'data-invalid-syntax': 'extension',
20
21
  'data-invalid-type': !closer ? 'fence' : 'syntax',
21
- 'data-invalid-message': !closer ? `Missing the closing delimiter "${delim}"` : 'Invalid syntax',
22
+ 'data-invalid-message': !closer ? `Missing the closing delimiter "${delim}"` : 'Invalid extension name',
23
+ ...closer && (opener.slice(delim.length).split(/\s/, 1)[0] === 'figure' || label(opener.slice(delim.length), context)) && {
24
+ 'data-invalid-syntax': 'figure',
25
+ 'data-invalid-type': 'content',
26
+ 'data-invalid-message': 'Invalid content',
27
+ },
22
28
  }, `${opener}${body}${closer}`)
23
29
  ])));
@@ -1,7 +1,7 @@
1
1
  import { table } from './table';
2
2
  import { some } from '../../../combinator';
3
3
  import { inspect } from '../../../debug.test';
4
- import { html } from 'typed-dom';
4
+ import { html } from 'typed-dom/dom';
5
5
 
6
6
  describe('Unit: parser/block/extension/table', () => {
7
7
  describe('table', () => {
@@ -7,7 +7,7 @@ import { inline } from '../../inline';
7
7
  import { str, anyline, emptyline, contentline } from '../../source';
8
8
  import { localize } from '../../locale';
9
9
  import { visualize } from '../../util';
10
- import { html, defrag } from 'typed-dom';
10
+ import { html, defrag } from 'typed-dom/dom';
11
11
  import { unshift, splice } from 'spica/array';
12
12
 
13
13
  import TableParser = ExtensionParser.TableParser;
@@ -3,7 +3,7 @@ import { union, some, block, line, validate, focus, rewrite, context, open, trim
3
3
  import { inline, indexee, indexer } from '../inline';
4
4
  import { str } from '../source';
5
5
  import { visualize } from '../util';
6
- import { html, defrag } from 'typed-dom';
6
+ import { html, defrag } from 'typed-dom/dom';
7
7
 
8
8
  export const segment: HeadingParser.SegmentParser = block(validate('#', focus(
9
9
  /^#+[^\S\n]+\S[^\n]*(?:\n#+(?!\S)[^\n]*)*(?:$|\n)/,
@@ -1,6 +1,6 @@
1
1
  import { HorizontalRuleParser } from '../block';
2
2
  import { block, line, focus } from '../../combinator';
3
- import { html } from 'typed-dom';
3
+ import { html } from 'typed-dom/dom';
4
4
 
5
5
  export const horizontalrule: HorizontalRuleParser = block(line(focus(
6
6
  /^-{3,}[^\S\n]*(?:$|\n)/,
@@ -4,7 +4,7 @@ import { ulist_, fillFirstLine } from './ulist';
4
4
  import { olist_ } from './olist';
5
5
  import { inline } from '../inline';
6
6
  import { contentline } from '../source';
7
- import { html, defrag } from 'typed-dom';
7
+ import { html, defrag } from 'typed-dom/dom';
8
8
 
9
9
  export const ilist: IListParser = lazy(() => block(validate(
10
10
  /^[-+*](?=[^\S\n]|\n[^\S\n]*\S)/,