securemark 0.295.0 → 0.295.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 +8 -0
- package/design.md +4 -3
- package/dist/index.js +529 -484
- package/markdown.d.ts +13 -28
- package/package.json +1 -1
- package/src/combinator/control/constraint/block.test.ts +6 -8
- package/src/combinator/control/constraint/contract.ts +7 -7
- package/src/combinator/control/constraint/line.test.ts +7 -9
- package/src/combinator/control/constraint/line.ts +0 -1
- package/src/combinator/control/manipulation/clear.ts +2 -2
- package/src/combinator/control/manipulation/convert.ts +3 -3
- package/src/combinator/control/manipulation/duplicate.ts +4 -4
- package/src/combinator/control/manipulation/fallback.ts +2 -2
- package/src/combinator/control/manipulation/fence.ts +3 -3
- package/src/combinator/control/manipulation/indent.test.ts +20 -22
- package/src/combinator/control/manipulation/indent.ts +2 -2
- package/src/combinator/control/manipulation/recovery.ts +3 -3
- package/src/combinator/control/manipulation/reverse.ts +2 -2
- package/src/combinator/control/manipulation/scope.ts +2 -4
- package/src/combinator/control/manipulation/surround.ts +66 -66
- package/src/combinator/control/monad/bind.ts +6 -6
- package/src/combinator/control/monad/fmap.ts +6 -6
- package/src/combinator/data/data.ts +2 -2
- package/src/combinator/data/{parser/context/delimiter.ts → delimiter.ts} +4 -4
- package/src/combinator/data/parser/context.test.ts +12 -11
- package/src/combinator/data/parser/context.ts +13 -14
- package/src/combinator/data/parser/inits.ts +5 -5
- package/src/combinator/data/parser/sequence.test.ts +12 -13
- package/src/combinator/data/parser/sequence.ts +5 -5
- package/src/combinator/data/parser/some.test.ts +15 -16
- package/src/combinator/data/parser/some.ts +5 -6
- package/src/combinator/data/parser/subsequence.test.ts +16 -17
- package/src/combinator/data/parser/subsequence.ts +3 -3
- package/src/combinator/data/parser/tails.ts +3 -3
- package/src/combinator/data/parser/union.test.ts +12 -13
- package/src/combinator/data/parser/union.ts +3 -3
- package/src/combinator/data/parser.ts +55 -32
- package/src/debug.test.ts +5 -3
- package/src/parser/api/bind.ts +8 -6
- package/src/parser/api/header.ts +4 -4
- package/src/parser/api/normalize.ts +2 -1
- package/src/parser/api/parse.test.ts +7 -6
- package/src/parser/api/parse.ts +9 -8
- package/src/parser/autolink.test.ts +18 -18
- package/src/parser/block/blockquote.test.ts +79 -79
- package/src/parser/block/blockquote.ts +5 -5
- package/src/parser/block/codeblock.test.ts +57 -57
- package/src/parser/block/codeblock.ts +3 -3
- package/src/parser/block/dlist.test.ts +57 -57
- package/src/parser/block/dlist.ts +6 -6
- package/src/parser/block/extension/aside.test.ts +9 -9
- package/src/parser/block/extension/aside.ts +5 -5
- package/src/parser/block/extension/example.test.ts +19 -19
- package/src/parser/block/extension/example.ts +6 -6
- package/src/parser/block/extension/fig.test.ts +36 -36
- package/src/parser/block/extension/figbase.test.ts +16 -16
- package/src/parser/block/extension/figbase.ts +2 -2
- package/src/parser/block/extension/figure.test.ts +63 -63
- package/src/parser/block/extension/figure.ts +3 -3
- package/src/parser/block/extension/message.test.ts +14 -14
- package/src/parser/block/extension/message.ts +5 -5
- package/src/parser/block/extension/placeholder.test.ts +13 -13
- package/src/parser/block/extension/placeholder.ts +2 -2
- package/src/parser/block/extension/table.test.ts +76 -76
- package/src/parser/block/extension/table.ts +14 -14
- package/src/parser/block/extension.test.ts +24 -24
- package/src/parser/block/heading.test.ts +59 -59
- package/src/parser/block/heading.ts +7 -7
- package/src/parser/block/ilist.test.ts +8 -12
- package/src/parser/block/ilist.ts +6 -6
- package/src/parser/block/mathblock.test.ts +32 -32
- package/src/parser/block/mathblock.ts +3 -3
- package/src/parser/block/mediablock.ts +3 -3
- package/src/parser/block/olist.test.ts +103 -103
- package/src/parser/block/olist.ts +5 -5
- package/src/parser/block/pagebreak.test.ts +16 -16
- package/src/parser/block/pagebreak.ts +2 -2
- package/src/parser/block/paragraph.test.ts +58 -58
- package/src/parser/block/paragraph.ts +2 -2
- package/src/parser/block/reply/cite.test.ts +40 -40
- package/src/parser/block/reply/cite.ts +6 -6
- package/src/parser/block/reply/quote.test.ts +51 -51
- package/src/parser/block/reply/quote.ts +3 -3
- package/src/parser/block/reply.test.ts +20 -20
- package/src/parser/block/reply.ts +3 -3
- package/src/parser/block/sidefence.test.ts +48 -48
- package/src/parser/block/sidefence.ts +4 -4
- package/src/parser/block/table.test.ts +50 -50
- package/src/parser/block/table.ts +12 -12
- package/src/parser/block/ulist.test.ts +53 -53
- package/src/parser/block/ulist.ts +6 -6
- package/src/parser/block.ts +6 -4
- package/src/parser/context.ts +39 -0
- package/src/parser/header.test.ts +23 -23
- package/src/parser/header.ts +5 -5
- package/src/parser/inline/annotation.test.ts +43 -43
- package/src/parser/inline/annotation.ts +15 -5
- package/src/parser/inline/autolink/account.test.ts +33 -33
- package/src/parser/inline/autolink/account.ts +9 -9
- package/src/parser/inline/autolink/anchor.test.ts +22 -22
- package/src/parser/inline/autolink/anchor.ts +4 -4
- package/src/parser/inline/autolink/channel.test.ts +15 -15
- package/src/parser/inline/autolink/email.test.ts +37 -37
- package/src/parser/inline/autolink/email.ts +2 -2
- package/src/parser/inline/autolink/hashnum.test.ts +33 -33
- package/src/parser/inline/autolink/hashnum.ts +6 -5
- package/src/parser/inline/autolink/hashtag.test.ts +60 -60
- package/src/parser/inline/autolink/hashtag.ts +4 -4
- package/src/parser/inline/autolink/url.test.ts +75 -75
- package/src/parser/inline/autolink/url.ts +4 -4
- package/src/parser/inline/bracket.test.ts +70 -70
- package/src/parser/inline/bracket.ts +35 -32
- package/src/parser/inline/code.test.ts +31 -31
- package/src/parser/inline/code.ts +4 -4
- package/src/parser/inline/deletion.test.ts +28 -28
- package/src/parser/inline/deletion.ts +4 -4
- package/src/parser/inline/emphasis.test.ts +40 -40
- package/src/parser/inline/emphasis.ts +3 -3
- package/src/parser/inline/emstrong.test.ts +101 -101
- package/src/parser/inline/emstrong.ts +23 -23
- package/src/parser/inline/extension/index.test.ts +92 -92
- package/src/parser/inline/extension/index.ts +5 -5
- package/src/parser/inline/extension/indexee.ts +5 -5
- package/src/parser/inline/extension/indexer.test.ts +24 -24
- package/src/parser/inline/extension/indexer.ts +2 -2
- package/src/parser/inline/extension/label.test.ts +33 -33
- package/src/parser/inline/extension/label.ts +2 -2
- package/src/parser/inline/extension/placeholder.test.ts +43 -43
- package/src/parser/inline/extension/placeholder.ts +4 -4
- package/src/parser/inline/html.test.ts +108 -108
- package/src/parser/inline/html.ts +10 -10
- package/src/parser/inline/htmlentity.test.ts +38 -38
- package/src/parser/inline/htmlentity.ts +5 -5
- package/src/parser/inline/insertion.test.ts +28 -28
- package/src/parser/inline/insertion.ts +4 -4
- package/src/parser/inline/italic.test.ts +55 -55
- package/src/parser/inline/italic.ts +4 -4
- package/src/parser/inline/link.test.ts +186 -187
- package/src/parser/inline/link.ts +16 -17
- package/src/parser/inline/mark.test.ts +31 -31
- package/src/parser/inline/mark.ts +5 -5
- package/src/parser/inline/math.test.ts +132 -132
- package/src/parser/inline/math.ts +2 -2
- package/src/parser/inline/media.test.ts +91 -91
- package/src/parser/inline/media.ts +15 -15
- package/src/parser/inline/reference.test.ts +109 -109
- package/src/parser/inline/reference.ts +16 -55
- package/src/parser/inline/remark.test.ts +50 -50
- package/src/parser/inline/remark.ts +5 -5
- package/src/parser/inline/ruby.test.ts +45 -45
- package/src/parser/inline/ruby.ts +17 -17
- package/src/parser/inline/shortmedia.test.ts +10 -10
- package/src/parser/inline/strong.test.ts +37 -37
- package/src/parser/inline/strong.ts +3 -3
- package/src/parser/inline/template.test.ts +23 -23
- package/src/parser/inline/template.ts +5 -5
- package/src/parser/inline.test.ts +224 -223
- package/src/parser/segment.ts +2 -2
- package/src/parser/source/escapable.test.ts +24 -24
- package/src/parser/source/escapable.ts +8 -8
- package/src/parser/source/line.test.ts +18 -18
- package/src/parser/source/str.ts +2 -2
- package/src/parser/source/text.test.ts +85 -85
- package/src/parser/source/text.ts +5 -5
- package/src/parser/source/unescapable.test.ts +24 -24
- package/src/parser/source/unescapable.ts +5 -5
- package/src/parser/util.ts +10 -11
- package/src/parser/visibility.ts +8 -9
- package/src/util/quote.ts +2 -1
|
@@ -1,48 +1,48 @@
|
|
|
1
1
|
import { autolink } from '../autolink';
|
|
2
2
|
import { some } from '../../../combinator';
|
|
3
3
|
import { input } from '../../../combinator/data/parser';
|
|
4
|
+
import { Context } from '../../context';
|
|
4
5
|
import { inspect } from '../../../debug.test';
|
|
5
6
|
|
|
6
7
|
describe('Unit: parser/inline/autolink/hashnum', () => {
|
|
7
8
|
describe('hashnum', () => {
|
|
8
|
-
const parser =
|
|
9
|
-
const { context: ctx } = input('', {});
|
|
9
|
+
const parser = some(autolink);
|
|
10
10
|
|
|
11
11
|
it('invalid', () => {
|
|
12
|
-
assert.deepStrictEqual(inspect(parser(''
|
|
13
|
-
assert.deepStrictEqual(inspect(parser('#'
|
|
14
|
-
assert.deepStrictEqual(inspect(parser('# '
|
|
15
|
-
assert.deepStrictEqual(inspect(parser('#1#'
|
|
16
|
-
assert.deepStrictEqual(inspect(parser('#1#2'
|
|
17
|
-
assert.deepStrictEqual(inspect(parser('#1#2#3'
|
|
18
|
-
assert.deepStrictEqual(inspect(parser('#1@2'
|
|
19
|
-
assert.deepStrictEqual(inspect(parser('#\\'
|
|
20
|
-
assert.deepStrictEqual(inspect(parser('#\\ '
|
|
21
|
-
assert.deepStrictEqual(inspect(parser('#\\\n'
|
|
22
|
-
assert.deepStrictEqual(inspect(parser('##'
|
|
23
|
-
assert.deepStrictEqual(inspect(parser('##1'
|
|
24
|
-
assert.deepStrictEqual(inspect(parser('###1'
|
|
25
|
-
assert.deepStrictEqual(inspect(parser('#{}'
|
|
26
|
-
assert.deepStrictEqual(inspect(parser('#{{}'
|
|
27
|
-
assert.deepStrictEqual(inspect(parser('#{}}'
|
|
28
|
-
assert.deepStrictEqual(inspect(parser('#{#}'
|
|
29
|
-
assert.deepStrictEqual(inspect(parser('#{1}'
|
|
30
|
-
assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(10)}
|
|
31
|
-
assert.deepStrictEqual(inspect(parser(`#${'1'.repeat(10)}a
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('# '
|
|
33
|
-
assert.deepStrictEqual(inspect(parser(' #1'
|
|
12
|
+
assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
|
|
13
|
+
assert.deepStrictEqual(inspect(parser, input('#', new Context())), undefined);
|
|
14
|
+
assert.deepStrictEqual(inspect(parser, input('# ', new Context())), undefined);
|
|
15
|
+
assert.deepStrictEqual(inspect(parser, input('#1#', new Context())), undefined);
|
|
16
|
+
assert.deepStrictEqual(inspect(parser, input('#1#2', new Context())), undefined);
|
|
17
|
+
assert.deepStrictEqual(inspect(parser, input('#1#2#3', new Context())), undefined);
|
|
18
|
+
assert.deepStrictEqual(inspect(parser, input('#1@2', new Context())), undefined);
|
|
19
|
+
assert.deepStrictEqual(inspect(parser, input('#\\', new Context())), undefined);
|
|
20
|
+
assert.deepStrictEqual(inspect(parser, input('#\\ ', new Context())), undefined);
|
|
21
|
+
assert.deepStrictEqual(inspect(parser, input('#\\\n', new Context())), undefined);
|
|
22
|
+
assert.deepStrictEqual(inspect(parser, input('##', new Context())), undefined);
|
|
23
|
+
assert.deepStrictEqual(inspect(parser, input('##1', new Context())), undefined);
|
|
24
|
+
assert.deepStrictEqual(inspect(parser, input('###1', new Context())), undefined);
|
|
25
|
+
assert.deepStrictEqual(inspect(parser, input('#{}', new Context())), undefined);
|
|
26
|
+
assert.deepStrictEqual(inspect(parser, input('#{{}', new Context())), undefined);
|
|
27
|
+
assert.deepStrictEqual(inspect(parser, input('#{}}', new Context())), undefined);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser, input('#{#}', new Context())), undefined);
|
|
29
|
+
assert.deepStrictEqual(inspect(parser, input('#{1}', new Context())), undefined);
|
|
30
|
+
assert.deepStrictEqual(inspect(parser, input(`#${'1'.repeat(10)}`, new Context())), undefined);
|
|
31
|
+
assert.deepStrictEqual(inspect(parser, input(`#${'1'.repeat(10)}a`, new Context())), undefined);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser, input('# ', new Context())), undefined);
|
|
33
|
+
assert.deepStrictEqual(inspect(parser, input(' #1', new Context())), undefined);
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
it('valid', () => {
|
|
37
|
-
assert.deepStrictEqual(inspect(parser('#1'
|
|
38
|
-
assert.deepStrictEqual(inspect(parser('#1 '
|
|
39
|
-
assert.deepStrictEqual(inspect(parser('#1\n'
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('#1\\'
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('#1\\ '
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('#1\\\n'
|
|
43
|
-
assert.deepStrictEqual(inspect(parser(`#1'
|
|
44
|
-
assert.deepStrictEqual(inspect(parser(`#1''
|
|
45
|
-
assert.deepStrictEqual(inspect(parser('#123456789'
|
|
37
|
+
assert.deepStrictEqual(inspect(parser, input('#1', new Context())), [['<a class="hashnum">#1</a>'], '']);
|
|
38
|
+
assert.deepStrictEqual(inspect(parser, input('#1 ', new Context())), [['<a class="hashnum">#1</a>'], ' ']);
|
|
39
|
+
assert.deepStrictEqual(inspect(parser, input('#1\n', new Context())), [['<a class="hashnum">#1</a>'], '\n']);
|
|
40
|
+
assert.deepStrictEqual(inspect(parser, input('#1\\', new Context())), [['<a class="hashnum">#1</a>'], '\\']);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser, input('#1\\ ', new Context())), [['<a class="hashnum">#1</a>'], '\\ ']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser, input('#1\\\n', new Context())), [['<a class="hashnum">#1</a>'], '\\\n']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser, input(`#1'`, new Context())), [[`<a class="hashnum">#1</a>`], `'`]);
|
|
44
|
+
assert.deepStrictEqual(inspect(parser, input(`#1''`, new Context())), [[`<a class="hashnum">#1</a>`], `''`]);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser, input('#123456789', new Context())), [['<a class="hashnum">#123456789</a>'], '']);
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AutolinkParser } from '../../inline';
|
|
2
2
|
import { State, Backtrack } from '../../context';
|
|
3
|
-
import { List,
|
|
3
|
+
import { List, Node } from '../../../combinator/data/parser';
|
|
4
4
|
import { state, constraint, surround, lazy } from '../../../combinator';
|
|
5
5
|
import { parse } from '../link';
|
|
6
6
|
import { emoji } from './hashtag';
|
|
@@ -17,12 +17,13 @@ export const hashnum: AutolinkParser.HashnumParser = lazy(() => constraint(State
|
|
|
17
17
|
].join('|').replace(/emoji/g, emoji.source), 'yu')),
|
|
18
18
|
'',
|
|
19
19
|
false,
|
|
20
|
-
|
|
20
|
+
// unescapableを使用するべきだがhashtagとの重複を回避するためescapableを使用する。
|
|
21
|
+
[3 | Backtrack.escapable],
|
|
21
22
|
([, [{ value }]], context) =>
|
|
22
23
|
new List([
|
|
23
|
-
new
|
|
24
|
-
new List([new
|
|
25
|
-
new List([new
|
|
24
|
+
new Node(define(parse(
|
|
25
|
+
new List([new Node(`#${value}`)]),
|
|
26
|
+
new List([new Node(value)]),
|
|
26
27
|
context),
|
|
27
28
|
{ class: 'hashnum', href: null }))
|
|
28
29
|
])))));
|
|
@@ -1,75 +1,75 @@
|
|
|
1
1
|
import { autolink } from '../autolink';
|
|
2
2
|
import { some } from '../../../combinator';
|
|
3
3
|
import { input } from '../../../combinator/data/parser';
|
|
4
|
+
import { Context } from '../../context';
|
|
4
5
|
import { inspect } from '../../../debug.test';
|
|
5
6
|
|
|
6
7
|
describe('Unit: parser/inline/autolink/hashtag', () => {
|
|
7
8
|
describe('hashtag', () => {
|
|
8
|
-
const parser =
|
|
9
|
-
const { context: ctx } = input('', {});
|
|
9
|
+
const parser = some(autolink);
|
|
10
10
|
|
|
11
11
|
it('invalid', () => {
|
|
12
|
-
assert.deepStrictEqual(inspect(parser(''
|
|
13
|
-
assert.deepStrictEqual(inspect(parser('#'
|
|
14
|
-
assert.deepStrictEqual(inspect(parser('# '
|
|
15
|
-
assert.deepStrictEqual(inspect(parser('#a#'
|
|
16
|
-
assert.deepStrictEqual(inspect(parser('#a#b'
|
|
17
|
-
assert.deepStrictEqual(inspect(parser('#a#b#c'
|
|
18
|
-
assert.deepStrictEqual(inspect(parser('#a@b'
|
|
19
|
-
assert.deepStrictEqual(inspect(parser('#@'
|
|
20
|
-
assert.deepStrictEqual(inspect(parser('#@a'
|
|
21
|
-
assert.deepStrictEqual(inspect(parser('#\\'
|
|
22
|
-
assert.deepStrictEqual(inspect(parser('#\\ '
|
|
23
|
-
assert.deepStrictEqual(inspect(parser('#\\\n'
|
|
24
|
-
assert.deepStrictEqual(inspect(parser('##'
|
|
25
|
-
assert.deepStrictEqual(inspect(parser('##a'
|
|
26
|
-
assert.deepStrictEqual(inspect(parser('###a'
|
|
27
|
-
assert.deepStrictEqual(inspect(parser(`#'
|
|
28
|
-
assert.deepStrictEqual(inspect(parser(`#'0
|
|
29
|
-
assert.deepStrictEqual(inspect(parser(`#'00
|
|
30
|
-
assert.deepStrictEqual(inspect(parser('#_'
|
|
31
|
-
assert.deepStrictEqual(inspect(parser('#_a'
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('#(a)'
|
|
33
|
-
assert.deepStrictEqual(inspect(parser('#{}'
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('#{{}'
|
|
35
|
-
assert.deepStrictEqual(inspect(parser('#{}}'
|
|
36
|
-
assert.deepStrictEqual(inspect(parser('#{#}'
|
|
37
|
-
assert.deepStrictEqual(inspect(parser('#{a}'
|
|
38
|
-
assert.deepStrictEqual(inspect(parser('#12345a'
|
|
39
|
-
assert.deepStrictEqual(inspect(parser('# '
|
|
40
|
-
assert.deepStrictEqual(inspect(parser(' #a'
|
|
12
|
+
assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
|
|
13
|
+
assert.deepStrictEqual(inspect(parser, input('#', new Context())), undefined);
|
|
14
|
+
assert.deepStrictEqual(inspect(parser, input('# ', new Context())), undefined);
|
|
15
|
+
assert.deepStrictEqual(inspect(parser, input('#a#', new Context())), undefined);
|
|
16
|
+
assert.deepStrictEqual(inspect(parser, input('#a#b', new Context())), undefined);
|
|
17
|
+
assert.deepStrictEqual(inspect(parser, input('#a#b#c', new Context())), undefined);
|
|
18
|
+
assert.deepStrictEqual(inspect(parser, input('#a@b', new Context())), undefined);
|
|
19
|
+
assert.deepStrictEqual(inspect(parser, input('#@', new Context())), undefined);
|
|
20
|
+
assert.deepStrictEqual(inspect(parser, input('#@a', new Context())), undefined);
|
|
21
|
+
assert.deepStrictEqual(inspect(parser, input('#\\', new Context())), undefined);
|
|
22
|
+
assert.deepStrictEqual(inspect(parser, input('#\\ ', new Context())), undefined);
|
|
23
|
+
assert.deepStrictEqual(inspect(parser, input('#\\\n', new Context())), undefined);
|
|
24
|
+
assert.deepStrictEqual(inspect(parser, input('##', new Context())), undefined);
|
|
25
|
+
assert.deepStrictEqual(inspect(parser, input('##a', new Context())), undefined);
|
|
26
|
+
assert.deepStrictEqual(inspect(parser, input('###a', new Context())), undefined);
|
|
27
|
+
assert.deepStrictEqual(inspect(parser, input(`#'`, new Context())), undefined);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser, input(`#'0`, new Context())), undefined);
|
|
29
|
+
assert.deepStrictEqual(inspect(parser, input(`#'00`, new Context())), undefined);
|
|
30
|
+
assert.deepStrictEqual(inspect(parser, input('#_', new Context())), undefined);
|
|
31
|
+
assert.deepStrictEqual(inspect(parser, input('#_a', new Context())), undefined);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser, input('#(a)', new Context())), undefined);
|
|
33
|
+
assert.deepStrictEqual(inspect(parser, input('#{}', new Context())), undefined);
|
|
34
|
+
assert.deepStrictEqual(inspect(parser, input('#{{}', new Context())), undefined);
|
|
35
|
+
assert.deepStrictEqual(inspect(parser, input('#{}}', new Context())), undefined);
|
|
36
|
+
assert.deepStrictEqual(inspect(parser, input('#{#}', new Context())), undefined);
|
|
37
|
+
assert.deepStrictEqual(inspect(parser, input('#{a}', new Context())), undefined);
|
|
38
|
+
assert.deepStrictEqual(inspect(parser, input('#12345a', new Context())), undefined);
|
|
39
|
+
assert.deepStrictEqual(inspect(parser, input('# ', new Context())), undefined);
|
|
40
|
+
assert.deepStrictEqual(inspect(parser, input(' #a', new Context())), undefined);
|
|
41
41
|
});
|
|
42
42
|
|
|
43
43
|
it('valid', () => {
|
|
44
|
-
assert.deepStrictEqual(inspect(parser('#a'
|
|
45
|
-
assert.deepStrictEqual(inspect(parser('#a '
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('#a\n'
|
|
47
|
-
assert.deepStrictEqual(inspect(parser('#a\\'
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('#a\\ '
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('#a\\\n'
|
|
50
|
-
assert.deepStrictEqual(inspect(parser('#a)'
|
|
51
|
-
assert.deepStrictEqual(inspect(parser('#a(b'
|
|
52
|
-
assert.deepStrictEqual(inspect(parser('#a(b)'
|
|
53
|
-
assert.deepStrictEqual(inspect(parser('#a_'
|
|
54
|
-
assert.deepStrictEqual(inspect(parser('#a_b'
|
|
55
|
-
assert.deepStrictEqual(inspect(parser('#a__b'
|
|
56
|
-
assert.deepStrictEqual(inspect(parser('#あ'
|
|
57
|
-
assert.deepStrictEqual(inspect(parser('#😀'
|
|
58
|
-
assert.deepStrictEqual(inspect(parser('#🤚🏽'
|
|
59
|
-
assert.deepStrictEqual(inspect(parser('#👨👩👧'
|
|
60
|
-
assert.deepStrictEqual(inspect(parser('#🇺🇳'
|
|
61
|
-
assert.deepStrictEqual(inspect(parser('##️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣'
|
|
62
|
-
assert.deepStrictEqual(inspect(parser('#1a'
|
|
63
|
-
assert.deepStrictEqual(inspect(parser('#1あ'
|
|
64
|
-
assert.deepStrictEqual(inspect(parser('#1😀'
|
|
65
|
-
assert.deepStrictEqual(inspect(parser(`#a'
|
|
66
|
-
assert.deepStrictEqual(inspect(parser(`#a''
|
|
67
|
-
assert.deepStrictEqual(inspect(parser(`#a'b
|
|
68
|
-
assert.deepStrictEqual(inspect(parser(`#a'0
|
|
69
|
-
assert.deepStrictEqual(inspect(parser(`#a'_b
|
|
70
|
-
assert.deepStrictEqual(inspect(parser(`#a_'b
|
|
71
|
-
assert.deepStrictEqual(inspect(parser('#1234a'
|
|
72
|
-
assert.deepStrictEqual(inspect(parser('#a+b'
|
|
44
|
+
assert.deepStrictEqual(inspect(parser, input('#a', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser, input('#a ', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], ' ']);
|
|
46
|
+
assert.deepStrictEqual(inspect(parser, input('#a\n', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\n']);
|
|
47
|
+
assert.deepStrictEqual(inspect(parser, input('#a\\', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\\']);
|
|
48
|
+
assert.deepStrictEqual(inspect(parser, input('#a\\ ', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\\ ']);
|
|
49
|
+
assert.deepStrictEqual(inspect(parser, input('#a\\\n', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '\\\n']);
|
|
50
|
+
assert.deepStrictEqual(inspect(parser, input('#a)', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], ')']);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser, input('#a(b', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '(b']);
|
|
52
|
+
assert.deepStrictEqual(inspect(parser, input('#a(b)', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '(b)']);
|
|
53
|
+
assert.deepStrictEqual(inspect(parser, input('#a_', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '_']);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser, input('#a_b', new Context())), [['<a class="hashtag" href="/hashtags/a_b">#a_b</a>'], '']);
|
|
55
|
+
assert.deepStrictEqual(inspect(parser, input('#a__b', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '__b']);
|
|
56
|
+
assert.deepStrictEqual(inspect(parser, input('#あ', new Context())), [['<a class="hashtag" href="/hashtags/あ">#あ</a>'], '']);
|
|
57
|
+
assert.deepStrictEqual(inspect(parser, input('#😀', new Context())), [['<a class="hashtag" href="/hashtags/😀">#😀</a>'], '']);
|
|
58
|
+
assert.deepStrictEqual(inspect(parser, input('#🤚🏽', new Context())), [['<a class="hashtag" href="/hashtags/🤚🏽">#🤚🏽</a>'], '']);
|
|
59
|
+
assert.deepStrictEqual(inspect(parser, input('#👨👩👧', new Context())), [['<a class="hashtag" href="/hashtags/👨👩👧">#👨👩👧</a>'], '']);
|
|
60
|
+
assert.deepStrictEqual(inspect(parser, input('#🇺🇳', new Context())), [['<a class="hashtag" href="/hashtags/🇺🇳">#🇺🇳</a>'], '']);
|
|
61
|
+
assert.deepStrictEqual(inspect(parser, input('##️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣', new Context())), [['<a class="hashtag" href="/hashtags/#️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣">##️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣</a>'], '']);
|
|
62
|
+
assert.deepStrictEqual(inspect(parser, input('#1a', new Context())), [['<a class="hashtag" href="/hashtags/1a">#1a</a>'], '']);
|
|
63
|
+
assert.deepStrictEqual(inspect(parser, input('#1あ', new Context())), [['<a class="hashtag" href="/hashtags/1あ">#1あ</a>'], '']);
|
|
64
|
+
assert.deepStrictEqual(inspect(parser, input('#1😀', new Context())), [['<a class="hashtag" href="/hashtags/1😀">#1😀</a>'], '']);
|
|
65
|
+
assert.deepStrictEqual(inspect(parser, input(`#a'`, new Context())), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `'`]);
|
|
66
|
+
assert.deepStrictEqual(inspect(parser, input(`#a''`, new Context())), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `''`]);
|
|
67
|
+
assert.deepStrictEqual(inspect(parser, input(`#a'b`, new Context())), [[`<a class="hashtag" href="/hashtags/a'b">#a'b</a>`], '']);
|
|
68
|
+
assert.deepStrictEqual(inspect(parser, input(`#a'0`, new Context())), [[`<a class="hashtag" href="/hashtags/a'0">#a'0</a>`], '']);
|
|
69
|
+
assert.deepStrictEqual(inspect(parser, input(`#a'_b`, new Context())), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `'_b`]);
|
|
70
|
+
assert.deepStrictEqual(inspect(parser, input(`#a_'b`, new Context())), [[`<a class="hashtag" href="/hashtags/a">#a</a>`], `_'b`]);
|
|
71
|
+
assert.deepStrictEqual(inspect(parser, input('#1234a', new Context())), [['<a class="hashtag" href="/hashtags/1234a">#1234a</a>'], '']);
|
|
72
|
+
assert.deepStrictEqual(inspect(parser, input('#a+b', new Context())), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '+b']);
|
|
73
73
|
});
|
|
74
74
|
|
|
75
75
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AutolinkParser } from '../../inline';
|
|
2
2
|
import { State, Backtrack } from '../../context';
|
|
3
|
-
import { List,
|
|
3
|
+
import { List, Node } from '../../../combinator/data/parser';
|
|
4
4
|
import { state, constraint, verify, surround, lazy } from '../../../combinator';
|
|
5
5
|
import { parse } from '../link';
|
|
6
6
|
import { str } from '../../source';
|
|
@@ -28,9 +28,9 @@ export const hashtag: AutolinkParser.HashtagParser = lazy(() => constraint(State
|
|
|
28
28
|
[3 | Backtrack.unescapable],
|
|
29
29
|
([, [{ value }]], context) =>
|
|
30
30
|
new List([
|
|
31
|
-
new
|
|
32
|
-
new List([new
|
|
33
|
-
new List([new
|
|
31
|
+
new Node(define(parse(
|
|
32
|
+
new List([new Node(`#${value}`)]),
|
|
33
|
+
new List([new Node(`/hashtags/${value}`)]),
|
|
34
34
|
context),
|
|
35
35
|
{ class: 'hashtag' }))
|
|
36
36
|
])))));
|
|
@@ -1,98 +1,98 @@
|
|
|
1
1
|
import { autolink } from '../autolink';
|
|
2
2
|
import { some } from '../../../combinator';
|
|
3
|
-
import { input } from '../../../combinator/data/parser';
|
|
3
|
+
import { Input, input } from '../../../combinator/data/parser';
|
|
4
|
+
import { Context } from '../../context';
|
|
4
5
|
import { inspect } from '../../../debug.test';
|
|
5
6
|
|
|
6
7
|
describe('Unit: parser/inline/autolink/url', () => {
|
|
7
8
|
describe('url', () => {
|
|
8
|
-
const parser = (
|
|
9
|
-
const { context: ctx } = input('', {});
|
|
9
|
+
const parser = (input: Input<Context>) => some(autolink)((++input.context.position, input));
|
|
10
10
|
|
|
11
11
|
it('invalid', () => {
|
|
12
|
-
assert.deepStrictEqual(inspect(parser(''
|
|
13
|
-
assert.deepStrictEqual(inspect(parser(' '
|
|
14
|
-
assert.deepStrictEqual(inspect(parser(' http'
|
|
15
|
-
assert.deepStrictEqual(inspect(parser(' http://'
|
|
16
|
-
assert.deepStrictEqual(inspect(parser(' http://['
|
|
17
|
-
assert.deepStrictEqual(inspect(parser(' http://]'
|
|
18
|
-
assert.deepStrictEqual(inspect(parser(' Http://host'
|
|
19
|
-
assert.deepStrictEqual(inspect(parser(' http://[::ffff:0:0%1]'
|
|
20
|
-
assert.deepStrictEqual(inspect(parser(' http://[::ffff:0:0/96]'
|
|
12
|
+
assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
|
|
13
|
+
assert.deepStrictEqual(inspect(parser, input(' ', new Context())), undefined);
|
|
14
|
+
assert.deepStrictEqual(inspect(parser, input(' http', new Context())), undefined);
|
|
15
|
+
assert.deepStrictEqual(inspect(parser, input(' http://', new Context())), undefined);
|
|
16
|
+
assert.deepStrictEqual(inspect(parser, input(' http://[', new Context())), undefined);
|
|
17
|
+
assert.deepStrictEqual(inspect(parser, input(' http://]', new Context())), undefined);
|
|
18
|
+
assert.deepStrictEqual(inspect(parser, input(' Http://host', new Context())), undefined);
|
|
19
|
+
assert.deepStrictEqual(inspect(parser, input(' http://[::ffff:0:0%1]', new Context())), [['<a class="invalid">http://[::ffff:0:0%1]</a>'], '']);
|
|
20
|
+
assert.deepStrictEqual(inspect(parser, input(' http://[::ffff:0:0/96]', new Context())), [['<a class="invalid">http://[::ffff:0:0/96]</a>'], '']);
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
it('basic', () => {
|
|
24
|
-
assert.deepStrictEqual(inspect(parser(' http://a'
|
|
25
|
-
assert.deepStrictEqual(inspect(parser(' http://a/'
|
|
26
|
-
assert.deepStrictEqual(inspect(parser(' http://a:80'
|
|
27
|
-
assert.deepStrictEqual(inspect(parser(' http://a.b'
|
|
28
|
-
assert.deepStrictEqual(inspect(parser(` http://a?#${encodeURIComponent(':/[]()<>?#=& ')}
|
|
29
|
-
assert.deepStrictEqual(inspect(parser(' http://a#()'
|
|
30
|
-
assert.deepStrictEqual(inspect(parser(' http://a#( )'
|
|
31
|
-
assert.deepStrictEqual(inspect(parser(' http://a#(\n)'
|
|
32
|
-
assert.deepStrictEqual(inspect(parser(' http://[::]'
|
|
33
|
-
assert.deepStrictEqual(inspect(parser('\rhttp://a#\\'
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('\nhttp://a#\\'
|
|
24
|
+
assert.deepStrictEqual(inspect(parser, input(' http://a', new Context())), [['<a class="url" href="http://a" target="_blank">http://a</a>'], '']);
|
|
25
|
+
assert.deepStrictEqual(inspect(parser, input(' http://a/', new Context())), [['<a class="url" href="http://a/" target="_blank">http://a/</a>'], '']);
|
|
26
|
+
assert.deepStrictEqual(inspect(parser, input(' http://a:80', new Context())), [['<a class="url" href="http://a:80" target="_blank">http://a:80</a>'], '']);
|
|
27
|
+
assert.deepStrictEqual(inspect(parser, input(' http://a.b', new Context())), [['<a class="url" href="http://a.b" target="_blank">http://a.b</a>'], '']);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser, input(` http://a?#${encodeURIComponent(':/[]()<>?#=& ')}`, new Context())), [['<a class="url" href="http://a?#%3A%2F%5B%5D()%3C%3E%3F%23%3D%26%20" target="_blank">http://a?#%3A%2F[]()<>%3F%23%3D%26%20</a>'], '']);
|
|
29
|
+
assert.deepStrictEqual(inspect(parser, input(' http://a#()', new Context())), [['<a class="url" href="http://a#()" target="_blank">http://a#()</a>'], '']);
|
|
30
|
+
assert.deepStrictEqual(inspect(parser, input(' http://a#( )', new Context())), [['<a class="url" href="http://a#" target="_blank">http://a#</a>'], '( )']);
|
|
31
|
+
assert.deepStrictEqual(inspect(parser, input(' http://a#(\n)', new Context())), [['<a class="url" href="http://a#" target="_blank">http://a#</a>'], '(\n)']);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser, input(' http://[::]', new Context())), [['<a class="url" href="http://[::]" target="_blank">http://[::]</a>'], '']);
|
|
33
|
+
assert.deepStrictEqual(inspect(parser, input('\rhttp://a#\\', new Context())), [['<a class="url" href="http://a#\\" target="_blank">http://a#\\</a>'], '']);
|
|
34
|
+
assert.deepStrictEqual(inspect(parser, input('\nhttp://a#\\', new Context())), [['<a class="url" href="http://a#\\" target="_blank">http://a#\\</a>'], '']);
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
it('trailing symbols', () => {
|
|
38
|
-
assert.deepStrictEqual(inspect(parser(' http://host '
|
|
39
|
-
assert.deepStrictEqual(inspect(parser(' http://host\n'
|
|
40
|
-
assert.deepStrictEqual(inspect(parser(' http://host\\'
|
|
41
|
-
assert.deepStrictEqual(inspect(parser(' http://host\\a'
|
|
42
|
-
assert.deepStrictEqual(inspect(parser(' http://host\\ '
|
|
43
|
-
assert.deepStrictEqual(inspect(parser(' http://host\\\n'
|
|
44
|
-
assert.deepStrictEqual(inspect(parser(' http://host. '
|
|
45
|
-
assert.deepStrictEqual(inspect(parser(' http://host.\n'
|
|
46
|
-
assert.deepStrictEqual(inspect(parser(' http://host.\\'
|
|
47
|
-
assert.deepStrictEqual(inspect(parser(' http://host.\\ '
|
|
48
|
-
assert.deepStrictEqual(inspect(parser(' http://host.\\\n'
|
|
49
|
-
assert.deepStrictEqual(inspect(parser(' http://host,'
|
|
50
|
-
assert.deepStrictEqual(inspect(parser(' http://host;'
|
|
51
|
-
assert.deepStrictEqual(inspect(parser(' http://host.'
|
|
52
|
-
assert.deepStrictEqual(inspect(parser(' http://host:'
|
|
53
|
-
assert.deepStrictEqual(inspect(parser(' http://host!'
|
|
54
|
-
assert.deepStrictEqual(inspect(parser(' http://host?'
|
|
55
|
-
assert.deepStrictEqual(inspect(parser(' http://host+'
|
|
56
|
-
assert.deepStrictEqual(inspect(parser(' http://host-'
|
|
57
|
-
assert.deepStrictEqual(inspect(parser(' http://host*'
|
|
58
|
-
assert.deepStrictEqual(inspect(parser(' http://host='
|
|
59
|
-
assert.deepStrictEqual(inspect(parser(' http://host~'
|
|
60
|
-
assert.deepStrictEqual(inspect(parser(' http://host^'
|
|
61
|
-
assert.deepStrictEqual(inspect(parser(' http://host_'
|
|
62
|
-
assert.deepStrictEqual(inspect(parser(' http://host/'
|
|
63
|
-
assert.deepStrictEqual(inspect(parser(' http://host//'
|
|
64
|
-
assert.deepStrictEqual(inspect(parser(' http://host///'
|
|
65
|
-
assert.deepStrictEqual(inspect(parser(` http://host'
|
|
66
|
-
assert.deepStrictEqual(inspect(parser(' http://host"'
|
|
67
|
-
assert.deepStrictEqual(inspect(parser(' http://host`'
|
|
68
|
-
assert.deepStrictEqual(inspect(parser(' http://host|'
|
|
69
|
-
assert.deepStrictEqual(inspect(parser(' http://host&'
|
|
70
|
-
assert.deepStrictEqual(inspect(parser(' http://host$'
|
|
71
|
-
assert.deepStrictEqual(inspect(parser(' http://host#"$"'
|
|
72
|
-
assert.deepStrictEqual(inspect(parser(' http://host#($)'
|
|
73
|
-
assert.deepStrictEqual(inspect(parser(' http://host#(($))'
|
|
74
|
-
assert.deepStrictEqual(inspect(parser(' http://user@host'
|
|
75
|
-
assert.deepStrictEqual(inspect(parser(' http://host#@'
|
|
76
|
-
assert.deepStrictEqual(inspect(parser(' http://host['
|
|
77
|
-
assert.deepStrictEqual(inspect(parser(' http://host]'
|
|
78
|
-
assert.deepStrictEqual(inspect(parser(' http://host('
|
|
79
|
-
assert.deepStrictEqual(inspect(parser(' http://host)'
|
|
80
|
-
assert.deepStrictEqual(inspect(parser(' http://host{'
|
|
81
|
-
assert.deepStrictEqual(inspect(parser(' http://host}'
|
|
82
|
-
assert.deepStrictEqual(inspect(parser(' http://host<'
|
|
83
|
-
assert.deepStrictEqual(inspect(parser(' http://host>'
|
|
84
|
-
assert.deepStrictEqual(inspect(parser(' http://host('
|
|
85
|
-
assert.deepStrictEqual(inspect(parser(' http://host)'
|
|
38
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host ', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], ' ']);
|
|
39
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host\n', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '\n']);
|
|
40
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host\\', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '\\']);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host\\a', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '\\a']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host\\ ', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '\\ ']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host\\\n', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '\\\n']);
|
|
44
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host. ', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '. ']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host.\n', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '.\n']);
|
|
46
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host.\\', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '.\\']);
|
|
47
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host.\\ ', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '.\\ ']);
|
|
48
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host.\\\n', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '.\\\n']);
|
|
49
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host,', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], ',']);
|
|
50
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host;', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], ';']);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host.', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '.']);
|
|
52
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host:', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], ':']);
|
|
53
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host!', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '!']);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host?', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '?']);
|
|
55
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host+', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '+']);
|
|
56
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host-', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '-']);
|
|
57
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host*', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '*']);
|
|
58
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host=', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '=']);
|
|
59
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host~', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '~']);
|
|
60
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host^', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '^']);
|
|
61
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host_', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '_']);
|
|
62
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host/', new Context())), [['<a class="url" href="http://host/" target="_blank">http://host/</a>'], '']);
|
|
63
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host//', new Context())), [['<a class="url" href="http://host//" target="_blank">http://host//</a>'], '']);
|
|
64
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host///', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '///']);
|
|
65
|
+
assert.deepStrictEqual(inspect(parser, input(` http://host'`, new Context())), [[`<a class="url" href="http://host'" target="_blank">http://host'</a>`], '']);
|
|
66
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host"', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '"']);
|
|
67
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host`', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '`']);
|
|
68
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host|', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '|']);
|
|
69
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host&', new Context())), [['<a class="url" href="http://host&" target="_blank">http://host&</a>'], '']);
|
|
70
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host$', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '$']);
|
|
71
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host#"$"', new Context())), [['<a class="url" href="http://host#" target="_blank">http://host#</a>'], '"$"']);
|
|
72
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host#($)', new Context())), [['<a class="url" href="http://host#" target="_blank">http://host#</a>'], '($)']);
|
|
73
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host#(($))', new Context())), [['<a class="url" href="http://host#" target="_blank">http://host#</a>'], '(($))']);
|
|
74
|
+
assert.deepStrictEqual(inspect(parser, input(' http://user@host', new Context())), [['<a class="url" href="http://user@host" target="_blank">http://user@host</a>'], '']);
|
|
75
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host#@', new Context())), [['<a class="url" href="http://host#@" target="_blank">http://host#@</a>'], '']);
|
|
76
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host[', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '[']);
|
|
77
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host]', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], ']']);
|
|
78
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host(', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '(']);
|
|
79
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host)', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], ')']);
|
|
80
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host{', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '{']);
|
|
81
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host}', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '}']);
|
|
82
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host<', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '<']);
|
|
83
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host>', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '>']);
|
|
84
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host(', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '(']);
|
|
85
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host)', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], ')']);
|
|
86
86
|
});
|
|
87
87
|
|
|
88
88
|
it('trailing entities', () => {
|
|
89
|
-
assert.deepStrictEqual(inspect(parser(' http://host?&hl;'
|
|
90
|
-
assert.deepStrictEqual(inspect(parser(' http://host?&hl;&hl;'
|
|
89
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host?&hl;', new Context())), [['<a class="url" href="http://host?&hl" target="_blank">http://host?&hl</a>'], ';']);
|
|
90
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host?&hl;&hl;', new Context())), [['<a class="url" href="http://host?&hl;&hl" target="_blank">http://host?&hl;&hl</a>'], ';']);
|
|
91
91
|
});
|
|
92
92
|
|
|
93
93
|
it('protocol', () => {
|
|
94
|
-
assert.deepStrictEqual(inspect(parser(' http://host'
|
|
95
|
-
assert.deepStrictEqual(inspect(parser(' https://host'
|
|
94
|
+
assert.deepStrictEqual(inspect(parser, input(' http://host', new Context())), [['<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
|
|
95
|
+
assert.deepStrictEqual(inspect(parser, input(' https://host', new Context())), [['<a class="url" href="https://host" target="_blank">https://host</a>'], '']);
|
|
96
96
|
});
|
|
97
97
|
|
|
98
98
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AutolinkParser } from '../../inline';
|
|
2
2
|
import { State, Recursion, Backtrack } from '../../context';
|
|
3
|
-
import { List,
|
|
3
|
+
import { List, Node } from '../../../combinator/data/parser';
|
|
4
4
|
import { union, tails, some, recursion, precedence, state, constraint, verify, focus, rewrite, surround, open, lazy } from '../../../combinator';
|
|
5
5
|
import { inline } from '../../inline';
|
|
6
6
|
import { parse } from '../link';
|
|
@@ -17,7 +17,7 @@ export const url: AutolinkParser.UrlParser = lazy(() => rewrite(
|
|
|
17
17
|
[3 | Backtrack.unescapable]),
|
|
18
18
|
union([
|
|
19
19
|
constraint(State.autolink, state(State.autolink, ({ context }) =>
|
|
20
|
-
new List([new
|
|
20
|
+
new List([new Node(parse(new List(), new List([new Node(context.source)]), context))]))),
|
|
21
21
|
open(str(/[^:]+/y), some(inline)),
|
|
22
22
|
])));
|
|
23
23
|
|
|
@@ -30,9 +30,9 @@ export const lineurl: AutolinkParser.UrlParser.LineUrlParser = lazy(() => focus(
|
|
|
30
30
|
const { source, position } = context;
|
|
31
31
|
context.position -= source[0] === '!' ? 1 : 0;
|
|
32
32
|
return new List([
|
|
33
|
-
new
|
|
33
|
+
new Node(parse(
|
|
34
34
|
new List(),
|
|
35
|
-
new List([new
|
|
35
|
+
new List([new Node(source.slice(position))]),
|
|
36
36
|
context))
|
|
37
37
|
]);
|
|
38
38
|
})),
|