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.
Files changed (53) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/design.md +14 -4
  3. package/dist/index.js +203 -153
  4. package/package.json +1 -1
  5. package/src/combinator/control/constraint/block.ts +2 -3
  6. package/src/combinator/control/constraint/contract.ts +5 -7
  7. package/src/combinator/control/constraint/line.ts +1 -2
  8. package/src/combinator/control/manipulation/convert.ts +1 -2
  9. package/src/combinator/control/manipulation/fence.ts +1 -2
  10. package/src/combinator/control/manipulation/match.ts +2 -3
  11. package/src/combinator/control/manipulation/scope.ts +3 -5
  12. package/src/combinator/control/manipulation/surround.ts +2 -2
  13. package/src/combinator/control/monad/bind.ts +2 -3
  14. package/src/combinator/data/parser/context.ts +14 -18
  15. package/src/combinator/data/parser/inits.ts +1 -2
  16. package/src/combinator/data/parser/sequence.ts +1 -2
  17. package/src/combinator/data/parser/some.ts +1 -2
  18. package/src/parser/api/parse.test.ts +19 -19
  19. package/src/parser/autolink.test.ts +6 -6
  20. package/src/parser/block/blockquote.test.ts +8 -8
  21. package/src/parser/block/codeblock.test.ts +4 -4
  22. package/src/parser/block/dlist.test.ts +1 -1
  23. package/src/parser/block/extension/figure.test.ts +1 -1
  24. package/src/parser/block/heading.test.ts +5 -5
  25. package/src/parser/block/olist.test.ts +1 -1
  26. package/src/parser/block/paragraph.test.ts +14 -14
  27. package/src/parser/block/reply/cite.test.ts +11 -11
  28. package/src/parser/block/reply/quote.test.ts +3 -3
  29. package/src/parser/block/reply.test.ts +8 -8
  30. package/src/parser/block/sidefence.test.ts +6 -6
  31. package/src/parser/block/ulist.test.ts +1 -1
  32. package/src/parser/context.ts +8 -7
  33. package/src/parser/inline/annotation.test.ts +3 -3
  34. package/src/parser/inline/autolink/account.test.ts +11 -11
  35. package/src/parser/inline/autolink/account.ts +4 -2
  36. package/src/parser/inline/autolink/anchor.test.ts +9 -9
  37. package/src/parser/inline/autolink/anchor.ts +14 -11
  38. package/src/parser/inline/autolink/channel.test.ts +3 -3
  39. package/src/parser/inline/autolink/hashnum.ts +4 -2
  40. package/src/parser/inline/autolink/hashtag.test.ts +20 -20
  41. package/src/parser/inline/autolink/hashtag.ts +4 -2
  42. package/src/parser/inline/autolink/url.test.ts +55 -55
  43. package/src/parser/inline/autolink/url.ts +5 -3
  44. package/src/parser/inline/html.test.ts +0 -2
  45. package/src/parser/inline/html.ts +1 -1
  46. package/src/parser/inline/link.test.ts +110 -110
  47. package/src/parser/inline/link.ts +8 -6
  48. package/src/parser/inline/media.test.ts +1 -0
  49. package/src/parser/inline/media.ts +1 -1
  50. package/src/parser/inline/reference.test.ts +3 -3
  51. package/src/parser/inline.test.ts +51 -51
  52. package/src/renderer/render/media/pdf.ts +1 -0
  53. package/src/util/info.ts +2 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.259.2",
3
+ "version": "0.260.0",
4
4
  "description": "Secure markdown renderer working on browsers for user input data.",
5
5
  "private": false,
6
6
  "homepage": "https://github.com/falsandtru/securemark",
@@ -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 input => {
10
- const { source, context } = input;
9
+ return ({ source, context }) => {
11
10
  if (source === '') return;
12
11
  context.memo ??= new Memo();
13
- const result = parser(input);
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 input => {
28
- const { source } = input;
27
+ return ({ source, context }) => {
29
28
  if (source === '') return;
30
29
  if (!match(source)) return;
31
- const result = parser!(input);
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 input => {
45
- const { source } = input;
43
+ return ({ source, context }) => {
46
44
  if (source === '') return;
47
- const result = parser(input);
45
+ const result = parser({ source, context });
48
46
  assert(check(source, result));
49
47
  if (!result) return;
50
- if (!cond(eval(result), exec(result), input.context)) return;
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 input => {
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 input => {
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 input => {
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 input => {
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)(input);
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 input => {
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 input => {
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(input);
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 input => {
42
- const { source: lmr_, context } = input;
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 input => {
11
- const { source, context } = input;
10
+ return ({ source, context }) => {
12
11
  if (source === '') return;
13
- const res1 = parser(input);
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, input => {
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!(input);
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 input => {
95
- const resources = input.context.resources ?? { clock: 1, recursion: 1 };
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!(input);
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 input => {
112
- const { context } = input;
110
+ return ({ source, context }) => {
113
111
  const p = context.precedence;
114
112
  context.precedence = precedence;
115
- const result = parser(input);
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 input =>
124
- f(input.context)
125
- ? parser(input)
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 input => {
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!(input)
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 input => {
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!(input);
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 input => {
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 input => {
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 input => {
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" class="account">@a</a></p>',
121
- '<p><a href="https://domain/@a" target="_blank" class="account">@domain/a</a></p>',
122
- '<p><a href="https://source/@a?ch=b" target="_blank" class="channel">@a#b</a></p>',
123
- '<p><a href="https://domain/@a?ch=b" target="_blank" class="channel">@domain/a#b</a></p>',
124
- '<p><a href="https://source/hashtags/a" target="_blank" class="hashtag">#a</a></p>',
125
- '<p><a href="https://domain/hashtags/a" target="_blank" class="hashtag">#domain/a</a></p>',
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" class="hashtag">#a</a>'], '']);
13
- assert.deepStrictEqual(inspect(parser('@a#b')), [['<a href="/@a?ch=b" class="channel">@a#b</a>'], '']);
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" class="hashtag">#b</a>'], '']);
22
- assert.deepStrictEqual(inspect(parser('a\\\n#b')), [['a', '\\', '<br>', '<a href="/hashtags/b" class="hashtag">#b</a>'], '']);
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" class="anchor">&gt;&gt;1</a></pre></blockquote>'], '']);
28
+ assert.deepStrictEqual(inspect(parser('> a\n>>1')), [['<blockquote><pre>a<br><a class="anchor" href="?at=1">&gt;&gt;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" class="anchor">&gt;&gt;1</a></pre></blockquote>'], '']);
34
+ assert.deepStrictEqual(inspect(parser('> a\n>\n>>1')), [['<blockquote><pre>a<br><br><a class="anchor" href="?at=1">&gt;&gt;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" class="hashtag">#a</a></pre></blockquote>'], '']);
46
- assert.deepStrictEqual(inspect(parser('> @a#b')), [['<blockquote><pre><a href="/@a?ch=b" class="channel">@a#b</a></pre></blockquote>'], '']);
47
- assert.deepStrictEqual(inspect(parser('> >>1\n> > b')), [['<blockquote><pre><a href="?at=1" class="anchor">&gt;&gt;1</a><br>&gt; b</pre></blockquote>'], '']);
48
- assert.deepStrictEqual(inspect(parser('> >>1\n> > b\n> c')), [['<blockquote><pre><a href="?at=1" class="anchor">&gt;&gt;1</a><br>&gt; b<br>c</pre></blockquote>'], '']);
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">&gt;&gt;1</a><br>&gt; b</pre></blockquote>'], '']);
48
+ assert.deepStrictEqual(inspect(parser('> >>1\n> > b\n> c')), [['<blockquote><pre><a class="anchor" href="?at=1">&gt;&gt;1</a><br>&gt; 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" class="hashtag">#a</a></pre>'], '']);
43
- assert.deepStrictEqual(inspect(parser('```\n@a#b\n```')), [['<pre class="text"><a href="/@a?ch=b" class="channel">@a#b</a></pre>'], '']);
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" class="hashtag">#b</a>]</dt><dd></dd></dl>'], '']);
69
+ assert.deepStrictEqual(inspect(parser('~ a [#b]\\')), [['<dl><dt id="index:a_[#b]">a [<a class="hashtag" href="/hashtags/b">#b</a>]</dt><dd></dd></dl>'], '']);
70
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 href="/@a" class="account">@a</a></h2>'], '']);
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" class="hashtag">#b</a>]<span class="indexer" data-index="c"></span></h2>'], '']);
83
- assert.deepStrictEqual(inspect(parser('## a [#b ] [#c ]')), [['<h2 id="index:c">a [<a href="/hashtags/b" class="hashtag">#b</a> ]<span class="indexer" data-index="c"></span></h2>'], '']);
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" class="anchor">&gt;&gt;1</a> a<br>b</p>'], '']);
41
- assert.deepStrictEqual(inspect(parser('>>1 a\n>>2')), [['<p><a href="?at=1" class="anchor">&gt;&gt;1</a> a<br><a href="?at=2" class="anchor">&gt;&gt;2</a></p>'], '']);
42
- assert.deepStrictEqual(inspect(parser('>>1 a\n>>b')), [['<p><a href="?at=1" class="anchor">&gt;&gt;1</a> a<br><a href="?at=b" class="anchor">&gt;&gt;b</a></p>'], '']);
43
- assert.deepStrictEqual(inspect(parser('>>1 a\n>> b')), [['<p><a href="?at=1" class="anchor">&gt;&gt;1</a> a<br>&gt;&gt; b</p>'], '']);
44
- assert.deepStrictEqual(inspect(parser('>>11.')), [['<p><a href="?at=11" class="anchor">&gt;&gt;11</a>.</p>'], '']);
45
- assert.deepStrictEqual(inspect(parser('>>11 a')), [['<p><a href="?at=11" class="anchor">&gt;&gt;11</a> a</p>'], '']);
46
- assert.deepStrictEqual(inspect(parser('>>>11 a')), [['<p>&gt;<a href="?at=11" class="anchor">&gt;&gt;11</a> a</p>'], '']);
47
- assert.deepStrictEqual(inspect(parser('>> a\n>>1')), [['<p>&gt;&gt; a<br><a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
40
+ assert.deepStrictEqual(inspect(parser('>>1 a\nb')), [['<p><a class="anchor" href="?at=1">&gt;&gt;1</a> a<br>b</p>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('>>1 a\n>>2')), [['<p><a class="anchor" href="?at=1">&gt;&gt;1</a> a<br><a class="anchor" href="?at=2">&gt;&gt;2</a></p>'], '']);
42
+ assert.deepStrictEqual(inspect(parser('>>1 a\n>>b')), [['<p><a class="anchor" href="?at=1">&gt;&gt;1</a> a<br><a class="anchor" href="?at=b">&gt;&gt;b</a></p>'], '']);
43
+ assert.deepStrictEqual(inspect(parser('>>1 a\n>> b')), [['<p><a class="anchor" href="?at=1">&gt;&gt;1</a> a<br>&gt;&gt; b</p>'], '']);
44
+ assert.deepStrictEqual(inspect(parser('>>11.')), [['<p><a class="anchor" href="?at=11">&gt;&gt;11</a>.</p>'], '']);
45
+ assert.deepStrictEqual(inspect(parser('>>11 a')), [['<p><a class="anchor" href="?at=11">&gt;&gt;11</a> a</p>'], '']);
46
+ assert.deepStrictEqual(inspect(parser('>>>11 a')), [['<p>&gt;<a class="anchor" href="?at=11">&gt;&gt;11</a> a</p>'], '']);
47
+ assert.deepStrictEqual(inspect(parser('>> a\n>>1')), [['<p>&gt;&gt; a<br><a class="anchor" href="?at=1">&gt;&gt;1</a></p>'], '']);
48
48
  assert.deepStrictEqual(inspect(parser('a>>1')), [['<p>a&gt;&gt;1</p>'], '']);
49
49
  assert.deepStrictEqual(inspect(parser('ab>>1')), [['<p>ab&gt;&gt;1</p>'], '']);
50
- assert.deepStrictEqual(inspect(parser('a >>1')), [['<p>a <a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
51
- assert.deepStrictEqual(inspect(parser('a\n>>1')), [['<p>a<br><a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
52
- assert.deepStrictEqual(inspect(parser('a\n>>1\nb')), [['<p>a<br><a href="?at=1" class="anchor">&gt;&gt;1</a><br>b</p>'], '']);
50
+ assert.deepStrictEqual(inspect(parser('a >>1')), [['<p>a <a class="anchor" href="?at=1">&gt;&gt;1</a></p>'], '']);
51
+ assert.deepStrictEqual(inspect(parser('a\n>>1')), [['<p>a<br><a class="anchor" href="?at=1">&gt;&gt;1</a></p>'], '']);
52
+ assert.deepStrictEqual(inspect(parser('a\n>>1\nb')), [['<p>a<br><a class="anchor" href="?at=1">&gt;&gt;1</a><br>b</p>'], '']);
53
53
  assert.deepStrictEqual(inspect(parser('a\n>> b\nc')), [['<p>a<br>&gt;&gt; b<br>c</p>'], '']);
54
- assert.deepStrictEqual(inspect(parser('\t>>1')), [['<p>\t<a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
55
- assert.deepStrictEqual(inspect(parser('\t>>>1')), [['<p>\t&gt;<a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
56
- assert.deepStrictEqual(inspect(parser('あ>>1')), [['<p>あ<a href="?at=1" class="anchor">&gt;&gt;1</a></p>'], '']);
54
+ assert.deepStrictEqual(inspect(parser('\t>>1')), [['<p>\t<a class="anchor" href="?at=1">&gt;&gt;1</a></p>'], '']);
55
+ assert.deepStrictEqual(inspect(parser('\t>>>1')), [['<p>\t&gt;<a class="anchor" href="?at=1">&gt;&gt;1</a></p>'], '']);
56
+ assert.deepStrictEqual(inspect(parser('あ>>1')), [['<p>あ<a class="anchor" href="?at=1">&gt;&gt;1</a></p>'], '']);
57
57
  });
58
58
 
59
59
  it('comment', () => {