securemark 0.249.1 → 0.252.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 (37) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/dist/index.js +120 -141
  4. package/markdown.d.ts +9 -19
  5. package/package.json +3 -3
  6. package/src/combinator/control/manipulation/indent.ts +15 -12
  7. package/src/combinator/control/manipulation/match.ts +2 -3
  8. package/src/parser/api/parse.test.ts +12 -6
  9. package/src/parser/block/blockquote.test.ts +2 -2
  10. package/src/parser/block/dlist.test.ts +2 -1
  11. package/src/parser/block/dlist.ts +4 -4
  12. package/src/parser/block/extension/figure.ts +5 -7
  13. package/src/parser/block/extension/message.ts +0 -2
  14. package/src/parser/block/heading.test.ts +1 -0
  15. package/src/parser/block/heading.ts +4 -4
  16. package/src/parser/block/olist.ts +7 -6
  17. package/src/parser/block/paragraph.test.ts +10 -10
  18. package/src/parser/block/paragraph.ts +2 -2
  19. package/src/parser/block/reply.ts +2 -2
  20. package/src/parser/block/ulist.ts +4 -3
  21. package/src/parser/block.ts +0 -3
  22. package/src/parser/inline/annotation.ts +2 -2
  23. package/src/parser/inline/code.ts +1 -1
  24. package/src/parser/inline/comment.test.ts +44 -44
  25. package/src/parser/inline/comment.ts +2 -2
  26. package/src/parser/inline/extension/index.test.ts +4 -4
  27. package/src/parser/inline/extension/index.ts +4 -5
  28. package/src/parser/inline/extension/placeholder.test.ts +4 -4
  29. package/src/parser/inline/html.ts +3 -3
  30. package/src/parser/inline/link.ts +2 -2
  31. package/src/parser/inline/reference.test.ts +3 -3
  32. package/src/parser/inline/reference.ts +6 -6
  33. package/src/parser/inline.test.ts +2 -2
  34. package/src/parser/source/str.ts +2 -2
  35. package/src/parser/util.ts +15 -11
  36. package/src/parser/block/indentblock.test.ts +0 -30
  37. package/src/parser/block/indentblock.ts +0 -13
@@ -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,8 +6,8 @@ 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(
@@ -45,7 +45,7 @@ describe('Unit: parser/inline/extension/index', () => {
45
45
  assert.deepStrictEqual(inspect(parser('[#a \\ ]')), [['<a class="index" href="#index:a">a</a>'], '']);
46
46
  assert.deepStrictEqual(inspect(parser('[#a &nbsp;]')), [['<a class="index" href="#index:a">a</a>'], '']);
47
47
  assert.deepStrictEqual(inspect(parser('[#a <wbr>]')), [['<a class="index" href="#index:a">a</a>'], '']);
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>'], '']);
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>'], '']);
49
49
  assert.deepStrictEqual(inspect(parser('[#a\\ ]')), [['<a class="index" href="#index:a">a</a>'], '']);
50
50
  assert.deepStrictEqual(inspect(parser('[#a\\ b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
51
51
  assert.deepStrictEqual(inspect(parser('[#[]]')), [['<a class="index" href="#index:[]">[]</a>'], '']);
@@ -61,8 +61,8 @@ describe('Unit: parser/inline/extension/index', () => {
61
61
  assert.deepStrictEqual(inspect(parser('[#@a]')), [['<a class="index" href="#index:@a">@a</a>'], '']);
62
62
  assert.deepStrictEqual(inspect(parser('[#http://host]')), [['<a class="index" href="#index:http://host">http://host</a>'], '']);
63
63
  assert.deepStrictEqual(inspect(parser('[#!http://host]')), [['<a class="index" href="#index:!http://host">!http://host</a>'], '']);
64
- assert.deepStrictEqual(inspect(parser('[#[# #]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[# #]</span></span></a>'], '']);
65
- assert.deepStrictEqual(inspect(parser('[#[# a #]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[# a #]</span></span></a>'], '']);
64
+ assert.deepStrictEqual(inspect(parser('[#[% %]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[% %]</span></span></a>'], '']);
65
+ assert.deepStrictEqual(inspect(parser('[#[% a %]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[% a %]</span></span></a>'], '']);
66
66
  assert.deepStrictEqual(inspect(parser('[#a((b))]')), [['<a class="index" href="#index:a((b))">a<span class="paren">((b))</span></a>'], '']);
67
67
  assert.deepStrictEqual(inspect(parser('[#a[[b]]]')), [['<a class="index" href="#index:a[[b]]">a[[b]]</a>'], '']);
68
68
  });
@@ -89,7 +89,7 @@ describe('Unit: parser/inline/extension/index', () => {
89
89
  assert.deepStrictEqual(inspect(parser('[#a \\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
90
90
  assert.deepStrictEqual(inspect(parser('[#a &nbsp;|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
91
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>'], '']);
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
93
  assert.deepStrictEqual(inspect(parser('[#a\\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
94
94
  });
95
95
 
@@ -4,7 +4,7 @@ import { union, some, validate, guard, context, creator, surround, open, lazy, f
4
4
  import { inline } from '../../inline';
5
5
  import { indexee, identity } from './indexee';
6
6
  import { txt, str, stropt } from '../../source';
7
- import { startTight, trimNodeEnd } from '../../util';
7
+ import { startTight, trimBlankEnd } from '../../util';
8
8
  import { html, define, defrag } from 'typed-dom/dom';
9
9
 
10
10
  import IndexParser = ExtensionParser.IndexParser;
@@ -22,13 +22,12 @@ export const index: IndexParser = lazy(() => creator(validate('[#', ']', '\n', f
22
22
  media: false,
23
23
  autolink: false,
24
24
  }}},
25
- open(stropt('|'),
26
- some(union([
25
+ open(stropt(/^\|?/), trimBlankEnd(some(union([
27
26
  signature,
28
27
  inline,
29
- ]), ']', /^\\?\n/), true)))),
28
+ ]), ']', /^\\?\n/)), true)))),
30
29
  ']'),
31
- ns => [html('a', trimNodeEnd(defrag(ns)))])),
30
+ ns => [html('a', defrag(ns))])),
32
31
  ([el]: [HTMLAnchorElement]) => [
33
32
  define(el,
34
33
  {
@@ -45,13 +45,13 @@ describe('Unit: parser/inline/extension/placeholder', () => {
45
45
  assert.deepStrictEqual(inspect(parser('[^a\\ \\ ]')), [['<span class="invalid">a </span>'], '']);
46
46
  assert.deepStrictEqual(inspect(parser('[^a<wbr>]')), [['<span class="invalid">a<wbr></span>'], '']);
47
47
  assert.deepStrictEqual(inspect(parser('[^a<wbr><wbr>]')), [['<span class="invalid">a<wbr><wbr></span>'], '']);
48
- assert.deepStrictEqual(inspect(parser('[^a[# b #]]')), [['<span class="invalid">a<span class="comment"><input type="checkbox"><span>[# b #]</span></span></span>'], '']);
49
- assert.deepStrictEqual(inspect(parser('[^a[# b #][# c #]]')), [['<span class="invalid">a<span class="comment"><input type="checkbox"><span>[# b #]</span></span><span class="comment"><input type="checkbox"><span>[# c #]</span></span></span>'], '']);
48
+ assert.deepStrictEqual(inspect(parser('[^a[% b %]]')), [['<span class="invalid">a<span class="comment"><input type="checkbox"><span>[% b %]</span></span></span>'], '']);
49
+ assert.deepStrictEqual(inspect(parser('[^a[% b %][% c %]]')), [['<span class="invalid">a<span class="comment"><input type="checkbox"><span>[% b %]</span></span><span class="comment"><input type="checkbox"><span>[% c %]</span></span></span>'], '']);
50
50
  assert.deepStrictEqual(inspect(parser('[^\\]]')), [['<span class="invalid">]</span>'], '']);
51
51
  assert.deepStrictEqual(inspect(parser('[^(])]')), [['<span class="invalid"><span class="paren">(])</span></span>'], '']);
52
52
  assert.deepStrictEqual(inspect(parser('[^!http://host]')), [['<span class="invalid"><a href="http://host" target="_blank"><img class="media" data-src="http://host" alt=""></a></span>'], '']);
53
- assert.deepStrictEqual(inspect(parser('[^[# a #]]')), [['<span class="invalid"><span class="comment"><input type="checkbox"><span>[# a #]</span></span></span>'], '']);
54
- assert.deepStrictEqual(inspect(parser('[^[# a #]b]')), [['<span class="invalid"><span class="comment"><input type="checkbox"><span>[# a #]</span></span>b</span>'], '']);
53
+ assert.deepStrictEqual(inspect(parser('[^[% a %]]')), [['<span class="invalid"><span class="comment"><input type="checkbox"><span>[% a %]</span></span></span>'], '']);
54
+ assert.deepStrictEqual(inspect(parser('[^[% a %]b]')), [['<span class="invalid"><span class="comment"><input type="checkbox"><span>[% a %]</span></span>b</span>'], '']);
55
55
  });
56
56
 
57
57
  });
@@ -20,7 +20,7 @@ Object.values(attrspec).forEach(o => Object.setPrototypeOf(o, null));
20
20
 
21
21
  export const html: HTMLParser = lazy(() => creator(validate('<', validate(/^<[a-z]+(?=[^\S\n]|>)/, union([
22
22
  match(
23
- /^(?=<(wbr)(?=[^\S\n]|>))/,
23
+ /^<(wbr)(?=[^\S\n]|>)/,
24
24
  memoize(
25
25
  ([, tag]) =>
26
26
  surround(
@@ -29,7 +29,7 @@ export const html: HTMLParser = lazy(() => creator(validate('<', validate(/^<[a-
29
29
  [[h(tag as 'span', attributes('html', [], attrspec[tag], bs))], rest]),
30
30
  ([, tag]) => tags.indexOf(tag), [])),
31
31
  match(
32
- /^(?=<(sup|sub|small|bdo|bdi)(?=[^\S\n]|>))/,
32
+ /^<(sup|sub|small|bdo|bdi)(?=[^\S\n]|>)/,
33
33
  memoize(
34
34
  ([, tag]) =>
35
35
  surround<HTMLParser.TagParser, string>(surround(
@@ -42,7 +42,7 @@ export const html: HTMLParser = lazy(() => creator(validate('<', validate(/^<[a-
42
42
  [[elem(tag, as, bs, cs)], rest]),
43
43
  ([, tag]) => tags.indexOf(tag), [])),
44
44
  match(
45
- /^(?=<([a-z]+)(?=[^\S\n]|>))/,
45
+ /^<([a-z]+)(?=[^\S\n]|>)/,
46
46
  memoize(
47
47
  ([, tag]) =>
48
48
  surround<HTMLParser.TagParser, string>(surround(
@@ -6,7 +6,7 @@ import { inline, media, shortmedia } from '../inline';
6
6
  import { attributes } from './html';
7
7
  import { autolink } from '../autolink';
8
8
  import { str } from '../source';
9
- import { trimBlankInline, stringify } from '../util';
9
+ import { trimBlank, stringify } from '../util';
10
10
  import { html, define, defrag } from 'typed-dom/dom';
11
11
  import { ReadonlyURL } from 'spica/url';
12
12
 
@@ -36,7 +36,7 @@ export const link: LinkParser = lazy(() => creator(10, validate(['[', '{'], '}',
36
36
  media: false,
37
37
  autolink: false,
38
38
  }}},
39
- trimBlankInline(some(inline, ']', /^\\?\n/))),
39
+ trimBlank(some(inline, ']', /^\\?\n/))),
40
40
  ']',
41
41
  true),
42
42
  ]))),
@@ -58,7 +58,7 @@ describe('Unit: parser/inline/reference', () => {
58
58
  assert.deepStrictEqual(inspect(parser('[[^a,]]')), [['<sup class="reference" data-abbr="a,"></sup>'], '']);
59
59
  assert.deepStrictEqual(inspect(parser('[[^a, ]]')), [['<sup class="reference" data-abbr="a,"></sup>'], '']);
60
60
  assert.deepStrictEqual(inspect(parser('[[^a ]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
61
- assert.deepStrictEqual(inspect(parser('[[^a ]]')), [['<sup class="invalid">^a</sup>'], '']);
61
+ assert.deepStrictEqual(inspect(parser('[[^a ]]')), [['<sup class="invalid">^a </sup>'], '']);
62
62
  assert.deepStrictEqual(inspect(parser('[[^a b]]')), [['<sup class="reference" data-abbr="a b"></sup>'], '']);
63
63
  assert.deepStrictEqual(inspect(parser('[[^a b]]')), [['<sup class="invalid">^a b</sup>'], '']);
64
64
  assert.deepStrictEqual(inspect(parser('[[^a|]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
@@ -76,7 +76,7 @@ describe('Unit: parser/inline/reference', () => {
76
76
  assert.deepStrictEqual(inspect(parser('[[^a| ]]')), [['<sup class="reference" data-abbr="a"></sup>'], '']);
77
77
  assert.deepStrictEqual(inspect(parser('[[^1]]')), [['<sup class="invalid">^1</sup>'], '']);
78
78
  assert.deepStrictEqual(inspect(parser('[[^1a]]')), [['<sup class="reference" data-abbr="1a"></sup>'], '']);
79
- assert.deepStrictEqual(inspect(parser('[[^1 ]]')), [['<sup class="invalid">^1</sup>'], '']);
79
+ assert.deepStrictEqual(inspect(parser('[[^1 ]]')), [['<sup class="invalid">^1 </sup>'], '']);
80
80
  assert.deepStrictEqual(inspect(parser('[[^1 a]]')), [['<sup class="reference" data-abbr="1 a"></sup>'], '']);
81
81
  assert.deepStrictEqual(inspect(parser('[[^1|]]')), [['<sup class="invalid">^1|</sup>'], '']);
82
82
  assert.deepStrictEqual(inspect(parser('[[^1 |]]')), [['<sup class="invalid">^1 |</sup>'], '']);
@@ -91,7 +91,7 @@ describe('Unit: parser/inline/reference', () => {
91
91
  assert.deepStrictEqual(inspect(parser('[[^ a]]')), [['<sup class="invalid">^ a</sup>'], '']);
92
92
  assert.deepStrictEqual(inspect(parser('[[^ |]]')), [['<sup class="invalid">^ |</sup>'], '']);
93
93
  assert.deepStrictEqual(inspect(parser('[[^ |b]]')), [['<sup class="invalid">^ |b</sup>'], '']);
94
- assert.deepStrictEqual(inspect(parser('[[^ | ]]')), [['<sup class="invalid">^ |</sup>'], '']);
94
+ assert.deepStrictEqual(inspect(parser('[[^ | ]]')), [['<sup class="invalid">^ | </sup>'], '']);
95
95
  assert.deepStrictEqual(inspect(parser('[[^ | b]]')), [['<sup class="invalid">^ | b</sup>'], '']);
96
96
  });
97
97
 
@@ -1,9 +1,9 @@
1
1
  import { undefined } from 'spica/global';
2
2
  import { ReferenceParser } from '../inline';
3
- import { union, subsequence, some, validate, focus, guard, context, creator, surround, lazy, fmap, bind } from '../../combinator';
3
+ import { union, subsequence, some, validate, guard, context, creator, surround, open, lazy, fmap, bind } from '../../combinator';
4
4
  import { inline } from '../inline';
5
- import { str } from '../source';
6
- import { regBlankInlineStart, trimBlankInline, stringify } from '../util';
5
+ import { str, stropt } from '../source';
6
+ import { regBlankStart, trimBlank, stringify } from '../util';
7
7
  import { html, defrag } from 'typed-dom/dom';
8
8
 
9
9
  export const reference: ReferenceParser = lazy(() => creator(validate('[[', ']]', '\n', fmap(surround(
@@ -21,8 +21,8 @@ export const reference: ReferenceParser = lazy(() => creator(validate('[[', ']]'
21
21
  }}, delimiters: undefined },
22
22
  subsequence([
23
23
  abbr,
24
- focus(/^\^[^\S\n]*/, source => [['', source], '']),
25
- trimBlankInline(some(inline, ']', /^\\?\n/)),
24
+ open(stropt(/^(?=\^)/), some(inline, ']', /^\\?\n/)),
25
+ trimBlank(some(inline, ']', /^\\?\n/)),
26
26
  ]))),
27
27
  ']]'),
28
28
  ns => [html('sup', attributes(ns), defrag(ns))]))));
@@ -31,7 +31,7 @@ const abbr: ReferenceParser.AbbrParser = creator(bind(surround(
31
31
  '^',
32
32
  union([str(/^(?![0-9]+\s?[|\]])[0-9A-Za-z]+(?:(?:-|(?=\W)(?!'\d)'?(?!\.\d)\.?(?!,\S),? ?)[0-9A-Za-z]+)*(?:-|'?\.?,? ?)?/)]),
33
33
  /^\|?(?=]])|^\|[^\S\n]*/),
34
- ([source], rest) => [[html('abbr', source)], rest.replace(regBlankInlineStart, '')]));
34
+ ([source], rest) => [[html('abbr', source)], rest.replace(regBlankStart, '')]));
35
35
 
36
36
  function attributes(ns: (string | HTMLElement)[]): Record<string, string | undefined> {
37
37
  return typeof ns[0] === 'object' && ns[0].tagName === 'ABBR'
@@ -166,8 +166,8 @@ describe('Unit: parser/inline', () => {
166
166
  assert.deepStrictEqual(inspect(parser('[#a*b\nc*]')), [['[', '<a href="/hashtags/a" class="hashtag">#a</a>', '<em>b<br>c</em>', ']'], '']);
167
167
  assert.deepStrictEqual(inspect(parser('[*a\nb*]{/}')), [['[', '<em>a<br>b</em>', ']', '<a href="/">/</a>'], '']);
168
168
  assert.deepStrictEqual(inspect(parser('[[*a\nb*]]')), [['[', '[', '<em>a<br>b</em>', ']', ']'], '']);
169
- assert.deepStrictEqual(inspect(parser('"[# *"*"*')), [['"', '[#', ' ', '*', '"', '*', '"', '*'], '']);
170
- assert.deepStrictEqual(inspect(parser('"[# "*"* #]')), [['"', '[#', ' ', '"', '*', '"', '*', ' ', '#', ']'], '']);
169
+ assert.deepStrictEqual(inspect(parser('"[% *"*"*')), [['"', '[%', ' ', '*', '"', '*', '"', '*'], '']);
170
+ assert.deepStrictEqual(inspect(parser('"[% "*"* %]')), [['"', '[%', ' ', '"', '*', '"', '*', ' ', '%', ']'], '']);
171
171
  });
172
172
 
173
173
  it('uri', () => {
@@ -30,13 +30,13 @@ export function stropt(pattern: string | RegExp): Parser<string, Context<StrPars
30
30
  if (source === '') return;
31
31
  return source.slice(0, pattern.length) === pattern
32
32
  ? [[pattern], source.slice(pattern.length)]
33
- : [[], source];
33
+ : undefined;
34
34
  })
35
35
  : creator(source => {
36
36
  if (source === '') return;
37
37
  const m = source.match(pattern);
38
38
  return m
39
39
  ? [[m[0]], source.slice(m[0].length)]
40
- : [[], source];
40
+ : undefined;
41
41
  });
42
42
  }
@@ -8,7 +8,7 @@ import { invisibleHTMLEntityNames } from './api/normalize';
8
8
  import { reduce } from 'spica/memoize';
9
9
  import { push } from 'spica/array';
10
10
 
11
- export const regBlankInlineStart = new RegExp(String.raw
11
+ export const regBlankStart = new RegExp(String.raw
12
12
  `^(?:\\?[^\S\n]|&(?:${invisibleHTMLEntityNames.join('|')});|<wbr>)+`);
13
13
 
14
14
  export function blankWith(delimiter: string | RegExp): RegExp;
@@ -60,7 +60,7 @@ export function startLoose<T extends HTMLElement | string>(parser: Parser<T>, ex
60
60
  : undefined;
61
61
  }
62
62
  const isStartLoose = reduce((source: string, context: MarkdownParser.Context, except?: string): boolean => {
63
- return isStartTight(source.replace(regBlankInlineStart, ''), context, except);
63
+ return isStartTight(source.replace(regBlankStart, ''), context, except);
64
64
  }, (source, _, except = '') => `${source}\x1E${except}`);
65
65
 
66
66
  export function startTight<P extends Parser<unknown>>(parser: P, except?: string): P;
@@ -137,18 +137,22 @@ function isVisible(node: HTMLElement | string, strpos?: number): boolean {
137
137
  }
138
138
  }
139
139
 
140
- export function trimBlankInline<P extends Parser<HTMLElement | string>>(parser: P): P;
141
- export function trimBlankInline<T extends HTMLElement | string>(parser: Parser<T>): Parser<T> {
142
- return fmap(
143
- trimBlankInlineStart(parser),
144
- trimNodeEnd);
140
+ export function trimBlank<P extends Parser<HTMLElement | string>>(parser: P): P;
141
+ export function trimBlank<T extends HTMLElement | string>(parser: Parser<T>): Parser<T> {
142
+ return trimBlankStart(trimBlankEnd(parser));
145
143
  }
146
- function trimBlankInlineStart<P extends Parser<unknown>>(parser: P): P;
147
- function trimBlankInlineStart<T>(parser: Parser<T>): Parser<T> {
144
+ export function trimBlankStart<P extends Parser<unknown>>(parser: P): P;
145
+ export function trimBlankStart<T>(parser: Parser<T>): Parser<T> {
148
146
  return convert(
149
- reduce(source => source.replace(regBlankInlineStart, '')),
147
+ reduce(source => source.replace(regBlankStart, '')),
150
148
  parser);
151
149
  }
150
+ export function trimBlankEnd<P extends Parser<HTMLElement | string>>(parser: P): P;
151
+ export function trimBlankEnd<T extends HTMLElement | string>(parser: Parser<T>): Parser<T> {
152
+ return fmap(
153
+ parser,
154
+ trimNodeEnd);
155
+ }
152
156
  //export function trimNode(nodes: (HTMLElement | string)[]): (HTMLElement | string)[] {
153
157
  // return trimNodeStart(trimNodeEnd(nodes));
154
158
  //}
@@ -166,7 +170,7 @@ function trimBlankInlineStart<T>(parser: Parser<T>): Parser<T> {
166
170
  // }
167
171
  // return nodes;
168
172
  //}
169
- export function trimNodeEnd<T extends HTMLElement | string>(nodes: T[]): T[] {
173
+ function trimNodeEnd<T extends HTMLElement | string>(nodes: T[]): T[] {
170
174
  const skip = nodes.length > 0 &&
171
175
  typeof nodes[nodes.length - 1] === 'object' &&
172
176
  nodes[nodes.length - 1]['className'] === 'indexer'
@@ -1,30 +0,0 @@
1
- import { indentblock } from './indentblock';
2
- import { some } from '../../combinator';
3
- import { inspect } from '../../debug.test';
4
-
5
- describe('Unit: parser/block/indentblock', () => {
6
- describe('indentblock', () => {
7
- const parser = (source: string) => some(indentblock)(source, {});
8
-
9
- it('invalid', () => {
10
- assert.deepStrictEqual(inspect(parser('')), undefined);
11
- assert.deepStrictEqual(inspect(parser('\na')), undefined);
12
- assert.deepStrictEqual(inspect(parser(' a')), undefined);
13
- assert.deepStrictEqual(inspect(parser(' \ta')), undefined);
14
- assert.deepStrictEqual(inspect(parser(' a\nb')), undefined);
15
- assert.deepStrictEqual(inspect(parser(' a\n b')), undefined);
16
- });
17
-
18
- it('valid', () => {
19
- assert.deepStrictEqual(inspect(parser(' a')), [['<pre class="text">a</pre>'], '']);
20
- assert.deepStrictEqual(inspect(parser(' a ')), [['<pre class="text">a </pre>'], '']);
21
- assert.deepStrictEqual(inspect(parser(' a \n')), [['<pre class="text">a </pre>'], '']);
22
- assert.deepStrictEqual(inspect(parser(' a \n b')), [['<pre class="text">a <br> b</pre>'], '']);
23
- assert.deepStrictEqual(inspect(parser(' a\\\n b')), [['<pre class="text">a\\<br>b</pre>'], '']);
24
- assert.deepStrictEqual(inspect(parser('\ta')), [['<pre class="text">a</pre>'], '']);
25
- assert.deepStrictEqual(inspect(parser('\t a')), [['<pre class="text"> a</pre>'], '']);
26
- });
27
-
28
- });
29
-
30
- });
@@ -1,13 +0,0 @@
1
- import { IndentBlockParser } from '../block';
2
- import { union, block, validate, indent, convert } from '../../combinator';
3
- import { codeblock } from './codeblock';
4
-
5
- // 空行を含むインデントブロックはインデントの違いによるセグメント分割の境界が視認不能となるため採用しない
6
-
7
- export const indentblock: IndentBlockParser = block(validate(/^(?: |\t)/, indent(convert(
8
- source => {
9
- const fence = (source.match(/^`{3,}(?=[^\S\n]*$)/mg) ?? [])
10
- .reduce((max, fence) => fence > max ? fence : max, '``') + '`';
11
- return `${fence}\n${source}\n${fence}`;
12
- },
13
- union([codeblock])), true)));