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 +4 -0
- package/dist/index.js +10 -22
- package/package.json +1 -1
- package/src/combinator/control/manipulation/scope.ts +3 -4
- package/src/parser/api/parse.test.ts +2 -2
- package/src/parser/block/sidefence.ts +2 -2
- package/src/parser/block/table.ts +2 -2
- package/src/parser/inline/autolink/url.test.ts +5 -5
- package/src/parser/inline/bracket.test.ts +2 -2
- package/src/parser/inline/italic.test.ts +9 -9
- package/src/parser/inline/mark.test.ts +5 -5
- package/src/parser/inline.test.ts +8 -7
- package/src/parser/source/escapable.test.ts +1 -1
- package/src/parser/source/escapable.ts +2 -1
- package/src/parser/source/text.ts +2 -12
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! securemark v0.293.
|
|
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
|
|
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])
|
|
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)
|
|
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']]
|
|
5586
|
+
}) => [[source.at(-1) === ':' ? 'center' : 'start']]), (0, combinator_1.focus)(/-+:?/y, ({
|
|
5588
5587
|
context: {
|
|
5589
5588
|
source
|
|
5590
5589
|
}
|
|
5591
|
-
}) => [[source.at(-1) === ':' ? 'end' : '']]
|
|
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,
|
|
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.
|
|
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 = /(?=[\\!@#$&"`\[\](){}
|
|
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,8 +1,8 @@
|
|
|
1
1
|
import { Parser, Context, input, eval, failsafe } from '../../data/parser';
|
|
2
|
-
import {
|
|
2
|
+
import { matcher } from '../../../combinator';
|
|
3
3
|
|
|
4
|
-
export function focus<P extends Parser<unknown>>(scope: string | RegExp, parser: P
|
|
5
|
-
export function focus<N>(scope: string | RegExp, parser: 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)}((([[[[#$[${'
|
|
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)}((([[[[#$[${'
|
|
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])
|
|
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)
|
|
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']]
|
|
43
|
+
[[source.at(-1) === ':' ? 'center' : 'start']]),
|
|
44
44
|
focus(/-+:?/y, ({ context: { source } }) =>
|
|
45
|
-
[[source.at(-1) === ':' ? 'end' : '']]
|
|
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:', '
|
|
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', '
|
|
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>', '
|
|
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/(<bdi>)">http://host/(<bdi>)</a>', '
|
|
169
|
-
assert.deepStrictEqual(inspect(parser('[#@a/http://host/(<bdi>)]</bdi>'), ctx), [['<a class="index" href="#index::@a/http://host/(<bdi>)">@a/http://host/(<bdi>)</a>', '
|
|
168
|
+
assert.deepStrictEqual(inspect(parser('[#http://host/(<bdi>)]</bdi>'), ctx), [['<a class="index" href="#index::http://host/(<bdi>)">http://host/(<bdi>)</a>', '</bdi', '>'], '']);
|
|
169
|
+
assert.deepStrictEqual(inspect(parser('[#@a/http://host/(<bdi>)]</bdi>'), ctx), [['<a class="index" href="#index::@a/http://host/(<bdi>)">@a/http://host/(<bdi>)</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:', '
|
|
177
|
-
assert.deepStrictEqual(inspect(parser('0aAhttp://host'), ctx), [['0aAhttp:', '
|
|
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
|
|
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', '
|
|
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', '
|
|
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
|
|
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 = /(?=[\\!@#$&"`\[\](){}
|
|
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
|
-
|
|
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'
|