securemark 0.293.1 → 0.293.2

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.293.2
4
+
5
+ - Refactoring.
6
+
3
7
  ## 0.293.1
4
8
 
5
9
  - Refactoring.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! securemark v0.293.1 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
1
+ /*! securemark v0.293.2 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"));
@@ -2906,7 +2906,7 @@ Object.defineProperty(exports, "__esModule", ({
2906
2906
  exports.rewrite = exports.focus = void 0;
2907
2907
  const parser_1 = __webpack_require__(605);
2908
2908
  const combinator_1 = __webpack_require__(3484);
2909
- function focus(scope, parser, cost = true) {
2909
+ function focus(scope, parser) {
2910
2910
  const match = (0, combinator_1.matcher)(scope, false);
2911
2911
  return (0, parser_1.failsafe)(({
2912
2912
  context
@@ -2920,7 +2920,6 @@ function focus(scope, parser, cost = true) {
2920
2920
  context
2921
2921
  }))?.[0] ?? '';
2922
2922
  if (src === '') return;
2923
- cost && (0, combinator_1.consume)(src.length, context);
2924
2923
  context.range = src.length;
2925
2924
  context.offset ??= 0;
2926
2925
  context.offset += position;
@@ -5543,13 +5542,13 @@ const autolink_1 = __webpack_require__(1671);
5543
5542
  const source_1 = __webpack_require__(8745);
5544
5543
  const util_1 = __webpack_require__(4992);
5545
5544
  const dom_1 = __webpack_require__(394);
5546
- exports.sidefence = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.focus)(/(?=\|+(?:[^\S\n]|\n\|))(?:\|+(?:[^\S\n][^\n]*)?(?:$|\n))+$/y, (0, combinator_1.union)([source]), false), ([el]) => [(0, dom_1.define)(el, {
5545
+ exports.sidefence = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.focus)(/(?=\|+(?:[^\S\n]|\n\|))(?:\|+(?:[^\S\n][^\n]*)?(?:$|\n))+$/y, (0, combinator_1.union)([source])), ([el]) => [(0, dom_1.define)(el, {
5547
5546
  class: 'invalid',
5548
5547
  ...(0, util_1.invalid)('sidefence', 'syntax', 'Reserved syntax')
5549
5548
  })])));
5550
5549
  const opener = /(?=\|\|+(?:$|\s))/y;
5551
5550
  const unindent = source => source.replace(/(?<=^|\n)\|(?:[^\S\n]|(?=\|*(?:$|\s)))|\n$/g, '');
5552
- const source = (0, combinator_1.lazy)(() => (0, combinator_1.fmap)((0, combinator_1.some)((0, combinator_1.recursion)(1 /* Recursion.block */, (0, combinator_1.union)([(0, combinator_1.focus)(/(?:\|\|+(?:[^\S\n][^\n]*)?(?:$|\n))+/y, (0, combinator_1.convert)(unindent, source, false, true), false), (0, combinator_1.rewrite)((0, combinator_1.some)(source_1.contentline, opener), (0, combinator_1.convert)(unindent, (0, combinator_1.fmap)(autolink_1.autolink, ns => [(0, dom_1.html)('pre', (0, dom_1.defrag)(ns))]), false, true))]))), ns => [(0, dom_1.html)('blockquote', ns)]));
5551
+ const source = (0, combinator_1.lazy)(() => (0, combinator_1.fmap)((0, combinator_1.some)((0, combinator_1.recursion)(1 /* Recursion.block */, (0, combinator_1.union)([(0, combinator_1.focus)(/(?:\|\|+(?:[^\S\n][^\n]*)?(?:$|\n))+/y, (0, combinator_1.convert)(unindent, source, false, true)), (0, combinator_1.rewrite)((0, combinator_1.some)(source_1.contentline, opener), (0, combinator_1.convert)(unindent, (0, combinator_1.fmap)(autolink_1.autolink, ns => [(0, dom_1.html)('pre', (0, dom_1.defrag)(ns))]), false, true))]))), ns => [(0, dom_1.html)('blockquote', ns)]));
5553
5552
 
5554
5553
  /***/ },
5555
5554
 
@@ -5584,11 +5583,11 @@ const align = (0, combinator_1.fmap)((0, combinator_1.open)('|', (0, combinator_
5584
5583
  context: {
5585
5584
  source
5586
5585
  }
5587
- }) => [[source.at(-1) === ':' ? 'center' : 'start']], false), (0, combinator_1.focus)(/-+:?/y, ({
5586
+ }) => [[source.at(-1) === ':' ? 'center' : 'start']]), (0, combinator_1.focus)(/-+:?/y, ({
5588
5587
  context: {
5589
5588
  source
5590
5589
  }
5591
- }) => [[source.at(-1) === ':' ? 'end' : '']], false)])), ns => [(0, dom_1.html)('td', (0, dom_1.defrag)(ns))]);
5590
+ }) => [[source.at(-1) === ':' ? 'end' : '']])])), ns => [(0, dom_1.html)('td', (0, dom_1.defrag)(ns))]);
5592
5591
  const cell = (0, combinator_1.surround)(/\|\s*(?=\S)/y, (0, combinator_1.union)([(0, combinator_1.close)(inline_1.medialink, /\s*(?=\||$)/y), (0, combinator_1.close)(inline_1.media, /\s*(?=\||$)/y), (0, combinator_1.close)(inline_1.shortmedia, /\s*(?=\||$)/y), (0, visibility_1.trimBlank)((0, combinator_1.some)(inline_1.inline, /\|/y, [[/[|\\]?\s*$/y, 9]]))]), /[^|]*/y, true);
5593
5592
  const head = (0, combinator_1.fmap)(cell, ns => [(0, dom_1.html)('th', (0, dom_1.defrag)(ns))]);
5594
5593
  const data = (0, combinator_1.fmap)(cell, ns => [(0, dom_1.html)('td', (0, dom_1.defrag)(ns))]);
@@ -7949,8 +7948,8 @@ Object.defineProperty(exports, "__esModule", ({
7949
7948
  exports.escsource = void 0;
7950
7949
  const combinator_1 = __webpack_require__(3484);
7951
7950
  const text_1 = __webpack_require__(5655);
7952
- const unescapable_1 = __webpack_require__(8407);
7953
7951
  const dom_1 = __webpack_require__(394);
7952
+ const delimiter = /(?=[\\$"`\[\](){}\r\n]|\s(?:\$)|:\/\/)/g;
7954
7953
  const escsource = ({
7955
7954
  context
7956
7955
  }) => {
@@ -7988,7 +7987,7 @@ const escsource = ({
7988
7987
  if (context.sequential) return [[char]];
7989
7988
  text_1.nonWhitespace.lastIndex = position + 1;
7990
7989
  const b = (0, text_1.isBlank)(source, position);
7991
- let i = b ? text_1.nonWhitespace.test(source) ? text_1.nonWhitespace.lastIndex - 1 : source.length : (0, text_1.next)(source, position, unescapable_1.delimiter);
7990
+ let i = b ? text_1.nonWhitespace.test(source) ? text_1.nonWhitespace.lastIndex - 1 : source.length : (0, text_1.next)(source, position, delimiter);
7992
7991
  i -= position;
7993
7992
  (0, combinator_1.consume)(i - 1, context);
7994
7993
  context.position += i - 1;
@@ -8101,10 +8100,10 @@ exports.strs = strs;
8101
8100
  Object.defineProperty(exports, "__esModule", ({
8102
8101
  value: true
8103
8102
  }));
8104
- exports.isAlphanumeric = exports.isBlank = exports.backToEmailHead = exports.backToUrlHead = exports.next = exports.linebreak = exports.txt = exports.text = exports.nonWhitespace = exports.delimiter = void 0;
8103
+ exports.isBlank = exports.backToEmailHead = exports.backToUrlHead = exports.next = exports.linebreak = exports.txt = exports.text = exports.nonWhitespace = exports.delimiter = void 0;
8105
8104
  const combinator_1 = __webpack_require__(3484);
8106
8105
  const dom_1 = __webpack_require__(394);
8107
- exports.delimiter = /(?=[\\!@#$&"`\[\](){}<>()[]{}*%|+~=/]|\s(?:\\?(?:$|\s)|[$*%|]|([+~=])\1)|\/{3}|:\/\/|\n)/g;
8106
+ exports.delimiter = /(?=[\\!@#$&"`\[\](){}<>()[]{}*%|\r\n]|([+~=])\1|\/{3}|\s(?:\\?(?:$|\s)|[$%])|:\/\/)/g;
8108
8107
  exports.nonWhitespace = /[\S\r\n]/g;
8109
8108
  const text = input => {
8110
8109
  const {
@@ -8170,16 +8169,6 @@ function next(source, position, delimiter) {
8170
8169
  index = backToEmailHead(source, position, index);
8171
8170
  break;
8172
8171
  }
8173
- if (index > position + 1) switch (char) {
8174
- case '*':
8175
- case '+':
8176
- case '~':
8177
- case '=':
8178
- case '/':
8179
- case '%':
8180
- case '|':
8181
- index -= /\s/.test(source[index - 1]) ? 1 : 0;
8182
- }
8183
8172
  return index;
8184
8173
  }
8185
8174
  exports.next = next;
@@ -8250,7 +8239,6 @@ function isAlphanumeric(char) {
8250
8239
  if (char < '0' || '\x7F' < char) return false;
8251
8240
  return '0' <= char && char <= '9' || 'a' <= char && char <= 'z' || 'A' <= char && char <= 'Z';
8252
8241
  }
8253
- exports.isAlphanumeric = isAlphanumeric;
8254
8242
 
8255
8243
  /***/ },
8256
8244
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.293.1",
3
+ "version": "0.293.2",
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,8 +1,8 @@
1
1
  import { Parser, Context, input, eval, failsafe } from '../../data/parser';
2
- import { consume, matcher } from '../../../combinator';
2
+ import { matcher } from '../../../combinator';
3
3
 
4
- export function focus<P extends Parser<unknown>>(scope: string | RegExp, parser: P, cost?: boolean): P;
5
- export function focus<N>(scope: string | RegExp, parser: Parser<N>, cost = true): Parser<N> {
4
+ export function focus<P extends Parser<unknown>>(scope: string | RegExp, parser: P): P;
5
+ export function focus<N>(scope: string | RegExp, parser: Parser<N>): Parser<N> {
6
6
  assert(parser);
7
7
  const match = matcher(scope, false);
8
8
  return failsafe(({ context }) => {
@@ -11,7 +11,6 @@ export function focus<N>(scope: string | RegExp, parser: Parser<N>, cost = true)
11
11
  const src = eval(match({ context }))?.[0] ?? '';
12
12
  assert(source.startsWith(src, position));
13
13
  if (src === '') return;
14
- cost && consume(src.length, context);
15
14
  context.range = src.length;
16
15
  context.offset ??= 0;
17
16
  context.offset += position;
@@ -363,7 +363,7 @@ describe('Unit: parser/api/parse', () => {
363
363
  this.timeout(5000);
364
364
  // 最悪計算量での実行速度はCommonMarkの公式JS実装の32nに対して3倍遅い程度。
365
365
  // 5n = annotation/reference + link + url/math + ruby + text
366
- const source = `${'.'.repeat(0 + 0)}((([[[[#$[${'.'.repeat(19998)}`;
366
+ const source = `${'.'.repeat(0 + 0)}((([[[[#$[${'&'.repeat(19998)}`;
367
367
  assert.deepStrictEqual(
368
368
  [...parse(source, {}, { resources: { clock: 100000, recursions: [100] } }).children]
369
369
  .map(el => el.tagName),
@@ -372,7 +372,7 @@ describe('Unit: parser/api/parse', () => {
372
372
 
373
373
  it('backtrack error', function () {
374
374
  this.timeout(5000);
375
- const source = `${'.'.repeat(0 + 1)}((([[[[#$[${'.'.repeat(19998)}`;
375
+ const source = `${'.'.repeat(0 + 1)}((([[[[#$[${'&'.repeat(19998)}`;
376
376
  assert.deepStrictEqual(
377
377
  [...parse(source, {}, { resources: { clock: 100000, recursions: [100] } }).children]
378
378
  .map(el => el.tagName),
@@ -8,7 +8,7 @@ import { html, define, defrag } from 'typed-dom/dom';
8
8
 
9
9
  export const sidefence: SidefenceParser = lazy(() => block(fmap(focus(
10
10
  /(?=\|+(?:[^\S\n]|\n\|))(?:\|+(?:[^\S\n][^\n]*)?(?:$|\n))+$/y,
11
- union([source]), false),
11
+ union([source])),
12
12
  ([el]) => [
13
13
  define(el, {
14
14
  class: 'invalid',
@@ -23,7 +23,7 @@ const source: SidefenceParser.SourceParser = lazy(() => fmap(
23
23
  some(recursion(Recursion.block, union([
24
24
  focus(
25
25
  /(?:\|\|+(?:[^\S\n][^\n]*)?(?:$|\n))+/y,
26
- convert(unindent, source, false, true), false),
26
+ convert(unindent, source, false, true)),
27
27
  rewrite(
28
28
  some(contentline, opener),
29
29
  convert(unindent, fmap(autolink, ns => [html('pre', defrag(ns))]), false, true)),
@@ -40,9 +40,9 @@ const align: AlignParser = fmap(open(
40
40
  '|',
41
41
  union([
42
42
  focus(/:-+:?/y, ({ context: { source } }) =>
43
- [[source.at(-1) === ':' ? 'center' : 'start']], false),
43
+ [[source.at(-1) === ':' ? 'center' : 'start']]),
44
44
  focus(/-+:?/y, ({ context: { source } }) =>
45
- [[source.at(-1) === ':' ? 'end' : '']], false),
45
+ [[source.at(-1) === ':' ? 'end' : '']]),
46
46
  ])),
47
47
  ns => [html('td', defrag(ns))]);
48
48
 
@@ -12,10 +12,10 @@ describe('Unit: parser/inline/autolink/url', () => {
12
12
  assert.deepStrictEqual(inspect(parser(''), ctx), undefined);
13
13
  assert.deepStrictEqual(inspect(parser(' http'), ctx), [[' http'], '']);
14
14
  assert.deepStrictEqual(inspect(parser(' ttp'), ctx), [[' ttp'], '']);
15
- assert.deepStrictEqual(inspect(parser(' http://'), ctx), [[' ', 'http:', '/', '/'], '']);
16
- assert.deepStrictEqual(inspect(parser(' http://['), ctx), [[' ', 'http:', '/', '/', '['], '']);
17
- assert.deepStrictEqual(inspect(parser(' http://]'), ctx), [[' ', 'http:', '/', '/', ']'], '']);
18
- assert.deepStrictEqual(inspect(parser(' Http://host'), ctx), [[' ', 'Http:', '/', '/host'], '']);
15
+ assert.deepStrictEqual(inspect(parser(' http://'), ctx), [[' ', 'http:', '//'], '']);
16
+ assert.deepStrictEqual(inspect(parser(' http://['), ctx), [[' ', 'http:', '//', '['], '']);
17
+ assert.deepStrictEqual(inspect(parser(' http://]'), ctx), [[' ', 'http:', '//', ']'], '']);
18
+ assert.deepStrictEqual(inspect(parser(' Http://host'), ctx), [[' ', 'Http:', '//host'], '']);
19
19
  assert.deepStrictEqual(inspect(parser(' http://[::ffff:0:0%1]'), ctx), [[' ', '<a class="invalid">http://[::ffff:0:0%1]</a>'], '']);
20
20
  assert.deepStrictEqual(inspect(parser(' http://[::ffff:0:0/96]'), ctx), [[' ', '<a class="invalid">http://[::ffff:0:0/96]</a>'], '']);
21
21
  });
@@ -59,7 +59,7 @@ describe('Unit: parser/inline/autolink/url', () => {
59
59
  assert.deepStrictEqual(inspect(parser(' http://host^'), ctx), [[' ', '<a class="url" href="http://host" target="_blank">http://host</a>', '^'], '']);
60
60
  assert.deepStrictEqual(inspect(parser(' http://host_'), ctx), [[' ', '<a class="url" href="http://host" target="_blank">http://host</a>', '_'], '']);
61
61
  assert.deepStrictEqual(inspect(parser(' http://host/'), ctx), [[' ', '<a class="url" href="http://host/" target="_blank">http://host/</a>'], '']);
62
- assert.deepStrictEqual(inspect(parser(' http://host//'), ctx), [[' ', '<a class="url" href="http://host" target="_blank">http://host</a>', '/', '/'], '']);
62
+ assert.deepStrictEqual(inspect(parser(' http://host//'), ctx), [[' ', '<a class="url" href="http://host" target="_blank">http://host</a>', '//'], '']);
63
63
  assert.deepStrictEqual(inspect(parser(` http://host'`), ctx), [[' ', '<a class="url" href="http://host\'" target="_blank">http://host\'</a>'], '']);
64
64
  assert.deepStrictEqual(inspect(parser(' http://host"'), ctx), [[' ', '<a class="url" href="http://host" target="_blank">http://host</a>', '"'], '']);
65
65
  assert.deepStrictEqual(inspect(parser(' http://host`'), ctx), [[' ', '<a class="url" href="http://host" target="_blank">http://host</a>', '`'], '']);
@@ -60,7 +60,7 @@ describe('Unit: parser/inline/bracket', () => {
60
60
  assert.deepStrictEqual(inspect(parser('[]'), ctx), [['[', ']'], '']);
61
61
  assert.deepStrictEqual(inspect(parser('[a'), ctx), [['[', 'a'], '']);
62
62
  assert.deepStrictEqual(inspect(parser('[a]'), ctx), [['[', 'a', ']'], '']);
63
- assert.deepStrictEqual(inspect(parser('[==]'), ctx), [['[', '=', '=', ']'], '']);
63
+ assert.deepStrictEqual(inspect(parser('[==]'), ctx), [['[', '==', ']'], '']);
64
64
  assert.deepStrictEqual(inspect(parser('[$]$'), ctx), [['[', '<span class="math" translate="no" data-src="$]$">$]$</span>'], '']);
65
65
  assert.deepStrictEqual(inspect(parser(']'), ctx), undefined);
66
66
  });
@@ -70,7 +70,7 @@ describe('Unit: parser/inline/bracket', () => {
70
70
  assert.deepStrictEqual(inspect(parser('{}'), ctx), [['{', '}'], '']);
71
71
  assert.deepStrictEqual(inspect(parser('{a'), ctx), [['{', 'a'], '']);
72
72
  assert.deepStrictEqual(inspect(parser('{a}'), ctx), [['{', 'a', '}'], '']);
73
- assert.deepStrictEqual(inspect(parser('{==}'), ctx), [['{', '=', '=', '}'], '']);
73
+ assert.deepStrictEqual(inspect(parser('{==}'), ctx), [['{', '==', '}'], '']);
74
74
  assert.deepStrictEqual(inspect(parser('}'), ctx), undefined);
75
75
  });
76
76
 
@@ -11,14 +11,14 @@ describe('Unit: parser/inline/italic', () => {
11
11
  it('invalid', () => {
12
12
  assert.deepStrictEqual(inspect(parser('///'), ctx), undefined);
13
13
  assert.deepStrictEqual(inspect(parser('///a'), ctx), [['///', 'a'], '']);
14
- assert.deepStrictEqual(inspect(parser('///a ///'), ctx), [['///', 'a', ' ', '/', '/', '/'], '']);
15
- assert.deepStrictEqual(inspect(parser('///a ///'), ctx), [['///', 'a', ' ', '/', '/', '/'], '']);
16
- assert.deepStrictEqual(inspect(parser('///a\n///'), ctx), [['///', 'a', '<br>', '/', '/', '/'], '']);
17
- assert.deepStrictEqual(inspect(parser('///a\\ ///'), ctx), [['///', 'a', ' ', '/', '/', '/'], '']);
18
- assert.deepStrictEqual(inspect(parser('///a\\\n///'), ctx), [['///', 'a', '<br>', '/', '/', '/'], '']);
14
+ assert.deepStrictEqual(inspect(parser('///a ///'), ctx), [['///', 'a', ' ', '///'], '']);
15
+ assert.deepStrictEqual(inspect(parser('///a ///'), ctx), [['///', 'a', ' ', '///'], '']);
16
+ assert.deepStrictEqual(inspect(parser('///a\n///'), ctx), [['///', 'a', '<br>', '///'], '']);
17
+ assert.deepStrictEqual(inspect(parser('///a\\ ///'), ctx), [['///', 'a', ' ', '///'], '']);
18
+ assert.deepStrictEqual(inspect(parser('///a\\\n///'), ctx), [['///', 'a', '<br>', '///'], '']);
19
19
  assert.deepStrictEqual(inspect(parser('///a/b'), ctx), [['///', 'a', '/b'], '']);
20
- assert.deepStrictEqual(inspect(parser('///a//b'), ctx), [['///', 'a', '/', '/b'], '']);
21
- assert.deepStrictEqual(inspect(parser('///a*b///'), ctx), [['///', 'a', '*', 'b', '/', '/', '/'], '']);
20
+ assert.deepStrictEqual(inspect(parser('///a//b'), ctx), [['///', 'a', '//b'], '']);
21
+ assert.deepStrictEqual(inspect(parser('///a*b///'), ctx), [['///', 'a', '*', 'b', '///'], '']);
22
22
  assert.deepStrictEqual(inspect(parser('/// ///'), ctx), undefined);
23
23
  assert.deepStrictEqual(inspect(parser('/// a///'), ctx), undefined);
24
24
  assert.deepStrictEqual(inspect(parser('/// a ///'), ctx), undefined);
@@ -53,8 +53,8 @@ describe('Unit: parser/inline/italic', () => {
53
53
  assert.deepStrictEqual(inspect(parser('//////a///b'), ctx), [['///', '<i>a</i>', 'b'], '']);
54
54
  assert.deepStrictEqual(inspect(parser('//////a////'), ctx), [['///', '<i>a</i>', '/'], '']);
55
55
  assert.deepStrictEqual(inspect(parser('//////a////b'), ctx), [['///', '<i>a</i>', '/b'], '']);
56
- assert.deepStrictEqual(inspect(parser('//////a/////'), ctx), [['///', '<i>a</i>', '/', '/'], '']);
57
- assert.deepStrictEqual(inspect(parser('//////a/////b'), ctx), [['///', '<i>a</i>', '/', '/b'], '']);
56
+ assert.deepStrictEqual(inspect(parser('//////a/////'), ctx), [['///', '<i>a</i>', '//'], '']);
57
+ assert.deepStrictEqual(inspect(parser('//////a/////b'), ctx), [['///', '<i>a</i>', '//b'], '']);
58
58
  assert.deepStrictEqual(inspect(parser('//////a//////'), ctx), [['<i><i>a</i></i>'], '']);
59
59
  assert.deepStrictEqual(inspect(parser('//////a///b///'), ctx), [['<i><i>a</i>b</i>'], '']);
60
60
  assert.deepStrictEqual(inspect(parser('///a ///b//////'), ctx), [['<i>a <i>b</i></i>'], '']);
@@ -14,11 +14,11 @@ describe('Unit: parser/inline/mark', () => {
14
14
  assert.deepStrictEqual(inspect(parser('=='), ctx), undefined);
15
15
  assert.deepStrictEqual(inspect(parser('==a'), ctx), [['==', 'a'], '']);
16
16
  assert.deepStrictEqual(inspect(parser('==a='), ctx), [['==', 'a', '='], '']);
17
- assert.deepStrictEqual(inspect(parser('==a =='), ctx), [['==', 'a', ' ', '=', '='], '']);
18
- assert.deepStrictEqual(inspect(parser('==a =='), ctx), [['==', 'a', ' ', '=', '='], '']);
19
- assert.deepStrictEqual(inspect(parser('==a\n=='), ctx), [['==', 'a', '<br>', '=', '='], '']);
20
- assert.deepStrictEqual(inspect(parser('==a\\ =='), ctx), [['==', 'a', ' ', '=', '='], '']);
21
- assert.deepStrictEqual(inspect(parser('==a\\\n=='), ctx), [['==', 'a', '<br>', '=', '='], '']);
17
+ assert.deepStrictEqual(inspect(parser('==a =='), ctx), [['==', 'a', ' ', '=='], '']);
18
+ assert.deepStrictEqual(inspect(parser('==a =='), ctx), [['==', 'a', ' ', '=='], '']);
19
+ assert.deepStrictEqual(inspect(parser('==a\n=='), ctx), [['==', 'a', '<br>', '=='], '']);
20
+ assert.deepStrictEqual(inspect(parser('==a\\ =='), ctx), [['==', 'a', ' ', '=='], '']);
21
+ assert.deepStrictEqual(inspect(parser('==a\\\n=='), ctx), [['==', 'a', '<br>', '=='], '']);
22
22
  assert.deepStrictEqual(inspect(parser('== =='), ctx), undefined);
23
23
  assert.deepStrictEqual(inspect(parser('== a=='), ctx), undefined);
24
24
  assert.deepStrictEqual(inspect(parser('== a =='), ctx), undefined);
@@ -165,16 +165,16 @@ describe('Unit: parser/inline', () => {
165
165
  assert.deepStrictEqual(inspect(parser('"[% *"*"*'), ctx), [['"', '[%', ' ', '*', '"', '*', '"', '*'], '']);
166
166
  assert.deepStrictEqual(inspect(parser('"[% "*"* %]'), ctx), [['"', '<span class="remark"><input type="checkbox"><span>[% "*"* %]</span></span>'], '']);
167
167
  assert.deepStrictEqual(inspect(parser('"{{""}}'), ctx), [['"', '{', '{', '"', '"', '}', '}'], '']);
168
- assert.deepStrictEqual(inspect(parser('[#http://host/(<bdi>)]</bdi>'), ctx), [['<a class="index" href="#index::http://host/(&lt;bdi&gt;)">http://host/(&lt;bdi&gt;)</a>', '<', '/bdi', '>'], '']);
169
- assert.deepStrictEqual(inspect(parser('[#@a/http://host/(<bdi>)]</bdi>'), ctx), [['<a class="index" href="#index::@a/http://host/(&lt;bdi&gt;)">@a/http://host/(&lt;bdi&gt;)</a>', '<', '/bdi', '>'], '']);
168
+ assert.deepStrictEqual(inspect(parser('[#http://host/(<bdi>)]</bdi>'), ctx), [['<a class="index" href="#index::http://host/(&lt;bdi&gt;)">http://host/(&lt;bdi&gt;)</a>', '</bdi', '>'], '']);
169
+ assert.deepStrictEqual(inspect(parser('[#@a/http://host/(<bdi>)]</bdi>'), ctx), [['<a class="index" href="#index::@a/http://host/(&lt;bdi&gt;)">@a/http://host/(&lt;bdi&gt;)</a>', '</bdi', '>'], '']);
170
170
  assert.deepStrictEqual(inspect(parser('[#a|<bdi>]</bdi>'), ctx), [['[', '<a class="hashtag" href="/hashtags/a">#a</a>', '|', '<bdi>]</bdi>'], '']);
171
171
  assert.deepStrictEqual(inspect(parser('[[#a|<bdi>]</bdi>'), ctx), [['[', '[', '<a class="hashtag" href="/hashtags/a">#a</a>', '|', '<bdi>]</bdi>'], '']);
172
172
  });
173
173
 
174
174
  it('uri', () => {
175
175
  assert.deepStrictEqual(inspect(parser('\nhttp://host'), ctx), [['<br>', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
176
- assert.deepStrictEqual(inspect(parser('0http://host'), ctx), [['0http:', '/', '/host'], '']);
177
- assert.deepStrictEqual(inspect(parser('0aAhttp://host'), ctx), [['0aAhttp:', '/', '/host'], '']);
176
+ assert.deepStrictEqual(inspect(parser('0http://host'), ctx), [['0http:', '//host'], '']);
177
+ assert.deepStrictEqual(inspect(parser('0aAhttp://host'), ctx), [['0aAhttp:', '//host'], '']);
178
178
  assert.deepStrictEqual(inspect(parser('?http://host'), ctx), [['?', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
179
179
  assert.deepStrictEqual(inspect(parser('0!http://host'), ctx), [['0', '!', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
180
180
  assert.deepStrictEqual(inspect(parser('0?http://host'), ctx), [['0', '?', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
@@ -196,7 +196,8 @@ describe('Unit: parser/inline', () => {
196
196
  assert.deepStrictEqual(inspect(parser('*a@b*'), ctx), [['<em><a class="email" href="mailto:a@b">a@b</a></em>'], '']);
197
197
  assert.deepStrictEqual(inspect(parser('(a@b)'), ctx), [['<span class="paren">(<a class="email" href="mailto:a@b">a@b</a>)</span>'], '']);
198
198
  assert.deepStrictEqual(inspect(parser(' a@b'), ctx), [[' ', '<a class="email" href="mailto:a@b">a@b</a>'], '']);
199
- assert.deepStrictEqual(inspect(parser('++a++b@c++'), ctx), [['<ins>a</ins>', '<a class="email" href="mailto:b@c">b@c</a>', '+', '+'], '']);
199
+ assert.deepStrictEqual(inspect(parser('++a@b++'), ctx), [['<ins><a class="email" href="mailto:a@b">a@b</a></ins>'], '']);
200
+ assert.deepStrictEqual(inspect(parser('++a++b@c++'), ctx), [['<ins>a</ins>', '<a class="email" href="mailto:b@c">b@c</a>', '++'], '']);
200
201
  });
201
202
 
202
203
  it('channel', () => {
@@ -209,7 +210,7 @@ describe('Unit: parser/inline', () => {
209
210
 
210
211
  it('account', () => {
211
212
  assert.deepStrictEqual(inspect(parser('@a'), ctx), [['<a class="account" href="/@a">@a</a>'], '']);
212
- assert.deepStrictEqual(inspect(parser('@http://host'), ctx), [['@http', ':', '/', '/host'], '']);
213
+ assert.deepStrictEqual(inspect(parser('@http://host'), ctx), [['@http', '://host'], '']);
213
214
  assert.deepStrictEqual(inspect(parser('_@a'), ctx), [['_', '<a class="account" href="/@a">@a</a>'], '']);
214
215
  assert.deepStrictEqual(inspect(parser('_@a_'), ctx), [['_', '<a class="account" href="/@a">@a</a>', '_'], '']);
215
216
  assert.deepStrictEqual(inspect(parser('*@a*'), ctx), [['<em><a class="account" href="/@a">@a</a></em>'], '']);
@@ -221,7 +222,7 @@ describe('Unit: parser/inline', () => {
221
222
  assert.deepStrictEqual(inspect(parser('#a#'), ctx), [['#a', '#'], '']);
222
223
  assert.deepStrictEqual(inspect(parser('#a#b'), ctx), [['#a', '#b'], '']);
223
224
  assert.deepStrictEqual(inspect(parser('#a'), ctx), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
224
- assert.deepStrictEqual(inspect(parser('#http://host'), ctx), [['#http', ':', '/', '/host'], '']);
225
+ assert.deepStrictEqual(inspect(parser('#http://host'), ctx), [['#http', '://host'], '']);
225
226
  assert.deepStrictEqual(inspect(parser('#a\nb\n#c\n[#d]'), ctx), [['<a class="hashtag" href="/hashtags/a">#a</a>', '<br>', 'b', '<br>', '<a class="hashtag" href="/hashtags/c">#c</a>', '<br>', '<a class="index" href="#index::d">d</a>'], '']);
226
227
  assert.deepStrictEqual(inspect(parser('##a'), ctx), [['##a'], '']);
227
228
  assert.deepStrictEqual(inspect(parser('_#a'), ctx), [['_', '<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
@@ -15,7 +15,7 @@ describe('Unit: parser/source/escsource', () => {
15
15
  it('basic', () => {
16
16
  assert.deepStrictEqual(inspect(parser('a'), ctx), [['a'], '']);
17
17
  assert.deepStrictEqual(inspect(parser('ab'), ctx), [['ab'], '']);
18
- assert.deepStrictEqual(inspect(parser('09あいAZaz'), ctx), [['09', 'あいAZaz'], '']);
18
+ assert.deepStrictEqual(inspect(parser('09あいAZaz'), ctx), [['09あいAZaz'], '']);
19
19
  });
20
20
 
21
21
  it('space', () => {
@@ -2,9 +2,10 @@ import { EscapableSourceParser } from '../source';
2
2
  import { Command } from '../context';
3
3
  import { consume } from '../../combinator';
4
4
  import { nonWhitespace, isBlank, next } from './text';
5
- import { delimiter } from './unescapable';
6
5
  import { html } from 'typed-dom/dom';
7
6
 
7
+ const delimiter = /(?=[\\$"`\[\](){}\r\n]|\s(?:\$)|:\/\/)/g;
8
+
8
9
  export const escsource: EscapableSourceParser = ({ context }) => {
9
10
  const { source, position } = context;
10
11
  if (position === source.length) return;
@@ -3,7 +3,7 @@ import { Command } from '../context';
3
3
  import { union, consume, focus } from '../../combinator';
4
4
  import { html } from 'typed-dom/dom';
5
5
 
6
- export const delimiter = /(?=[\\!@#$&"`\[\](){}<>()[]{}*%|+~=/]|\s(?:\\?(?:$|\s)|[$*%|]|([+~=])\1)|\/{3}|:\/\/|\n)/g;
6
+ export const delimiter = /(?=[\\!@#$&"`\[\](){}<>()[]{}*%|\r\n]|([+~=])\1|\/{3}|\s(?:\\?(?:$|\s)|[$%])|:\/\/)/g;
7
7
  export const nonWhitespace = /[\S\r\n]/g;
8
8
 
9
9
  export const text: TextParser = input => {
@@ -85,16 +85,6 @@ export function next(source: string, position: number, delimiter: RegExp): numbe
85
85
  index = backToEmailHead(source, position, index);
86
86
  break;
87
87
  }
88
- if (index > position + 1) switch (char) {
89
- case '*':
90
- case '+':
91
- case '~':
92
- case '=':
93
- case '/':
94
- case '%':
95
- case '|':
96
- index -= /\s/.test(source[index - 1]) ? 1 : 0;
97
- }
98
88
  assert(index > position);
99
89
  return index;
100
90
  }
@@ -159,7 +149,7 @@ export function isBlank(source: string, position: number): boolean {
159
149
  blank.lastIndex = position;
160
150
  return blank.test(source);
161
151
  }
162
- export function isAlphanumeric(char: string): boolean {
152
+ function isAlphanumeric(char: string): boolean {
163
153
  assert(char.length === 1);
164
154
  if (char < '0' || '\x7F' < char) return false;
165
155
  return '0' <= char && char <= '9'