securemark 0.265.0 → 0.266.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.266.0
4
+
5
+ - Change index schemas.
6
+ - Fix footnote processing.
7
+
3
8
  ## 0.265.0
4
9
 
5
10
  - Change ulist and olist parsers to index list items.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! securemark v0.265.0 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
1
+ /*! securemark v0.266.0 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"));
@@ -3908,6 +3908,7 @@ function bind(target, settings) {
3908
3908
  })
3909
3909
  };
3910
3910
 
3911
+ if (context.id?.includes(':')) throw new Error('ID must not contain ":"');
3911
3912
  if (context.host?.origin === 'null') throw new Error(`Invalid host: ${context.host.href}`);
3912
3913
  const blocks = [];
3913
3914
  const adds = [];
@@ -4224,7 +4225,8 @@ const footnote_1 = __webpack_require__(7529);
4224
4225
  const url_1 = __webpack_require__(2261);
4225
4226
  const dom_1 = __webpack_require__(3252);
4226
4227
  function parse(source, opts = {}, context) {
4227
- if (!(0, segment_1.validate)(source, segment_1.MAX_SEGMENT_SIZE)) throw new Error(`Too large input over ${segment_1.MAX_SEGMENT_SIZE.toLocaleString('en')} bytes.`);
4228
+ if (!(0, segment_1.validate)(source, segment_1.MAX_SEGMENT_SIZE)) throw new Error(`Too large input over ${segment_1.MAX_SEGMENT_SIZE.toLocaleString('en')} bytes`);
4229
+ if (context?.id?.includes(':')) throw new Error('ID must not contain ":"');
4228
4230
  const url = (0, header_2.headers)(source).find(field => field.toLowerCase().startsWith('url:'))?.slice(4).trim() ?? '';
4229
4231
  source = !context ? (0, normalize_1.normalize)(source) : source;
4230
4232
  context = {
@@ -4548,7 +4550,7 @@ exports.aside = (0, combinator_1.block)((0, combinator_1.validate)('~~~', (0, co
4548
4550
  'data-invalid-message': 'Missing the title at the first line'
4549
4551
  }, `${opener}${body}${closer}`)];
4550
4552
  return [(0, dom_1.html)('aside', {
4551
- id: (0, indexee_1.identity)((0, indexee_1.text)(heading)),
4553
+ id: (0, indexee_1.identity)(context.id, (0, indexee_1.text)(heading)),
4552
4554
  class: 'aside'
4553
4555
  }, [document, (0, dom_1.html)('h2', 'References'), references])];
4554
4556
  })));
@@ -6104,7 +6106,7 @@ exports.index = (0, combinator_1.lazy)(() => (0, combinator_1.validate)('[#', (0
6104
6106
  }, el.childNodes)])));
6105
6107
  const signature = (0, combinator_1.lazy)(() => (0, combinator_1.creation)((0, combinator_1.fmap)((0, combinator_1.open)('|', (0, visibility_1.startTight)((0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.txt]), ']'))), ns => [(0, dom_1.html)('span', {
6106
6108
  class: 'indexer',
6107
- 'data-index': (0, indexee_1.identity)(ns.join('')).slice(6)
6109
+ 'data-index': (0, indexee_1.identity)(undefined, ns.join('')).slice(7)
6108
6110
  })])));
6109
6111
  const bracket = (0, combinator_1.lazy)(() => (0, combinator_1.creation)((0, combinator_1.union)([(0, combinator_1.surround)((0, source_1.str)('('), (0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.txt]), ')'), (0, source_1.str)(')'), true), (0, combinator_1.surround)((0, source_1.str)('['), (0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.txt]), ']'), (0, source_1.str)(']'), true), (0, combinator_1.surround)((0, source_1.str)('{'), (0, combinator_1.some)((0, combinator_1.union)([bracket, source_1.txt]), '}'), (0, source_1.str)('}'), true), (0, combinator_1.surround)((0, source_1.str)('"'), (0, combinator_1.precedence)(8, (0, combinator_1.some)(source_1.txt, '"')), (0, source_1.str)('"'), true)])));
6110
6112
 
@@ -6126,18 +6128,20 @@ function indexee(parser, optional) {
6126
6128
  return (0, combinator_1.fmap)(parser, ([el], _, {
6127
6129
  id
6128
6130
  }) => [(0, dom_1.define)(el, {
6129
- id: id !== '' && identity(text(el, optional)) || undefined
6131
+ id: identity(id, text(el, optional))
6130
6132
  })]);
6131
6133
  }
6132
6134
  exports.indexee = indexee;
6133
- function identity(text, name = 'index') {
6135
+ function identity(id, text, name = 'index') {
6136
+ if (id === '') return undefined;
6134
6137
  text &&= text.trim().replace(/\s+/g, '_');
6135
- if (text.length <= 100) return text && `${name}:${text}`;
6138
+ if (text === '') return undefined;
6139
+ if (text.length <= 100) return `${name}:${id ?? ''}:${text}`;
6136
6140
  switch (name) {
6137
6141
  case 'index':
6138
- return `${name}:${text.slice(0, 97)}...`;
6142
+ return `${name}:${id ?? ''}:${text.slice(0, 97)}...`;
6139
6143
  case 'mark':
6140
- return `${name}:${text.slice(0, 50)}...${text.slice(-47)}`;
6144
+ return `${name}:${id ?? ''}:${text.slice(0, 50)}...${text.slice(-47)}`;
6141
6145
  }
6142
6146
  }
6143
6147
  exports.identity = identity;
@@ -6200,7 +6204,7 @@ exports.indexer = (0, combinator_1.creation)((0, combinator_1.fmap)((0, combinat
6200
6204
  // Indexer is invisible but invalids must be visible.
6201
6205
  ([el]) => el.getElementsByClassName('invalid').length === 0), ([el]) => [(0, dom_1.html)('span', {
6202
6206
  class: 'indexer',
6203
- 'data-index': el.getAttribute('href').slice(7)
6207
+ 'data-index': el.getAttribute('href').slice(1).replace(/^\w+:\w*:/, '')
6204
6208
  })]));
6205
6209
 
6206
6210
  /***/ }),
@@ -6533,7 +6537,7 @@ exports.mark = (0, combinator_1.lazy)(() => (0, combinator_1.surround)((0, sourc
6533
6537
  }) => {
6534
6538
  const el = (0, dom_1.html)('mark', (0, dom_1.defrag)(bs));
6535
6539
  (0, dom_1.define)(el, {
6536
- id: id !== '' && (0, indexee_1.identity)((0, indexee_1.text)(el), 'mark') || undefined
6540
+ id: (0, indexee_1.identity)(id, (0, indexee_1.text)(el), 'mark')
6537
6541
  });
6538
6542
  return [[el, (0, dom_1.html)('a', {
6539
6543
  href: el.id ? `#${el.id}` : undefined
@@ -7071,16 +7075,18 @@ function build(syntax, marker, splitter) {
7071
7075
  for (let refs = target.querySelectorAll(`sup.${syntax}:not(.disabled)`), len = refs.length, i = 0; i < len; ++i) {
7072
7076
  yield;
7073
7077
  const ref = refs[i];
7074
- while (+splitters[0]?.compareDocumentPosition(ref) & Node.DOCUMENT_POSITION_FOLLOWING) {
7078
+ while (splitters.length > 0 && splitters[0].compareDocumentPosition(ref) & Node.DOCUMENT_POSITION_FOLLOWING) {
7075
7079
  if (defs.size > 0) {
7076
7080
  total += defs.size;
7077
7081
  yield* proc(defs, target.insertBefore((0, dom_1.html)('ol', {
7078
7082
  class: `${syntax}s`
7079
- }), splitters[0] ?? null));
7083
+ }), splitters[0]));
7084
+ } else if (splitters.length % 100 === 0) {
7085
+ yield;
7080
7086
  }
7081
7087
  splitters.shift();
7082
7088
  }
7083
- const identifier = `${+!ref.querySelector('.label')}:${ref.getAttribute('data-abbr') || '_' + ref.firstElementChild.innerHTML}`;
7089
+ const identifier = ref.getAttribute('data-abbr') || ` ${ref.firstElementChild.innerHTML}`;
7084
7090
  const abbr = ref.getAttribute('data-abbr') || undefined;
7085
7091
  const content = (0, dom_1.frag)(ref.firstElementChild.cloneNode(true).childNodes);
7086
7092
  style ??= abbr ? 'abbr' : 'count';
@@ -7104,13 +7110,13 @@ function build(syntax, marker, splitter) {
7104
7110
  } else {
7105
7111
  ref.lastChild?.remove();
7106
7112
  }
7107
- const title = false || titles.get(identifier) || +identifier[0] && ref.title || (0, indexee_1.text)(content).trim() || content.textContent.trim() || undefined;
7113
+ const title = titles.get(identifier) || (0, indexee_1.text)(content).trim() || undefined;
7108
7114
  title ? !titles.has(identifier) && titles.set(identifier, title) : buffer.set(identifier, ref);
7109
7115
  const blank = !!abbr && !content.firstChild;
7110
7116
  const refIndex = ++count;
7111
- const refId = opts.id !== '' ? ref.id || `${syntax}:${opts.id ? `${opts.id}:` : ''}ref:${refIndex}` : undefined;
7117
+ const refId = opts.id !== '' ? `${syntax}:${opts.id ?? ''}:ref:${refIndex}` : undefined;
7112
7118
  const def = false || defs.get(identifier) || defs.set(identifier, (0, dom_1.html)('li', {
7113
- id: opts.id !== '' ? `${syntax}:${opts.id ? `${opts.id}:` : ''}def:${total + defs.size + 1}` : undefined,
7119
+ id: opts.id !== '' ? `${syntax}:${opts.id ?? ''}:def:${total + defs.size + 1}` : undefined,
7114
7120
  'data-marker': !footnote ? marker(total + defs.size + 1, abbr) : undefined
7115
7121
  }, [content.cloneNode(true), (0, dom_1.html)('sup')])).get(identifier);
7116
7122
  if (title && !blank && def.childNodes.length === 1) {
package/index.d.ts CHANGED
@@ -28,7 +28,8 @@ export type ParserOptions = Omit<Partial<ParserSettings>, 'chunk'>;
28
28
  export interface ParserSettings {
29
29
  // Host URL.
30
30
  readonly host?: URL;
31
- // Id of comments and timelines.
31
+ // ID of comments and timelines.
32
+ // Must not contain ":".
32
33
  readonly id?: string;
33
34
  // For editing.
34
35
  readonly caches?: Partial<Caches>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.265.0",
3
+ "version": "0.266.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",
@@ -122,7 +122,7 @@ describe('Unit: parser/api/bind', () => {
122
122
  });
123
123
 
124
124
  it('complex', () => {
125
- assert.deepStrictEqual(inspect(bind(html('div'), cfgs).parse('# a\n# b')), ['<h1 id="index:a">a</h1>', '<h1 id="index:b">b</h1>']);
125
+ assert.deepStrictEqual(inspect(bind(html('div'), cfgs).parse('# a\n# b')), ['<h1 id="index::a">a</h1>', '<h1 id="index::b">b</h1>']);
126
126
  });
127
127
 
128
128
  it('normalize', () => {
@@ -158,10 +158,10 @@ describe('Unit: parser/api/bind', () => {
158
158
  assert(el.innerHTML === '<p>1</p><p>2</p><p>4</p>');
159
159
  [...update('')];
160
160
  assert(el.innerHTML === '');
161
- assert.deepStrictEqual(inspect(update('# a\n# b'), 1), ['<h1 id="index:a">a</h1>']);
162
- assert(el.innerHTML === '<h1 id="index:a">a</h1>');
163
- assert.deepStrictEqual(inspect(update('# a\n# b'), 2), ['<h1 id="index:b">b</h1>']);
164
- assert(el.innerHTML === '<h1 id="index:a">a</h1><h1 id="index:b">b</h1>');
161
+ assert.deepStrictEqual(inspect(update('# a\n# b'), 1), ['<h1 id="index::a">a</h1>']);
162
+ assert(el.innerHTML === '<h1 id="index::a">a</h1>');
163
+ assert.deepStrictEqual(inspect(update('# a\n# b'), 2), ['<h1 id="index::b">b</h1>']);
164
+ assert(el.innerHTML === '<h1 id="index::a">a</h1><h1 id="index::b">b</h1>');
165
165
  });
166
166
 
167
167
  it('chunk', () => {
@@ -192,38 +192,38 @@ describe('Unit: parser/api/bind', () => {
192
192
  [...el.children].map(el => el.outerHTML),
193
193
  [
194
194
  html('p', [
195
- html('sup', { class: "reference", id: "reference:ref:1", title: "1" }, [
195
+ html('sup', { class: "reference", id: "reference::ref:1", title: "1" }, [
196
196
  html('span', { hidden: '' }, '1'),
197
- html('a', { href: "#reference:def:1" }, '[1]'),
197
+ html('a', { href: "#reference::def:1" }, '[1]'),
198
198
  ]),
199
199
  ]).outerHTML,
200
200
  html('p', [
201
- html('sup', { class: "reference", id: "reference:ref:2", title: "2" }, [
201
+ html('sup', { class: "reference", id: "reference::ref:2", title: "2" }, [
202
202
  html('span', { hidden: '' }, '2'),
203
- html('a', { href: "#reference:def:2" }, '[2]'),
203
+ html('a', { href: "#reference::def:2" }, '[2]'),
204
204
  ]),
205
205
  ]).outerHTML,
206
206
  html('p', [
207
- html('sup', { class: "reference", id: "reference:ref:3", title: "3" }, [
207
+ html('sup', { class: "reference", id: "reference::ref:3", title: "3" }, [
208
208
  html('span', { hidden: '' }, '3'),
209
- html('a', { href: "#reference:def:3" }, '[3]'),
209
+ html('a', { href: "#reference::def:3" }, '[3]'),
210
210
  ]),
211
211
  ]).outerHTML,
212
212
  ]);
213
213
  assert.deepStrictEqual(
214
214
  cfgs.footnotes.references?.outerHTML,
215
215
  html('ol', [
216
- html('li', { id: 'reference:def:1' }, [
216
+ html('li', { id: 'reference::def:1' }, [
217
217
  '1',
218
- html('sup', [html('a', { href: '#reference:ref:1' }, '^1')]),
218
+ html('sup', [html('a', { href: '#reference::ref:1' }, '^1')]),
219
219
  ]),
220
- html('li', { id: 'reference:def:2' }, [
220
+ html('li', { id: 'reference::def:2' }, [
221
221
  '2',
222
- html('sup', [html('a', { href: '#reference:ref:2' }, '^2')]),
222
+ html('sup', [html('a', { href: '#reference::ref:2' }, '^2')]),
223
223
  ]),
224
- html('li', { id: 'reference:def:3' }, [
224
+ html('li', { id: 'reference::def:3' }, [
225
225
  '3',
226
- html('sup', [html('a', { href: '#reference:ref:3' }, '^3')]),
226
+ html('sup', [html('a', { href: '#reference::ref:3' }, '^3')]),
227
227
  ]),
228
228
  ]).outerHTML);
229
229
  assert.throws(() => update('').next());
@@ -26,6 +26,7 @@ export function bind(target: DocumentFragment | HTMLElement | ShadowRoot, settin
26
26
  host: settings.host ?? new ReadonlyURL(location.pathname, location.origin),
27
27
  memo: new Memo({ targets: State.backtrackers }),
28
28
  };
29
+ if (context.id?.includes(':')) throw new Error('ID must not contain ":"');
29
30
  if (context.host?.origin === 'null') throw new Error(`Invalid host: ${context.host.href}`);
30
31
  assert(!settings.id);
31
32
  type Block = readonly [segment: string, blocks: readonly HTMLElement[], url: string];
@@ -123,10 +123,10 @@ describe('Unit: parser/api/parse', () => {
123
123
  '<p><a class="channel" href="https://domain/@a?ch=b" target="_blank">@domain/a#b</a></p>',
124
124
  '<p><a class="hashtag" href="https://source/hashtags/a" target="_blank">#a</a></p>',
125
125
  '<p><a class="hashtag" href="https://domain/hashtags/a" target="_blank">#domain/a</a></p>',
126
- '<p><a class="index" href="#index:a">a</a></p>',
126
+ '<p><a class="index" href="#index::a">a</a></p>',
127
127
  '<figure data-type="math" data-label="$-a" data-group="$" data-number="1" id="label:$-a"><figcaption><span class="figindex">(1)</span><span class="figtext"></span></figcaption><div><div class="math" translate="no">$$\n$$</div></div></figure>',
128
128
  '<p><a class="label" data-label="$-a" href="#label:$-a">(1)</a></p>',
129
- '<p><sup class="annotation" id="annotation:ref:1" title="a"><span hidden="">a</span><a href="#annotation:def:1">*1</a></sup></p>',
129
+ '<p><sup class="annotation" id="annotation::ref:1" title="a"><span hidden="">a</span><a href="#annotation::def:1">*1</a></sup></p>',
130
130
  '<p><a class="url" href="https://source/x/a" target="_blank">a</a></p>',
131
131
  '<p><a class="url" href="https://source/a" target="_blank">/a</a></p>',
132
132
  '<p><a class="url" href="/z/a">^/a</a></p>',
@@ -137,7 +137,7 @@ describe('Unit: parser/api/parse', () => {
137
137
  '<p><a href="https://source/x/a" target="_blank"><img class="media" data-src="https://source/x/a" alt=""></a></p>',
138
138
  '<p><a href="/z/a" target="_blank"><img class="media" data-src="/z/a" alt=""></a></p>',
139
139
  '<p><a href="https://source/a" target="_blank"><img class="media" data-src="https://source/a" alt=""></a></p>',
140
- '<ol class="annotations"><li id="annotation:def:1" data-marker="*1">a<sup><a href="#annotation:ref:1">^1</a></sup></li></ol>',
140
+ '<ol class="annotations"><li id="annotation::def:1" data-marker="*1">a<sup><a href="#annotation::ref:1">^1</a></sup></li></ol>',
141
141
  ]);
142
142
  assert.deepStrictEqual(
143
143
  [...parse([
@@ -209,12 +209,12 @@ describe('Unit: parser/api/parse', () => {
209
209
  [...parse('$-a\n$$\n$$\n\n(($-a[[b]][[c_d_]]))', { footnotes }).children].map(el => el.outerHTML),
210
210
  [
211
211
  '<figure data-type="math" data-label="$-a" data-group="$" data-number="1" id="label:$-a"><figcaption><span class="figindex">(1)</span><span class="figtext"></span></figcaption><div><div class="math" translate="no">$$\n$$</div></div></figure>',
212
- '<p><sup class="annotation" id="annotation:ref:1" title="(1)"><span hidden=""><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference:ref:1" title="b"><span hidden="">b</span><a href="#reference:def:1">[1]</a></sup><sup class="reference" id="reference:ref:2" title="cd"><span hidden="">c<em>d</em></span><a href="#reference:def:2">[2]</a></sup></span><a href="#annotation:def:1">*1</a></sup></p>',
213
- '<ol class="annotations"><li id="annotation:def:1" data-marker="*1"><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference:ref:1" title="b"><span hidden="">b</span><a href="#reference:def:1">[1]</a></sup><sup class="reference" id="reference:ref:2" title="cd"><span hidden="">c<em>d</em></span><a href="#reference:def:2">[2]</a></sup><sup><a href="#annotation:ref:1">^1</a></sup></li></ol>',
212
+ '<p><sup class="annotation" id="annotation::ref:1" title="(1)"><span hidden=""><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference::ref:1" title="b"><span hidden="">b</span><a href="#reference::def:1">[1]</a></sup><sup class="reference" id="reference::ref:2" title="cd"><span hidden="">c<em>d</em></span><a href="#reference::def:2">[2]</a></sup></span><a href="#annotation::def:1">*1</a></sup></p>',
213
+ '<ol class="annotations"><li id="annotation::def:1" data-marker="*1"><a class="label" data-label="$-a" href="#label:$-a">(1)</a><sup class="reference" id="reference::ref:1" title="b"><span hidden="">b</span><a href="#reference::def:1">[1]</a></sup><sup class="reference" id="reference::ref:2" title="cd"><span hidden="">c<em>d</em></span><a href="#reference::def:2">[2]</a></sup><sup><a href="#annotation::ref:1">^1</a></sup></li></ol>',
214
214
  ]);
215
215
  assert.deepStrictEqual(
216
216
  footnotes.references.outerHTML,
217
- '<ol><li id="reference:def:1">b<sup><a href="#reference:ref:1">^1</a></sup></li><li id="reference:def:2">c<em>d</em><sup><a href="#reference:ref:2">^2</a></sup></li></ol>');
217
+ '<ol><li id="reference::def:1">b<sup><a href="#reference::ref:1">^1</a></sup></li><li id="reference::def:2">c<em>d</em><sup><a href="#reference::ref:2">^2</a></sup></li></ol>');
218
218
  });
219
219
 
220
220
  it('normalize', () => {
@@ -18,7 +18,8 @@ interface Options extends ParserOptions {
18
18
  }
19
19
 
20
20
  export function parse(source: string, opts: Options = {}, context?: MarkdownParser.Context): DocumentFragment {
21
- if (!validate(source, MAX_SEGMENT_SIZE)) throw new Error(`Too large input over ${MAX_SEGMENT_SIZE.toLocaleString('en')} bytes.`);
21
+ if (!validate(source, MAX_SEGMENT_SIZE)) throw new Error(`Too large input over ${MAX_SEGMENT_SIZE.toLocaleString('en')} bytes`);
22
+ if (context?.id?.includes(':')) throw new Error('ID must not contain ":"');
22
23
  const url = headers(source).find(field => field.toLowerCase().startsWith('url:'))?.slice(4).trim() ?? '';
23
24
  source = !context ? normalize(source) : source;
24
25
  assert(!context?.delimiters);
@@ -31,46 +31,46 @@ describe('Unit: parser/block/dlist', () => {
31
31
  });
32
32
 
33
33
  it('single', () => {
34
- assert.deepStrictEqual(inspect(parser('~ a')), [['<dl><dt id="index:a">a</dt><dd></dd></dl>'], '']);
35
- assert.deepStrictEqual(inspect(parser('~ \\')), [['<dl><dt id="index:\\">\\</dt><dd></dd></dl>'], '']);
36
- assert.deepStrictEqual(inspect(parser('~ \\ a')), [['<dl><dt id="index:a">a</dt><dd></dd></dl>'], '']);
37
- assert.deepStrictEqual(inspect(parser('~ a\nb')), [['<dl><dt id="index:a">a</dt><dd>b</dd></dl>'], '']);
38
- assert.deepStrictEqual(inspect(parser('~ a\nb\n')), [['<dl><dt id="index:a">a</dt><dd>b</dd></dl>'], '']);
39
- assert.deepStrictEqual(inspect(parser('~ a\nb\nc')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd></dl>'], '']);
40
- assert.deepStrictEqual(inspect(parser('~ a\nb\n\\\nc')), [['<dl><dt id="index:a">a</dt><dd>b<br>\\<br>c</dd></dl>'], '']);
41
- assert.deepStrictEqual(inspect(parser('~ a\n~')), [['<dl><dt id="index:a">a</dt><dd>~</dd></dl>'], '']);
42
- assert.deepStrictEqual(inspect(parser('~ a\n~b')), [['<dl><dt id="index:a">a</dt><dd>~b</dd></dl>'], '']);
43
- assert.deepStrictEqual(inspect(parser('~ a\n~ b')), [['<dl><dt id="index:a">a</dt><dt id="index:b">b</dt><dd></dd></dl>'], '']);
44
- assert.deepStrictEqual(inspect(parser('~ a\n:')), [['<dl><dt id="index:a">a</dt><dd>:</dd></dl>'], '']);
45
- assert.deepStrictEqual(inspect(parser('~ a\n: ')), [['<dl><dt id="index:a">a</dt><dd>:</dd></dl>'], '']);
46
- assert.deepStrictEqual(inspect(parser('~ a\n: \n')), [['<dl><dt id="index:a">a</dt><dd>:</dd></dl>'], '']);
47
- assert.deepStrictEqual(inspect(parser('~ a\n: \\')), [['<dl><dt id="index:a">a</dt><dd>\\</dd></dl>'], '']);
48
- assert.deepStrictEqual(inspect(parser('~ a\n:b')), [['<dl><dt id="index:a">a</dt><dd>:b</dd></dl>'], '']);
49
- assert.deepStrictEqual(inspect(parser('~ a\n: b')), [['<dl><dt id="index:a">a</dt><dd>b</dd></dl>'], '']);
50
- assert.deepStrictEqual(inspect(parser('~ a\n: b\n')), [['<dl><dt id="index:a">a</dt><dd>b</dd></dl>'], '']);
51
- assert.deepStrictEqual(inspect(parser('~ a\n: b\nc')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd></dl>'], '']);
52
- assert.deepStrictEqual(inspect(parser('~ a\n: b\n\\\nc')), [['<dl><dt id="index:a">a</dt><dd>b<br>\\<br>c</dd></dl>'], '']);
53
- assert.deepStrictEqual(inspect(parser('~ a~ b')), [['<dl><dt id="index:a~_b">a~ b</dt><dd></dd></dl>'], '']);
54
- assert.deepStrictEqual(inspect(parser('~ a: b')), [['<dl><dt id="index:a:_b">a: b</dt><dd></dd></dl>'], '']);
55
- assert.deepStrictEqual(inspect(parser('~ a \n: b \nc ')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd></dl>'], '']);
56
- assert.deepStrictEqual(inspect(parser('~ a \n: b\n c ')), [['<dl><dt id="index:a">a</dt><dd>b<br> c</dd></dl>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('~ a')), [['<dl><dt id="index::a">a</dt><dd></dd></dl>'], '']);
35
+ assert.deepStrictEqual(inspect(parser('~ \\')), [['<dl><dt id="index::\\">\\</dt><dd></dd></dl>'], '']);
36
+ assert.deepStrictEqual(inspect(parser('~ \\ a')), [['<dl><dt id="index::a">a</dt><dd></dd></dl>'], '']);
37
+ assert.deepStrictEqual(inspect(parser('~ a\nb')), [['<dl><dt id="index::a">a</dt><dd>b</dd></dl>'], '']);
38
+ assert.deepStrictEqual(inspect(parser('~ a\nb\n')), [['<dl><dt id="index::a">a</dt><dd>b</dd></dl>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('~ a\nb\nc')), [['<dl><dt id="index::a">a</dt><dd>b<br>c</dd></dl>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('~ a\nb\n\\\nc')), [['<dl><dt id="index::a">a</dt><dd>b<br>\\<br>c</dd></dl>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('~ a\n~')), [['<dl><dt id="index::a">a</dt><dd>~</dd></dl>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('~ a\n~b')), [['<dl><dt id="index::a">a</dt><dd>~b</dd></dl>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('~ a\n~ b')), [['<dl><dt id="index::a">a</dt><dt id="index::b">b</dt><dd></dd></dl>'], '']);
44
+ assert.deepStrictEqual(inspect(parser('~ a\n:')), [['<dl><dt id="index::a">a</dt><dd>:</dd></dl>'], '']);
45
+ assert.deepStrictEqual(inspect(parser('~ a\n: ')), [['<dl><dt id="index::a">a</dt><dd>:</dd></dl>'], '']);
46
+ assert.deepStrictEqual(inspect(parser('~ a\n: \n')), [['<dl><dt id="index::a">a</dt><dd>:</dd></dl>'], '']);
47
+ assert.deepStrictEqual(inspect(parser('~ a\n: \\')), [['<dl><dt id="index::a">a</dt><dd>\\</dd></dl>'], '']);
48
+ assert.deepStrictEqual(inspect(parser('~ a\n:b')), [['<dl><dt id="index::a">a</dt><dd>:b</dd></dl>'], '']);
49
+ assert.deepStrictEqual(inspect(parser('~ a\n: b')), [['<dl><dt id="index::a">a</dt><dd>b</dd></dl>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('~ a\n: b\n')), [['<dl><dt id="index::a">a</dt><dd>b</dd></dl>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('~ a\n: b\nc')), [['<dl><dt id="index::a">a</dt><dd>b<br>c</dd></dl>'], '']);
52
+ assert.deepStrictEqual(inspect(parser('~ a\n: b\n\\\nc')), [['<dl><dt id="index::a">a</dt><dd>b<br>\\<br>c</dd></dl>'], '']);
53
+ assert.deepStrictEqual(inspect(parser('~ a~ b')), [['<dl><dt id="index::a~_b">a~ b</dt><dd></dd></dl>'], '']);
54
+ assert.deepStrictEqual(inspect(parser('~ a: b')), [['<dl><dt id="index::a:_b">a: b</dt><dd></dd></dl>'], '']);
55
+ assert.deepStrictEqual(inspect(parser('~ a \n: b \nc ')), [['<dl><dt id="index::a">a</dt><dd>b<br>c</dd></dl>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('~ a \n: b\n c ')), [['<dl><dt id="index::a">a</dt><dd>b<br> c</dd></dl>'], '']);
57
57
  });
58
58
 
59
59
  it('multiple', () => {
60
- assert.deepStrictEqual(inspect(parser('~ a\n: b\n~ c\n: d')), [['<dl><dt id="index:a">a</dt><dd>b</dd><dt id="index:c">c</dt><dd>d</dd></dl>'], '']);
61
- assert.deepStrictEqual(inspect(parser('~ a\n b\nc\n d')), [['<dl><dt id="index:a">a</dt><dd> b<br>c<br> d</dd></dl>'], '']);
62
- assert.deepStrictEqual(inspect(parser('~ a\n: b\nc\n: d')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd><dd>d</dd></dl>'], '']);
63
- assert.deepStrictEqual(inspect(parser('~ a\n: b\nc\n~ d\n: e')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd><dt id="index:d">d</dt><dd>e</dd></dl>'], '']);
64
- assert.deepStrictEqual(inspect(parser('~ a\n: b\n~ c\n: d\n~ e\n: f')), [['<dl><dt id="index:a">a</dt><dd>b</dd><dt id="index:c">c</dt><dd>d</dd><dt id="index:e">e</dt><dd>f</dd></dl>'], '']);
60
+ assert.deepStrictEqual(inspect(parser('~ a\n: b\n~ c\n: d')), [['<dl><dt id="index::a">a</dt><dd>b</dd><dt id="index::c">c</dt><dd>d</dd></dl>'], '']);
61
+ assert.deepStrictEqual(inspect(parser('~ a\n b\nc\n d')), [['<dl><dt id="index::a">a</dt><dd> b<br>c<br> d</dd></dl>'], '']);
62
+ assert.deepStrictEqual(inspect(parser('~ a\n: b\nc\n: d')), [['<dl><dt id="index::a">a</dt><dd>b<br>c</dd><dd>d</dd></dl>'], '']);
63
+ assert.deepStrictEqual(inspect(parser('~ a\n: b\nc\n~ d\n: e')), [['<dl><dt id="index::a">a</dt><dd>b<br>c</dd><dt id="index::d">d</dt><dd>e</dd></dl>'], '']);
64
+ assert.deepStrictEqual(inspect(parser('~ a\n: b\n~ c\n: d\n~ e\n: f')), [['<dl><dt id="index::a">a</dt><dd>b</dd><dt id="index::c">c</dt><dd>d</dd><dt id="index::e">e</dt><dd>f</dd></dl>'], '']);
65
65
  });
66
66
 
67
67
  it('index', () => {
68
- assert.deepStrictEqual(inspect(parser('~ a [#b]')), [['<dl><dt id="index:b">a<span class="indexer" data-index="b"></span></dt><dd></dd></dl>'], '']);
69
- assert.deepStrictEqual(inspect(parser('~ a [#b]\\')), [['<dl><dt id="index:a_[#b]">a [<a class="hashtag" href="/hashtags/b">#b</a>]</dt><dd></dd></dl>'], '']);
70
- assert.deepStrictEqual(inspect(parser('~ A')), [['<dl><dt id="index:A">A</dt><dd></dd></dl>'], '']);
71
- assert.deepStrictEqual(inspect(parser('~ _A_')), [['<dl><dt id="index:A"><em>A</em></dt><dd></dd></dl>'], '']);
72
- assert.deepStrictEqual(inspect(parser('~ `A`')), [['<dl><dt id="index:`A`"><code data-src="`A`">A</code></dt><dd></dd></dl>'], '']);
73
- assert.deepStrictEqual(inspect(parser('~ ${A}$')), [['<dl><dt id="index:${A}$"><span class="math" translate="no" data-src="${A}$">${A}$</span></dt><dd></dd></dl>'], '']);
68
+ assert.deepStrictEqual(inspect(parser('~ a [#b]')), [['<dl><dt id="index::b">a<span class="indexer" data-index="b"></span></dt><dd></dd></dl>'], '']);
69
+ assert.deepStrictEqual(inspect(parser('~ a [#b]\\')), [['<dl><dt id="index::a_[#b]">a [<a class="hashtag" href="/hashtags/b">#b</a>]</dt><dd></dd></dl>'], '']);
70
+ assert.deepStrictEqual(inspect(parser('~ A')), [['<dl><dt id="index::A">A</dt><dd></dd></dl>'], '']);
71
+ assert.deepStrictEqual(inspect(parser('~ _A_')), [['<dl><dt id="index::A"><em>A</em></dt><dd></dd></dl>'], '']);
72
+ assert.deepStrictEqual(inspect(parser('~ `A`')), [['<dl><dt id="index::`A`"><code data-src="`A`">A</code></dt><dd></dd></dl>'], '']);
73
+ assert.deepStrictEqual(inspect(parser('~ ${A}$')), [['<dl><dt id="index::${A}$"><span class="math" translate="no" data-src="${A}$">${A}$</span></dt><dd></dd></dl>'], '']);
74
74
  });
75
75
 
76
76
  });
@@ -14,9 +14,9 @@ describe('Unit: parser/block/extension/aside', () => {
14
14
  });
15
15
 
16
16
  it('valid', () => {
17
- assert.deepStrictEqual(inspect(parser('~~~aside\n# 0\n~~~')), [['<aside id="index:0" class="aside"><h1>0</h1><h2>References</h2><ol class="references"></ol></aside>'], '']);
18
- assert.deepStrictEqual(inspect(parser('~~~aside\n## 0\n~~~')), [['<aside id="index:0" class="aside"><h2>0</h2><h2>References</h2><ol class="references"></ol></aside>'], '']);
19
- assert.deepStrictEqual(inspect(parser('~~~aside\n# 0\n\n$-0.0\n\n## 1\n\n$test-a\n> \n~~~')), [['<aside id="index:0" class="aside"><h1>0</h1><figure data-label="$-0.0" data-group="$" hidden="" data-number="0.0"></figure><h2>1</h2><figure data-type="quote" data-label="test-a" data-group="test" data-number="1.1"><figcaption><span class="figindex">Test 1.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure><h2>References</h2><ol class="references"></ol></aside>'], '']);
17
+ assert.deepStrictEqual(inspect(parser('~~~aside\n# 0\n~~~')), [['<aside id="index::0" class="aside"><h1>0</h1><h2>References</h2><ol class="references"></ol></aside>'], '']);
18
+ assert.deepStrictEqual(inspect(parser('~~~aside\n## 0\n~~~')), [['<aside id="index::0" class="aside"><h2>0</h2><h2>References</h2><ol class="references"></ol></aside>'], '']);
19
+ assert.deepStrictEqual(inspect(parser('~~~aside\n# 0\n\n$-0.0\n\n## 1\n\n$test-a\n> \n~~~')), [['<aside id="index::0" class="aside"><h1>0</h1><figure data-label="$-0.0" data-group="$" hidden="" data-number="0.0"></figure><h2>1</h2><figure data-type="quote" data-label="test-a" data-group="test" data-number="1.1"><figcaption><span class="figindex">Test 1.1. </span><span class="figtext"></span></figcaption><div><blockquote></blockquote></div></figure><h2>References</h2><ol class="references"></ol></aside>'], '']);
20
20
  });
21
21
 
22
22
  });
@@ -34,9 +34,9 @@ export const aside: ExtensionParser.AsideParser = block(validate('~~~', fmap(
34
34
  'data-invalid-type': 'content',
35
35
  'data-invalid-message': 'Missing the title at the first line',
36
36
  }, `${opener}${body}${closer}`)];
37
- assert(identity(text(heading)));
37
+ assert(identity(context.id, text(heading)));
38
38
  return [
39
- html('aside', { id: identity(text(heading)), class: 'aside' }, [
39
+ html('aside', { id: identity(context.id, text(heading)), class: 'aside' }, [
40
40
  document,
41
41
  html('h2', 'References'),
42
42
  references,
@@ -44,8 +44,8 @@ describe('Unit: parser/block/extension/figure', () => {
44
44
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
45
45
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\\\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">\\</span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
46
46
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n!https://caption\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">!<a class="url" href="https://caption" target="_blank">https://caption</a></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
47
- assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n- a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><ul><li id="index:a">a</li></ul></div></figure>'], '']);
48
- assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n1. a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><ol><li id="index:a">a</li></ol></div></figure>'], '']);
47
+ assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n- a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><ul><li id="index::a">a</li></ul></div></figure>'], '']);
48
+ assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n1. a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><ol><li id="index::a">a</li></ol></div></figure>'], '']);
49
49
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n|\n|-\n|\n~~~')), [['<figure data-type="table" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><table><thead><tr></tr></thead><tbody><tr></tr></tbody></table></div></figure>'], '']);
50
50
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n\n```\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><pre class="text"></pre></div></figure>'], '']);
51
51
  assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n```\n~~~\n```\n\n~~~')), [['<figure data-type="text" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><pre class="text">~~~</pre></div></figure>'], '']);
@@ -27,60 +27,60 @@ describe('Unit: parser/block/heading', () => {
27
27
  assert.deepStrictEqual(inspect(parser('# a\nb')), undefined);
28
28
  assert.deepStrictEqual(inspect(parser('# *a\nb*')), undefined);
29
29
  assert.deepStrictEqual(inspect(parser('# a\n#b')), undefined);
30
- assert.deepStrictEqual(inspect(parser('####### a')), [['<h6 class="invalid" id="index:a">a</h6>'], '']);
30
+ assert.deepStrictEqual(inspect(parser('####### a')), [['<h6 class="invalid" id="index::a">a</h6>'], '']);
31
31
  assert.deepStrictEqual(inspect(parser(' # a')), undefined);
32
32
  });
33
33
 
34
34
  it('basic', () => {
35
- assert.deepStrictEqual(inspect(parser('# a')), [['<h1 id="index:a">a</h1>'], '']);
36
- assert.deepStrictEqual(inspect(parser('# a ')), [['<h1 id="index:a">a</h1>'], '']);
37
- assert.deepStrictEqual(inspect(parser('# a b c \n')), [['<h1 id="index:a_b_c">a b c</h1>'], '']);
38
- assert.deepStrictEqual(inspect(parser('# a\n')), [['<h1 id="index:a">a</h1>'], '']);
39
- assert.deepStrictEqual(inspect(parser('# _a_`b`${c}$')), [['<h1 id="index:a`b`${c}$"><em>a</em><code data-src="`b`">b</code><span class="math" translate="no" data-src="${c}$">${c}$</span></h1>'], '']);
40
- assert.deepStrictEqual(inspect(parser('# a\\')), [['<h1 id="index:a">a</h1>'], '']);
41
- assert.deepStrictEqual(inspect(parser('# a\\\n')), [['<h1 id="index:a">a</h1>'], '']);
42
- assert.deepStrictEqual(inspect(parser('# \\')), [['<h1 id="index:\\">\\</h1>'], '']);
43
- assert.deepStrictEqual(inspect(parser('# \\ a')), [['<h1 id="index:a">a</h1>'], '']);
44
- assert.deepStrictEqual(inspect(parser('## \\')), [['<h2 id="index:\\">\\</h2>'], '']);
45
- assert.deepStrictEqual(inspect(parser('# @a')), [['<h1 id="index:@a">@a</h1>'], '']);
46
- assert.deepStrictEqual(inspect(parser('## @a')), [['<h2 id="index:@a"><a class="account" href="/@a">@a</a></h2>'], '']);
47
- assert.deepStrictEqual(inspect(parser('# http://host')), [['<h1 id="index:http://host">http://host</h1>'], '']);
48
- assert.deepStrictEqual(inspect(parser('## http://host')), [['<h2 id="index:http://host"><a class="url" href="http://host" target="_blank">http://host</a></h2>'], '']);
49
- assert.deepStrictEqual(inspect(parser('# !http://host')), [['<h1 id="index:!http://host">!http://host</h1>'], '']);
50
- assert.deepStrictEqual(inspect(parser('## !http://host')), [['<h2 id="index:!http://host">!<a class="url" href="http://host" target="_blank">http://host</a></h2>'], '']);
51
- assert.deepStrictEqual(inspect(parser('# a((b))')), [['<h1 id="index:a((b))">a<span class="paren">((b))</span></h1>'], '']);
52
- assert.deepStrictEqual(inspect(parser('## a((b))')), [['<h2 id="index:a((b))">a<span class="paren">((b))</span></h2>'], '']);
53
- assert.deepStrictEqual(inspect(parser('# a[[b]]')), [['<h1 id="index:a[[b]]">a[[b]]</h1>'], '']);
54
- assert.deepStrictEqual(inspect(parser('## a[[b]]')), [['<h2 id="index:a[[b]]">a[[b]]</h2>'], '']);
55
- assert.deepStrictEqual(inspect(parser('###### a')), [['<h6 id="index:a">a</h6>'], '']);
56
- assert.deepStrictEqual(inspect(parser('# a\n##')), [['<h1 id="index:a">a</h1>', '##'], '']);
57
- assert.deepStrictEqual(inspect(parser('# a\n## ')), [['<h1 id="index:a">a</h1>', '## '], '']);
58
- assert.deepStrictEqual(inspect(parser('# a\n## b')), [['<h1 id="index:a">a</h1>', '<h2 id="index:b">b</h2>'], '']);
59
- assert.deepStrictEqual(inspect(parser('# a\n##\n## b')), [['<h1 id="index:a">a</h1>', '##\n', '<h2 id="index:b">b</h2>'], '']);
35
+ assert.deepStrictEqual(inspect(parser('# a')), [['<h1 id="index::a">a</h1>'], '']);
36
+ assert.deepStrictEqual(inspect(parser('# a ')), [['<h1 id="index::a">a</h1>'], '']);
37
+ assert.deepStrictEqual(inspect(parser('# a b c \n')), [['<h1 id="index::a_b_c">a b c</h1>'], '']);
38
+ assert.deepStrictEqual(inspect(parser('# a\n')), [['<h1 id="index::a">a</h1>'], '']);
39
+ assert.deepStrictEqual(inspect(parser('# _a_`b`${c}$')), [['<h1 id="index::a`b`${c}$"><em>a</em><code data-src="`b`">b</code><span class="math" translate="no" data-src="${c}$">${c}$</span></h1>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('# a\\')), [['<h1 id="index::a">a</h1>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('# a\\\n')), [['<h1 id="index::a">a</h1>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('# \\')), [['<h1 id="index::\\">\\</h1>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('# \\ a')), [['<h1 id="index::a">a</h1>'], '']);
44
+ assert.deepStrictEqual(inspect(parser('## \\')), [['<h2 id="index::\\">\\</h2>'], '']);
45
+ assert.deepStrictEqual(inspect(parser('# @a')), [['<h1 id="index::@a">@a</h1>'], '']);
46
+ assert.deepStrictEqual(inspect(parser('## @a')), [['<h2 id="index::@a"><a class="account" href="/@a">@a</a></h2>'], '']);
47
+ assert.deepStrictEqual(inspect(parser('# http://host')), [['<h1 id="index::http://host">http://host</h1>'], '']);
48
+ assert.deepStrictEqual(inspect(parser('## http://host')), [['<h2 id="index::http://host"><a class="url" href="http://host" target="_blank">http://host</a></h2>'], '']);
49
+ assert.deepStrictEqual(inspect(parser('# !http://host')), [['<h1 id="index::!http://host">!http://host</h1>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('## !http://host')), [['<h2 id="index::!http://host">!<a class="url" href="http://host" target="_blank">http://host</a></h2>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('# a((b))')), [['<h1 id="index::a((b))">a<span class="paren">((b))</span></h1>'], '']);
52
+ assert.deepStrictEqual(inspect(parser('## a((b))')), [['<h2 id="index::a((b))">a<span class="paren">((b))</span></h2>'], '']);
53
+ assert.deepStrictEqual(inspect(parser('# a[[b]]')), [['<h1 id="index::a[[b]]">a[[b]]</h1>'], '']);
54
+ assert.deepStrictEqual(inspect(parser('## a[[b]]')), [['<h2 id="index::a[[b]]">a[[b]]</h2>'], '']);
55
+ assert.deepStrictEqual(inspect(parser('###### a')), [['<h6 id="index::a">a</h6>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('# a\n##')), [['<h1 id="index::a">a</h1>', '##'], '']);
57
+ assert.deepStrictEqual(inspect(parser('# a\n## ')), [['<h1 id="index::a">a</h1>', '## '], '']);
58
+ assert.deepStrictEqual(inspect(parser('# a\n## b')), [['<h1 id="index::a">a</h1>', '<h2 id="index::b">b</h2>'], '']);
59
+ assert.deepStrictEqual(inspect(parser('# a\n##\n## b')), [['<h1 id="index::a">a</h1>', '##\n', '<h2 id="index::b">b</h2>'], '']);
60
60
  });
61
61
 
62
62
  it('indexer', () => {
63
- assert.deepStrictEqual(inspect(parser('# [#a]')), [['<h1 id="index:[#a]">[#a]</h1>'], '']);
64
- assert.deepStrictEqual(inspect(parser('# a[#b]')), [['<h1 id="index:a[#b]">a[#b]</h1>'], '']);
65
- assert.deepStrictEqual(inspect(parser('# a [#b]')), [['<h1 id="index:b">a<span class="indexer" data-index="b"></span></h1>'], '']);
66
- assert.deepStrictEqual(inspect(parser('# a [#b] ')), [['<h1 id="index:b">a<span class="indexer" data-index="b"></span></h1>'], '']);
67
- assert.deepStrictEqual(inspect(parser('# a [#b]\\')), [['<h1 id="index:a_[#b]">a [#b]</h1>'], '']);
68
- assert.deepStrictEqual(inspect(parser('# a [#B]')), [['<h1 id="index:B">a<span class="indexer" data-index="B"></span></h1>'], '']);
69
- assert.deepStrictEqual(inspect(parser('# a [#b ]')), [['<h1 id="index:b">a<span class="indexer" data-index="b"></span></h1>'], '']);
70
- assert.deepStrictEqual(inspect(parser('# a [#b ]')), [['<h1 id="index:b">a<span class="indexer" data-index="b"></span></h1>'], '']);
71
- assert.deepStrictEqual(inspect(parser('# a [#b c]')), [['<h1 id="index:b_c">a<span class="indexer" data-index="b_c"></span></h1>'], '']);
72
- assert.deepStrictEqual(inspect(parser('# a [#_b_`c`${d}$]')), [['<h1 id="index:b`c`${d}$">a<span class="indexer" data-index="b`c`${d}$"></span></h1>'], '']);
73
- assert.deepStrictEqual(inspect(parser('# a [#@a]')), [['<h1 id="index:@a">a<span class="indexer" data-index="@a"></span></h1>'], '']);
74
- assert.deepStrictEqual(inspect(parser('# a [#http://host]')), [['<h1 id="index:http://host">a<span class="indexer" data-index="http://host"></span></h1>'], '']);
75
- assert.deepStrictEqual(inspect(parser('# a [#!http://host]')), [['<h1 id="index:!http://host">a<span class="indexer" data-index="!http://host"></span></h1>'], '']);
76
- assert.deepStrictEqual(inspect(parser('# a [#a((b))]')), [['<h1 id="index:a((b))">a<span class="indexer" data-index="a((b))"></span></h1>'], '']);
77
- assert.deepStrictEqual(inspect(parser('# a [#a[[b]]]')), [['<h1 id="index:a[[b]]">a<span class="indexer" data-index="a[[b]]"></span></h1>'], '']);
78
- assert.deepStrictEqual(inspect(parser('# a [#b |c]')), [['<h1 id="index:c">a<span class="indexer" data-index="c"></span></h1>'], '']);
79
- assert.deepStrictEqual(inspect(parser('# a [#b] [#c]')), [['<h1 id="index:c">a [#b]<span class="indexer" data-index="c"></span></h1>'], '']);
80
- assert.deepStrictEqual(inspect(parser('# a [#b] \n')), [['<h1 id="index:b">a<span class="indexer" data-index="b"></span></h1>'], '']);
81
- assert.deepStrictEqual(inspect(parser('# a \\[#b]')), [['<h1 id="index:a_[#b]">a [#b]</h1>'], '']);
82
- assert.deepStrictEqual(inspect(parser('## a [#b] [#c]')), [['<h2 id="index:c">a [<a class="hashtag" href="/hashtags/b">#b</a>]<span class="indexer" data-index="c"></span></h2>'], '']);
83
- assert.deepStrictEqual(inspect(parser('## a [#b ] [#c ]')), [['<h2 id="index:c">a [<a class="hashtag" href="/hashtags/b">#b</a> ]<span class="indexer" data-index="c"></span></h2>'], '']);
63
+ assert.deepStrictEqual(inspect(parser('# [#a]')), [['<h1 id="index::[#a]">[#a]</h1>'], '']);
64
+ assert.deepStrictEqual(inspect(parser('# a[#b]')), [['<h1 id="index::a[#b]">a[#b]</h1>'], '']);
65
+ assert.deepStrictEqual(inspect(parser('# a [#b]')), [['<h1 id="index::b">a<span class="indexer" data-index="b"></span></h1>'], '']);
66
+ assert.deepStrictEqual(inspect(parser('# a [#b] ')), [['<h1 id="index::b">a<span class="indexer" data-index="b"></span></h1>'], '']);
67
+ assert.deepStrictEqual(inspect(parser('# a [#b]\\')), [['<h1 id="index::a_[#b]">a [#b]</h1>'], '']);
68
+ assert.deepStrictEqual(inspect(parser('# a [#B]')), [['<h1 id="index::B">a<span class="indexer" data-index="B"></span></h1>'], '']);
69
+ assert.deepStrictEqual(inspect(parser('# a [#b ]')), [['<h1 id="index::b">a<span class="indexer" data-index="b"></span></h1>'], '']);
70
+ assert.deepStrictEqual(inspect(parser('# a [#b ]')), [['<h1 id="index::b">a<span class="indexer" data-index="b"></span></h1>'], '']);
71
+ assert.deepStrictEqual(inspect(parser('# a [#b c]')), [['<h1 id="index::b_c">a<span class="indexer" data-index="b_c"></span></h1>'], '']);
72
+ assert.deepStrictEqual(inspect(parser('# a [#_b_`c`${d}$]')), [['<h1 id="index::b`c`${d}$">a<span class="indexer" data-index="b`c`${d}$"></span></h1>'], '']);
73
+ assert.deepStrictEqual(inspect(parser('# a [#@a]')), [['<h1 id="index::@a">a<span class="indexer" data-index="@a"></span></h1>'], '']);
74
+ assert.deepStrictEqual(inspect(parser('# a [#http://host]')), [['<h1 id="index::http://host">a<span class="indexer" data-index="http://host"></span></h1>'], '']);
75
+ assert.deepStrictEqual(inspect(parser('# a [#!http://host]')), [['<h1 id="index::!http://host">a<span class="indexer" data-index="!http://host"></span></h1>'], '']);
76
+ assert.deepStrictEqual(inspect(parser('# a [#a((b))]')), [['<h1 id="index::a((b))">a<span class="indexer" data-index="a((b))"></span></h1>'], '']);
77
+ assert.deepStrictEqual(inspect(parser('# a [#a[[b]]]')), [['<h1 id="index::a[[b]]">a<span class="indexer" data-index="a[[b]]"></span></h1>'], '']);
78
+ assert.deepStrictEqual(inspect(parser('# a [#b |c]')), [['<h1 id="index::c">a<span class="indexer" data-index="c"></span></h1>'], '']);
79
+ assert.deepStrictEqual(inspect(parser('# a [#b] [#c]')), [['<h1 id="index::c">a [#b]<span class="indexer" data-index="c"></span></h1>'], '']);
80
+ assert.deepStrictEqual(inspect(parser('# a [#b] \n')), [['<h1 id="index::b">a<span class="indexer" data-index="b"></span></h1>'], '']);
81
+ assert.deepStrictEqual(inspect(parser('# a \\[#b]')), [['<h1 id="index::a_[#b]">a [#b]</h1>'], '']);
82
+ assert.deepStrictEqual(inspect(parser('## a [#b] [#c]')), [['<h2 id="index::c">a [<a class="hashtag" href="/hashtags/b">#b</a>]<span class="indexer" data-index="c"></span></h2>'], '']);
83
+ assert.deepStrictEqual(inspect(parser('## a [#b ] [#c ]')), [['<h2 id="index::c">a [<a class="hashtag" href="/hashtags/b">#b</a> ]<span class="indexer" data-index="c"></span></h2>'], '']);
84
84
  });
85
85
 
86
86
  });