securemark 0.259.2 → 0.260.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/design.md +14 -4
- package/dist/index.js +203 -153
- package/package.json +1 -1
- package/src/combinator/control/constraint/block.ts +2 -3
- package/src/combinator/control/constraint/contract.ts +5 -7
- package/src/combinator/control/constraint/line.ts +1 -2
- package/src/combinator/control/manipulation/convert.ts +1 -2
- package/src/combinator/control/manipulation/fence.ts +1 -2
- package/src/combinator/control/manipulation/match.ts +2 -3
- package/src/combinator/control/manipulation/scope.ts +3 -5
- package/src/combinator/control/manipulation/surround.ts +2 -2
- package/src/combinator/control/monad/bind.ts +2 -3
- package/src/combinator/data/parser/context.ts +14 -18
- package/src/combinator/data/parser/inits.ts +1 -2
- package/src/combinator/data/parser/sequence.ts +1 -2
- package/src/combinator/data/parser/some.ts +1 -2
- package/src/parser/api/parse.test.ts +19 -19
- package/src/parser/autolink.test.ts +6 -6
- package/src/parser/block/blockquote.test.ts +8 -8
- package/src/parser/block/codeblock.test.ts +4 -4
- package/src/parser/block/dlist.test.ts +1 -1
- package/src/parser/block/extension/figure.test.ts +1 -1
- package/src/parser/block/heading.test.ts +5 -5
- package/src/parser/block/olist.test.ts +1 -1
- package/src/parser/block/paragraph.test.ts +14 -14
- package/src/parser/block/reply/cite.test.ts +11 -11
- package/src/parser/block/reply/quote.test.ts +3 -3
- package/src/parser/block/reply.test.ts +8 -8
- package/src/parser/block/sidefence.test.ts +6 -6
- package/src/parser/block/ulist.test.ts +1 -1
- package/src/parser/context.ts +8 -7
- package/src/parser/inline/annotation.test.ts +3 -3
- package/src/parser/inline/autolink/account.test.ts +11 -11
- package/src/parser/inline/autolink/account.ts +4 -2
- package/src/parser/inline/autolink/anchor.test.ts +9 -9
- package/src/parser/inline/autolink/anchor.ts +14 -11
- package/src/parser/inline/autolink/channel.test.ts +3 -3
- package/src/parser/inline/autolink/hashnum.ts +4 -2
- package/src/parser/inline/autolink/hashtag.test.ts +20 -20
- package/src/parser/inline/autolink/hashtag.ts +4 -2
- package/src/parser/inline/autolink/url.test.ts +55 -55
- package/src/parser/inline/autolink/url.ts +5 -3
- package/src/parser/inline/html.test.ts +0 -2
- package/src/parser/inline/html.ts +1 -1
- package/src/parser/inline/link.test.ts +110 -110
- package/src/parser/inline/link.ts +8 -6
- package/src/parser/inline/media.test.ts +1 -0
- package/src/parser/inline/media.ts +1 -1
- package/src/parser/inline/reference.test.ts +3 -3
- package/src/parser/inline.test.ts +51 -51
- package/src/renderer/render/media/pdf.ts +1 -0
- package/src/util/info.ts +2 -4
package/package.json
CHANGED
|
@@ -6,11 +6,10 @@ import { firstline, isEmpty } from './line';
|
|
|
6
6
|
export function block<P extends Parser<unknown>>(parser: P, separation?: boolean): P;
|
|
7
7
|
export function block<T>(parser: Parser<T>, separation = true): Parser<T> {
|
|
8
8
|
assert(parser);
|
|
9
|
-
return
|
|
10
|
-
const { source, context } = input;
|
|
9
|
+
return ({ source, context }) => {
|
|
11
10
|
if (source === '') return;
|
|
12
11
|
context.memo ??= new Memo();
|
|
13
|
-
const result = parser(
|
|
12
|
+
const result = parser({ source, context });
|
|
14
13
|
if (!result) return;
|
|
15
14
|
const rest = exec(result);
|
|
16
15
|
if (separation && !isEmpty(firstline(rest))) return;
|
|
@@ -24,11 +24,10 @@ export function validate<T>(patterns: string | RegExp | (string | RegExp)[], has
|
|
|
24
24
|
? `|| source.slice(0, ${pattern.length}) === '${pattern}'`
|
|
25
25
|
: `|| /${pattern.source}/${pattern.flags}.test(source)`),
|
|
26
26
|
].join(''))();
|
|
27
|
-
return
|
|
28
|
-
const { source } = input;
|
|
27
|
+
return ({ source, context }) => {
|
|
29
28
|
if (source === '') return;
|
|
30
29
|
if (!match(source)) return;
|
|
31
|
-
const result = parser!(
|
|
30
|
+
const result = parser!({ source, context });
|
|
32
31
|
assert(check(source, result));
|
|
33
32
|
if (!result) return;
|
|
34
33
|
assert(exec(result).length < source.length);
|
|
@@ -41,13 +40,12 @@ export function validate<T>(patterns: string | RegExp | (string | RegExp)[], has
|
|
|
41
40
|
export function verify<P extends Parser<unknown>>(parser: P, cond: (results: readonly Tree<P>[], rest: string, context: Context<P>) => boolean): P;
|
|
42
41
|
export function verify<T>(parser: Parser<T>, cond: (results: readonly T[], rest: string, context: Ctx) => boolean): Parser<T> {
|
|
43
42
|
assert(parser);
|
|
44
|
-
return
|
|
45
|
-
const { source } = input;
|
|
43
|
+
return ({ source, context }) => {
|
|
46
44
|
if (source === '') return;
|
|
47
|
-
const result = parser(
|
|
45
|
+
const result = parser({ source, context });
|
|
48
46
|
assert(check(source, result));
|
|
49
47
|
if (!result) return;
|
|
50
|
-
if (!cond(eval(result), exec(result),
|
|
48
|
+
if (!cond(eval(result), exec(result), context)) return;
|
|
51
49
|
assert(exec(result).length < source.length);
|
|
52
50
|
return exec(result).length < source.length
|
|
53
51
|
? result
|
|
@@ -5,8 +5,7 @@ import { Memo } from '../../data/parser/context/memo';
|
|
|
5
5
|
export function line<P extends Parser<unknown>>(parser: P): P;
|
|
6
6
|
export function line<T>(parser: Parser<T>): Parser<T> {
|
|
7
7
|
assert(parser);
|
|
8
|
-
return
|
|
9
|
-
const { source, context } = input;
|
|
8
|
+
return ({ source, context }) => {
|
|
10
9
|
if (source === '') return;
|
|
11
10
|
context.memo ??= new Memo();
|
|
12
11
|
const line = firstline(source);
|
|
@@ -3,8 +3,7 @@ import { Parser, check } from '../../data/parser';
|
|
|
3
3
|
export function convert<P extends Parser<unknown>>(conv: (source: string) => string, parser: P): P;
|
|
4
4
|
export function convert<T>(conv: (source: string) => string, parser: Parser<T>): Parser<T> {
|
|
5
5
|
assert(parser);
|
|
6
|
-
return
|
|
7
|
-
const { source, context } = input;
|
|
6
|
+
return ({ source, context }) => {
|
|
8
7
|
if (source === '') return;
|
|
9
8
|
const src = conv(source);
|
|
10
9
|
if (src === '') return [[], ''];
|
|
@@ -3,8 +3,7 @@ import { firstline, isEmpty } from '../constraint/line';
|
|
|
3
3
|
import { unshift } from 'spica/array';
|
|
4
4
|
|
|
5
5
|
export function fence<C extends Ctx, D extends Parser<unknown, C>[]>(opener: RegExp, limit: number, separation = true): Parser<string, C, D> {
|
|
6
|
-
return
|
|
7
|
-
const { source } = input;
|
|
6
|
+
return ({ source }) => {
|
|
8
7
|
if (source === '') return;
|
|
9
8
|
const matches = source.match(opener);
|
|
10
9
|
if (!matches) return;
|
|
@@ -4,13 +4,12 @@ import { Parser, exec, check } from '../../data/parser';
|
|
|
4
4
|
export function match<P extends Parser<unknown>>(pattern: RegExp, f: (matched: RegExpMatchArray) => P): P;
|
|
5
5
|
export function match<T>(pattern: RegExp, f: (matched: RegExpMatchArray) => Parser<T>): Parser<T> {
|
|
6
6
|
assert(!pattern.flags.match(/[gmy]/) && pattern.source.startsWith('^'));
|
|
7
|
-
return
|
|
8
|
-
const { source } = input;
|
|
7
|
+
return ({ source, context }) => {
|
|
9
8
|
if (source === '') return;
|
|
10
9
|
const param = source.match(pattern);
|
|
11
10
|
if (!param) return;
|
|
12
11
|
assert(source.startsWith(param[0]));
|
|
13
|
-
const result = f(param)(
|
|
12
|
+
const result = f(param)({ source, context });
|
|
14
13
|
assert(check(source, result, false));
|
|
15
14
|
if (!result) return;
|
|
16
15
|
return exec(result).length < source.length && exec(result).length <= source.length
|
|
@@ -8,8 +8,7 @@ export function focus<T>(scope: string | RegExp, parser: Parser<T>): Parser<T> {
|
|
|
8
8
|
const match: (source: string) => string = typeof scope === 'string'
|
|
9
9
|
? source => source.slice(0, scope.length) === scope ? scope : ''
|
|
10
10
|
: source => source.match(scope)?.[0] ?? '';
|
|
11
|
-
return
|
|
12
|
-
const { source, context } = input;
|
|
11
|
+
return ({ source, context }) => {
|
|
13
12
|
if (source === '') return;
|
|
14
13
|
const src = match(source);
|
|
15
14
|
assert(source.startsWith(src));
|
|
@@ -32,12 +31,11 @@ export function rewrite<P extends Parser<unknown>>(scope: Parser<unknown, Contex
|
|
|
32
31
|
export function rewrite<T>(scope: Parser<unknown>, parser: Parser<T>): Parser<T> {
|
|
33
32
|
assert(scope);
|
|
34
33
|
assert(parser);
|
|
35
|
-
return
|
|
36
|
-
const { source, context } = input;
|
|
34
|
+
return ({ source, context }) => {
|
|
37
35
|
if (source === '') return;
|
|
38
36
|
const memo = context.memo;
|
|
39
37
|
context.memo = undefined;
|
|
40
|
-
const res1 = scope(
|
|
38
|
+
const res1 = scope({ source, context });
|
|
41
39
|
assert(check(source, res1));
|
|
42
40
|
context.memo = memo;
|
|
43
41
|
if (!res1 || exec(res1).length >= source.length) return;
|
|
@@ -38,8 +38,8 @@ export function surround<T>(
|
|
|
38
38
|
case 'object':
|
|
39
39
|
return surround(opener, parser, match(closer), optional, f, g);
|
|
40
40
|
}
|
|
41
|
-
return
|
|
42
|
-
const
|
|
41
|
+
return ({ source, context }) => {
|
|
42
|
+
const lmr_ = source;
|
|
43
43
|
if (lmr_ === '') return;
|
|
44
44
|
const res1 = opener({ source: lmr_, context });
|
|
45
45
|
assert(check(lmr_, res1, false));
|
|
@@ -7,10 +7,9 @@ export function bind<T, P extends Parser<unknown>>(parser: Parser<T, Context<P>,
|
|
|
7
7
|
export function bind<U, P extends Parser<unknown>>(parser: P, f: (nodes: Tree<P>[], rest: string, context: Context<P>) => Result<U, Context<P>, SubParsers<P>>): Parser<U, Context<P>, SubParsers<P>>;
|
|
8
8
|
export function bind<T, U>(parser: Parser<T>, f: (nodes: T[], rest: string, context: Ctx) => Result<U>): Parser<U> {
|
|
9
9
|
assert(parser);
|
|
10
|
-
return
|
|
11
|
-
const { source, context } = input;
|
|
10
|
+
return ({ source, context }) => {
|
|
12
11
|
if (source === '') return;
|
|
13
|
-
const res1 = parser(
|
|
12
|
+
const res1 = parser({ source, context });
|
|
14
13
|
assert(check(source, res1));
|
|
15
14
|
if (!res1) return;
|
|
16
15
|
const res2 = f(eval(res1), exec(res1), context);
|
|
@@ -58,8 +58,7 @@ function apply<T>(parser: Parser<T>, source: string, context: Ctx, changes: [str
|
|
|
58
58
|
|
|
59
59
|
export function syntax<P extends Parser<unknown>>(syntax: number, precedence: number, cost: number, state: number, parser: P): P;
|
|
60
60
|
export function syntax<T>(syntax: number, prec: number, cost: number, state: number, parser?: Parser<T>): Parser<T> {
|
|
61
|
-
return creation(cost, precedence(prec,
|
|
62
|
-
const { source, context } = input;
|
|
61
|
+
return creation(cost, precedence(prec, ({ source, context }) => {
|
|
63
62
|
if (source === '') return;
|
|
64
63
|
const memo = context.memo ??= new Memo();
|
|
65
64
|
context.memorable ??= ~0;
|
|
@@ -72,7 +71,7 @@ export function syntax<T>(syntax: number, prec: number, cost: number, state: num
|
|
|
72
71
|
? cache.length === 0
|
|
73
72
|
? undefined
|
|
74
73
|
: [cache[0], source.slice(cache[1])]
|
|
75
|
-
: parser!(
|
|
74
|
+
: parser!({ source, context });
|
|
76
75
|
if (syntax && st0 & context.memorable!) {
|
|
77
76
|
cache ?? memo.set(position, syntax, st1, eval(result), source.length - exec(result, '').length);
|
|
78
77
|
assert.deepStrictEqual(cache && cache, cache && memo.get(position, syntax, st1));
|
|
@@ -91,12 +90,12 @@ export function creation<P extends Parser<unknown>>(cost: number, parser: P): P;
|
|
|
91
90
|
export function creation(cost: number | Parser<unknown>, parser?: Parser<unknown>): Parser<unknown> {
|
|
92
91
|
if (typeof cost === 'function') return creation(1, cost);
|
|
93
92
|
assert(cost > 0);
|
|
94
|
-
return
|
|
95
|
-
const resources =
|
|
93
|
+
return ({ source, context }) => {
|
|
94
|
+
const resources = context.resources ?? { clock: 1, recursion: 1 };
|
|
96
95
|
if (resources.clock <= 0) throw new Error('Too many creations');
|
|
97
96
|
if (resources.recursion <= 0) throw new Error('Too much recursion');
|
|
98
97
|
--resources.recursion;
|
|
99
|
-
const result = parser!(
|
|
98
|
+
const result = parser!({ source, context });
|
|
100
99
|
++resources.recursion;
|
|
101
100
|
if (result) {
|
|
102
101
|
resources.clock -= cost;
|
|
@@ -108,11 +107,10 @@ export function creation(cost: number | Parser<unknown>, parser?: Parser<unknown
|
|
|
108
107
|
export function precedence<P extends Parser<unknown>>(precedence: number, parser: P): P;
|
|
109
108
|
export function precedence<T>(precedence: number, parser: Parser<T>): Parser<T> {
|
|
110
109
|
assert(precedence > 0);
|
|
111
|
-
return
|
|
112
|
-
const { context } = input;
|
|
110
|
+
return ({ source, context }) => {
|
|
113
111
|
const p = context.precedence;
|
|
114
112
|
context.precedence = precedence;
|
|
115
|
-
const result = parser(
|
|
113
|
+
const result = parser({ source, context });
|
|
116
114
|
context.precedence = p;
|
|
117
115
|
return result;
|
|
118
116
|
};
|
|
@@ -120,9 +118,9 @@ export function precedence<T>(precedence: number, parser: Parser<T>): Parser<T>
|
|
|
120
118
|
|
|
121
119
|
export function guard<P extends Parser<unknown>>(f: (context: Context<P>) => boolean | number, parser: P): P;
|
|
122
120
|
export function guard<T>(f: (context: Ctx) => boolean | number, parser: Parser<T>): Parser<T> {
|
|
123
|
-
return
|
|
124
|
-
f(
|
|
125
|
-
? parser(
|
|
121
|
+
return ({ source, context }) =>
|
|
122
|
+
f(context)
|
|
123
|
+
? parser({ source, context })
|
|
126
124
|
: undefined;
|
|
127
125
|
}
|
|
128
126
|
|
|
@@ -134,13 +132,12 @@ export function constraint<T>(state: number, positive: boolean | Parser<T>, pars
|
|
|
134
132
|
positive = true;
|
|
135
133
|
}
|
|
136
134
|
assert(state);
|
|
137
|
-
return
|
|
138
|
-
const { context } = input;
|
|
135
|
+
return ({ source, context }) => {
|
|
139
136
|
const s = positive
|
|
140
137
|
? state & context.state!
|
|
141
138
|
: state & ~context.state!;
|
|
142
139
|
return s === state
|
|
143
|
-
? parser!(
|
|
140
|
+
? parser!({ source, context })
|
|
144
141
|
: undefined;
|
|
145
142
|
};
|
|
146
143
|
}
|
|
@@ -153,13 +150,12 @@ export function state<T>(state: number, positive: boolean | Parser<T>, parser?:
|
|
|
153
150
|
positive = true;
|
|
154
151
|
}
|
|
155
152
|
assert(state);
|
|
156
|
-
return
|
|
157
|
-
const { context } = input;
|
|
153
|
+
return ({ source, context }) => {
|
|
158
154
|
const s = context.state ?? 0;
|
|
159
155
|
context.state = positive
|
|
160
156
|
? s | state
|
|
161
157
|
: s & ~state;
|
|
162
|
-
const result = parser!(
|
|
158
|
+
const result = parser!({ source, context });
|
|
163
159
|
context.state = s;
|
|
164
160
|
return result;
|
|
165
161
|
};
|
|
@@ -6,8 +6,7 @@ export function inits<P extends Parser<unknown>>(parsers: SubParsers<P>, resume?
|
|
|
6
6
|
export function inits<T, D extends Parser<T>[]>(parsers: D, resume?: (nodes: T[], rest: string) => boolean): Parser<T, Ctx, D> {
|
|
7
7
|
assert(parsers.every(f => f));
|
|
8
8
|
if (parsers.length === 1) return parsers[0];
|
|
9
|
-
return
|
|
10
|
-
const { source, context } = input;
|
|
9
|
+
return ({ source, context }) => {
|
|
11
10
|
let rest = source;
|
|
12
11
|
let nodes: T[] | undefined;
|
|
13
12
|
for (let i = 0, len = parsers.length; i < len; ++i) {
|
|
@@ -6,8 +6,7 @@ export function sequence<P extends Parser<unknown>>(parsers: SubParsers<P>, resu
|
|
|
6
6
|
export function sequence<T, D extends Parser<T>[]>(parsers: D, resume?: (nodes: T[], rest: string) => boolean): Parser<T, Ctx, D> {
|
|
7
7
|
assert(parsers.every(f => f));
|
|
8
8
|
if (parsers.length === 1) return parsers[0];
|
|
9
|
-
return
|
|
10
|
-
const { source, context } = input;
|
|
9
|
+
return ({ source, context }) => {
|
|
11
10
|
let rest = source;
|
|
12
11
|
let nodes: T[] | undefined;
|
|
13
12
|
for (let i = 0, len = parsers.length; i < len; ++i) {
|
|
@@ -16,8 +16,7 @@ export function some<T>(parser: Parser<T>, end?: string | RegExp | number, delim
|
|
|
16
16
|
matcher: Delimiters.matcher(delimiter),
|
|
17
17
|
precedence,
|
|
18
18
|
}));
|
|
19
|
-
return
|
|
20
|
-
const { source, context } = input;
|
|
19
|
+
return ({ source, context }) => {
|
|
21
20
|
if (source === '') return;
|
|
22
21
|
let rest = source;
|
|
23
22
|
let nodes: T[] | undefined;
|
|
@@ -117,23 +117,23 @@ describe('Unit: parser/api/parse', () => {
|
|
|
117
117
|
].join('\n\n'), { host: new URL(`${location.origin}/z`) }).children].map(el => el.outerHTML),
|
|
118
118
|
[
|
|
119
119
|
'<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="https://source/x/y"><span class="field-name">URL</span>: <span class="field-value">https://source/x/y</span>\n</span></details></aside>',
|
|
120
|
-
'<p><a href="https://source/@a" target="_blank"
|
|
121
|
-
'<p><a href="https://domain/@a" target="_blank"
|
|
122
|
-
'<p><a href="https://source/@a?ch=b" target="_blank"
|
|
123
|
-
'<p><a href="https://domain/@a?ch=b" target="_blank"
|
|
124
|
-
'<p><a href="https://source/hashtags/a" target="_blank"
|
|
125
|
-
'<p><a href="https://domain/hashtags/a" target="_blank"
|
|
120
|
+
'<p><a class="account" href="https://source/@a" target="_blank">@a</a></p>',
|
|
121
|
+
'<p><a class="account" href="https://domain/@a" target="_blank">@domain/a</a></p>',
|
|
122
|
+
'<p><a class="channel" href="https://source/@a?ch=b" target="_blank">@a#b</a></p>',
|
|
123
|
+
'<p><a class="channel" href="https://domain/@a?ch=b" target="_blank">@domain/a#b</a></p>',
|
|
124
|
+
'<p><a class="hashtag" href="https://source/hashtags/a" target="_blank">#a</a></p>',
|
|
125
|
+
'<p><a class="hashtag" href="https://domain/hashtags/a" target="_blank">#domain/a</a></p>',
|
|
126
126
|
'<p><a class="index" href="#index:a">a</a></p>',
|
|
127
127
|
'<figure data-type="math" data-label="$-a" data-group="$" data-number="1" id="label:$-a"><figcaption><span class="figindex">(1)</span><span class="figtext"></span></figcaption><div><div class="math" translate="no">$$\n$$</div></div></figure>',
|
|
128
128
|
'<p><a class="label" data-label="$-a" href="#label:$-a">(1)</a></p>',
|
|
129
129
|
'<p><sup class="annotation" id="annotation:ref:1" title="a"><span hidden="">a</span><a href="#annotation:def:1">*1</a></sup></p>',
|
|
130
|
-
'<p><a href="https://source/x/a" target="_blank">a</a></p>',
|
|
131
|
-
'<p><a href="https://source/a" target="_blank">/a</a></p>',
|
|
132
|
-
'<p><a href="/z/a">^/a</a></p>',
|
|
133
|
-
'<p><a href="https://source/x/a" target="_blank">./a</a></p>',
|
|
134
|
-
'<p><a href="https://source/a" target="_blank">../a</a></p>',
|
|
135
|
-
'<p><a href="https://source/a" target="_blank">../../a</a></p>',
|
|
136
|
-
'<p><a href="//domain/a" target="_blank">//domain/a</a></p>',
|
|
130
|
+
'<p><a class="link" href="https://source/x/a" target="_blank">a</a></p>',
|
|
131
|
+
'<p><a class="link" href="https://source/a" target="_blank">/a</a></p>',
|
|
132
|
+
'<p><a class="link" href="/z/a">^/a</a></p>',
|
|
133
|
+
'<p><a class="link" href="https://source/x/a" target="_blank">./a</a></p>',
|
|
134
|
+
'<p><a class="link" href="https://source/a" target="_blank">../a</a></p>',
|
|
135
|
+
'<p><a class="link" href="https://source/a" target="_blank">../../a</a></p>',
|
|
136
|
+
'<p><a class="link" href="//domain/a" target="_blank">//domain/a</a></p>',
|
|
137
137
|
'<p><a href="https://source/x/a" target="_blank"><img class="media" data-src="https://source/x/a" alt=""></a></p>',
|
|
138
138
|
'<p><a href="/z/a" target="_blank"><img class="media" data-src="/z/a" alt=""></a></p>',
|
|
139
139
|
'<p><a href="https://source/a" target="_blank"><img class="media" data-src="https://source/a" alt=""></a></p>',
|
|
@@ -151,8 +151,8 @@ describe('Unit: parser/api/parse', () => {
|
|
|
151
151
|
].join('\n\n'), { host: new URL(`${location.origin}/index.md`) }).children].map(el => el.outerHTML),
|
|
152
152
|
[
|
|
153
153
|
'<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="https://source/x/y"><span class="field-name">URL</span>: <span class="field-value">https://source/x/y</span>\n</span></details></aside>',
|
|
154
|
-
'<p><a href="/a">^/a</a></p>',
|
|
155
|
-
'<p><a href="https://source/x/a" target="_blank">./a</a></p>',
|
|
154
|
+
'<p><a class="link" href="/a">^/a</a></p>',
|
|
155
|
+
'<p><a class="link" href="https://source/x/a" target="_blank">./a</a></p>',
|
|
156
156
|
]);
|
|
157
157
|
assert.deepStrictEqual(
|
|
158
158
|
[...parse([
|
|
@@ -166,8 +166,8 @@ describe('Unit: parser/api/parse', () => {
|
|
|
166
166
|
].join('\n\n'), { host: new URL(`${location.origin}/z`) }).children].map(el => el.outerHTML),
|
|
167
167
|
[
|
|
168
168
|
`<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="${location.origin}/x/y"><span class="field-name">URL</span>: <span class="field-value">${location.origin}/x/y</span>\n</span></details></aside>`,
|
|
169
|
-
'<p><a href="/z/a">^/a</a></p>',
|
|
170
|
-
'<p><a href="/x/a">./a</a></p>',
|
|
169
|
+
'<p><a class="link" href="/z/a">^/a</a></p>',
|
|
170
|
+
'<p><a class="link" href="/x/a">./a</a></p>',
|
|
171
171
|
]);
|
|
172
172
|
});
|
|
173
173
|
|
|
@@ -198,8 +198,8 @@ describe('Unit: parser/api/parse', () => {
|
|
|
198
198
|
[
|
|
199
199
|
`<aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="https://example/x"><span class="field-name">URL</span>: <span class="field-value">https://example/x</span>\n</span></details></aside>`,
|
|
200
200
|
'<pre class="invalid" translate="no" data-invalid-syntax="header" data-invalid-type="syntax" data-invalid-message="Invalid syntax">---\nURL: https://example/y\n---\n</pre>',
|
|
201
|
-
'<aside class="example" data-type="markdown"><pre translate="no">---\nURL: https://example/y\n---\n\n{#}</pre><hr><section><aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="https://example/y"><span class="field-name">URL</span>: <span class="field-value">https://example/y</span>\n</span></details></aside><p><a href="https://example/y#" target="_blank">#</a></p><ol class="references"></ol></section></aside>',
|
|
202
|
-
'<p><a href="https://example/x#" target="_blank">#</a></p>',
|
|
201
|
+
'<aside class="example" data-type="markdown"><pre translate="no">---\nURL: https://example/y\n---\n\n{#}</pre><hr><section><aside class="header"><details open=""><summary>Header</summary><span class="field" data-name="url" data-value="https://example/y"><span class="field-name">URL</span>: <span class="field-value">https://example/y</span>\n</span></details></aside><p><a class="link" href="https://example/y#" target="_blank">#</a></p><ol class="references"></ol></section></aside>',
|
|
202
|
+
'<p><a class="link" href="https://example/x#" target="_blank">#</a></p>',
|
|
203
203
|
]);
|
|
204
204
|
});
|
|
205
205
|
|
|
@@ -7,10 +7,10 @@ describe('Unit: parser/autolink', () => {
|
|
|
7
7
|
const parser = (source: string) => some(autolink)({ source, context: {} });
|
|
8
8
|
|
|
9
9
|
it('basic', () => {
|
|
10
|
-
assert.deepStrictEqual(inspect(parser(' http://host')), [[' ', '<a href="http://host" target="_blank">http://host</a>'], '']);
|
|
11
|
-
assert.deepStrictEqual(inspect(parser('!http://host')), [['!', '<a href="http://host" target="_blank">http://host</a>'], '']);
|
|
12
|
-
assert.deepStrictEqual(inspect(parser('#a')), [['<a href="/hashtags/a"
|
|
13
|
-
assert.deepStrictEqual(inspect(parser('@a#b')), [['<a href="/@a?ch=b"
|
|
10
|
+
assert.deepStrictEqual(inspect(parser(' http://host')), [[' ', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
|
|
11
|
+
assert.deepStrictEqual(inspect(parser('!http://host')), [['!', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
|
|
12
|
+
assert.deepStrictEqual(inspect(parser('#a')), [['<a class="hashtag" href="/hashtags/a">#a</a>'], '']);
|
|
13
|
+
assert.deepStrictEqual(inspect(parser('@a#b')), [['<a class="channel" href="/@a?ch=b">@a#b</a>'], '']);
|
|
14
14
|
assert.deepStrictEqual(inspect(parser('\\\n')), [['\\', '<br>'], '']);
|
|
15
15
|
assert.deepStrictEqual(inspect(parser('a#b')), [['a#b'], '']);
|
|
16
16
|
assert.deepStrictEqual(inspect(parser('0a#b')), [['0a#b'], '']);
|
|
@@ -18,8 +18,8 @@ describe('Unit: parser/autolink', () => {
|
|
|
18
18
|
assert.deepStrictEqual(inspect(parser('あい#b')), [['あ', 'い#b'], '']);
|
|
19
19
|
assert.deepStrictEqual(inspect(parser('0aあ#b')), [['0aあ#b'], '']);
|
|
20
20
|
assert.deepStrictEqual(inspect(parser('0aあい#b')), [['0a', 'あ', 'い#b'], '']);
|
|
21
|
-
assert.deepStrictEqual(inspect(parser('a\n#b')), [['a', '<br>', '<a href="/hashtags/b"
|
|
22
|
-
assert.deepStrictEqual(inspect(parser('a\\\n#b')), [['a', '\\', '<br>', '<a href="/hashtags/b"
|
|
21
|
+
assert.deepStrictEqual(inspect(parser('a\n#b')), [['a', '<br>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
|
22
|
+
assert.deepStrictEqual(inspect(parser('a\\\n#b')), [['a', '\\', '<br>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
|
23
23
|
assert.deepStrictEqual(inspect(parser('0a>>b')), [['0a>>b'], '']);
|
|
24
24
|
});
|
|
25
25
|
|
|
@@ -25,13 +25,13 @@ describe('Unit: parser/block/blockquote', () => {
|
|
|
25
25
|
assert.deepStrictEqual(inspect(parser('> a\nb')), [['<blockquote><pre>a<br>b</pre></blockquote>'], '']);
|
|
26
26
|
assert.deepStrictEqual(inspect(parser('> a\n b ')), [['<blockquote><pre>a<br> b </pre></blockquote>'], '']);
|
|
27
27
|
assert.deepStrictEqual(inspect(parser('> a\n>')), [['<blockquote><pre>a<br></pre></blockquote>'], '']);
|
|
28
|
-
assert.deepStrictEqual(inspect(parser('> a\n>>1')), [['<blockquote><pre>a<br><a href="?at=1"
|
|
28
|
+
assert.deepStrictEqual(inspect(parser('> a\n>>1')), [['<blockquote><pre>a<br><a class="anchor" href="?at=1">>>1</a></pre></blockquote>'], '']);
|
|
29
29
|
assert.deepStrictEqual(inspect(parser('> a\n> b ')), [['<blockquote><pre>a<br>b </pre></blockquote>'], '']);
|
|
30
30
|
assert.deepStrictEqual(inspect(parser('> a\n>\n')), [['<blockquote><pre>a<br></pre></blockquote>'], '']);
|
|
31
31
|
assert.deepStrictEqual(inspect(parser('> a\n>\nb')), [['<blockquote><pre>a<br><br>b</pre></blockquote>'], '']);
|
|
32
32
|
assert.deepStrictEqual(inspect(parser('> a\n>\n b ')), [['<blockquote><pre>a<br><br> b </pre></blockquote>'], '']);
|
|
33
33
|
assert.deepStrictEqual(inspect(parser('> a\n>\n>')), [['<blockquote><pre>a<br><br></pre></blockquote>'], '']);
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('> a\n>\n>>1')), [['<blockquote><pre>a<br><br><a href="?at=1"
|
|
34
|
+
assert.deepStrictEqual(inspect(parser('> a\n>\n>>1')), [['<blockquote><pre>a<br><br><a class="anchor" href="?at=1">>>1</a></pre></blockquote>'], '']);
|
|
35
35
|
assert.deepStrictEqual(inspect(parser('> a\n>\n> b ')), [['<blockquote><pre>a<br><br>b </pre></blockquote>'], '']);
|
|
36
36
|
assert.deepStrictEqual(inspect(parser('> a\\\nb')), [['<blockquote><pre>a\\<br>b</pre></blockquote>'], '']);
|
|
37
37
|
assert.deepStrictEqual(inspect(parser('> a ')), [['<blockquote><pre> a </pre></blockquote>'], '']);
|
|
@@ -40,12 +40,12 @@ describe('Unit: parser/block/blockquote', () => {
|
|
|
40
40
|
assert.deepStrictEqual(inspect(parser('>\n a')), [['<blockquote><pre><br> a</pre></blockquote>'], '']);
|
|
41
41
|
assert.deepStrictEqual(inspect(parser('>\n>')), [['<blockquote><pre><br></pre></blockquote>'], '']);
|
|
42
42
|
assert.deepStrictEqual(inspect(parser('>\n> a')), [['<blockquote><pre><br>a</pre></blockquote>'], '']);
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('> http://host')), [['<blockquote><pre><a href="http://host" target="_blank">http://host</a></pre></blockquote>'], '']);
|
|
44
|
-
assert.deepStrictEqual(inspect(parser('> !http://host')), [['<blockquote><pre>!<a href="http://host" target="_blank">http://host</a></pre></blockquote>'], '']);
|
|
45
|
-
assert.deepStrictEqual(inspect(parser('> #a')), [['<blockquote><pre><a href="/hashtags/a"
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('> @a#b')), [['<blockquote><pre><a href="/@a?ch=b"
|
|
47
|
-
assert.deepStrictEqual(inspect(parser('> >>1\n> > b')), [['<blockquote><pre><a href="?at=1"
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('> >>1\n> > b\n> c')), [['<blockquote><pre><a href="?at=1"
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('> http://host')), [['<blockquote><pre><a class="url" href="http://host" target="_blank">http://host</a></pre></blockquote>'], '']);
|
|
44
|
+
assert.deepStrictEqual(inspect(parser('> !http://host')), [['<blockquote><pre>!<a class="url" href="http://host" target="_blank">http://host</a></pre></blockquote>'], '']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser('> #a')), [['<blockquote><pre><a class="hashtag" href="/hashtags/a">#a</a></pre></blockquote>'], '']);
|
|
46
|
+
assert.deepStrictEqual(inspect(parser('> @a#b')), [['<blockquote><pre><a class="channel" href="/@a?ch=b">@a#b</a></pre></blockquote>'], '']);
|
|
47
|
+
assert.deepStrictEqual(inspect(parser('> >>1\n> > b')), [['<blockquote><pre><a class="anchor" href="?at=1">>>1</a><br>> b</pre></blockquote>'], '']);
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('> >>1\n> > b\n> c')), [['<blockquote><pre><a class="anchor" href="?at=1">>>1</a><br>> b<br>c</pre></blockquote>'], '']);
|
|
49
49
|
});
|
|
50
50
|
|
|
51
51
|
it('nest', () => {
|
|
@@ -37,10 +37,10 @@ describe('Unit: parser/block/codeblock', () => {
|
|
|
37
37
|
assert.deepStrictEqual(inspect(parser('````\n```\n````')), [['<pre class="text">```</pre>'], '']);
|
|
38
38
|
assert.deepStrictEqual(inspect(parser('````\n```\n\n````')), [['<pre class="text">```<br></pre>'], '']);
|
|
39
39
|
assert.deepStrictEqual(inspect(parser('```\n\n```\n')), [['<pre class="text"></pre>'], '']);
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('```\nhttp://host\n```')), [['<pre class="text"><a href="http://host" target="_blank">http://host</a></pre>'], '']);
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('```\n!http://host\n```')), [['<pre class="text">!<a href="http://host" target="_blank">http://host</a></pre>'], '']);
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('```\n#a\n```')), [['<pre class="text"><a href="/hashtags/a"
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('```\n@a#b\n```')), [['<pre class="text"><a href="/@a?ch=b"
|
|
40
|
+
assert.deepStrictEqual(inspect(parser('```\nhttp://host\n```')), [['<pre class="text"><a class="url" href="http://host" target="_blank">http://host</a></pre>'], '']);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser('```\n!http://host\n```')), [['<pre class="text">!<a class="url" href="http://host" target="_blank">http://host</a></pre>'], '']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('```\n#a\n```')), [['<pre class="text"><a class="hashtag" href="/hashtags/a">#a</a></pre>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('```\n@a#b\n```')), [['<pre class="text"><a class="channel" href="/@a?ch=b">@a#b</a></pre>'], '']);
|
|
44
44
|
assert.deepStrictEqual(inspect(parser(`\`\`\`\n0${'\n'.repeat(300)}\`\`\``), '>'), [['<pre class="text">'], '']);
|
|
45
45
|
});
|
|
46
46
|
|
|
@@ -66,7 +66,7 @@ describe('Unit: parser/block/dlist', () => {
|
|
|
66
66
|
|
|
67
67
|
it('index', () => {
|
|
68
68
|
assert.deepStrictEqual(inspect(parser('~ a [#b]')), [['<dl><dt id="index:b">a<span class="indexer" data-index="b"></span></dt><dd></dd></dl>'], '']);
|
|
69
|
-
assert.deepStrictEqual(inspect(parser('~ a [#b]\\')), [['<dl><dt id="index:a_[#b]">a [<a href="/hashtags/b"
|
|
69
|
+
assert.deepStrictEqual(inspect(parser('~ a [#b]\\')), [['<dl><dt id="index:a_[#b]">a [<a class="hashtag" href="/hashtags/b">#b</a>]</dt><dd></dd></dl>'], '']);
|
|
70
70
|
assert.deepStrictEqual(inspect(parser('~ A')), [['<dl><dt id="index:A">A</dt><dd></dd></dl>'], '']);
|
|
71
71
|
assert.deepStrictEqual(inspect(parser('~ *A*')), [['<dl><dt id="index:A"><em>A</em></dt><dd></dd></dl>'], '']);
|
|
72
72
|
assert.deepStrictEqual(inspect(parser('~ `A`')), [['<dl><dt id="index:`A`"><code data-src="`A`">A</code></dt><dd></dd></dl>'], '']);
|
|
@@ -43,7 +43,7 @@ describe('Unit: parser/block/extension/figure', () => {
|
|
|
43
43
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
44
44
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
45
45
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n\\\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">\\</span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n!https://caption\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">!<a href="https://caption" target="_blank">https://caption</a></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
46
|
+
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n!https://host\n\n!https://caption\n~~~')), [['<figure data-type="media" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext">!<a class="url" href="https://caption" target="_blank">https://caption</a></span></figcaption><div><a href="https://host" target="_blank"><img class="media" data-src="https://host" alt=""></a></div></figure>'], '']);
|
|
47
47
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n- a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><ul><li>a</li></ul></div></figure>'], '']);
|
|
48
48
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n1. a\n~~~')), [['<figure data-type="list" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><ol><li>a</li></ol></div></figure>'], '']);
|
|
49
49
|
assert.deepStrictEqual(inspect(parser('~~~figure [$group-name]\n|\n|-\n|\n~~~')), [['<figure data-type="table" data-label="group-name" data-group="group"><figcaption><span class="figindex"></span><span class="figtext"></span></figcaption><div><table><thead><tr></tr></thead><tbody><tr></tr></tbody></table></div></figure>'], '']);
|
|
@@ -43,11 +43,11 @@ describe('Unit: parser/block/heading', () => {
|
|
|
43
43
|
assert.deepStrictEqual(inspect(parser('# \\ a')), [['<h1 id="index:a">a</h1>'], '']);
|
|
44
44
|
assert.deepStrictEqual(inspect(parser('## \\')), [['<h2 id="index:\\">\\</h2>'], '']);
|
|
45
45
|
assert.deepStrictEqual(inspect(parser('# @a')), [['<h1 id="index:@a">@a</h1>'], '']);
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('## @a')), [['<h2 id="index:@a"><a
|
|
46
|
+
assert.deepStrictEqual(inspect(parser('## @a')), [['<h2 id="index:@a"><a class="account" href="/@a">@a</a></h2>'], '']);
|
|
47
47
|
assert.deepStrictEqual(inspect(parser('# http://host')), [['<h1 id="index:http://host">http://host</h1>'], '']);
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('## http://host')), [['<h2 id="index:http://host"><a href="http://host" target="_blank">http://host</a></h2>'], '']);
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('## http://host')), [['<h2 id="index:http://host"><a class="url" href="http://host" target="_blank">http://host</a></h2>'], '']);
|
|
49
49
|
assert.deepStrictEqual(inspect(parser('# !http://host')), [['<h1 id="index:!http://host">!http://host</h1>'], '']);
|
|
50
|
-
assert.deepStrictEqual(inspect(parser('## !http://host')), [['<h2 id="index:!http://host">!<a href="http://host" target="_blank">http://host</a></h2>'], '']);
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('## !http://host')), [['<h2 id="index:!http://host">!<a class="url" href="http://host" target="_blank">http://host</a></h2>'], '']);
|
|
51
51
|
assert.deepStrictEqual(inspect(parser('# a((b))')), [['<h1 id="index:a((b))">a<span class="paren">((b))</span></h1>'], '']);
|
|
52
52
|
assert.deepStrictEqual(inspect(parser('## a((b))')), [['<h2 id="index:a((b))">a<span class="paren">((b))</span></h2>'], '']);
|
|
53
53
|
assert.deepStrictEqual(inspect(parser('# a[[b]]')), [['<h1 id="index:a[[b]]">a[[b]]</h1>'], '']);
|
|
@@ -79,8 +79,8 @@ describe('Unit: parser/block/heading', () => {
|
|
|
79
79
|
assert.deepStrictEqual(inspect(parser('# a [#b] [#c]')), [['<h1 id="index:c">a [#b]<span class="indexer" data-index="c"></span></h1>'], '']);
|
|
80
80
|
assert.deepStrictEqual(inspect(parser('# a [#b] \n')), [['<h1 id="index:b">a<span class="indexer" data-index="b"></span></h1>'], '']);
|
|
81
81
|
assert.deepStrictEqual(inspect(parser('# a \\[#b]')), [['<h1 id="index:a_[#b]">a [#b]</h1>'], '']);
|
|
82
|
-
assert.deepStrictEqual(inspect(parser('## a [#b] [#c]')), [['<h2 id="index:c">a [<a href="/hashtags/b"
|
|
83
|
-
assert.deepStrictEqual(inspect(parser('## a [#b ] [#c ]')), [['<h2 id="index:c">a [<a href="/hashtags/b"
|
|
82
|
+
assert.deepStrictEqual(inspect(parser('## a [#b] [#c]')), [['<h2 id="index:c">a [<a class="hashtag" href="/hashtags/b">#b</a>]<span class="indexer" data-index="c"></span></h2>'], '']);
|
|
83
|
+
assert.deepStrictEqual(inspect(parser('## a [#b ] [#c ]')), [['<h2 id="index:c">a [<a class="hashtag" href="/hashtags/b">#b</a> ]<span class="indexer" data-index="c"></span></h2>'], '']);
|
|
84
84
|
});
|
|
85
85
|
|
|
86
86
|
});
|
|
@@ -81,7 +81,7 @@ describe('Unit: parser/block/olist', () => {
|
|
|
81
81
|
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n 0. 3')), [['<ol><li>1<ol><li>2</li><li>3</li></ol></li></ol>'], '']);
|
|
82
82
|
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n 0. 3')), [['<ol><li>1<ol><li>2<ol><li>3</li></ol></li></ol></li></ol>'], '']);
|
|
83
83
|
assert.deepStrictEqual(inspect(parser('0. 1\n 0. 2\n 0. 3')), [['<ol><li>1<ol><li>2</li></ol></li><li><span class="invalid"> 0. 3</span></li></ol>'], '']);
|
|
84
|
-
assert.deepStrictEqual(inspect(parser('0. !http://host')), [['<ol><li>!<a href="http://host" target="_blank">http://host</a></li></ol>'], '']);
|
|
84
|
+
assert.deepStrictEqual(inspect(parser('0. !http://host')), [['<ol><li>!<a class="url" href="http://host" target="_blank">http://host</a></li></ol>'], '']);
|
|
85
85
|
});
|
|
86
86
|
|
|
87
87
|
it('index', () => {
|
|
@@ -37,23 +37,23 @@ describe('Unit: parser/block/paragraph', () => {
|
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
it('anchor', () => {
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('>>1 a\nb')), [['<p><a href="?at=1"
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('>>1 a\n>>2')), [['<p><a href="?at=1"
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('>>1 a\n>>b')), [['<p><a href="?at=1"
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('>>1 a\n>> b')), [['<p><a href="?at=1"
|
|
44
|
-
assert.deepStrictEqual(inspect(parser('>>11.')), [['<p><a href="?at=11"
|
|
45
|
-
assert.deepStrictEqual(inspect(parser('>>11 a')), [['<p><a href="?at=11"
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('>>>11 a')), [['<p>><a href="?at=11"
|
|
47
|
-
assert.deepStrictEqual(inspect(parser('>> a\n>>1')), [['<p>>> a<br><a href="?at=1"
|
|
40
|
+
assert.deepStrictEqual(inspect(parser('>>1 a\nb')), [['<p><a class="anchor" href="?at=1">>>1</a> a<br>b</p>'], '']);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser('>>1 a\n>>2')), [['<p><a class="anchor" href="?at=1">>>1</a> a<br><a class="anchor" href="?at=2">>>2</a></p>'], '']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('>>1 a\n>>b')), [['<p><a class="anchor" href="?at=1">>>1</a> a<br><a class="anchor" href="?at=b">>>b</a></p>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('>>1 a\n>> b')), [['<p><a class="anchor" href="?at=1">>>1</a> a<br>>> b</p>'], '']);
|
|
44
|
+
assert.deepStrictEqual(inspect(parser('>>11.')), [['<p><a class="anchor" href="?at=11">>>11</a>.</p>'], '']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser('>>11 a')), [['<p><a class="anchor" href="?at=11">>>11</a> a</p>'], '']);
|
|
46
|
+
assert.deepStrictEqual(inspect(parser('>>>11 a')), [['<p>><a class="anchor" href="?at=11">>>11</a> a</p>'], '']);
|
|
47
|
+
assert.deepStrictEqual(inspect(parser('>> a\n>>1')), [['<p>>> a<br><a class="anchor" href="?at=1">>>1</a></p>'], '']);
|
|
48
48
|
assert.deepStrictEqual(inspect(parser('a>>1')), [['<p>a>>1</p>'], '']);
|
|
49
49
|
assert.deepStrictEqual(inspect(parser('ab>>1')), [['<p>ab>>1</p>'], '']);
|
|
50
|
-
assert.deepStrictEqual(inspect(parser('a >>1')), [['<p>a <a href="?at=1"
|
|
51
|
-
assert.deepStrictEqual(inspect(parser('a\n>>1')), [['<p>a<br><a href="?at=1"
|
|
52
|
-
assert.deepStrictEqual(inspect(parser('a\n>>1\nb')), [['<p>a<br><a href="?at=1"
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('a >>1')), [['<p>a <a class="anchor" href="?at=1">>>1</a></p>'], '']);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser('a\n>>1')), [['<p>a<br><a class="anchor" href="?at=1">>>1</a></p>'], '']);
|
|
52
|
+
assert.deepStrictEqual(inspect(parser('a\n>>1\nb')), [['<p>a<br><a class="anchor" href="?at=1">>>1</a><br>b</p>'], '']);
|
|
53
53
|
assert.deepStrictEqual(inspect(parser('a\n>> b\nc')), [['<p>a<br>>> b<br>c</p>'], '']);
|
|
54
|
-
assert.deepStrictEqual(inspect(parser('\t>>1')), [['<p>\t<a href="?at=1"
|
|
55
|
-
assert.deepStrictEqual(inspect(parser('\t>>>1')), [['<p>\t><a href="?at=1"
|
|
56
|
-
assert.deepStrictEqual(inspect(parser('あ>>1')), [['<p>あ<a href="?at=1"
|
|
54
|
+
assert.deepStrictEqual(inspect(parser('\t>>1')), [['<p>\t<a class="anchor" href="?at=1">>>1</a></p>'], '']);
|
|
55
|
+
assert.deepStrictEqual(inspect(parser('\t>>>1')), [['<p>\t><a class="anchor" href="?at=1">>>1</a></p>'], '']);
|
|
56
|
+
assert.deepStrictEqual(inspect(parser('あ>>1')), [['<p>あ<a class="anchor" href="?at=1">>>1</a></p>'], '']);
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
it('comment', () => {
|