securemark 0.233.0 → 0.233.3

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,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.233.3
4
+
5
+ - Refactoring.
6
+
7
+ ## 0.233.2
8
+
9
+ - Refactoring.
10
+
11
+ ## 0.233.1
12
+
13
+ - Refactoring.
14
+
3
15
  ## 0.233.0
4
16
 
5
17
  - Refine comment parser.
@@ -1,4 +1,4 @@
1
- /*! securemark v0.233.0 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED */
1
+ /*! securemark v0.233.3 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) {
@@ -4467,22 +4467,19 @@ require = function () {
4467
4467
  const typed_dom_1 = _dereq_('typed-dom');
4468
4468
  const url_1 = _dereq_('spica/url');
4469
4469
  function parse(source, opts = {}, context) {
4470
- var _a, _b, _c, _d, _e, _f, _g, _h;
4470
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
4471
4471
  if (!(0, segment_1.validate)(source, segment_1.MAX_SEGMENT_SIZE))
4472
4472
  throw new Error(`Too large input over ${ segment_1.MAX_SEGMENT_SIZE.toLocaleString('en') } bytes.`);
4473
4473
  const url = (_b = (_a = (0, header_2.headers)(source).find(field => field.toLowerCase().startsWith('url:'))) === null || _a === void 0 ? void 0 : _a.slice(4).trim()) !== null && _b !== void 0 ? _b : '';
4474
4474
  source = !context ? (0, normalize_1.normalize)(source) : source;
4475
- context = context && url === '' && context.id === opts.id ? context : (0, alias_1.ObjectAssign)({
4476
- ...context,
4477
- ...opts
4478
- }, {
4475
+ context = context && url === '' && context.id === opts.id ? context : (0, alias_1.ObjectAssign)((0, alias_1.ObjectCreate)(context !== null && context !== void 0 ? context : {}), opts, {
4479
4476
  host: (_d = (_c = opts.host) !== null && _c !== void 0 ? _c : context === null || context === void 0 ? void 0 : context.host) !== null && _d !== void 0 ? _d : new url_1.ReadonlyURL(global_1.location.pathname, global_1.location.origin),
4480
4477
  url: url ? new url_1.ReadonlyURL(url) : context === null || context === void 0 ? void 0 : context.url,
4481
4478
  id: (_e = opts.id) !== null && _e !== void 0 ? _e : context === null || context === void 0 ? void 0 : context.id,
4482
4479
  footnotes: global_1.undefined,
4483
4480
  test: global_1.undefined
4484
4481
  });
4485
- if (((_f = context.host) === null || _f === void 0 ? void 0 : _f.origin) === 'null')
4482
+ if (((_g = context.host) === null || _g === void 0 ? void 0 : _g.origin) === 'null')
4486
4483
  throw new Error(`Invalid host: ${ context.host.href }`);
4487
4484
  const node = (0, typed_dom_1.frag)();
4488
4485
  let index = 0;
@@ -5625,7 +5622,7 @@ require = function () {
5625
5622
  } = {}
5626
5623
  }) => {
5627
5624
  var _a;
5628
- return [delim.length === 2 && closer && param.trimStart() === '' ? ((_a = cache === null || cache === void 0 ? void 0 : cache.get(`\n${ body }`)) === null || _a === void 0 ? void 0 : _a.cloneNode(true)) || (0, typed_dom_1.html)('div', {
5625
+ return [delim.length === 2 && closer && param.trimStart() === '' ? ((_a = cache === null || cache === void 0 ? void 0 : cache.get(`${ delim }\n${ body }${ delim }`)) === null || _a === void 0 ? void 0 : _a.cloneNode(true)) || (0, typed_dom_1.html)('div', {
5629
5626
  class: 'math',
5630
5627
  translate: 'no'
5631
5628
  }, `${ delim }\n${ body }${ delim }`) : (0, typed_dom_1.html)('pre', {
@@ -5847,8 +5844,8 @@ require = function () {
5847
5844
  const source_1 = _dereq_('../../source');
5848
5845
  const typed_dom_1 = _dereq_('typed-dom');
5849
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)([
5850
- (0, source_1.str)(/^>*(?=>>)/),
5851
- (0, combinator_1.validate)(new RegExp(`${ anchor_1.syntax.source }[^\S\n]*(?:$|\n)`), anchor_1.anchor)
5847
+ (0, source_1.str)(/^>*(?=>>[^>\s]+[^\S\n]*(?:$|\n))/),
5848
+ anchor_1.anchor
5852
5849
  ]))), ([el, quotes = '']) => [
5853
5850
  (0, typed_dom_1.html)('span', { class: 'cite' }, (0, typed_dom_1.defrag)([
5854
5851
  `${ quotes }>`,
@@ -6340,24 +6337,21 @@ require = function () {
6340
6337
  function (_dereq_, module, exports) {
6341
6338
  'use strict';
6342
6339
  Object.defineProperty(exports, '__esModule', { value: true });
6343
- exports.anchor = exports.syntax = void 0;
6340
+ exports.anchor = void 0;
6344
6341
  const combinator_1 = _dereq_('../../../combinator');
6345
6342
  const link_1 = _dereq_('../link');
6346
- const source_1 = _dereq_('../../source');
6347
6343
  const typed_dom_1 = _dereq_('typed-dom');
6348
- exports.syntax = /^>>[0-9a-z]+(?:-[0-9a-z]+)*(?![0-9A-Za-z@#:])/;
6349
- exports.anchor = (0, combinator_1.lazy)(() => (0, combinator_1.validate)('>>', (0, combinator_1.fmap)((0, combinator_1.rewrite)((0, source_1.str)(exports.syntax), (0, combinator_1.context)({
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
6345
  syntax: {
6351
6346
  inline: {
6352
6347
  link: true,
6353
6348
  autolink: false
6354
6349
  }
6355
6350
  }
6356
- }, (0, combinator_1.convert)(source => `[${ source }]{ ?comment=${ source.slice(2) } }`, (0, combinator_1.union)([link_1.link])))), ([el]) => [(0, typed_dom_1.define)(el, { class: 'anchor' })])));
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
6352
  },
6358
6353
  {
6359
6354
  '../../../combinator': 27,
6360
- '../../source': 128,
6361
6355
  '../link': 114,
6362
6356
  'typed-dom': 26
6363
6357
  }
@@ -6907,8 +6901,9 @@ require = function () {
6907
6901
  return (0, combinator_1.fmap)(parser, ([el], _, {id}) => [(0, typed_dom_1.define)(el, { id: id !== '' && identity(text(el)) || global_1.undefined })]);
6908
6902
  }
6909
6903
  exports.indexee = indexee;
6910
- function identity(index) {
6911
- return `index:${ index.trim().replace(/\s+/g, '_').slice(0, 101).replace(/^(.{97}).{4}$/, '$1...') }`;
6904
+ function identity(text) {
6905
+ text && (text = text.trim());
6906
+ return text && `index:${ text.replace(/\s+/g, '_').slice(0, 101).replace(/^(.{97}).{4}$/, '$1...') }`;
6912
6907
  }
6913
6908
  exports.identity = identity;
6914
6909
  function text(source) {
@@ -7283,13 +7278,13 @@ require = function () {
7283
7278
  const url_1 = _dereq_('spica/url');
7284
7279
  const optspec = { rel: ['nofollow'] };
7285
7280
  (0, alias_1.ObjectSetPrototypeOf)(optspec, null);
7286
- exports.link = (0, combinator_1.lazy)(() => (0, combinator_1.creator)(10, (0, combinator_1.bind)((0, combinator_1.reverse)((0, combinator_1.validate)([
7281
+ exports.link = (0, combinator_1.lazy)(() => (0, combinator_1.creator)(10, (0, combinator_1.bind)((0, combinator_1.validate)([
7287
7282
  '[',
7288
7283
  '{'
7289
7284
  ], '}', '\n', (0, combinator_1.guard)(context => {
7290
7285
  var _a, _b, _c;
7291
7286
  return (_c = (_b = (_a = context.syntax) === null || _a === void 0 ? void 0 : _a.inline) === null || _b === void 0 ? void 0 : _b.link) !== null && _c !== void 0 ? _c : true;
7292
- }, (0, combinator_1.tails)([
7287
+ }, (0, combinator_1.reverse)((0, combinator_1.tails)([
7293
7288
  (0, combinator_1.context)({ syntax: { inline: { link: false } } }, (0, combinator_1.dup)((0, combinator_1.union)([
7294
7289
  (0, combinator_1.surround)('[', inline_1.media, ']'),
7295
7290
  (0, combinator_1.surround)('[', inline_1.shortmedia, ']'),
@@ -8159,7 +8154,7 @@ require = function () {
8159
8154
  } else {
8160
8155
  (_b = ref.lastChild) === null || _b === void 0 ? void 0 : _b.remove();
8161
8156
  }
8162
- const title = global_1.undefined || titles.get(identifier) || +identifier[0] && ref.title || (0, indexee_1.text)(content).trim() || global_1.undefined;
8157
+ const title = global_1.undefined || titles.get(identifier) || +identifier[0] && ref.title || (0, indexee_1.text)(content).trim() || content.textContent.trim() || global_1.undefined;
8163
8158
  title ? !titles.has(identifier) && titles.set(identifier, title) : buffer.set(identifier, ref);
8164
8159
  const blank = !!abbr && !content.firstChild;
8165
8160
  const refIndex = i + 1;
@@ -8762,11 +8757,7 @@ require = function () {
8762
8757
  function isEndTightNodes(nodes) {
8763
8758
  if (nodes.length === 0)
8764
8759
  return true;
8765
- for (let i = nodes.length; i--;) {
8766
- const node = nodes[i];
8767
- return isVisible(node, -1);
8768
- }
8769
- return false;
8760
+ return isVisible(nodes[nodes.length - 1], -1);
8770
8761
  }
8771
8762
  exports.isEndTightNodes = isEndTightNodes;
8772
8763
  function isVisible(node, strpos) {
package/markdown.d.ts CHANGED
@@ -1057,7 +1057,7 @@ export namespace MarkdownParser {
1057
1057
  export interface UrlParser extends
1058
1058
  // https://host
1059
1059
  Inline<'url'>,
1060
- Parser<HTMLElement, Context, [
1060
+ Parser<HTMLAnchorElement, Context, [
1061
1061
  LinkParser,
1062
1062
  ]> {
1063
1063
  }
package/package-lock.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.233.0",
3
+ "version": "0.233.3",
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.92",
3034
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.92.tgz",
3035
- "integrity": "sha512-YAVbvQIcDE/IJ/vzDMjD484/hsRbFPW2qXJPaYTfOhtligmfYEYOep+5QojpaEU9kq6bMvNeC2aG7arYvTHYsA==",
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==",
3036
3036
  "dev": true
3037
3037
  },
3038
3038
  "elliptic": {
@@ -6359,9 +6359,9 @@
6359
6359
  "dev": true
6360
6360
  },
6361
6361
  "isbinaryfile": {
6362
- "version": "4.0.8",
6363
- "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz",
6364
- "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==",
6362
+ "version": "4.0.10",
6363
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
6364
+ "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
6365
6365
  "dev": true
6366
6366
  },
6367
6367
  "isexe": {
@@ -7092,18 +7092,18 @@
7092
7092
  }
7093
7093
  },
7094
7094
  "make-fetch-happen": {
7095
- "version": "10.0.6",
7096
- "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.0.6.tgz",
7097
- "integrity": "sha512-4Gfh6lV3TLXmj7qz79hBFuvVqjYSMW6v2+sxtdX4LFQU0rK3V/txRjE0DoZb7X0IF3t9f8NO3CxPSWlvdckhVA==",
7095
+ "version": "10.1.0",
7096
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.0.tgz",
7097
+ "integrity": "sha512-HeP4QlkadP/Op+hE+Une1070kcyN85FshQObku3/rmzRh4zDcKXA19d2L3AQR6UoaX3uZmhSOpTLH15b1vOFvQ==",
7098
7098
  "dev": true,
7099
7099
  "requires": {
7100
7100
  "agentkeepalive": "^4.2.1",
7101
- "cacache": "^16.0.0",
7101
+ "cacache": "^16.0.2",
7102
7102
  "http-cache-semantics": "^4.1.0",
7103
7103
  "http-proxy-agent": "^5.0.0",
7104
7104
  "https-proxy-agent": "^5.0.0",
7105
7105
  "is-lambda": "^1.0.1",
7106
- "lru-cache": "^7.5.1",
7106
+ "lru-cache": "^7.7.1",
7107
7107
  "minipass": "^3.1.6",
7108
7108
  "minipass-collect": "^1.0.2",
7109
7109
  "minipass-fetch": "^2.0.3",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.233.0",
3
+ "version": "0.233.3",
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",
@@ -1,5 +1,5 @@
1
1
  import { undefined, location } from 'spica/global';
2
- import { ObjectAssign } from 'spica/alias';
2
+ import { ObjectAssign, ObjectCreate } from 'spica/alias';
3
3
  import { ParserOptions } from '../../..';
4
4
  import { MarkdownParser } from '../../../markdown';
5
5
  import { eval } from '../../combinator/data/parser';
@@ -24,13 +24,14 @@ export function parse(source: string, opts: Options = {}, context?: MarkdownPars
24
24
  assert(!context?.delimiters);
25
25
  context = context && url === '' && context.id === opts.id
26
26
  ? context
27
- : ObjectAssign({ ...context, ...opts }, {
27
+ : ObjectAssign(ObjectCreate(context ?? {}), opts, {
28
28
  host: opts.host ?? context?.host ?? new ReadonlyURL(location.pathname, location.origin),
29
29
  url: url ? new ReadonlyURL(url as ':') : context?.url,
30
30
  id: opts.id ?? context?.id,
31
31
  footnotes: undefined,
32
32
  test: undefined,
33
33
  });
34
+ assert(context.caches === arguments[2]?.caches);
34
35
  if (context.host?.origin === 'null') throw new Error(`Invalid host: ${context.host.href}`);
35
36
  const node = frag();
36
37
  let index = 0;
@@ -25,13 +25,13 @@ describe('Unit: parser/block/blockquote', () => {
25
25
  assert.deepStrictEqual(inspect(parser('> a\nb')), [['<blockquote><pre>a<br>b</pre></blockquote>'], '']);
26
26
  assert.deepStrictEqual(inspect(parser('> a\n b ')), [['<blockquote><pre>a<br> b </pre></blockquote>'], '']);
27
27
  assert.deepStrictEqual(inspect(parser('> a\n>')), [['<blockquote><pre>a<br></pre></blockquote>'], '']);
28
- assert.deepStrictEqual(inspect(parser('> a\n>>1')), [['<blockquote><pre>a<br><a href="?comment=1" class="anchor">&gt;&gt;1</a></pre></blockquote>'], '']);
28
+ assert.deepStrictEqual(inspect(parser('> a\n>>1')), [['<blockquote><pre>a<br><a href="?at=1" class="anchor">&gt;&gt;1</a></pre></blockquote>'], '']);
29
29
  assert.deepStrictEqual(inspect(parser('> a\n> b ')), [['<blockquote><pre>a<br>b </pre></blockquote>'], '']);
30
30
  assert.deepStrictEqual(inspect(parser('> a\n>\n')), [['<blockquote><pre>a<br></pre></blockquote>'], '']);
31
31
  assert.deepStrictEqual(inspect(parser('> a\n>\nb')), [['<blockquote><pre>a<br><br>b</pre></blockquote>'], '']);
32
32
  assert.deepStrictEqual(inspect(parser('> a\n>\n b ')), [['<blockquote><pre>a<br><br> b </pre></blockquote>'], '']);
33
33
  assert.deepStrictEqual(inspect(parser('> a\n>\n>')), [['<blockquote><pre>a<br><br></pre></blockquote>'], '']);
34
- assert.deepStrictEqual(inspect(parser('> a\n>\n>>1')), [['<blockquote><pre>a<br><br><a href="?comment=1" class="anchor">&gt;&gt;1</a></pre></blockquote>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('> a\n>\n>>1')), [['<blockquote><pre>a<br><br><a href="?at=1" class="anchor">&gt;&gt;1</a></pre></blockquote>'], '']);
35
35
  assert.deepStrictEqual(inspect(parser('> a\n>\n> b ')), [['<blockquote><pre>a<br><br>b </pre></blockquote>'], '']);
36
36
  assert.deepStrictEqual(inspect(parser('> a\\\nb')), [['<blockquote><pre>a\\<br>b</pre></blockquote>'], '']);
37
37
  assert.deepStrictEqual(inspect(parser('> a ')), [['<blockquote><pre> a </pre></blockquote>'], '']);
@@ -44,8 +44,8 @@ describe('Unit: parser/block/blockquote', () => {
44
44
  assert.deepStrictEqual(inspect(parser('> !http://host')), [['<blockquote><pre>!<a href="http://host" target="_blank">http://host</a></pre></blockquote>'], '']);
45
45
  assert.deepStrictEqual(inspect(parser('> #a')), [['<blockquote><pre><a href="/hashtags/a" class="hashtag">#a</a></pre></blockquote>'], '']);
46
46
  assert.deepStrictEqual(inspect(parser('> @a#b')), [['<blockquote><pre><a href="/@a?ch=b" class="channel">@a#b</a></pre></blockquote>'], '']);
47
- assert.deepStrictEqual(inspect(parser('> >>1\n> > b')), [['<blockquote><pre><a href="?comment=1" class="anchor">&gt;&gt;1</a><br>&gt; b</pre></blockquote>'], '']);
48
- assert.deepStrictEqual(inspect(parser('> >>1\n> > b\n> c')), [['<blockquote><pre><a href="?comment=1" class="anchor">&gt;&gt;1</a><br>&gt; b<br>c</pre></blockquote>'], '']);
47
+ assert.deepStrictEqual(inspect(parser('> >>1\n> > b')), [['<blockquote><pre><a href="?at=1" class="anchor">&gt;&gt;1</a><br>&gt; b</pre></blockquote>'], '']);
48
+ assert.deepStrictEqual(inspect(parser('> >>1\n> > b\n> c')), [['<blockquote><pre><a href="?at=1" class="anchor">&gt;&gt;1</a><br>&gt; b<br>c</pre></blockquote>'], '']);
49
49
  });
50
50
 
51
51
  it('nest', () => {
@@ -16,7 +16,7 @@ export const mathblock: MathBlockParser = block(validate('$$', fmap(
16
16
  // Bug: Type mismatch between outer and inner.
17
17
  ([body, closer, opener, delim, param]: string[], _, { caches: { math: cache = undefined } = {} }) => [
18
18
  delim.length === 2 && closer && param.trimStart() === ''
19
- ? cache?.get(`\n${body}`)?.cloneNode(true) as HTMLDivElement ||
19
+ ? cache?.get(`${delim}\n${body}${delim}`)?.cloneNode(true) as HTMLDivElement ||
20
20
  html('div', { class: 'math', translate: 'no' }, `${delim}\n${body}${delim}`)
21
21
  : html('pre', {
22
22
  class: 'invalid',
@@ -29,21 +29,21 @@ describe('Unit: parser/block/paragraph', () => {
29
29
  });
30
30
 
31
31
  it('anchor', () => {
32
- assert.deepStrictEqual(inspect(parser('>>1 a\nb')), [['<p><a href="?comment=1" class="anchor">&gt;&gt;1</a> a<br>b</p>'], '']);
33
- assert.deepStrictEqual(inspect(parser('>>1 a\n>>2')), [['<p><a href="?comment=1" class="anchor">&gt;&gt;1</a> a<br><a href="?comment=2" class="anchor">&gt;&gt;2</a></p>'], '']);
34
- assert.deepStrictEqual(inspect(parser('>>1 a\n>>b')), [['<p><a href="?comment=1" class="anchor">&gt;&gt;1</a> a<br><a href="?comment=b" class="anchor">&gt;&gt;b</a></p>'], '']);
35
- assert.deepStrictEqual(inspect(parser('>>1 a\n>> b')), [['<p><a href="?comment=1" class="anchor">&gt;&gt;1</a> a<br>&gt;&gt; b</p>'], '']);
36
- assert.deepStrictEqual(inspect(parser('>>11.')), [['<p><a href="?comment=11" class="anchor">&gt;&gt;11</a>.</p>'], '']);
37
- assert.deepStrictEqual(inspect(parser('>>11 a')), [['<p><a href="?comment=11" class="anchor">&gt;&gt;11</a> a</p>'], '']);
38
- assert.deepStrictEqual(inspect(parser('>>>11 a')), [['<p>&gt;<a href="?comment=11" class="anchor">&gt;&gt;11</a> a</p>'], '']);
39
- assert.deepStrictEqual(inspect(parser('>> a\n>>1')), [['<p>&gt;&gt; a<br><a href="?comment=1" class="anchor">&gt;&gt;1</a></p>'], '']);
40
- assert.deepStrictEqual(inspect(parser('a>>1')), [['<p>a<a href="?comment=1" class="anchor">&gt;&gt;1</a></p>'], '']);
41
- assert.deepStrictEqual(inspect(parser('a >>1')), [['<p>a <a href="?comment=1" class="anchor">&gt;&gt;1</a></p>'], '']);
42
- assert.deepStrictEqual(inspect(parser('a\n>>1')), [['<p>a<br><a href="?comment=1" class="anchor">&gt;&gt;1</a></p>'], '']);
43
- assert.deepStrictEqual(inspect(parser('a\n>>1\nb')), [['<p>a<br><a href="?comment=1" class="anchor">&gt;&gt;1</a><br>b</p>'], '']);
32
+ assert.deepStrictEqual(inspect(parser('>>1 a\nb')), [['<p><a href="?at=1" class="anchor">&gt;&gt;1</a> a<br>b</p>'], '']);
33
+ assert.deepStrictEqual(inspect(parser('>>1 a\n>>2')), [['<p><a href="?at=1" class="anchor">&gt;&gt;1</a> a<br><a href="?at=2" class="anchor">&gt;&gt;2</a></p>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('>>1 a\n>>b')), [['<p><a href="?at=1" class="anchor">&gt;&gt;1</a> a<br><a href="?at=b" class="anchor">&gt;&gt;b</a></p>'], '']);
35
+ assert.deepStrictEqual(inspect(parser('>>1 a\n>> b')), [['<p><a href="?at=1" class="anchor">&gt;&gt;1</a> a<br>&gt;&gt; b</p>'], '']);
36
+ assert.deepStrictEqual(inspect(parser('>>11.')), [['<p><a href="?at=11" class="anchor">&gt;&gt;11</a>.</p>'], '']);
37
+ assert.deepStrictEqual(inspect(parser('>>11 a')), [['<p><a href="?at=11" class="anchor">&gt;&gt;11</a> a</p>'], '']);
38
+ assert.deepStrictEqual(inspect(parser('>>>11 a')), [['<p>&gt;<a href="?at=11" class="anchor">&gt;&gt;11</a> a</p>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('>> a\n>>1')), [['<p>&gt;&gt; a<br><a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('a>>1')), [['<p>a<a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('a >>1')), [['<p>a <a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('a\n>>1')), [['<p>a<br><a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('a\n>>1\nb')), [['<p>a<br><a href="?at=1" class="anchor">&gt;&gt;1</a><br>b</p>'], '']);
44
44
  assert.deepStrictEqual(inspect(parser('a\n>> b\nc')), [['<p>a<br>&gt;&gt; b<br>c</p>'], '']);
45
- assert.deepStrictEqual(inspect(parser(' >>1')), [['<p><a href="?comment=1" class="anchor">&gt;&gt;1</a></p>'], '']);
46
- assert.deepStrictEqual(inspect(parser(' >>>1')), [['<p>&gt;<a href="?comment=1" class="anchor">&gt;&gt;1</a></p>'], '']);
45
+ assert.deepStrictEqual(inspect(parser(' >>1')), [['<p><a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
46
+ assert.deepStrictEqual(inspect(parser(' >>>1')), [['<p>&gt;<a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
47
47
  });
48
48
 
49
49
  it('comment', () => {
@@ -28,17 +28,17 @@ describe('Unit: parser/block/reply/cite', () => {
28
28
  });
29
29
 
30
30
  it('valid', () => {
31
- assert.deepStrictEqual(inspect(parser('>>0')), [['<span class="cite">&gt;<a href="?comment=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '']);
32
- assert.deepStrictEqual(inspect(parser('>>0 ')), [['<span class="cite">&gt;<a href="?comment=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '']);
33
- assert.deepStrictEqual(inspect(parser('>>0\n')), [['<span class="cite">&gt;<a href="?comment=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '']);
34
- assert.deepStrictEqual(inspect(parser('>>>0')), [['<span class="cite">&gt;&gt;<a href="?comment=0" class="anchor" data-depth="2">&gt;0</a></span>', '<br>'], '']);
35
- assert.deepStrictEqual(inspect(parser('>>0\n1')), [['<span class="cite">&gt;<a href="?comment=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '1']);
36
- assert.deepStrictEqual(inspect(parser('>>0\n>1')), [['<span class="cite">&gt;<a href="?comment=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '>1']);
37
- assert.deepStrictEqual(inspect(parser('>>0\n>>')), [['<span class="cite">&gt;<a href="?comment=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '>>']);
38
- assert.deepStrictEqual(inspect(parser('>>0\n>>1')), [['<span class="cite">&gt;<a href="?comment=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>', '<span class="cite">&gt;<a href="?comment=1" class="anchor" data-depth="1">&gt;1</a></span>', '<br>'], '']);
39
- assert.deepStrictEqual(inspect(parser('>>0\n>>>1')), [['<span class="cite">&gt;<a href="?comment=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>', '<span class="cite">&gt;&gt;<a href="?comment=1" class="anchor" data-depth="2">&gt;1</a></span>', '<br>'], '']);
40
- assert.deepStrictEqual(inspect(parser('>>>0\n>>')), [['<span class="cite">&gt;&gt;<a href="?comment=0" class="anchor" data-depth="2">&gt;0</a></span>', '<br>'], '>>']);
41
- assert.deepStrictEqual(inspect(parser('>>>0\n>>1')), [['<span class="cite">&gt;&gt;<a href="?comment=0" class="anchor" data-depth="2">&gt;0</a></span>', '<br>', '<span class="cite">&gt;<a href="?comment=1" class="anchor" data-depth="1">&gt;1</a></span>', '<br>'], '']);
31
+ assert.deepStrictEqual(inspect(parser('>>0')), [['<span class="cite">&gt;<a href="?at=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '']);
32
+ assert.deepStrictEqual(inspect(parser('>>0 ')), [['<span class="cite">&gt;<a href="?at=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '']);
33
+ assert.deepStrictEqual(inspect(parser('>>0\n')), [['<span class="cite">&gt;<a href="?at=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('>>>0')), [['<span class="cite">&gt;&gt;<a href="?at=0" class="anchor" data-depth="2">&gt;0</a></span>', '<br>'], '']);
35
+ assert.deepStrictEqual(inspect(parser('>>0\n1')), [['<span class="cite">&gt;<a href="?at=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '1']);
36
+ 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>'], '>1']);
37
+ assert.deepStrictEqual(inspect(parser('>>0\n>>')), [['<span class="cite">&gt;<a href="?at=0" class="anchor" data-depth="1">&gt;0</a></span>', '<br>'], '>>']);
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;<a href="?at=1" class="anchor" data-depth="1">&gt;1</a></span>', '<br>'], '']);
39
+ 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
+ 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
+ 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>'], '']);
42
42
  });
43
43
 
44
44
  });
@@ -1,14 +1,14 @@
1
1
  import { ReplyParser } from '../../block';
2
2
  import { tails, line, validate, creator, reverse, fmap } from '../../../combinator';
3
- import { anchor, syntax } from '../../inline/autolink/anchor';
3
+ import { anchor } from '../../inline/autolink/anchor';
4
4
  import { str } from '../../source';
5
5
  import { html, define, defrag } from 'typed-dom';
6
6
 
7
7
  export const cite: ReplyParser.CiteParser = creator(line(fmap(validate(
8
8
  '>>',
9
9
  reverse(tails([
10
- str(/^>*(?=>>)/),
11
- validate(new RegExp(`${syntax.source}[^\S\n]*(?:$|\n)`), anchor),
10
+ str(/^>*(?=>>[^>\s]+[^\S\n]*(?:$|\n))/),
11
+ anchor,
12
12
  ]))),
13
13
  ([el, quotes = '']: [HTMLElement, string?]) => [
14
14
  html('span', { class: 'cite' }, defrag([
@@ -47,8 +47,8 @@ describe('Unit: parser/block/reply/quote', () => {
47
47
  assert.deepStrictEqual(inspect(parser('> 0\n>> 1')), [['<span class="quote">&gt; 0<br>&gt;&gt; 1</span>', '<br>'], '']);
48
48
  assert.deepStrictEqual(inspect(parser('>> 0\n> 1')), [['<span class="quote">&gt;&gt; 0<br>&gt; 1</span>', '<br>'], '']);
49
49
  assert.deepStrictEqual(inspect(parser('> \\')), [['<span class="quote">&gt; \\</span>', '<br>'], '']);
50
- assert.deepStrictEqual(inspect(parser('> >>0\n> > b')), [['<span class="quote">&gt; <a href="?comment=0" class="anchor">&gt;&gt;0</a><br>&gt; &gt; b</span>', '<br>'], '']);
51
- assert.deepStrictEqual(inspect(parser('> >>0\n> > b\n> c')), [['<span class="quote">&gt; <a href="?comment=0" class="anchor">&gt;&gt;0</a><br>&gt; &gt; b<br>&gt; c</span>', '<br>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('> >>0\n> > b')), [['<span class="quote">&gt; <a href="?at=0" class="anchor">&gt;&gt;0</a><br>&gt; &gt; b</span>', '<br>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('> >>0\n> > b\n> c')), [['<span class="quote">&gt; <a href="?at=0" class="anchor">&gt;&gt;0</a><br>&gt; &gt; b<br>&gt; c</span>', '<br>'], '']);
52
52
  assert.deepStrictEqual(inspect(parser('> > a\n> > b\n> > c')), [['<span class="quote">&gt; &gt; a<br>&gt; &gt; b<br>&gt; &gt; c</span>', '<br>'], '']);
53
53
  assert.deepStrictEqual(inspect(parser('> > > a\n> > > b')), [['<span class="quote">&gt; &gt; &gt; a<br>&gt; &gt; &gt; b</span>', '<br>'], '']);
54
54
  assert.deepStrictEqual(inspect(parser('> #a')), [['<span class="quote">&gt; <a href="/hashtags/a" class="hashtag">#a</a></span>', '<br>'], '']);
@@ -7,14 +7,14 @@ describe('Unit: parser/block/reply', () => {
7
7
  const parser = (source: string) => some(reply)(source, {});
8
8
 
9
9
  it('basic', () => {
10
- assert.deepStrictEqual(inspect(parser('>>1')), [['<p><span class="cite">&gt;<a href="?comment=1" class="anchor" data-depth="1">&gt;1</a></span></p>'], '']);
11
- assert.deepStrictEqual(inspect(parser('>>1\na')), [['<p><span class="cite">&gt;<a href="?comment=1" class="anchor" data-depth="1">&gt;1</a></span><br>a</p>'], '']);
12
- assert.deepStrictEqual(inspect(parser('>>1\na\n>>2')), [['<p><span class="cite">&gt;<a href="?comment=1" class="anchor" data-depth="1">&gt;1</a></span><br>a<br><a href="?comment=2" class="anchor">&gt;&gt;2</a></p>'], '']);
13
- assert.deepStrictEqual(inspect(parser('>>1\n>>2')), [['<p><span class="cite">&gt;<a href="?comment=1" class="anchor" data-depth="1">&gt;1</a></span><br><span class="cite">&gt;<a href="?comment=2" class="anchor" data-depth="1">&gt;2</a></span></p>'], '']);
14
- assert.deepStrictEqual(inspect(parser('>>1\n> a')), [['<p><span class="cite">&gt;<a href="?comment=1" class="anchor" data-depth="1">&gt;1</a></span><br><span class="quote">&gt; a</span></p>'], '']);
15
- assert.deepStrictEqual(inspect(parser('>>1\n> a\nb')), [['<p><span class="cite">&gt;<a href="?comment=1" class="anchor" data-depth="1">&gt;1</a></span><br><span class="quote">&gt; a</span><br>b</p>'], '']);
16
- assert.deepStrictEqual(inspect(parser('>>1\n> a\n>>2')), [['<p><span class="cite">&gt;<a href="?comment=1" class="anchor" data-depth="1">&gt;1</a></span><br><span class="quote">&gt; a</span><br><span class="cite">&gt;<a href="?comment=2" class="anchor" data-depth="1">&gt;2</a></span></p>'], '']);
17
- assert.deepStrictEqual(inspect(parser('>>1\n> a\n>> b')), [['<p><span class="cite">&gt;<a href="?comment=1" class="anchor" data-depth="1">&gt;1</a></span><br><span class="quote">&gt; a<br>&gt;&gt; b</span></p>'], '']);
10
+ assert.deepStrictEqual(inspect(parser('>>1')), [['<p><span class="cite">&gt;<a href="?at=1" class="anchor" data-depth="1">&gt;1</a></span></p>'], '']);
11
+ assert.deepStrictEqual(inspect(parser('>>1\na')), [['<p><span class="cite">&gt;<a href="?at=1" class="anchor" data-depth="1">&gt;1</a></span><br>a</p>'], '']);
12
+ assert.deepStrictEqual(inspect(parser('>>1\na\n>>2')), [['<p><span class="cite">&gt;<a href="?at=1" class="anchor" data-depth="1">&gt;1</a></span><br>a<br><a href="?at=2" class="anchor">&gt;&gt;2</a></p>'], '']);
13
+ assert.deepStrictEqual(inspect(parser('>>1\n>>2')), [['<p><span class="cite">&gt;<a href="?at=1" class="anchor" data-depth="1">&gt;1</a></span><br><span class="cite">&gt;<a href="?at=2" class="anchor" data-depth="1">&gt;2</a></span></p>'], '']);
14
+ assert.deepStrictEqual(inspect(parser('>>1\n> a')), [['<p><span class="cite">&gt;<a href="?at=1" class="anchor" data-depth="1">&gt;1</a></span><br><span class="quote">&gt; a</span></p>'], '']);
15
+ assert.deepStrictEqual(inspect(parser('>>1\n> a\nb')), [['<p><span class="cite">&gt;<a href="?at=1" class="anchor" data-depth="1">&gt;1</a></span><br><span class="quote">&gt; a</span><br>b</p>'], '']);
16
+ assert.deepStrictEqual(inspect(parser('>>1\n> a\n>>2')), [['<p><span class="cite">&gt;<a href="?at=1" class="anchor" data-depth="1">&gt;1</a></span><br><span class="quote">&gt; a</span><br><span class="cite">&gt;<a href="?at=2" class="anchor" data-depth="1">&gt;2</a></span></p>'], '']);
17
+ assert.deepStrictEqual(inspect(parser('>>1\n> a\n>> b')), [['<p><span class="cite">&gt;<a href="?at=1" class="anchor" data-depth="1">&gt;1</a></span><br><span class="quote">&gt; a<br>&gt;&gt; b</span></p>'], '']);
18
18
  });
19
19
 
20
20
  });
@@ -18,14 +18,14 @@ describe('Unit: parser/inline/annotation', () => {
18
18
  assert.deepStrictEqual(inspect(parser('((\na))')), undefined);
19
19
  assert.deepStrictEqual(inspect(parser('((\\ a))')), undefined);
20
20
  assert.deepStrictEqual(inspect(parser('((\\\na))')), undefined);
21
+ assert.deepStrictEqual(inspect(parser('((<wbr>a))')), undefined);
21
22
  assert.deepStrictEqual(inspect(parser('((a\n))')), undefined);
22
23
  assert.deepStrictEqual(inspect(parser('((a\\\n))')), undefined);
23
24
  assert.deepStrictEqual(inspect(parser('((a\nb))')), undefined);
24
25
  assert.deepStrictEqual(inspect(parser('((a\\\nb))')), undefined);
25
- assert.deepStrictEqual(inspect(parser('((<wbr>a))')), undefined);
26
- assert.deepStrictEqual(inspect(parser('((a)b))')), undefined);
27
26
  assert.deepStrictEqual(inspect(parser('((*a\nb*))')), undefined);
28
27
  assert.deepStrictEqual(inspect(parser('((\\))')), undefined);
28
+ assert.deepStrictEqual(inspect(parser('((a)b))')), undefined);
29
29
  assert.deepStrictEqual(inspect(parser('(((a))')), undefined);
30
30
  assert.deepStrictEqual(inspect(parser(' ((a))')), undefined);
31
31
  });
@@ -22,12 +22,12 @@ describe('Unit: parser/inline/autolink/anchor', () => {
22
22
  });
23
23
 
24
24
  it('valid', () => {
25
- assert.deepStrictEqual(inspect(parser('>>0')), [['<a href="?comment=0" class="anchor">&gt;&gt;0</a>'], '']);
26
- assert.deepStrictEqual(inspect(parser('>>a')), [['<a href="?comment=a" class="anchor">&gt;&gt;a</a>'], '']);
27
- assert.deepStrictEqual(inspect(parser('>>0-')), [['<a href="?comment=0" class="anchor">&gt;&gt;0</a>'], '-']);
28
- assert.deepStrictEqual(inspect(parser('>>0-a')), [['<a href="?comment=0-a" class="anchor">&gt;&gt;0-a</a>'], '']);
29
- assert.deepStrictEqual(inspect(parser('>>0-A')), [['<a href="?comment=0" class="anchor">&gt;&gt;0</a>'], '-A']);
30
- assert.deepStrictEqual(inspect(parser('>>0--a')), [['<a href="?comment=0" class="anchor">&gt;&gt;0</a>'], '--a']);
25
+ assert.deepStrictEqual(inspect(parser('>>0')), [['<a href="?at=0" class="anchor">&gt;&gt;0</a>'], '']);
26
+ assert.deepStrictEqual(inspect(parser('>>a')), [['<a href="?at=a" class="anchor">&gt;&gt;a</a>'], '']);
27
+ assert.deepStrictEqual(inspect(parser('>>0-')), [['<a href="?at=0" class="anchor">&gt;&gt;0</a>'], '-']);
28
+ 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']);
30
+ assert.deepStrictEqual(inspect(parser('>>0--a')), [['<a href="?at=0" class="anchor">&gt;&gt;0</a>'], '--a']);
31
31
  });
32
32
 
33
33
  });
@@ -1,18 +1,15 @@
1
1
  import { AutolinkParser } from '../../inline';
2
- import { union, validate, rewrite, context, convert, fmap, lazy } from '../../../combinator';
2
+ import { union, validate, focus, context, convert, fmap, lazy } from '../../../combinator';
3
3
  import { link } from '../link';
4
- import { str } from '../../source';
5
4
  import { define } from 'typed-dom';
6
5
 
7
- export const syntax = /^>>[0-9a-z]+(?:-[0-9a-z]+)*(?![0-9A-Za-z@#:])/;
8
-
9
- export const anchor: AutolinkParser.AnchorParser = lazy(() => validate('>>', fmap(rewrite(
10
- str(syntax),
6
+ export const anchor: AutolinkParser.AnchorParser = lazy(() => validate('>>', fmap(focus(
7
+ /^>>[0-9a-z]+(?:-[0-9a-z]+)*(?![0-9A-Za-z@#:])/,
11
8
  context({ syntax: { inline: {
12
9
  link: true,
13
10
  autolink: false,
14
11
  }}},
15
12
  convert(
16
- source => `[${source}]{ ?comment=${source.slice(2)} }`,
13
+ source => `[${source}]{ ?at=${source.slice(2)} }`,
17
14
  union([link])))),
18
15
  ([el]) => [define(el, { class: 'anchor' })])));
@@ -17,7 +17,7 @@ describe('Unit: parser/inline/deletion', () => {
17
17
 
18
18
  it('basic', () => {
19
19
  assert.deepStrictEqual(inspect(parser('~~a~~')), [['<del>a</del>'], '']);
20
- assert.deepStrictEqual(inspect(parser('~~ab~~')), [['<del>ab</del>'], '']);
20
+ assert.deepStrictEqual(inspect(parser('~~a~b~~')), [['<del>a~b</del>'], '']);
21
21
  assert.deepStrictEqual(inspect(parser('~~a ~~')), [['<del>a </del>'], '']);
22
22
  assert.deepStrictEqual(inspect(parser('~~ ~~')), [['<del> </del>'], '']);
23
23
  assert.deepStrictEqual(inspect(parser('~~ a~~')), [['<del> a</del>'], '']);
@@ -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" href="#index:"><span class="comment">[# #]</span></a>'], '']);
58
- assert.deepStrictEqual(inspect(parser('[#[# a #]]')), [['<a class="index" href="#index:"><span class="comment">[# a #]</span></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>'], '']);
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
  });
@@ -9,9 +9,10 @@ export function indexee(parser: Parser<HTMLElement, MarkdownParser.Context>): Pa
9
9
  return fmap(parser, ([el], _, { id }) => [define(el, { id: id !== '' && identity(text(el)) || undefined })]);
10
10
  }
11
11
 
12
- export function identity(index: string): string {
13
- assert(!index.includes('\n'));
14
- return `index:${index.trim().replace(/\s+/g, '_').slice(0, 101).replace(/^(.{97}).{4}$/, '$1...')}`;
12
+ export function identity(text: string): string {
13
+ assert(!text.includes('\n'));
14
+ text &&= text.trim();
15
+ return text && `index:${text.replace(/\s+/g, '_').slice(0, 101).replace(/^(.{97}).{4}$/, '$1...')}`;
15
16
  }
16
17
  assert(identity('0'.repeat(100)).slice(6) === '0'.repeat(100));
17
18
  assert(identity('0'.repeat(101)).slice(6) === '0'.repeat(97) + '...');
@@ -17,7 +17,7 @@ describe('Unit: parser/inline/insertion', () => {
17
17
 
18
18
  it('basic', () => {
19
19
  assert.deepStrictEqual(inspect(parser('++a++')), [['<ins>a</ins>'], '']);
20
- assert.deepStrictEqual(inspect(parser('++ab++')), [['<ins>ab</ins>'], '']);
20
+ assert.deepStrictEqual(inspect(parser('++a+b++')), [['<ins>a+b</ins>'], '']);
21
21
  assert.deepStrictEqual(inspect(parser('++a ++')), [['<ins>a </ins>'], '']);
22
22
  assert.deepStrictEqual(inspect(parser('++ ++')), [['<ins> </ins>'], '']);
23
23
  assert.deepStrictEqual(inspect(parser('++ a++')), [['<ins> a</ins>'], '']);
@@ -16,10 +16,10 @@ const optspec = {
16
16
  } as const;
17
17
  ObjectSetPrototypeOf(optspec, null);
18
18
 
19
- export const link: LinkParser = lazy(() => creator(10, bind(reverse(
19
+ export const link: LinkParser = lazy(() => creator(10, bind(
20
20
  validate(['[', '{'], '}', '\n',
21
21
  guard(context => context.syntax?.inline?.link ?? true,
22
- tails([
22
+ reverse(tails([
23
23
  context({ syntax: { inline: {
24
24
  link: false,
25
25
  }}},
@@ -27,7 +27,7 @@ describe('Unit: parser/inline/mark', () => {
27
27
 
28
28
  it('basic', () => {
29
29
  assert.deepStrictEqual(inspect(parser('==a==')), [['<mark>a</mark>'], '']);
30
- assert.deepStrictEqual(inspect(parser('==ab==')), [['<mark>ab</mark>'], '']);
30
+ assert.deepStrictEqual(inspect(parser('==a=b==')), [['<mark>a=b</mark>'], '']);
31
31
  assert.deepStrictEqual(inspect(parser('==a\nb==')), [['<mark>a<br>b</mark>'], '']);
32
32
  assert.deepStrictEqual(inspect(parser('==a\\\nb==')), [['<mark>a<span class="linebreak"> </span>b</mark>'], '']);
33
33
  assert.deepStrictEqual(inspect(parser('==\\===')), [['<mark>=</mark>'], '']);
@@ -18,14 +18,14 @@ describe('Unit: parser/inline/reference', () => {
18
18
  assert.deepStrictEqual(inspect(parser('[[\na]]')), undefined);
19
19
  assert.deepStrictEqual(inspect(parser('[[\\ a]]')), undefined);
20
20
  assert.deepStrictEqual(inspect(parser('[[\\\na]]')), undefined);
21
+ assert.deepStrictEqual(inspect(parser('[[<wbr>a]]')), undefined);
21
22
  assert.deepStrictEqual(inspect(parser('[[a\n]]')), undefined);
22
23
  assert.deepStrictEqual(inspect(parser('[[a\\\n]]')), undefined);
23
24
  assert.deepStrictEqual(inspect(parser('[[a\nb]]')), undefined);
24
25
  assert.deepStrictEqual(inspect(parser('[[a\\\nb]]')), undefined);
25
- assert.deepStrictEqual(inspect(parser('[[<wbr>a]]')), undefined);
26
- assert.deepStrictEqual(inspect(parser('[[a]b]]')), undefined);
27
26
  assert.deepStrictEqual(inspect(parser('[[*a\nb*]]')), undefined);
28
27
  assert.deepStrictEqual(inspect(parser('[[\\]]')), undefined);
28
+ assert.deepStrictEqual(inspect(parser('[[a]b]]')), undefined);
29
29
  assert.deepStrictEqual(inspect(parser('[[[a]]')), undefined);
30
30
  assert.deepStrictEqual(inspect(parser(' [[a]]')), undefined);
31
31
  });
@@ -11,8 +11,8 @@ describe('Unit: parser/inline/template', () => {
11
11
  assert.deepStrictEqual(inspect(parser('{')), undefined);
12
12
  assert.deepStrictEqual(inspect(parser('{}')), undefined);
13
13
  assert.deepStrictEqual(inspect(parser('{{')), undefined);
14
- assert.deepStrictEqual(inspect(parser('{{a}b}}')), undefined);
15
14
  assert.deepStrictEqual(inspect(parser('{{\\}}')), undefined);
15
+ assert.deepStrictEqual(inspect(parser('{{a}b}')), undefined);
16
16
  assert.deepStrictEqual(inspect(parser('{{{a}}')), undefined);
17
17
  assert.deepStrictEqual(inspect(parser(' {{}}')), undefined);
18
18
  });
@@ -22,8 +22,8 @@ function build(
22
22
  marker: (index: number, abbr: string | undefined) => string,
23
23
  ) {
24
24
  assert(syntax.match(/^[a-z]+$/));
25
- // Referenceを含むAnnotationの重複排除は両構文が互いに処理済みである必要があるため
26
- // 事後の補正処理が必要となり各1回の処理では不可能
25
+ // Referenceを含むAnnotationの重複排除は両構文が互いに処理済みであることを必要とするため
26
+ // 構文ごとに各1回の処理では不可能
27
27
  const identify = memoize<HTMLElement, string>(
28
28
  ref => `${+!ref.querySelector('.label')}:${ref.getAttribute('data-abbr') || '_' + ref.innerHTML}`,
29
29
  new WeakMap());
@@ -69,6 +69,7 @@ function build(
69
69
  || titles.get(identifier)
70
70
  || +identifier[0] && ref.title
71
71
  || text(content).trim()
72
+ || content.textContent!.trim()
72
73
  || undefined;
73
74
  title
74
75
  ? !titles.has(identifier) && titles.set(identifier, title)
@@ -126,11 +126,7 @@ export function isStartTightNodes(nodes: readonly (HTMLElement | string)[]): boo
126
126
  }
127
127
  export function isEndTightNodes(nodes: readonly (HTMLElement | string)[]): boolean {
128
128
  if (nodes.length === 0) return true;
129
- for (let i = nodes.length; i--;) {
130
- const node = nodes[i];
131
- return isVisible(node, -1);
132
- }
133
- return false;
129
+ return isVisible(nodes[nodes.length - 1], -1);
134
130
  }
135
131
  function isVisible(node: HTMLElement | string, strpos?: number): boolean {
136
132
  switch (typeof node) {