securemark 0.233.3 → 0.234.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.234.0
4
+
5
+ - Extend anchor syntax.
6
+ - Refine comment parser.
7
+
3
8
  ## 0.233.3
4
9
 
5
10
  - Refactoring.
@@ -1,4 +1,4 @@
1
- /*! securemark v0.233.3 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED */
1
+ /*! securemark v0.234.0 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED */
2
2
  require = function () {
3
3
  function r(e, n, t) {
4
4
  function o(i, f) {
@@ -5845,7 +5845,13 @@ require = function () {
5845
5845
  const typed_dom_1 = _dereq_('typed-dom');
5846
5846
  exports.cite = (0, combinator_1.creator)((0, combinator_1.line)((0, combinator_1.fmap)((0, combinator_1.validate)('>>', (0, combinator_1.reverse)((0, combinator_1.tails)([
5847
5847
  (0, source_1.str)(/^>*(?=>>[^>\s]+[^\S\n]*(?:$|\n))/),
5848
- anchor_1.anchor
5848
+ (0, combinator_1.union)([
5849
+ anchor_1.anchor,
5850
+ (0, combinator_1.focus)(/^>>\.[^\S\n]*(?:$|\n)/, () => [
5851
+ [(0, typed_dom_1.html)('a', { class: 'anchor' }, '>>.')],
5852
+ ''
5853
+ ])
5854
+ ])
5849
5855
  ]))), ([el, quotes = '']) => [
5850
5856
  (0, typed_dom_1.html)('span', { class: 'cite' }, (0, typed_dom_1.defrag)([
5851
5857
  `${ quotes }>`,
@@ -6341,14 +6347,14 @@ require = function () {
6341
6347
  const combinator_1 = _dereq_('../../../combinator');
6342
6348
  const link_1 = _dereq_('../link');
6343
6349
  const typed_dom_1 = _dereq_('typed-dom');
6344
- exports.anchor = (0, combinator_1.lazy)(() => (0, combinator_1.validate)('>>', (0, combinator_1.fmap)((0, combinator_1.focus)(/^>>[0-9a-z]+(?:-[0-9a-z]+)*(?![0-9A-Za-z@#:])/, (0, combinator_1.context)({
6350
+ exports.anchor = (0, combinator_1.lazy)(() => (0, combinator_1.validate)('>>', (0, combinator_1.fmap)((0, combinator_1.focus)(/^>>(?:[A-Za-z][0-9A-Za-z]*(?:-[0-9A-Za-z]+)*\/)?[0-9A-Za-z]+(?:-[0-9A-Za-z]+)*(?![0-9A-Za-z@#:])/, (0, combinator_1.context)({
6345
6351
  syntax: {
6346
6352
  inline: {
6347
6353
  link: true,
6348
6354
  autolink: false
6349
6355
  }
6350
6356
  }
6351
- }, (0, combinator_1.convert)(source => `[${ source }]{ ?at=${ source.slice(2) } }`, (0, combinator_1.union)([link_1.link])))), ([el]) => [(0, typed_dom_1.define)(el, { class: 'anchor' })])));
6357
+ }, (0, combinator_1.convert)(source => `[${ source }]{ ${ source.includes('/') ? `/@${ source.slice(2).replace('/', '/timeline/') }` : `?at=${ source.slice(2) }` } }`, (0, combinator_1.union)([link_1.link])))), ([el]) => [(0, typed_dom_1.define)(el, { class: 'anchor' })])));
6352
6358
  },
6353
6359
  {
6354
6360
  '../../../combinator': 27,
@@ -6600,24 +6606,25 @@ require = function () {
6600
6606
  'use strict';
6601
6607
  Object.defineProperty(exports, '__esModule', { value: true });
6602
6608
  exports.comment = void 0;
6603
- const parser_1 = _dereq_('../../combinator/data/parser');
6604
6609
  const combinator_1 = _dereq_('../../combinator');
6605
6610
  const inline_1 = _dereq_('../inline');
6606
6611
  const source_1 = _dereq_('../source');
6607
6612
  const typed_dom_1 = _dereq_('typed-dom');
6608
6613
  const memoize_1 = _dereq_('spica/memoize');
6609
6614
  const array_1 = _dereq_('spica/array');
6610
- exports.comment = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.validate)('[#', (0, combinator_1.match)(/^(?=\[(#+)\s)/, (0, memoize_1.memoize)(([, fence], closer = new RegExp(String.raw`^\s+${ fence }\]`)) => (0, combinator_1.surround)((0, source_1.str)(/^\[(\S+)\s+(?!\1\])/), (0, combinator_1.union)([(0, combinator_1.some)(inline_1.inline, closer)]), (0, source_1.str)(closer), true, ([, bs = []], rest) => [
6611
- [(0, typed_dom_1.html)('span', { class: 'comment' }, (0, typed_dom_1.defrag)((0, array_1.push)((0, array_1.unshift)([`[${ fence } `], bs), [` ${ fence }]`])))],
6615
+ exports.comment = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.validate)('[#', (0, combinator_1.match)(/^(?=\[(#+)\s)/, (0, memoize_1.memoize)(([, fence]) => (0, combinator_1.surround)((0, combinator_1.open)((0, source_1.str)(`[${ fence }`), (0, combinator_1.some)(source_1.text, new RegExp(String.raw`^\s+${ fence }\]|^\S`)), true), (0, combinator_1.union)([(0, combinator_1.some)(inline_1.inline, new RegExp(String.raw`^\s+${ fence }\]`))]), (0, combinator_1.close)((0, combinator_1.some)(source_1.text, /^\S/), (0, source_1.str)(`${ fence }]`)), true, ([as, bs = [], cs], rest) => [
6616
+ [(0, typed_dom_1.html)('span', { class: 'comment' }, [
6617
+ (0, typed_dom_1.html)('input', { type: 'checkbox' }),
6618
+ (0, typed_dom_1.html)('span', (0, typed_dom_1.defrag)((0, array_1.push)((0, array_1.unshift)(as, bs), cs)))
6619
+ ])],
6612
6620
  rest
6613
- ], ([as, bs = []], rest, context) => [
6614
- (0, array_1.unshift)((0, array_1.pop)((0, parser_1.eval)((0, combinator_1.some)(source_1.text)(`${ as[0] }!`, context)))[0], bs),
6621
+ ], ([as, bs = []], rest) => [
6622
+ (0, array_1.unshift)(as, bs),
6615
6623
  rest
6616
6624
  ]), ([, fence]) => fence)))));
6617
6625
  },
6618
6626
  {
6619
6627
  '../../combinator': 27,
6620
- '../../combinator/data/parser': 47,
6621
6628
  '../inline': 88,
6622
6629
  '../source': 128,
6623
6630
  'spica/array': 6,
package/markdown.d.ts CHANGED
@@ -572,7 +572,10 @@ export namespace MarkdownParser {
572
572
  Block<'reply/cite'>,
573
573
  Parser<HTMLSpanElement | HTMLBRElement, Context, [
574
574
  SourceParser.StrParser,
575
- InlineParser.AutolinkParser.AnchorParser,
575
+ Parser<HTMLAnchorElement, Context, [
576
+ InlineParser.AutolinkParser.AnchorParser,
577
+ Parser<HTMLAnchorElement, Context, []>,
578
+ ]>,
576
579
  ]> {
577
580
  }
578
581
  export interface QuoteParser extends
package/package-lock.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.233.3",
3
+ "version": "0.234.0",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
@@ -3030,9 +3030,9 @@
3030
3030
  "dev": true
3031
3031
  },
3032
3032
  "electron-to-chromium": {
3033
- "version": "1.4.95",
3034
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.95.tgz",
3035
- "integrity": "sha512-h2VAMV/hPtmAeiDkwA8c5sjS+cWt6GlQL4ERdrOUWu7cRIG5IRk9uwR9f0utP+hPJ9ZZsADTq9HpbuT46eBYAg==",
3033
+ "version": "1.4.96",
3034
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.96.tgz",
3035
+ "integrity": "sha512-DPNjvNGPabv6FcyjzLAN4C0psN/GgD9rSGvMTuv81SeXG/EX3mCz0wiw9N1tUEnfQXYCJi3H8M0oFPRziZh7rw==",
3036
3036
  "dev": true
3037
3037
  },
3038
3038
  "elliptic": {
@@ -11500,9 +11500,9 @@
11500
11500
  },
11501
11501
  "dependencies": {
11502
11502
  "ansi-regex": {
11503
- "version": "3.0.0",
11504
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
11505
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
11503
+ "version": "3.0.1",
11504
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
11505
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
11506
11506
  "dev": true
11507
11507
  },
11508
11508
  "is-fullwidth-code-point": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.233.3",
3
+ "version": "0.234.0",
4
4
  "description": "Secure markdown renderer working on browsers for user input data.",
5
5
  "private": false,
6
6
  "homepage": "https://github.com/falsandtru/securemark",
@@ -53,10 +53,10 @@ describe('Unit: parser/api/parse', () => {
53
53
  ['<p>&lt;wbr&gt;<br>a</p>']);
54
54
  assert.deepStrictEqual(
55
55
  [...parse('[#\n<wbr>\n#]').children].map(el => el.outerHTML),
56
- ['<p><span class="comment">[# &lt;wbr&gt; #]</span></p>']);
56
+ ['<p><span class="comment"><input type="checkbox"><span>[#<br>&lt;wbr&gt;<br>#]</span></span></p>']);
57
57
  assert.deepStrictEqual(
58
58
  [...parse('[#\n<wbr>\n#]\na').children].map(el => el.outerHTML),
59
- ['<p><span class="comment">[# &lt;wbr&gt; #]</span><br>a</p>']);
59
+ ['<p><span class="comment"><input type="checkbox"><span>[#<br>&lt;wbr&gt;<br>#]</span></span><br>a</p>']);
60
60
  });
61
61
 
62
62
  it('linebreak', () => {
@@ -47,13 +47,13 @@ describe('Unit: parser/block/paragraph', () => {
47
47
  });
48
48
 
49
49
  it('comment', () => {
50
- assert.deepStrictEqual(inspect(parser('[# a #]')), [['<p><span class="comment">[# a #]</span></p>'], '']);
51
- assert.deepStrictEqual(inspect(parser('[# a #]b')), [['<p><span class="comment">[# a #]</span>b</p>'], '']);
52
- assert.deepStrictEqual(inspect(parser('[# a #]\nb')), [['<p><span class="comment">[# a #]</span><br>b</p>'], '']);
53
- assert.deepStrictEqual(inspect(parser('[## a ##]')), [['<p><span class="comment">[## a ##]</span></p>'], '']);
54
- assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]')), [['<p><span class="comment">[# &lt;wbr&gt; #]</span></p>'], '']);
55
- assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]a')), [['<p><span class="comment">[# &lt;wbr&gt; #]</span>a</p>'], '']);
56
- assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]\na')), [['<p><span class="comment">[# &lt;wbr&gt; #]</span><br>a</p>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('[# a #]')), [['<p><span class="comment"><input type="checkbox"><span>[# a #]</span></span></p>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('[# a #]b')), [['<p><span class="comment"><input type="checkbox"><span>[# a #]</span></span>b</p>'], '']);
52
+ assert.deepStrictEqual(inspect(parser('[# a #]\nb')), [['<p><span class="comment"><input type="checkbox"><span>[# a #]</span></span><br>b</p>'], '']);
53
+ assert.deepStrictEqual(inspect(parser('[## a ##]')), [['<p><span class="comment"><input type="checkbox"><span>[## a ##]</span></span></p>'], '']);
54
+ assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]')), [['<p><span class="comment"><input type="checkbox"><span>[#<br>&lt;wbr&gt;<br>#]</span></span></p>'], '']);
55
+ assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]a')), [['<p><span class="comment"><input type="checkbox"><span>[#<br>&lt;wbr&gt;<br>#]</span></span>a</p>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('[#\n<wbr>\n#]\na')), [['<p><span class="comment"><input type="checkbox"><span>[#<br>&lt;wbr&gt;<br>#]</span></span><br>a</p>'], '']);
57
57
  });
58
58
 
59
59
  it('template', () => {
@@ -13,15 +13,14 @@ describe('Unit: parser/block/reply/cite', () => {
13
13
  assert.deepStrictEqual(inspect(parser('>\n')), undefined);
14
14
  assert.deepStrictEqual(inspect(parser('>>')), undefined);
15
15
  assert.deepStrictEqual(inspect(parser('>> ')), undefined);
16
- assert.deepStrictEqual(inspect(parser('>>0A')), undefined);
17
16
  assert.deepStrictEqual(inspect(parser('>>0 a')), undefined);
18
- assert.deepStrictEqual(inspect(parser('>>A')), undefined);
19
17
  assert.deepStrictEqual(inspect(parser('>>/')), undefined);
20
18
  assert.deepStrictEqual(inspect(parser('>>\\')), undefined);
21
19
  assert.deepStrictEqual(inspect(parser('>>01#')), undefined);
22
20
  assert.deepStrictEqual(inspect(parser('>>01@')), undefined);
23
21
  assert.deepStrictEqual(inspect(parser('>>https://host')), undefined);
24
22
  assert.deepStrictEqual(inspect(parser('>>tel:1234567890')), undefined);
23
+ assert.deepStrictEqual(inspect(parser('>>..')), undefined);
25
24
  assert.deepStrictEqual(inspect(parser('>> 0')), undefined);
26
25
  assert.deepStrictEqual(inspect(parser(' >>0')), undefined);
27
26
  assert.deepStrictEqual(inspect(parser('\\>>0')), undefined);
@@ -39,6 +38,7 @@ describe('Unit: parser/block/reply/cite', () => {
39
38
  assert.deepStrictEqual(inspect(parser('>>0\n>>>1')), [['<span class="cite">&gt;<a href="?at=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>', '<span class="cite">&gt;&gt;<a href="?at=1" class="anchor" data-depth="2">&gt;1</a></span>', '<br>'], '']);
40
39
  assert.deepStrictEqual(inspect(parser('>>>0\n>>')), [['<span class="cite">&gt;&gt;<a href="?at=0" class="anchor" data-depth="2">&gt;0</a></span>', '<br>'], '>>']);
41
40
  assert.deepStrictEqual(inspect(parser('>>>0\n>>1')), [['<span class="cite">&gt;&gt;<a href="?at=0" class="anchor" data-depth="2">&gt;0</a></span>', '<br>', '<span class="cite">&gt;<a href="?at=1" class="anchor" data-depth="1">&gt;1</a></span>', '<br>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('>>.')), [['<span class="cite">&gt;<a class="anchor" data-depth="1">&gt;.</a></span>', '<br>'], '']);
42
42
  });
43
43
 
44
44
  });
@@ -1,5 +1,5 @@
1
1
  import { ReplyParser } from '../../block';
2
- import { tails, line, validate, creator, reverse, fmap } from '../../../combinator';
2
+ import { union, tails, line, validate, focus, creator, reverse, fmap } from '../../../combinator';
3
3
  import { anchor } from '../../inline/autolink/anchor';
4
4
  import { str } from '../../source';
5
5
  import { html, define, defrag } from 'typed-dom';
@@ -8,7 +8,12 @@ export const cite: ReplyParser.CiteParser = creator(line(fmap(validate(
8
8
  '>>',
9
9
  reverse(tails([
10
10
  str(/^>*(?=>>[^>\s]+[^\S\n]*(?:$|\n))/),
11
- anchor,
11
+ union([
12
+ anchor,
13
+ // Subject page representation.
14
+ // リンクの実装は後で検討
15
+ focus(/^>>\.[^\S\n]*(?:$|\n)/, () => [[html('a', { class: 'anchor' }, '>>.')], '']),
16
+ ]),
12
17
  ]))),
13
18
  ([el, quotes = '']: [HTMLElement, string?]) => [
14
19
  html('span', { class: 'cite' }, defrag([
@@ -9,6 +9,13 @@ import { visualize } from '../util';
9
9
  import { html, defrag } from 'typed-dom';
10
10
  import { push, pop } from 'spica/array';
11
11
 
12
+ /*
13
+ 必ず対象指定から始まる
14
+ 対象がページである場合>>.を表現方法とする
15
+ 対象をURLで指定すべき(引用ツリーにルートを追加する)場合はない
16
+ 対象と引用は1:N(分割)、N:1(統合)のみ可能、N:N(混合)は不可能
17
+ */
18
+
12
19
  export const reply: ReplyParser = block(validate('>', localize(fmap(
13
20
  inits([
14
21
  some(inits([
@@ -17,10 +24,9 @@ export const reply: ReplyParser = block(validate('>', localize(fmap(
17
24
  ])),
18
25
  some(subsequence([
19
26
  some(quote),
20
- fmap(
21
- rewrite(
22
- some(anyline, delimiter),
23
- trim(visualize(some(inline)))),
27
+ fmap(rewrite(
28
+ some(anyline, delimiter),
29
+ trim(visualize(some(inline)))),
24
30
  ns => push(ns, [html('br')])),
25
31
  ])),
26
32
  ]),
@@ -10,8 +10,6 @@ describe('Unit: parser/inline/autolink/anchor', () => {
10
10
  assert.deepStrictEqual(inspect(parser('')), undefined);
11
11
  assert.deepStrictEqual(inspect(parser('>')), undefined);
12
12
  assert.deepStrictEqual(inspect(parser('>>')), undefined);
13
- assert.deepStrictEqual(inspect(parser('>>0A')), undefined);
14
- assert.deepStrictEqual(inspect(parser('>>A')), undefined);
15
13
  assert.deepStrictEqual(inspect(parser('>>-0')), undefined);
16
14
  assert.deepStrictEqual(inspect(parser('>>01#')), undefined);
17
15
  assert.deepStrictEqual(inspect(parser('>>01@')), undefined);
@@ -24,10 +22,13 @@ describe('Unit: parser/inline/autolink/anchor', () => {
24
22
  it('valid', () => {
25
23
  assert.deepStrictEqual(inspect(parser('>>0')), [['<a href="?at=0" class="anchor">&gt;&gt;0</a>'], '']);
26
24
  assert.deepStrictEqual(inspect(parser('>>a')), [['<a href="?at=a" class="anchor">&gt;&gt;a</a>'], '']);
25
+ assert.deepStrictEqual(inspect(parser('>>A')), [['<a href="?at=A" class="anchor">&gt;&gt;A</a>'], '']);
27
26
  assert.deepStrictEqual(inspect(parser('>>0-')), [['<a href="?at=0" class="anchor">&gt;&gt;0</a>'], '-']);
28
27
  assert.deepStrictEqual(inspect(parser('>>0-a')), [['<a href="?at=0-a" class="anchor">&gt;&gt;0-a</a>'], '']);
29
- assert.deepStrictEqual(inspect(parser('>>0-A')), [['<a href="?at=0" class="anchor">&gt;&gt;0</a>'], '-A']);
28
+ assert.deepStrictEqual(inspect(parser('>>0-A')), [['<a href="?at=0-A" class="anchor">&gt;&gt;0-A</a>'], '']);
30
29
  assert.deepStrictEqual(inspect(parser('>>0--a')), [['<a href="?at=0" class="anchor">&gt;&gt;0</a>'], '--a']);
30
+ assert.deepStrictEqual(inspect(parser('>>2000-01-31-23-59-59-999-JST')), [['<a href="?at=2000-01-31-23-59-59-999-JST" class="anchor">&gt;&gt;2000-01-31-23-59-59-999-JST</a>'], '']);
31
+ assert.deepStrictEqual(inspect(parser('>>A/2000-01-31-23-59-59-JST')), [['<a href="/@A/timeline/2000-01-31-23-59-59-JST" class="anchor">&gt;&gt;A/2000-01-31-23-59-59-JST</a>'], '']);
31
32
  });
32
33
 
33
34
  });
@@ -3,13 +3,27 @@ import { union, validate, focus, context, convert, fmap, lazy } from '../../../c
3
3
  import { link } from '../link';
4
4
  import { define } from 'typed-dom';
5
5
 
6
+ // Timeline(pseudonym): user/tid
7
+ // Thread(anonymous): cid
8
+
9
+ // tid: YYYY-MM-DD-HH-MM-SS-TMZ
10
+ // cid: YYYY-MM-DD-HH-MM-SS-mmm-TMZ
11
+
12
+ // 内部表現はUnixTimeに統一する(時系列順)
13
+ // 外部表現は投稿ごとに投稿者の投稿時のタイムゾーンに統一する(非時系列順)
14
+
6
15
  export const anchor: AutolinkParser.AnchorParser = lazy(() => validate('>>', fmap(focus(
7
- /^>>[0-9a-z]+(?:-[0-9a-z]+)*(?![0-9A-Za-z@#:])/,
16
+ /^>>(?:[A-Za-z][0-9A-Za-z]*(?:-[0-9A-Za-z]+)*\/)?[0-9A-Za-z]+(?:-[0-9A-Za-z]+)*(?![0-9A-Za-z@#:])/,
8
17
  context({ syntax: { inline: {
9
18
  link: true,
10
19
  autolink: false,
11
20
  }}},
12
21
  convert(
13
- source => `[${source}]{ ?at=${source.slice(2)} }`,
22
+ source =>
23
+ `[${source}]{ ${
24
+ source.includes('/')
25
+ ? `/@${source.slice(2).replace('/', '/timeline/')}`
26
+ : `?at=${source.slice(2)}`
27
+ } }`,
14
28
  union([link])))),
15
29
  ([el]) => [define(el, { class: 'anchor' })])));
@@ -13,50 +13,49 @@ describe('Unit: parser/inline/comment', () => {
13
13
  assert.deepStrictEqual(inspect(parser('[#[#')), undefined);
14
14
  assert.deepStrictEqual(inspect(parser('[#a#]')), undefined);
15
15
  assert.deepStrictEqual(inspect(parser('[#a b#]')), undefined);
16
- assert.deepStrictEqual(inspect(parser('[# ')), [['[', '#', ' '], '']);
17
- assert.deepStrictEqual(inspect(parser('[# \n a')), [['[', '#', '<br>', ' ', 'a'], '']);
16
+ assert.deepStrictEqual(inspect(parser('[# ')), [['[#'], '']);
17
+ assert.deepStrictEqual(inspect(parser('[# \n a')), [['[#', '<br>', ' ', 'a'], '']);
18
18
  assert.deepStrictEqual(inspect(parser('[##]')), undefined);
19
- assert.deepStrictEqual(inspect(parser('[# #]')), undefined);
20
- assert.deepStrictEqual(inspect(parser('[# #] #]')), undefined);
21
- assert.deepStrictEqual(inspect(parser('[# [#')), [['[', '#', ' ', '[', '#'], '']);
22
- assert.deepStrictEqual(inspect(parser('[# [# ')), [['[', '#', ' ', '[', '#', ' '], '']);
23
- assert.deepStrictEqual(inspect(parser('[# [# a')), [['[', '#', ' ', '[', '#', ' ', 'a'], '']);
24
- assert.deepStrictEqual(inspect(parser('[# [# a #]')), [['[', '#', ' ', '<span class="comment">[# a #]</span>'], '']);
25
- assert.deepStrictEqual(inspect(parser('[# a[#')), [['[', '#', ' ', 'a', '[', '#'], '']);
26
- assert.deepStrictEqual(inspect(parser('[# a [#')), [['[', '#', ' ', 'a', ' ', '[', '#'], '']);
27
- assert.deepStrictEqual(inspect(parser('[# a [# ')), [['[', '#', ' ', 'a', ' ', '[', '#', ' '], '']);
28
- assert.deepStrictEqual(inspect(parser('[# a [# b')), [['[', '#', ' ', 'a', ' ', '[', '#', ' ', 'b'], '']);
29
- assert.deepStrictEqual(inspect(parser('[# a [## b')), [['[', '#', ' ', 'a', ' ', '[', '#', '#', ' ', 'b'], '']);
30
- assert.deepStrictEqual(inspect(parser('[## a [# b')), [['[', '#', '#', ' ', 'a', ' ', '[', '#', ' ', 'b'], '']);
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'], '']);
31
29
  assert.deepStrictEqual(inspect(parser('[#\\ a #]')), undefined);
32
- assert.deepStrictEqual(inspect(parser('[# a\\ #]')), [['[', '#', ' ', 'a', ' ', '#', ']'], '']);
33
- assert.deepStrictEqual(inspect(parser('[# a#]')), [['[', '#', ' ', 'a#', ']'], '']);
34
- assert.deepStrictEqual(inspect(parser('[# a ##]')), [['[', '#', ' ', 'a', ' ', '##', ']'], '']);
35
- assert.deepStrictEqual(inspect(parser('[# [## #]')), [['[', '#', ' ', '[', '#', '#', ' ', '#', ']'], '']);
36
- assert.deepStrictEqual(inspect(parser('[## [# ##]')), [['[', '#', '#', ' ', '[', '#', ' ', '##', ']'], '']);
37
- assert.deepStrictEqual(inspect(parser('[## a #]')), [['[', '#', '#', ' ', 'a', ' ', '#', ']'], '']);
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', ' ', '#', ']'], '']);
38
36
  assert.deepStrictEqual(inspect(parser(' [# a #]')), undefined);
39
37
  });
40
38
 
41
39
  it('basic', () => {
42
- assert.deepStrictEqual(inspect(parser('[# #]')), [['<span class="comment">[# #]</span>'], '']);
43
- assert.deepStrictEqual(inspect(parser('[# #]')), [['<span class="comment">[# #]</span>'], '']);
44
- assert.deepStrictEqual(inspect(parser('[# a #]')), [['<span class="comment">[# a #]</span>'], '']);
45
- assert.deepStrictEqual(inspect(parser('[# a b #]')), [['<span class="comment">[# a b #]</span>'], '']);
46
- assert.deepStrictEqual(inspect(parser('[# a\nb #]')), [['<span class="comment">[# a<br>b #]</span>'], '']);
47
- assert.deepStrictEqual(inspect(parser('[# a #] #]')), [['<span class="comment">[# a #]</span>'], ' #]']);
48
- assert.deepStrictEqual(inspect(parser('[# ##] #]')), [['<span class="comment">[# ##] #]</span>'], '']);
49
- assert.deepStrictEqual(inspect(parser('[# [# a #] #]')), [['<span class="comment">[# <span class="comment">[# a #]</span> #]</span>'], '']);
50
- assert.deepStrictEqual(inspect(parser('[# [## a ##] #]')), [['<span class="comment">[# <span class="comment">[## a ##]</span> #]</span>'], '']);
51
- assert.deepStrictEqual(inspect(parser('[## a ##]')), [['<span class="comment">[## a ##]</span>'], '']);
52
- assert.deepStrictEqual(inspect(parser('[## #] ##]')), [['<span class="comment">[## #] ##]</span>'], '']);
53
- assert.deepStrictEqual(inspect(parser('[## [# a #] ##]')), [['<span class="comment">[## <span class="comment">[# a #]</span> ##]</span>'], '']);
54
- assert.deepStrictEqual(inspect(parser('[# a #]b')), [['<span class="comment">[# a #]</span>'], 'b']);
55
- assert.deepStrictEqual(inspect(parser('[#\na\n#]')), [['<span class="comment">[# a #]</span>'], '']);
56
- assert.deepStrictEqual(inspect(parser('[# &a; #]')), [['<span class="comment">[# <span class="invalid">&amp;a;</span> #]</span>'], '']);
57
- assert.deepStrictEqual(inspect(parser('[# &copy; #]')), [['<span class="comment">[# © #]</span>'], '']);
58
- assert.deepStrictEqual(inspect(parser('[# &amp;copy; #]')), [['<span class="comment">[# &amp;copy; #]</span>'], '']);
59
- assert.deepStrictEqual(inspect(parser('[# \\ a #]')), [['<span class="comment">[# a #]</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>'], '']);
60
59
  });
61
60
 
62
61
  });
@@ -1,24 +1,24 @@
1
1
  import { CommentParser } from '../inline';
2
- import { eval } from '../../combinator/data/parser';
3
- import { union, some, validate, creator, surround, match, lazy } from '../../combinator';
2
+ import { union, some, validate, creator, surround, open, close, match, lazy } from '../../combinator';
4
3
  import { inline } from '../inline';
5
4
  import { text, str } from '../source';
6
5
  import { html, defrag } from 'typed-dom';
7
6
  import { memoize } from 'spica/memoize';
8
- import { unshift, push, pop } from 'spica/array';
7
+ import { unshift, push } from 'spica/array';
9
8
 
10
9
  export const comment: CommentParser = lazy(() => creator(validate('[#', match(
11
10
  /^(?=\[(#+)\s)/,
12
11
  memoize(
13
- ([, fence], closer = new RegExp(String.raw`^\s+${fence}\]`)) =>
12
+ ([, fence]) =>
14
13
  surround(
15
- str(/^\[(\S+)\s+(?!\1\])/),
16
- union([some(inline, closer)]),
17
- str(closer), true,
18
- ([, bs = []], rest) => [[
19
- html('span',
20
- { class: 'comment' },
21
- defrag(push(unshift([`[${fence} `], bs), [` ${fence}]`]))),
14
+ open(str(`[${fence}`), some(text, new RegExp(String.raw`^\s+${fence}\]|^\S`)), true),
15
+ union([some(inline, new RegExp(String.raw`^\s+${fence}\]`))]),
16
+ close(some(text, /^\S/), str(`${fence}]`)), true,
17
+ ([as, bs = [], cs], rest) => [[
18
+ html('span', { class: 'comment' }, [
19
+ html('input', { type: 'checkbox' }),
20
+ html('span', defrag(push(unshift(as, bs), cs))),
21
+ ]),
22
22
  ], rest],
23
- ([as, bs = []], rest, context) => [unshift(pop(eval(some(text)(`${as[0]}!`, context))!)[0], bs), rest]),
23
+ ([as, bs = []], rest) => [unshift(as, bs), rest]),
24
24
  ([, fence]) => fence)))));
@@ -38,7 +38,7 @@ describe('Unit: parser/inline/extension/index', () => {
38
38
  assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
39
39
  assert.deepStrictEqual(inspect(parser('[#a &nbsp;]')), [['<a class="index" href="#index:a">a</a>'], '']);
40
40
  assert.deepStrictEqual(inspect(parser('[#a <wbr>]')), [['<a class="index" href="#index:a">a</a>'], '']);
41
- assert.deepStrictEqual(inspect(parser('[#a [# b #]]')), [['<a class="index" href="#index:a">a <span class="comment">[# b #]</span></a>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('[#a [# b #]]')), [['<a class="index" href="#index:a">a <span class="comment"><input type="checkbox"><span>[# b #]</span></span></a>'], '']);
42
42
  assert.deepStrictEqual(inspect(parser('[#a\\ ]')), [['<a class="index" href="#index:a">a</a>'], '']);
43
43
  assert.deepStrictEqual(inspect(parser('[#a\\ b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
44
44
  assert.deepStrictEqual(inspect(parser('[#[]]')), [['<a class="index" href="#index:[]">[]</a>'], '']);
@@ -54,8 +54,8 @@ describe('Unit: parser/inline/extension/index', () => {
54
54
  assert.deepStrictEqual(inspect(parser('[#@a]')), [['<a class="index" href="#index:@a">@a</a>'], '']);
55
55
  assert.deepStrictEqual(inspect(parser('[#http://host]')), [['<a class="index" href="#index:http://host">http://host</a>'], '']);
56
56
  assert.deepStrictEqual(inspect(parser('[#!http://host]')), [['<a class="index" href="#index:!http://host">!http://host</a>'], '']);
57
- assert.deepStrictEqual(inspect(parser('[#[# #]]')), [['<a class="index"><span class="comment">[# #]</span></a>'], '']);
58
- assert.deepStrictEqual(inspect(parser('[#[# a #]]')), [['<a class="index"><span class="comment">[# a #]</span></a>'], '']);
57
+ assert.deepStrictEqual(inspect(parser('[#[# #]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[# #]</span></span></a>'], '']);
58
+ assert.deepStrictEqual(inspect(parser('[#[# a #]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[# a #]</span></span></a>'], '']);
59
59
  assert.deepStrictEqual(inspect(parser('[#a((b))]')), [['<a class="index" href="#index:a((b))">a<span class="paren">((b))</span></a>'], '']);
60
60
  assert.deepStrictEqual(inspect(parser('[#a[[b]]]')), [['<a class="index" href="#index:a[[b]]">a[[b]]</a>'], '']);
61
61
  });
@@ -83,7 +83,7 @@ describe('Unit: parser/inline/extension/index', () => {
83
83
  assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
84
84
  assert.deepStrictEqual(inspect(parser('[#a &nbsp;|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
85
85
  assert.deepStrictEqual(inspect(parser('[#a <wbr>|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
86
- assert.deepStrictEqual(inspect(parser('[#a [# b #]|#b]')), [['<a class="index" href="#index:b">a <span class="comment">[# b #]</span><span class="indexer" data-index="b"></span></a>'], '']);
86
+ assert.deepStrictEqual(inspect(parser('[#a [# b #]|#b]')), [['<a class="index" href="#index:b">a <span class="comment"><input type="checkbox"><span>[# b #]</span></span><span class="indexer" data-index="b"></span></a>'], '']);
87
87
  });
88
88
 
89
89
  });
@@ -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">[# b #]</span></span>'], '']);
49
- assert.deepStrictEqual(inspect(parser('[^a[# b #][# c #]]')), [['<span class="invalid">a<span class="comment">[# b #]</span><span class="comment">[# c #]</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">[# a #]</span></span>'], '']);
54
- assert.deepStrictEqual(inspect(parser('[^[# a #]b]')), [['<span class="invalid"><span class="comment">[# a #]</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
  });