securemark 0.249.0 → 0.251.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.
@@ -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
 
@@ -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,30 +29,30 @@ 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(
36
36
  str(`<${tag}`), some(attribute), str(/^\s*>/), true),
37
37
  startLoose(some(union([
38
38
  open(/^\n?/, some(inline, blankWith('\n', `</${tag}>`)), true),
39
- ]), `</${tag}>`), `</${tag}>`),
39
+ ])), `</${tag}>`),
40
40
  str(`</${tag}>`), false,
41
41
  ([as, bs, cs], rest) =>
42
- [[elem(tag, as, defrag(bs), cs)], rest]),
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(
49
49
  str(`<${tag}`), some(attribute), str(/^\s*>/), true),
50
50
  startLoose(some(union([
51
51
  open(/^\n?/, some(inline, blankWith('\n', `</${tag}>`)), true),
52
- ]), `</${tag}>`), `</${tag}>`),
52
+ ])), `</${tag}>`),
53
53
  str(`</${tag}>`), false,
54
54
  ([as, bs, cs], rest) =>
55
- [[elem(tag, as, defrag(bs), cs)], rest]),
55
+ [[elem(tag, as, bs, cs)], rest]),
56
56
  ([, tag]) => tag,
57
57
  new Cache(10000))),
58
58
  ])))));
@@ -64,13 +64,12 @@ export const attribute: HTMLParser.TagParser.AttributeParser = union([
64
64
  function elem(tag: string, as: string[], bs: (HTMLElement | string)[], cs: string[]): HTMLElement {
65
65
  assert(as.length > 0);
66
66
  assert(as[0][0] === '<' && as[as.length - 1].slice(-1) === '>');
67
- assert(bs.length === defrag(bs).length);
68
67
  assert(cs.length === 1);
69
68
  if (!tags.includes(tag)) return invalid('tag', `Invalid HTML tag <${tag}>`, as, bs, cs);
70
69
  const attrs = attributes('html', [], attrspec[tag], as.slice(1, -1));
71
70
  return 'data-invalid-syntax' in attrs
72
71
  ? invalid('attribute', 'Invalid HTML attribute', as, bs, cs)
73
- : h(tag as 'span', attrs, bs);
72
+ : h(tag as 'span', attrs, defrag(bs));
74
73
  }
75
74
  function invalid(type: string, message: string, as: (HTMLElement | string)[], bs: (HTMLElement | string)[], cs: (HTMLElement | string)[]): HTMLElement {
76
75
  return h('span', {
@@ -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
  ]))),
@@ -3,7 +3,7 @@ import { ReferenceParser } from '../inline';
3
3
  import { union, subsequence, some, validate, focus, guard, context, creator, surround, lazy, fmap, bind } from '../../combinator';
4
4
  import { inline } from '../inline';
5
5
  import { str } from '../source';
6
- import { regBlankInlineStart, trimBlankInline, stringify } from '../util';
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(
@@ -22,7 +22,7 @@ export const reference: ReferenceParser = lazy(() => creator(validate('[[', ']]'
22
22
  subsequence([
23
23
  abbr,
24
24
  focus(/^\^[^\S\n]*/, source => [['', source], '']),
25
- trimBlankInline(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', () => {
@@ -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,16 +137,16 @@ 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> {
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
142
  return fmap(
143
- trimBlankInlineStart(parser),
143
+ trimBlankStart(parser),
144
144
  trimNodeEnd);
145
145
  }
146
- function trimBlankInlineStart<P extends Parser<unknown>>(parser: P): P;
147
- function trimBlankInlineStart<T>(parser: Parser<T>): Parser<T> {
146
+ function trimBlankStart<P extends Parser<unknown>>(parser: P): P;
147
+ function trimBlankStart<T>(parser: Parser<T>): Parser<T> {
148
148
  return convert(
149
- reduce(source => source.replace(regBlankInlineStart, '')),
149
+ reduce(source => source.replace(regBlankStart, '')),
150
150
  parser);
151
151
  }
152
152
  //export function trimNode(nodes: (HTMLElement | string)[]): (HTMLElement | string)[] {