securemark 0.297.6 → 0.297.7

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,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.297.7
4
+
5
+ - Fix annotation parser.
6
+
3
7
  ## 0.297.6
4
8
 
5
9
  - Refactoring.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! securemark v0.297.6 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
1
+ /*! securemark v0.297.7 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
2
2
  (function webpackUniversalModuleDefinition(root, factory) {
3
3
  if(typeof exports === 'object' && typeof module === 'object')
4
4
  module.exports = factory(require("Prism"), require("DOMPurify"));
@@ -6396,21 +6396,21 @@ exports.annotation = (0, combinator_1.lazy)(() => (0, combinator_1.constraint)(1
6396
6396
  recursion,
6397
6397
  resources
6398
6398
  } = context;
6399
+ if (linebreak !== 0) {
6400
+ ns.unshift(new parser_1.Node('('));
6401
+ ns.push(new parser_1.Node(')'));
6402
+ return new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6403
+ class: 'bracket'
6404
+ }, ['(', (0, dom_1.html)('span', {
6405
+ class: 'bracket'
6406
+ }, (0, dom_1.defrag)((0, util_1.unwrap)(ns))), ')']))]);
6407
+ }
6399
6408
  const depth = MAX_DEPTH - (resources?.recursions[4 /* Recursion.annotation */] ?? resources?.recursions.at(-1) ?? MAX_DEPTH);
6400
- if (linebreak === 0) {
6401
- recursion.add(depth);
6402
- return new parser_1.List([new parser_1.Node((0, dom_1.html)('sup', {
6403
- class: 'annotation'
6404
- }, [(0, dom_1.html)('span', (0, dom_1.defrag)((0, util_1.unwrap)((0, visibility_1.trimBlankNodeEnd)(ns))))]))]);
6405
- }
6406
- ns.unshift(new parser_1.Node('('));
6407
- ns.push(new parser_1.Node(')'));
6408
- return new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6409
- class: 'bracket'
6410
- }, ['(', (0, dom_1.html)('span', {
6411
- class: 'bracket'
6412
- }, (0, dom_1.defrag)((0, util_1.unwrap)(ns))), ')']))]);
6413
- }, ([, bs = new parser_1.List()], context) => {
6409
+ recursion.add(depth);
6410
+ return new parser_1.List([new parser_1.Node((0, dom_1.html)('sup', {
6411
+ class: 'annotation'
6412
+ }, [(0, dom_1.html)('span', (0, dom_1.defrag)((0, util_1.unwrap)((0, visibility_1.trimBlankNodeEnd)(ns))))]))]);
6413
+ }, ([, bs], context) => {
6414
6414
  const {
6415
6415
  source,
6416
6416
  position,
@@ -6420,7 +6420,7 @@ exports.annotation = (0, combinator_1.lazy)(() => (0, combinator_1.constraint)(1
6420
6420
  resources
6421
6421
  } = context;
6422
6422
  const depth = MAX_DEPTH - (resources?.recursions[4 /* Recursion.annotation */] ?? resources?.recursions.at(-1) ?? MAX_DEPTH);
6423
- if (linebreak === 0 && bs.length === 1 && source[position] === ')' && typeof bs.head?.value === 'object') {
6423
+ if (linebreak === 0 && bs && bs.length === 1 && source[position] === ')' && typeof bs.head?.value === 'object') {
6424
6424
  const {
6425
6425
  className
6426
6426
  } = bs.head.value;
@@ -6457,19 +6457,32 @@ exports.annotation = (0, combinator_1.lazy)(() => (0, combinator_1.constraint)(1
6457
6457
  }, [(0, dom_1.html)('span', [bs.head.value])])]))]);
6458
6458
  }
6459
6459
  }
6460
- const str = linebreak === 0 ? source.slice(position - range + 2, position) : '';
6461
- if (linebreak === 0 && bracket_1.indexA.test(str)) {
6462
- return new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6463
- class: 'bracket'
6464
- }, ['((' + str]))]);
6460
+ bs ??= new parser_1.List();
6461
+ bs.unshift(new parser_1.Node('('));
6462
+ if (source[context.position] === ')') {
6463
+ bs.push(new parser_1.Node(')'));
6464
+ context.position += 1;
6465
6465
  }
6466
+ const str = linebreak === 0 ? source.slice(position - range + 2, position) : '';
6467
+ bs = linebreak === 0 && (str === '' || bracket_1.indexA.test(str)) ? new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6468
+ class: 'paren'
6469
+ }, (0, dom_1.defrag)((0, util_1.unwrap)(bs))))]) : new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6470
+ class: 'bracket'
6471
+ }, (0, dom_1.defrag)((0, util_1.unwrap)(bs))))]);
6466
6472
  bs.unshift(new parser_1.Node('('));
6473
+ const cs = parser({
6474
+ context
6475
+ });
6476
+ if (source[context.position] === ')') {
6477
+ cs && bs.import(cs);
6478
+ bs.push(new parser_1.Node(')'));
6479
+ context.position += 1;
6480
+ }
6467
6481
  return new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6468
6482
  class: 'bracket'
6469
- }, ['(', (0, dom_1.html)('span', {
6470
- class: 'bracket'
6471
- }, (0, dom_1.defrag)((0, util_1.unwrap)(bs)))]))]);
6483
+ }, (0, dom_1.defrag)((0, util_1.unwrap)(bs))))]);
6472
6484
  })));
6485
+ const parser = (0, combinator_1.lazy)(() => (0, combinator_1.precedence)(1, (0, combinator_1.some)(inline_1.inline, ')', [[')', 1]])));
6473
6486
  function deepunwrap(list) {
6474
6487
  let bottom = list.head.value;
6475
6488
  for (; bottom;) {
@@ -6800,7 +6813,7 @@ const p1 = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.
6800
6813
  linebreak
6801
6814
  }) => {
6802
6815
  const str = linebreak === 0 ? source.slice(position - range + 1, position - 1) : '';
6803
- return linebreak === 0 && exports.indexA.test(str) ? new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6816
+ return linebreak === 0 && (str === '' || exports.indexA.test(str)) ? new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6804
6817
  class: 'paren'
6805
6818
  }, `(${str})`))]) : new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6806
6819
  class: 'bracket'
@@ -6813,7 +6826,7 @@ const p1 = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.
6813
6826
  linebreak
6814
6827
  } = context;
6815
6828
  const str = linebreak === 0 ? source.slice(position - range + 1, position) : '';
6816
- return linebreak === 0 && exports.indexA.test(str) ? new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6829
+ return linebreak === 0 && (str === '' || exports.indexA.test(str)) ? new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6817
6830
  class: 'paren'
6818
6831
  }, `(${str}`))]) : new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6819
6832
  class: 'bracket'
@@ -6826,7 +6839,7 @@ const p2 = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.
6826
6839
  linebreak
6827
6840
  }) => {
6828
6841
  const str = linebreak === 0 ? source.slice(position - range + 1, position - 1) : '';
6829
- return linebreak === 0 && indexF.test(str) ? new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6842
+ return linebreak === 0 && (str === '' || indexF.test(str)) ? new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6830
6843
  class: 'paren'
6831
6844
  }, `(${str})`))]) : new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6832
6845
  class: 'bracket'
@@ -6839,7 +6852,7 @@ const p2 = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, source_1.
6839
6852
  linebreak
6840
6853
  } = context;
6841
6854
  const str = linebreak === 0 ? source.slice(position - range + 1, position) : '';
6842
- return linebreak === 0 && indexF.test(str) ? new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6855
+ return linebreak === 0 && (str === '' || indexF.test(str)) ? new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6843
6856
  class: 'paren'
6844
6857
  }, `(${str}`))]) : new parser_1.List([new parser_1.Node((0, dom_1.html)('span', {
6845
6858
  class: 'bracket'
@@ -7960,12 +7973,12 @@ exports.reference = (0, combinator_1.lazy)(() => (0, combinator_1.constraint)(64
7960
7973
  range,
7961
7974
  linebreak
7962
7975
  } = context;
7963
- if (linebreak === 0) {
7964
- return new parser_1.List([new parser_1.Node((0, dom_1.html)('sup', attributes(ns), [(0, dom_1.html)('span', (0, dom_1.defrag)((0, util_1.unwrap)((0, visibility_1.trimBlankNodeEnd)(ns))))]))]);
7965
- } else {
7966
- const head = position - range;
7976
+ const head = position - range;
7977
+ if (linebreak !== 0) {
7967
7978
  (0, combinator_1.setBacktrack)(context, 2 | 64 /* Backtrack.link */, head, 2);
7979
+ return;
7968
7980
  }
7981
+ return new parser_1.List([new parser_1.Node((0, dom_1.html)('sup', attributes(ns), [(0, dom_1.html)('span', (0, dom_1.defrag)((0, util_1.unwrap)((0, visibility_1.trimBlankNodeEnd)(ns))))]))]);
7969
7982
  }, (_, context) => {
7970
7983
  const {
7971
7984
  source,
@@ -8480,6 +8493,9 @@ function build(syntax, list, query, marker, splitter = '') {
8480
8493
  'data-marker': note ? undefined : marker(total + defs.size + 1, abbr)
8481
8494
  }, [content, (0, dom_1.html)('sup')]) : defs.get(identifier);
8482
8495
  initial && defs.set(identifier, def);
8496
+ if (!initial && content.innerHTML.length > def.firstElementChild.innerHTML.length) {
8497
+ def.firstElementChild.replaceWith(content);
8498
+ }
8483
8499
  const defIndex = initial ? info.defIndex = total + defs.size : info.defIndex;
8484
8500
  const title = info.title ||= text;
8485
8501
  (0, dom_1.define)(ref, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.297.6",
3
+ "version": "0.297.7",
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",
@@ -307,7 +307,7 @@ describe('Unit: parser/api/parse', () => {
307
307
  // ]);
308
308
  assert.deepStrictEqual(
309
309
  [...parse(`${'('.repeat(20)}0`).children].map(el => el.outerHTML),
310
- [`<p>${'<span class="bracket">('.repeat(19)}(0${'</span>'.repeat(19)}</p>`]);
310
+ [`<p>${'<span class="bracket">('.repeat(19)}<span class="paren">(0</span>${'</span>'.repeat(19)}</p>`]);
311
311
  assert.deepStrictEqual(
312
312
  [...parse(`${'('.repeat(21)}0`).children].map(el => el.outerHTML.replace(/:\w+/, ':rnd')),
313
313
  [
@@ -33,7 +33,7 @@ describe('Unit: parser/block/table', () => {
33
33
  assert.deepStrictEqual(inspect(parser, input('|||\n|-|-|\n|||', new Context())), [['<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td></td><td></td></tr></tbody></table>'], '']);
34
34
  assert.deepStrictEqual(inspect(parser, input('|"|\n|-\n|', new Context())), [['<table><thead><tr><th>"</th></tr></thead><tbody><tr></tr></tbody></table>'], '']);
35
35
  assert.deepStrictEqual(inspect(parser, input('|`|`|\n|-\n|', new Context())), [['<table><thead><tr><th><code data-src="`|`">|</code></th></tr></thead><tbody><tr></tr></tbody></table>'], '']);
36
- assert.deepStrictEqual(inspect(parser, input('|((|\n|-\n|', new Context())), [['<table><thead><tr><th><span class="bracket">(<span class="bracket">(</span></span></th></tr></thead><tbody><tr></tr></tbody></table>'], '']);
36
+ assert.deepStrictEqual(inspect(parser, input('|((|\n|-\n|', new Context())), [['<table><thead><tr><th><span class="bracket">(<span class="paren">(</span></span></th></tr></thead><tbody><tr></tr></tbody></table>'], '']);
37
37
  assert.deepStrictEqual(inspect(parser, input('|a|b|\n|-|-|\n|1|2|', new Context())), [['<table><thead><tr><th>a</th><th>b</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'], '']);
38
38
  assert.deepStrictEqual(inspect(parser, input('|a|b\n|-|-\n|1|2', new Context())), [['<table><thead><tr><th>a</th><th>b</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'], '']);
39
39
  assert.deepStrictEqual(inspect(parser, input('|a|\n|-|\n|1|', new Context())), [['<table><thead><tr><th>a</th></tr></thead><tbody><tr><td>1</td></tr></tbody></table>'], '']);
@@ -13,9 +13,15 @@ describe('Unit: parser/inline/annotation', () => {
13
13
  assert.deepStrictEqual(inspect(parser, input('(', new Context())), undefined);
14
14
  assert.deepStrictEqual(inspect(parser, input('()', new Context())), undefined);
15
15
  assert.deepStrictEqual(inspect(parser, input('((', new Context())), undefined);
16
- assert.deepStrictEqual(inspect(parser, input('(())', new Context())), [['<span class="bracket">(<span class="bracket">(</span></span>'], '))']);
17
- assert.deepStrictEqual(inspect(parser, input('(()))', new Context())), [['<span class="bracket">(<span class="bracket">(</span></span>'], ')))']);
16
+ assert.deepStrictEqual(inspect(parser, input('(())', new Context())), [['<span class="bracket">(<span class="paren">()</span>)</span>'], '']);
17
+ assert.deepStrictEqual(inspect(parser, input('(()))', new Context())), [['<span class="bracket">(<span class="paren">()</span>)</span>'], ')']);
18
18
  assert.deepStrictEqual(inspect(parser, input('(("))', new Context())), [['<span class="bracket">(<span class="bracket">("))</span></span>'], '']);
19
+ assert.deepStrictEqual(inspect(parser, input('((a', new Context())), [['<span class="bracket">(<span class="paren">(a</span></span>'], '']);
20
+ assert.deepStrictEqual(inspect(parser, input('((!', new Context())), [['<span class="bracket">(<span class="bracket">(!</span></span>'], '']);
21
+ assert.deepStrictEqual(inspect(parser, input('((a)', new Context())), [['<span class="bracket">(<span class="paren">(a)</span></span>'], '']);
22
+ assert.deepStrictEqual(inspect(parser, input('((!)', new Context())), [['<span class="bracket">(<span class="bracket">(!)</span></span>'], '']);
23
+ assert.deepStrictEqual(inspect(parser, input('((a)b)', new Context())), [['<span class="bracket">(<span class="paren">(a)</span>b)</span>'], '']);
24
+ assert.deepStrictEqual(inspect(parser, input('((!)b)', new Context())), [['<span class="bracket">(<span class="bracket">(!)</span>b)</span>'], '']);
19
25
  assert.deepStrictEqual(inspect(parser, input('(([))', new Context())), [['<span class="bracket">(<span class="bracket">([))</span></span>'], '']);
20
26
  assert.deepStrictEqual(inspect(parser, input('(([%))', new Context())), [['<span class="bracket">(<span class="bracket">([%))</span></span>'], '']);
21
27
  assert.deepStrictEqual(inspect(parser, input('(( ))', new Context())), undefined);
@@ -31,9 +37,7 @@ describe('Unit: parser/inline/annotation', () => {
31
37
  assert.deepStrictEqual(inspect(parser, input('((a\nb))', new Context())), [['<span class="bracket">(<span class="bracket">(a<br>b)</span>)</span>'], '']);
32
38
  assert.deepStrictEqual(inspect(parser, input('((a\\\nb))', new Context())), [['<span class="bracket">(<span class="bracket">(a<br>b)</span>)</span>'], '']);
33
39
  assert.deepStrictEqual(inspect(parser, input('((*a\nb*))', new Context())), [['<span class="bracket">(<span class="bracket">(<em>a<br>b</em>)</span>)</span>'], '']);
34
- assert.deepStrictEqual(inspect(parser, input('((\\))', new Context())), [['<span class="bracket">(<span class="bracket">()</span></span>'], ')']);
35
- assert.deepStrictEqual(inspect(parser, input('((a)b))', new Context())), [['<span class="bracket">((a</span>'], ')b))']);
36
- assert.deepStrictEqual(inspect(parser, input('((!)b))', new Context())), [['<span class="bracket">(<span class="bracket">(!</span></span>'], ')b))']);
40
+ assert.deepStrictEqual(inspect(parser, input('((\\))', new Context())), [['<span class="bracket">(<span class="bracket">())</span></span>'], '']);
37
41
  assert.deepStrictEqual(inspect(parser, input('(((a))', new Context())), [['<span class="bracket">(<sup class="annotation"><span>a</span></sup></span>'], '']);
38
42
  assert.deepStrictEqual(inspect(parser, input('(((!))', new Context())), [['<span class="bracket">(<sup class="annotation"><span>!</span></sup></span>'], '']);
39
43
  assert.deepStrictEqual(inspect(parser, input('(((*a*))', new Context())), [['<span class="bracket">(<sup class="annotation"><span><em>a</em></span></sup></span>'], '']);
@@ -57,6 +61,8 @@ describe('Unit: parser/inline/annotation', () => {
57
61
  assert.deepStrictEqual(inspect(parser, input('((@a))', new Context())), [['<sup class="annotation"><span><a class="account" href="/@a">@a</a></span></sup>'], '']);
58
62
  assert.deepStrictEqual(inspect(parser, input('((http://host))', new Context())), [['<sup class="annotation"><span><a class="url" href="http://host" target="_blank">http://host</a></span></sup>'], '']);
59
63
  assert.deepStrictEqual(inspect(parser, input('((![]{a}))', new Context())), [['<sup class="annotation"><span>!<a class="url" href="a">a</a></span></sup>'], '']);
64
+ assert.deepStrictEqual(inspect(parser, input('((a(())))', new Context())), [['<sup class="annotation"><span>a<span class="bracket">(<span class="paren">()</span>)</span></span></sup>'], '']);
65
+ assert.deepStrictEqual(inspect(parser, input('((a[[]]))', new Context())), [['<sup class="annotation"><span>a[[]]</span></sup>'], '']);
60
66
  assert.deepStrictEqual(inspect(parser, input('(([[a] ]))', new Context())), [['<sup class="annotation"><span>[[a] ]</span></sup>'], '']);
61
67
  assert.deepStrictEqual(inspect(parser, input('(((a)))', new Context())), [['<sup class="annotation"><span><span class="paren">(a)</span></span></sup>'], '']);
62
68
  assert.deepStrictEqual(inspect(parser, input('((((a))))', new Context())), [['<sup class="annotation"><span><sup class="annotation"><span>a</span></sup></span></sup>'], '']);
@@ -31,19 +31,19 @@ export const annotation: AnnotationParser = lazy(() => constraint(State.annotati
31
31
  false, [],
32
32
  ([, ns], context) => {
33
33
  const { linebreak, recursion, resources } = context;
34
- const depth = MAX_DEPTH - (resources?.recursions[Recursion.annotation] ?? resources?.recursions.at(-1) ?? MAX_DEPTH);
35
- if (linebreak === 0) {
36
- recursion.add(depth);
37
- return new List([new Node(html('sup', { class: 'annotation' }, [html('span', defrag(unwrap(trimBlankNodeEnd(ns))))]))]);
34
+ if (linebreak !== 0) {
35
+ ns.unshift(new Node('('));
36
+ ns.push(new Node(')'));
37
+ return new List([new Node(html('span', { class: 'bracket' }, ['(', html('span', { class: 'bracket' }, defrag(unwrap(ns))), ')']))]);
38
38
  }
39
- ns.unshift(new Node('('));
40
- ns.push(new Node(')'));
41
- return new List([new Node(html('span', { class: 'bracket' }, ['(', html('span', { class: 'bracket' }, defrag(unwrap(ns))), ')']))]);
39
+ const depth = MAX_DEPTH - (resources?.recursions[Recursion.annotation] ?? resources?.recursions.at(-1) ?? MAX_DEPTH);
40
+ recursion.add(depth);
41
+ return new List([new Node(html('sup', { class: 'annotation' }, [html('span', defrag(unwrap(trimBlankNodeEnd(ns))))]))]);
42
42
  },
43
- ([, bs = new List()], context) => {
43
+ ([, bs], context) => {
44
44
  const { source, position, range, linebreak, recursion, resources } = context;
45
45
  const depth = MAX_DEPTH - (resources?.recursions[Recursion.annotation] ?? resources?.recursions.at(-1) ?? MAX_DEPTH);
46
- if (linebreak === 0 && bs.length === 1 && source[position] === ')' && typeof bs.head?.value === 'object') {
46
+ if (linebreak === 0 && bs && bs.length === 1 && source[position] === ')' && typeof bs.head?.value === 'object') {
47
47
  const { className } = bs.head.value;
48
48
  if (className === 'paren' || className === 'bracket') {
49
49
  const { firstChild, lastChild } = bs.head.value;
@@ -71,14 +71,28 @@ export const annotation: AnnotationParser = lazy(() => constraint(State.annotati
71
71
  return new List([new Node(html('span', { class: 'bracket' }, ['(', html('sup', { class: 'annotation' }, [html('span', [bs.head.value])])]))]);
72
72
  }
73
73
  }
74
- const str = linebreak === 0 ? source.slice(position - range + 2, position) : '';
75
- if (linebreak === 0 && indexA.test(str)) {
76
- return new List([new Node(html('span', { class: 'bracket' }, ['((' + str]))]);
74
+ bs ??= new List();
75
+ bs.unshift(new Node('('));
76
+ if (source[context.position] === ')') {
77
+ bs.push(new Node(')'));
78
+ context.position += 1;
77
79
  }
80
+ const str = linebreak === 0 ? source.slice(position - range + 2, position) : '';
81
+ bs = linebreak === 0 && (str === '' || indexA.test(str))
82
+ ? new List([new Node(html('span', { class: 'paren' }, defrag(unwrap(bs))))])
83
+ : new List([new Node(html('span', { class: 'bracket' }, defrag(unwrap(bs))))]);
78
84
  bs.unshift(new Node('('));
79
- return new List([new Node(html('span', { class: 'bracket' }, ['(', html('span', { class: 'bracket' }, defrag(unwrap(bs)))]))]);
85
+ const cs = parser({ context });
86
+ if (source[context.position] === ')') {
87
+ cs && bs.import(cs);
88
+ bs.push(new Node(')'));
89
+ context.position += 1;
90
+ }
91
+ return new List([new Node(html('span', { class: 'bracket' }, defrag(unwrap(bs))))]);
80
92
  })));
81
93
 
94
+ const parser = lazy(() => precedence(1, some(inline, ')', [[')', 1]])));
95
+
82
96
  function deepunwrap(list: List<Node<string | HTMLElement>>): boolean {
83
97
  let bottom = list.head!.value as HTMLElement;
84
98
  for (; bottom;) {
@@ -9,8 +9,8 @@ describe('Unit: parser/inline/bracket', () => {
9
9
  const parser = some(bracket);
10
10
 
11
11
  it('(', () => {
12
- assert.deepStrictEqual(inspect(parser, input('(', new Context())), [['<span class="bracket">(</span>'], '']);
13
- assert.deepStrictEqual(inspect(parser, input('()', new Context())), [['<span class="bracket">()</span>'], '']);
12
+ assert.deepStrictEqual(inspect(parser, input('(', new Context())), [['<span class="paren">(</span>'], '']);
13
+ assert.deepStrictEqual(inspect(parser, input('()', new Context())), [['<span class="paren">()</span>'], '']);
14
14
  assert.deepStrictEqual(inspect(parser, input('(a', new Context())), [['<span class="paren">(a</span>'], '']);
15
15
  assert.deepStrictEqual(inspect(parser, input('(0)', new Context())), [['<span class="paren">(0)</span>'], '']);
16
16
  assert.deepStrictEqual(inspect(parser, input('(1)', new Context())), [['<span class="paren">(1)</span>'], '']);
@@ -41,7 +41,8 @@ describe('Unit: parser/inline/bracket', () => {
41
41
  assert.deepStrictEqual(inspect(parser, input('(ABBR, ABBR)', new Context())), [['<span class="paren">(ABBR, ABBR)</span>'], '']);
42
42
  assert.deepStrictEqual(inspect(parser, input('(\\a)', new Context())), [['<span class="bracket">(a)</span>'], '']);
43
43
  assert.deepStrictEqual(inspect(parser, input('(==)', new Context())), [['<span class="bracket">(==)</span>'], '']);
44
- assert.deepStrictEqual(inspect(parser, input('("(\n))"(")', new Context())), [['<span class="bracket">("<span class="bracket">(</span><br>)</span>'], ')"(")']);
44
+ assert.deepStrictEqual(inspect(parser, input('(()', new Context())), [['<span class="bracket">(<span class="paren">()</span></span>'], '']);
45
+ assert.deepStrictEqual(inspect(parser, input('("(\n))"(")', new Context())), [['<span class="bracket">("<span class="paren">(</span><br>)</span>'], ')"(")']);
45
46
  assert.deepStrictEqual(inspect(parser, input('($)$', new Context())), [['<span class="bracket">(<span class="math" translate="no" data-src="$)$">$)$</span></span>'], '']);
46
47
  assert.deepStrictEqual(inspect(parser, input(')', new Context())), undefined);
47
48
  assert.deepStrictEqual(inspect(parser, input('(1,2)', new Context())), [['<span class="paren">(1,2)</span>'], '']);
@@ -80,10 +81,10 @@ describe('Unit: parser/inline/bracket', () => {
80
81
  assert.deepStrictEqual(inspect(parser, input('""', new Context())), [['"', '"'], '']);
81
82
  assert.deepStrictEqual(inspect(parser, input('"a', new Context())), [['"', 'a'], '']);
82
83
  assert.deepStrictEqual(inspect(parser, input('"a"', new Context())), [['"', 'a', '"'], '']);
83
- assert.deepStrictEqual(inspect(parser, input('"(")"', new Context())), [['"', '<span class="bracket">(</span>', '"'], ')"']);
84
- assert.deepStrictEqual(inspect(parser, input('"(("', new Context())), [['"', '<span class="bracket">(<span class="bracket">(</span></span>', '"'], '']);
84
+ assert.deepStrictEqual(inspect(parser, input('"(")"', new Context())), [['"', '<span class="paren">(</span>', '"'], ')"']);
85
+ assert.deepStrictEqual(inspect(parser, input('"(("', new Context())), [['"', '<span class="bracket">(<span class="paren">(</span></span>', '"'], '']);
85
86
  assert.deepStrictEqual(inspect(parser, input('"(\\")"', new Context())), [['"', '<span class="bracket">(")</span>', '"'], '']);
86
- assert.deepStrictEqual(inspect(parser, input('"(\n)"(")', new Context())), [['"', '<span class="bracket">(</span>'], '\n)"(")']);
87
+ assert.deepStrictEqual(inspect(parser, input('"(\n)"(")', new Context())), [['"', '<span class="paren">(</span>'], '\n)"(")']);
87
88
  assert.deepStrictEqual(inspect(parser, input('"\n"', new Context())), [['"'], '\n"']);
88
89
  assert.deepStrictEqual(inspect(parser, input('"\n"(")', new Context())), [['"'], '\n"(")']);
89
90
  });
@@ -41,14 +41,14 @@ const p1 = lazy(() => surround(
41
41
  true, [],
42
42
  ([as, bs = [], cs], { source, position, range, linebreak }) => {
43
43
  const str = linebreak === 0 ? source.slice(position - range + 1, position - 1) : '';
44
- return linebreak === 0 && indexA.test(str)
44
+ return linebreak === 0 && (str === '' || indexA.test(str))
45
45
  ? new List([new Node(html('span', { class: 'paren' }, `(${str})`))])
46
46
  : new List([new Node(html('span', { class: 'bracket' }, defrag(unwrap(as.import(bs as List<Node<string>>).import(cs)))))]);
47
47
  },
48
48
  ([as, bs = new List()], context) => {
49
49
  const { source, position, range, linebreak } = context;
50
50
  const str = linebreak === 0 ? source.slice(position - range + 1, position) : '';
51
- return linebreak === 0 && indexA.test(str)
51
+ return linebreak === 0 && (str === '' || indexA.test(str))
52
52
  ? new List([new Node(html('span', { class: 'paren' }, `(${str}`))])
53
53
  : new List([new Node(html('span', { class: 'bracket' }, defrag(unwrap(as.import(bs as List<Node<string>>)))))]);
54
54
  }));
@@ -60,14 +60,14 @@ const p2 = lazy(() => surround(
60
60
  true, [],
61
61
  ([as, bs = [], cs], { source, position, range, linebreak }) => {
62
62
  const str = linebreak === 0 ? source.slice(position - range + 1, position - 1) : '';
63
- return linebreak === 0 && indexF.test(str)
63
+ return linebreak === 0 && (str === '' || indexF.test(str))
64
64
  ? new List([new Node(html('span', { class: 'paren' }, `(${str})`))])
65
65
  : new List([new Node(html('span', { class: 'bracket' }, defrag(unwrap(as.import(bs as List<Node<string>>).import(cs)))))]);
66
66
  },
67
67
  ([as, bs = new List()], context) => {
68
68
  const { source, position, range, linebreak } = context;
69
69
  const str = linebreak === 0 ? source.slice(position - range + 1, position) : '';
70
- return linebreak === 0 && indexF.test(str)
70
+ return linebreak === 0 && (str === '' || indexF.test(str))
71
71
  ? new List([new Node(html('span', { class: 'paren' }, `(${str}`))])
72
72
  : new List([new Node(html('span', { class: 'bracket' }, defrag(unwrap(as.import(bs as List<Node<string>>)))))]);
73
73
  }));
@@ -15,6 +15,7 @@ const MAX = 60;
15
15
  const ELLIPSIS = '...';
16
16
  const PART = (MAX - ELLIPSIS.length) / 2 | 0;
17
17
  const REM = MAX - PART * 2 - ELLIPSIS.length;
18
+ assert(PART * 2 + REM + ELLIPSIS.length === MAX);
18
19
  const table = [
19
20
  ...[...Array(36)].map((_, i) => i.toString(36)),
20
21
  ...[...Array(36)].map((_, i) => i.toString(36).toUpperCase()).slice(-26),
@@ -15,6 +15,9 @@ describe('Unit: parser/inline/reference', () => {
15
15
  assert.deepStrictEqual(inspect(parser, input('[[', new Context())), undefined);
16
16
  assert.deepStrictEqual(inspect(parser, input('[[]]', new Context())), undefined);
17
17
  assert.deepStrictEqual(inspect(parser, input('[[]]]', new Context())), undefined);
18
+ assert.deepStrictEqual(inspect(parser, input('[[a', new Context())), undefined);
19
+ assert.deepStrictEqual(inspect(parser, input('[[a]', new Context())), undefined);
20
+ assert.deepStrictEqual(inspect(parser, input('[[a]b]', new Context())), undefined);
18
21
  assert.deepStrictEqual(inspect(parser, input('[["]]', new Context())), undefined);
19
22
  assert.deepStrictEqual(inspect(parser, input('[[(]]', new Context())), undefined);
20
23
  assert.deepStrictEqual(inspect(parser, input('[[[%]]', new Context())), undefined);
@@ -51,6 +54,7 @@ describe('Unit: parser/inline/reference', () => {
51
54
  assert.deepStrictEqual(inspect(parser, input('[[@a]]', new Context())), [['<sup class="reference"><span><a class="account" href="/@a">@a</a></span></sup>'], '']);
52
55
  assert.deepStrictEqual(inspect(parser, input('[[http://host]]', new Context())), [['<sup class="reference"><span><a class="url" href="http://host" target="_blank">http://host</a></span></sup>'], '']);
53
56
  assert.deepStrictEqual(inspect(parser, input('[[![]{a}]]', new Context())), [['<sup class="reference"><span>!<a class="url" href="a">a</a></span></sup>'], '']);
57
+ assert.deepStrictEqual(inspect(parser, input('[[a[[]]]]', new Context())), [['<sup class="reference"><span>a[[]]</span></sup>'], '']);
54
58
  assert.deepStrictEqual(inspect(parser, input('[[[a]]]', new Context())), [['<sup class="reference"><span>[a]</span></sup>'], '']);
55
59
  assert.deepStrictEqual(inspect(parser, input('[[[[a]]]]', new Context())), [['<sup class="reference"><span>[[a]]</span></sup>'], '']);
56
60
  assert.deepStrictEqual(inspect(parser, input('[[((a))]]', new Context())), [['<sup class="reference"><span><span class="bracket">(<span class="paren">(a)</span>)</span></span></sup>'], '']);
@@ -21,13 +21,12 @@ export const reference: ReferenceParser = lazy(() => constraint(State.reference,
21
21
  [2, 1 | Backtrack.common, 3 | Backtrack.doublebracket],
22
22
  ([, ns], context) => {
23
23
  const { position, range, linebreak } = context;
24
- if (linebreak === 0) {
25
- return new List([new Node(html('sup', attributes(ns), [html('span', defrag(unwrap(trimBlankNodeEnd(ns))))]))]);
26
- }
27
- else {
28
- const head = position - range;
24
+ const head = position - range;
25
+ if (linebreak !== 0) {
29
26
  setBacktrack(context, 2 | Backtrack.link, head, 2);
27
+ return;
30
28
  }
29
+ return new List([new Node(html('sup', attributes(ns), [html('span', defrag(unwrap(trimBlankNodeEnd(ns))))]))]);
31
30
  },
32
31
  (_, context): undefined => {
33
32
  const { source, position, range, linebreak } = context;
@@ -83,11 +83,11 @@ describe('Unit: parser/inline', () => {
83
83
  assert.deepStrictEqual(inspect(parser, input('*++ a ++*', new Context())), [['<em><ins> a </ins></em>'], '']);
84
84
  assert.deepStrictEqual(inspect(parser, input('*<bdi>`a`</bdi>*', new Context())), [['<em><bdi><code data-src="`a`">a</code></bdi></em>'], '']);
85
85
  assert.deepStrictEqual(inspect(parser, input('*a"\nb*', new Context())), [['<em>a"<br>b</em>'], '']);
86
- assert.deepStrictEqual(inspect(parser, input('*a"\n"("b*', new Context())), [['<em>a"<br>"<span class="bracket">(</span>"b</em>'], '']);
86
+ assert.deepStrictEqual(inspect(parser, input('*a"\n"("b*', new Context())), [['<em>a"<br>"<span class="paren">(</span>"b</em>'], '']);
87
87
  assert.deepStrictEqual(inspect(parser, input('"*a\nb*', new Context())), [['"', '*', 'a', '<br>', 'b', '*'], '']);
88
88
  assert.deepStrictEqual(inspect(parser, input('"*a\n""b*', new Context())), [['"', '*', 'a', '<br>', '"', '"', 'b', '*'], '']);
89
89
  assert.deepStrictEqual(inspect(parser, input('"a\n"*b"c*', new Context())), [['"', 'a', '<br>', '"', '*', 'b', '"', 'c', '*'], '']);
90
- assert.deepStrictEqual(inspect(parser, input('"*a**b\nc**"("*', new Context())), [['"', '*', 'a', '**', 'b', '<br>', 'c', '**', '"', '<span class="bracket">(</span>', '"', '*'], '']);
90
+ assert.deepStrictEqual(inspect(parser, input('"*a**b\nc**"("*', new Context())), [['"', '*', 'a', '**', 'b', '<br>', 'c', '**', '"', '<span class="paren">(</span>', '"', '*'], '']);
91
91
  assert.deepStrictEqual(inspect(parser, input('[% a"\nb %]', new Context())), [['<span class="remark"><input type="checkbox"><span>[% a"<br>b %]</span></span>'], '']);
92
92
  assert.deepStrictEqual(inspect(parser, input('"<bdi>"a\n""b</bdi>"', new Context())), [['"', '<span class="invalid">&lt;bdi&gt;</span>', '"', 'a', '<br>', '"', '"', 'b', '</bdi', '>', '"'], '']);
93
93
  assert.deepStrictEqual(inspect(parser, input('<bdi>*<bdi>a</bdi>*</bdi>', new Context())), [['<bdi><em><bdi>a</bdi></em></bdi>'], '']);
@@ -140,7 +140,7 @@ describe('Unit: parser/inline', () => {
140
140
  assert.deepStrictEqual(inspect(parser, input('(([["*(*"] ]))', new Context())), [['<sup class="annotation"><span>[["*<span class="bracket">(*</span>"] ]</span></sup>'], '']);
141
141
  assert.deepStrictEqual(inspect(parser, input('(([:a\n]', new Context())), [['<span class="bracket">(<span class="bracket">(<span class="invalid">[:a\n]</span></span></span>'], '']);
142
142
  assert.deepStrictEqual(inspect(parser, input('(({{\n}}', new Context())), [['<span class="bracket">(<span class="bracket">(<span class="template">{{<br>}}</span></span></span>'], '']);
143
- assert.deepStrictEqual(inspect(parser, input('"((""))', new Context())), [['"', '<span class="bracket">(<span class="bracket">(</span></span>', '"', '"', ')', ')'], '']);
143
+ assert.deepStrictEqual(inspect(parser, input('"((""))', new Context())), [['"', '<span class="bracket">(<span class="paren">(</span></span>', '"', '"', ')', ')'], '']);
144
144
  assert.deepStrictEqual(inspect(parser, input('[[[a]]', new Context())), [['[', '<sup class="reference"><span>a</span></sup>'], '']);
145
145
  assert.deepStrictEqual(inspect(parser, input('[[[[a]]', new Context())), [['[', '[', '<sup class="reference"><span>a</span></sup>'], '']);
146
146
  assert.deepStrictEqual(inspect(parser, input('[[[[a]]]]', new Context())), [['<sup class="reference"><span>[[a]]</span></sup>'], '']);
@@ -154,6 +154,9 @@ function build(
154
154
  : defs.get(identifier)!;
155
155
  initial && defs.set(identifier, def);
156
156
  assert(def.lastElementChild?.matches('sup'));
157
+ if (!initial && content.innerHTML.length > def.firstElementChild!.innerHTML.length) {
158
+ def.firstElementChild!.replaceWith(content);
159
+ }
157
160
  const defIndex = initial
158
161
  ? info.defIndex = total + defs.size
159
162
  : info.defIndex;