securemark 0.263.0 → 0.264.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 +10 -0
- package/dist/index.js +1483 -3326
- package/index.ts +0 -1
- package/markdown.d.ts +1 -1
- package/package.json +19 -19
- package/src/combinator/control/constraint/block.ts +1 -2
- package/src/combinator/control/constraint/contract.ts +3 -3
- package/src/combinator/control/constraint/line.ts +1 -2
- package/src/combinator/control/manipulation/indent.ts +0 -1
- package/src/combinator/control/manipulation/match.ts +1 -2
- package/src/combinator/control/manipulation/scope.ts +3 -4
- package/src/combinator/control/manipulation/surround.ts +1 -2
- package/src/combinator/control/monad/bind.ts +2 -3
- package/src/combinator/data/parser/context.ts +3 -3
- 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/combinator/data/parser/union.ts +4 -12
- package/src/parser/api/bind.test.ts +1 -1
- package/src/parser/api/bind.ts +0 -1
- package/src/parser/api/parse.test.ts +3 -3
- package/src/parser/api/parse.ts +0 -1
- package/src/parser/block/blockquote.test.ts +3 -3
- package/src/parser/block/codeblock.ts +0 -1
- package/src/parser/block/dlist.ts +2 -3
- package/src/parser/block/extension/example.test.ts +1 -1
- package/src/parser/block/extension/fig.ts +2 -1
- package/src/parser/block/extension/figure.ts +2 -4
- package/src/parser/block/extension/table.ts +2 -4
- package/src/parser/block/heading.test.ts +1 -1
- package/src/parser/block/mathblock.ts +0 -1
- package/src/parser/block/olist.ts +0 -1
- package/src/parser/block/paragraph.test.ts +1 -1
- package/src/parser/block/paragraph.ts +2 -3
- package/src/parser/block/reply.ts +2 -3
- package/src/parser/block.ts +0 -1
- package/src/parser/context.ts +15 -19
- package/src/parser/inline/annotation.ts +1 -2
- package/src/parser/inline/bracket.test.ts +1 -1
- package/src/parser/inline/bracket.ts +1 -2
- package/src/parser/inline/deletion.test.ts +2 -2
- package/src/parser/inline/emphasis.test.ts +2 -2
- package/src/parser/inline/emphasis.ts +2 -2
- package/src/parser/inline/extension/index.test.ts +28 -32
- package/src/parser/inline/extension/index.ts +1 -2
- package/src/parser/inline/extension/indexee.ts +22 -13
- package/src/parser/inline/extension/label.ts +0 -1
- package/src/parser/inline/extension/placeholder.test.ts +10 -12
- package/src/parser/inline/extension/placeholder.ts +7 -7
- package/src/parser/inline/html.test.ts +1 -1
- package/src/parser/inline/html.ts +2 -3
- package/src/parser/inline/htmlentity.ts +0 -1
- package/src/parser/inline/insertion.test.ts +2 -2
- package/src/parser/inline/link.test.ts +6 -5
- package/src/parser/inline/link.ts +43 -43
- package/src/parser/inline/mark.test.ts +11 -11
- package/src/parser/inline/mark.ts +12 -6
- package/src/parser/inline/media.ts +0 -1
- package/src/parser/inline/reference.ts +0 -1
- package/src/parser/inline/ruby.ts +0 -1
- package/src/parser/inline/strong.test.ts +2 -2
- package/src/parser/inline/strong.ts +2 -2
- package/src/parser/inline/template.ts +0 -1
- package/src/parser/inline.test.ts +8 -7
- package/src/parser/processor/figure.ts +0 -1
- package/src/parser/processor/footnote.ts +0 -1
- package/src/parser/segment.ts +0 -1
- package/src/parser/source/escapable.test.ts +1 -1
- package/src/parser/source/escapable.ts +7 -1
- package/src/parser/source/line.ts +0 -1
- package/src/parser/source/str.ts +0 -1
- package/src/parser/source/text.test.ts +24 -35
- package/src/parser/source/text.ts +2 -16
- package/src/parser/visibility.ts +1 -7
- package/src/renderer/render/math.ts +0 -1
- package/src/renderer/render/media/image.ts +0 -1
- package/src/renderer/render/media/twitter.ts +0 -1
- package/src/renderer/render/media/video.ts +0 -1
- package/src/renderer/render/media/youtube.ts +0 -1
- package/src/renderer/render.ts +0 -1
- package/src/util/quote.ts +0 -1
- package/src/util/scope.ts +0 -2
- package/src/util/toc.ts +0 -1
- package/webpack.config.js +1 -1
- package/src/parser/locale/ja.test.ts +0 -14
- package/src/parser/locale/ja.ts +0 -3
- package/src/parser/locale.test.ts +0 -26
- package/src/parser/locale.ts +0 -61
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
import { MarkParser } from '../inline';
|
|
2
|
-
import { union, some, syntax, surround, open, lazy } from '../../combinator';
|
|
2
|
+
import { union, some, syntax, constraint, surround, open, lazy } from '../../combinator';
|
|
3
3
|
import { inline } from '../inline';
|
|
4
|
+
import { identity, text } from './extension/indexee';
|
|
4
5
|
import { str } from '../source';
|
|
5
6
|
import { startTight, blankWith } from '../visibility';
|
|
6
7
|
import { Syntax, State } from '../context';
|
|
7
8
|
import { unshift } from 'spica/array';
|
|
8
|
-
import { html, defrag } from 'typed-dom/dom';
|
|
9
|
+
import { html, define, defrag } from 'typed-dom/dom';
|
|
9
10
|
|
|
10
11
|
export const mark: MarkParser = lazy(() => surround(
|
|
11
12
|
str('==', '='),
|
|
13
|
+
constraint(State.mark, false,
|
|
12
14
|
syntax(Syntax.none, 1, 1, State.none,
|
|
13
15
|
startTight(some(union([
|
|
14
|
-
some(inline, blankWith('==')),
|
|
15
|
-
open(some(inline, '='), mark),
|
|
16
|
-
])))),
|
|
16
|
+
some(inline, blankWith('=='), [[/^\\?\n/, 9]]),
|
|
17
|
+
open(some(inline, '=', [[/^\\?\n/, 9]]), mark),
|
|
18
|
+
]))))),
|
|
17
19
|
str('=='), false,
|
|
18
|
-
([, bs], rest
|
|
20
|
+
([, bs], rest, { id }) => {
|
|
21
|
+
const el = html('mark', defrag(bs));
|
|
22
|
+
define(el, { id: id !== '' && identity(text(el), 'mark') || undefined });
|
|
23
|
+
return [[el, html('a', { href: el.id ? `#${el.id}` : undefined })], rest];
|
|
24
|
+
},
|
|
19
25
|
([as, bs], rest) => [unshift(as, bs), rest]));
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { undefined, location } from 'spica/global';
|
|
2
1
|
import { MediaParser } from '../inline';
|
|
3
2
|
import { union, inits, tails, some, syntax, creation, precedence, constraint, validate, verify, surround, open, dup, lazy, fmap, bind } from '../../combinator';
|
|
4
3
|
import { unsafelink, uri, option as linkoption, resolve } from './link';
|
|
@@ -12,8 +12,10 @@ describe('Unit: parser/inline/strong', () => {
|
|
|
12
12
|
assert.deepStrictEqual(inspect(parser('*a *')), [['*', 'a'], ' *']);
|
|
13
13
|
assert.deepStrictEqual(inspect(parser('*a *')), [['*', 'a', ' '], ' *']);
|
|
14
14
|
assert.deepStrictEqual(inspect(parser('*a\n*')), [['*', 'a'], '\n*']);
|
|
15
|
+
assert.deepStrictEqual(inspect(parser('*a\nb*')), [['*', 'a'], '\nb*']);
|
|
15
16
|
assert.deepStrictEqual(inspect(parser('*a\\ *')), [['*', 'a'], '\\ *']);
|
|
16
17
|
assert.deepStrictEqual(inspect(parser('*a\\\n*')), [['*', 'a'], '\\\n*']);
|
|
18
|
+
assert.deepStrictEqual(inspect(parser('*a\\\nb*')), [['*', 'a'], '\\\nb*']);
|
|
17
19
|
assert.deepStrictEqual(inspect(parser('* *')), undefined);
|
|
18
20
|
assert.deepStrictEqual(inspect(parser('* a*')), undefined);
|
|
19
21
|
assert.deepStrictEqual(inspect(parser('* a *')), undefined);
|
|
@@ -28,8 +30,6 @@ describe('Unit: parser/inline/strong', () => {
|
|
|
28
30
|
it('basic', () => {
|
|
29
31
|
assert.deepStrictEqual(inspect(parser('*a*')), [['<strong>a</strong>'], '']);
|
|
30
32
|
assert.deepStrictEqual(inspect(parser('*ab*')), [['<strong>ab</strong>'], '']);
|
|
31
|
-
assert.deepStrictEqual(inspect(parser('*a\nb*')), [['<strong>a<br>b</strong>'], '']);
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('*a\\\nb*')), [['<strong>a<span class="linebreak"> </span>b</strong>'], '']);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
it('nest', () => {
|
|
@@ -11,8 +11,8 @@ export const strong: StrongParser = lazy(() => surround(
|
|
|
11
11
|
str('*', '*'),
|
|
12
12
|
syntax(Syntax.none, 1, 1, State.none,
|
|
13
13
|
startTight(some(union([
|
|
14
|
-
some(inline, blankWith('*')),
|
|
15
|
-
open(some(inline, '*'), strong),
|
|
14
|
+
some(inline, blankWith('*'), [[/^\\?\n/, 9]]),
|
|
15
|
+
open(some(inline, '*', [[/^\\?\n/, 9]]), strong),
|
|
16
16
|
])))),
|
|
17
17
|
str('*'), false,
|
|
18
18
|
([, bs], rest) => [[html('strong', defrag(bs))], rest],
|
|
@@ -51,7 +51,7 @@ describe('Unit: parser/inline', () => {
|
|
|
51
51
|
assert.deepStrictEqual(inspect(parser('[]{{a}}')), [['[', ']', '<span class="template">{{a}}</span>'], '']);
|
|
52
52
|
assert.deepStrictEqual(inspect(parser('![]{{a}}')), [['!', '[', ']', '<span class="template">{{a}}</span>'], '']);
|
|
53
53
|
assert.deepStrictEqual(inspect(parser('[\n]{a}')), [['[', '<br>', ']', '<a class="url" href="a">a</a>'], '']);
|
|
54
|
-
assert.deepStrictEqual(inspect(parser('[\\\n]{a}')), [['[', '<
|
|
54
|
+
assert.deepStrictEqual(inspect(parser('[\\\n]{a}')), [['[', '<br>', ']', '<a class="url" href="a">a</a>'], '']);
|
|
55
55
|
assert.deepStrictEqual(inspect(parser('{}')), [['{', '}'], '']);
|
|
56
56
|
assert.deepStrictEqual(inspect(parser('{a}')), [['<a class="url" href="a">a</a>'], '']);
|
|
57
57
|
assert.deepStrictEqual(inspect(parser('{{a}}')), [['<span class="template">{{a}}</span>'], '']);
|
|
@@ -81,6 +81,7 @@ describe('Unit: parser/inline', () => {
|
|
|
81
81
|
assert.deepStrictEqual(inspect(parser('[[<bdi>]]')), [['<sup class="reference"><span><span class="invalid"><bdi></span></span></sup>'], '']);
|
|
82
82
|
assert.deepStrictEqual(inspect(parser('[[${]]}$')), [['', '[', '', '[', '<span class="math" translate="no" data-src="${]]}$">${]]}$</span>'], '']);
|
|
83
83
|
assert.deepStrictEqual(inspect(parser('"[[""]]')), [['"', '<sup class="reference"><span>""</span></sup>'], '']);
|
|
84
|
+
assert.deepStrictEqual(inspect(parser('[==a==]{b}')), [['<a class="link" href="b">==a==</a>'], '']);
|
|
84
85
|
assert.deepStrictEqual(inspect(parser('[[a](b)]{c}')), [['<a class="link" href="c"><ruby>a<rp>(</rp><rt>b</rt><rp>)</rp></ruby></a>'], '']);
|
|
85
86
|
assert.deepStrictEqual(inspect(parser('[[[[[[[{a}')), [['', '[', '', '[', '', '[', '', '[', '', '[', '', '[', '', '[', '<a class="url" href="a">a</a>'], '']);
|
|
86
87
|
assert.deepStrictEqual(inspect(parser('<http://host>')), [['<', '<a class="url" href="http://host" target="_blank">http://host</a>', '>'], '']);
|
|
@@ -89,11 +90,11 @@ describe('Unit: parser/inline', () => {
|
|
|
89
90
|
assert.deepStrictEqual(inspect(parser('[~~a~~]')), [['[', '<del>a</del>', ']'], '']);
|
|
90
91
|
assert.deepStrictEqual(inspect(parser('[^http://host')), [['[^', '<a class="url" href="http://host" target="_blank">http://host</a>'], '']);
|
|
91
92
|
assert.deepStrictEqual(inspect(parser('[^a@b')), [['[^', '<a class="email" href="mailto:a@b">a@b</a>'], '']);
|
|
92
|
-
assert.deepStrictEqual(inspect(parser('[#a
|
|
93
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
94
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
95
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
96
|
-
assert.deepStrictEqual(inspect(parser('[[
|
|
93
|
+
assert.deepStrictEqual(inspect(parser('[#a++b\nc++]')), [['[', '<a class="hashtag" href="/hashtags/a">#a</a>', '<ins>b<br>c</ins>', ']'], '']);
|
|
94
|
+
assert.deepStrictEqual(inspect(parser('[++a\nb++]{/}')), [['[', '<ins>a<br>b</ins>', ']', '<a class="url" href="/">/</a>'], '']);
|
|
95
|
+
assert.deepStrictEqual(inspect(parser('[++a\nb]++')), [['[', '++', 'a', '<br>', 'b', ']', '++'], '']);
|
|
96
|
+
assert.deepStrictEqual(inspect(parser('[++[a\nb++]')), [['', '[', '++', '[', 'a', '<br>', 'b', '++', ']'], '']);
|
|
97
|
+
assert.deepStrictEqual(inspect(parser('[[++a\nb++]]')), [['[', '[', '<ins>a<br>b</ins>', ']', ']'], '']);
|
|
97
98
|
assert.deepStrictEqual(inspect(parser('"[% *"*"*')), [['"', '[%', ' ', '*', '"', '*', '"', '*'], '']);
|
|
98
99
|
assert.deepStrictEqual(inspect(parser('"[% "*"* %]')), [['"', '[%', ' ', '"', '*', '"', '*', ' ', '%', ']'], '']);
|
|
99
100
|
});
|
|
@@ -158,7 +159,7 @@ describe('Unit: parser/inline', () => {
|
|
|
158
159
|
assert.deepStrictEqual(inspect(parser('0aあい#b')), [['0a', 'あ', 'い#b'], '']);
|
|
159
160
|
assert.deepStrictEqual(inspect(parser('「#あ」')), [['「', '<a class="hashtag" href="/hashtags/あ">#あ</a>', '」'], '']);
|
|
160
161
|
assert.deepStrictEqual(inspect(parser('a\n#b')), [['a', '<br>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
|
161
|
-
assert.deepStrictEqual(inspect(parser('a\\\n#b')), [['a', '<
|
|
162
|
+
assert.deepStrictEqual(inspect(parser('a\\\n#b')), [['a', '<br>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
|
162
163
|
assert.deepStrictEqual(inspect(parser('_a_#b')), [['<em>a</em>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
|
163
164
|
assert.deepStrictEqual(inspect(parser('*a*#b')), [['<strong>a</strong>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
|
164
165
|
assert.deepStrictEqual(inspect(parser('((a))#b')), [['<sup class="annotation"><span>a</span></sup>', '<a class="hashtag" href="/hashtags/b">#b</a>'], '']);
|
package/src/parser/segment.ts
CHANGED
|
@@ -39,7 +39,7 @@ describe('Unit: parser/source/escsource', () => {
|
|
|
39
39
|
assert.deepStrictEqual(inspect(parser('\\a')), [['\\a'], '']);
|
|
40
40
|
assert.deepStrictEqual(inspect(parser('\\$')), [['\\$'], '']);
|
|
41
41
|
assert.deepStrictEqual(inspect(parser('\\ ')), [['\\ '], '']);
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('\\\n')), [['
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('\\\n')), [['\\', '\n'], '']);
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
});
|
|
@@ -15,7 +15,13 @@ export const escsource: EscapableSourceParser = creation(1, false, ({ source })
|
|
|
15
15
|
case '\x1B':
|
|
16
16
|
return [[source.slice(1, 2)], source.slice(2)];
|
|
17
17
|
case '\\':
|
|
18
|
-
|
|
18
|
+
switch (source[1]) {
|
|
19
|
+
case undefined:
|
|
20
|
+
case '\n':
|
|
21
|
+
return [[source[0]], source.slice(1)];
|
|
22
|
+
default:
|
|
23
|
+
return [[source.slice(0, 2)], source.slice(2)];
|
|
24
|
+
}
|
|
19
25
|
default:
|
|
20
26
|
const b = source[0] !== '\n' && source[0].trimStart() === '';
|
|
21
27
|
const i = b
|
package/src/parser/source/str.ts
CHANGED
|
@@ -18,14 +18,28 @@ describe('Unit: parser/text/text', () => {
|
|
|
18
18
|
assert.deepStrictEqual(inspect(parser('a\nb')), [['a', '<br>', 'b'], '']);
|
|
19
19
|
});
|
|
20
20
|
|
|
21
|
+
it('escape', () => {
|
|
22
|
+
assert.deepStrictEqual(inspect(parser('\\')), [[], '']);
|
|
23
|
+
assert.deepStrictEqual(inspect(parser('\\\\')), [['\\'], '']);
|
|
24
|
+
assert.deepStrictEqual(inspect(parser('\\\\\\')), [['\\'], '']);
|
|
25
|
+
assert.deepStrictEqual(inspect(parser('\\\\\\\\')), [['\\', '\\'], '']);
|
|
26
|
+
assert.deepStrictEqual(inspect(parser('\\ ')), [[' '], '']);
|
|
27
|
+
assert.deepStrictEqual(inspect(parser('\\_')), [['_'], '']);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser('\\0')), [['0'], '']);
|
|
29
|
+
assert.deepStrictEqual(inspect(parser('\\a')), [['a'], '']);
|
|
30
|
+
assert.deepStrictEqual(inspect(parser('\\\\a')), [['\\', 'a'], '']);
|
|
31
|
+
assert.deepStrictEqual(inspect(parser('\\ ')), [[' '], '']);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser('\\。')), [['。'], '']);
|
|
33
|
+
});
|
|
34
|
+
|
|
21
35
|
it('space', () => {
|
|
22
36
|
assert.deepStrictEqual(inspect(parser(' ')), [[], '']);
|
|
23
37
|
assert.deepStrictEqual(inspect(parser(' ')), [[], '']);
|
|
24
38
|
assert.deepStrictEqual(inspect(parser(' ')), [[], '']);
|
|
25
39
|
assert.deepStrictEqual(inspect(parser(' \n')), [['<br>'], '']);
|
|
26
40
|
assert.deepStrictEqual(inspect(parser(' \n')), [['<br>'], '']);
|
|
27
|
-
assert.deepStrictEqual(inspect(parser(' \\\n')), [['<
|
|
28
|
-
assert.deepStrictEqual(inspect(parser(' \\\n')), [['<
|
|
41
|
+
assert.deepStrictEqual(inspect(parser(' \\\n')), [['<br>'], '']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser(' \\\n')), [['<br>'], '']);
|
|
29
43
|
assert.deepStrictEqual(inspect(parser(' a')), [[' ', 'a'], '']);
|
|
30
44
|
assert.deepStrictEqual(inspect(parser(' a')), [[' ', ' ', 'a'], '']);
|
|
31
45
|
assert.deepStrictEqual(inspect(parser(' a')), [[' ', ' ', 'a'], '']);
|
|
@@ -33,8 +47,8 @@ describe('Unit: parser/text/text', () => {
|
|
|
33
47
|
assert.deepStrictEqual(inspect(parser('a ')), [['a'], '']);
|
|
34
48
|
assert.deepStrictEqual(inspect(parser('a \n')), [['a', '<br>'], '']);
|
|
35
49
|
assert.deepStrictEqual(inspect(parser('a \n')), [['a', '<br>'], '']);
|
|
36
|
-
assert.deepStrictEqual(inspect(parser('a \\\n')), [['a', '<
|
|
37
|
-
assert.deepStrictEqual(inspect(parser('a \\\n')), [['a', '<
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('a \\\n')), [['a', '<br>'], '']);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser('a \\\n')), [['a', '<br>'], '']);
|
|
38
52
|
assert.deepStrictEqual(inspect(parser('a b')), [['a', ' ', 'b'], '']);
|
|
39
53
|
assert.deepStrictEqual(inspect(parser('a b')), [['a', ' ', ' ', 'b'], '']);
|
|
40
54
|
assert.deepStrictEqual(inspect(parser('a b')), [['a', ' ', ' ', 'b'], '']);
|
|
@@ -51,27 +65,13 @@ describe('Unit: parser/text/text', () => {
|
|
|
51
65
|
assert.deepStrictEqual(inspect(parser('。\n')), [['。', '<br>'], '']);
|
|
52
66
|
});
|
|
53
67
|
|
|
54
|
-
it('\\', () => {
|
|
55
|
-
assert.deepStrictEqual(inspect(parser('\\')), [[], '']);
|
|
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')), [['0'], '']);
|
|
62
|
-
assert.deepStrictEqual(inspect(parser('\\a')), [['a'], '']);
|
|
63
|
-
assert.deepStrictEqual(inspect(parser('\\\\a')), [['\\', 'a'], '']);
|
|
64
|
-
assert.deepStrictEqual(inspect(parser('\\ ')), [[' '], '']);
|
|
65
|
-
assert.deepStrictEqual(inspect(parser('\\。')), [['。'], '']);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
68
|
it('softbreak', () => {
|
|
69
|
-
assert.deepStrictEqual(inspect(parser('\\\n')), [['<
|
|
70
|
-
assert.deepStrictEqual(inspect(parser('\\\n ')), [['<
|
|
71
|
-
assert.deepStrictEqual(inspect(parser('\\\na')), [['<
|
|
72
|
-
assert.deepStrictEqual(inspect(parser('a\\\n')), [['a', '<
|
|
73
|
-
assert.deepStrictEqual(inspect(parser('a\\\nb\\\n')), [['a', '<
|
|
74
|
-
assert.deepStrictEqual(inspect(parser('\\\\\\\n')), [['\\', '<
|
|
69
|
+
assert.deepStrictEqual(inspect(parser('\\\n')), [['<br>'], '']);
|
|
70
|
+
assert.deepStrictEqual(inspect(parser('\\\n ')), [['<br>'], '']);
|
|
71
|
+
assert.deepStrictEqual(inspect(parser('\\\na')), [['<br>', 'a'], '']);
|
|
72
|
+
assert.deepStrictEqual(inspect(parser('a\\\n')), [['a', '<br>'], '']);
|
|
73
|
+
assert.deepStrictEqual(inspect(parser('a\\\nb\\\n')), [['a', '<br>', 'b', '<br>'], '']);
|
|
74
|
+
assert.deepStrictEqual(inspect(parser('\\\\\\\n')), [['\\', '<br>'], '']);
|
|
75
75
|
});
|
|
76
76
|
|
|
77
77
|
it('account', () => {
|
|
@@ -116,17 +116,6 @@ describe('Unit: parser/text/text', () => {
|
|
|
116
116
|
assert.deepStrictEqual(inspect(parser('>>>>0')), [['>', '>', '>', '>', '0'], '']);
|
|
117
117
|
});
|
|
118
118
|
|
|
119
|
-
it('localize', () => {
|
|
120
|
-
assert.deepStrictEqual(inspect(parser('a\\\n0')), [['a', '<span class="linebreak"> </span>', '0'], '']);
|
|
121
|
-
assert.deepStrictEqual(inspect(parser('あ\\\n0')), [['あ', '<span class="linebreak"></span>', '0'], '']);
|
|
122
|
-
assert.deepStrictEqual(inspect(parser('ア\\\n0')), [['ア', '<span class="linebreak"></span>', '0'], '']);
|
|
123
|
-
assert.deepStrictEqual(inspect(parser('亜\\\n0')), [['亜', '<span class="linebreak"></span>', '0'], '']);
|
|
124
|
-
assert.deepStrictEqual(inspect(parser('、\\\n0')), [['、', '<span class="linebreak"></span>', '0'], '']);
|
|
125
|
-
assert.deepStrictEqual(inspect(parser('。\\\n0')), [['。', '<span class="linebreak"></span>', '0'], '']);
|
|
126
|
-
assert.deepStrictEqual(inspect(parser('!?\\\n0')), [['!', '?', '<span class="linebreak"></span>', '0'], '']);
|
|
127
|
-
assert.deepStrictEqual(inspect(parser('\\あ\\\n0')), [['あ', '<span class="linebreak"></span>', '0'], '']);
|
|
128
|
-
});
|
|
129
|
-
|
|
130
119
|
});
|
|
131
120
|
|
|
132
121
|
});
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { undefined } from 'spica/global';
|
|
2
1
|
import { TextParser, TxtParser, LinebreakParser } from '../source';
|
|
3
2
|
import { union, creation, focus } from '../../combinator';
|
|
4
3
|
import { str } from './str';
|
|
5
4
|
import { html } from 'typed-dom/dom';
|
|
6
5
|
|
|
7
|
-
export const delimiter = /[\s\x00-\x7F]|\S[#>]
|
|
6
|
+
export const delimiter = /[\s\x00-\x7F]|\S[#>]/u;
|
|
8
7
|
export const nonWhitespace = /[\S\n]|$/;
|
|
9
8
|
export const nonAlphanumeric = /[^0-9A-Za-z]|\S[#>]|$/;
|
|
10
|
-
const nssb = /^[\p{Ideo}\p{scx=Hiragana}\p{scx=Katakana}~!?][^\S\n]*(?=\\\n)/u;
|
|
11
9
|
const repeat = str(/^(.)\1*/);
|
|
12
10
|
|
|
13
11
|
export const text: TextParser = creation(1, false, ({ source, context }) => {
|
|
@@ -17,26 +15,14 @@ export const text: TextParser = creation(1, false, ({ source, context }) => {
|
|
|
17
15
|
case -1:
|
|
18
16
|
return [[source], ''];
|
|
19
17
|
case 0:
|
|
20
|
-
switch (source[0]) {
|
|
21
|
-
case '\x1B':
|
|
22
|
-
case '\\':
|
|
23
|
-
if (!nssb.test(source.slice(1))) break;
|
|
24
|
-
assert(source[0] !== '\x1B');
|
|
25
|
-
return text({ source: source.slice(1), context });
|
|
26
|
-
default:
|
|
27
|
-
const i = source.match(nssb)?.[0].length ?? -1;
|
|
28
|
-
if (i !== -1) return [[source[0], html('span', { class: 'linebreak' })], source.slice(i + 2)];
|
|
29
|
-
}
|
|
30
18
|
switch (source[0]) {
|
|
31
19
|
case '\x1B':
|
|
32
20
|
case '\\':
|
|
33
21
|
switch (source[1]) {
|
|
34
22
|
case undefined:
|
|
35
|
-
assert(source[0] !== '\x1B');
|
|
36
|
-
return [[], ''];
|
|
37
23
|
case '\n':
|
|
38
24
|
assert(source[0] !== '\x1B');
|
|
39
|
-
return [[
|
|
25
|
+
return [[], source.slice(1)];
|
|
40
26
|
default:
|
|
41
27
|
return [[source.slice(1, 2)], source.slice(2)];
|
|
42
28
|
}
|
package/src/parser/visibility.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { undefined } from 'spica/global';
|
|
2
1
|
import { MarkdownParser } from '../../markdown';
|
|
3
2
|
import { Parser, Input, eval } from '../combinator/data/parser';
|
|
4
3
|
import { union, some, verify, convert, fmap } from '../combinator';
|
|
@@ -109,10 +108,7 @@ export function isStartLooseNodes(nodes: readonly (HTMLElement | string)[]): boo
|
|
|
109
108
|
for (let i = 0; i < nodes.length; ++i) {
|
|
110
109
|
const node = nodes[i];
|
|
111
110
|
if (isVisible(node)) return true;
|
|
112
|
-
if (typeof node === 'object')
|
|
113
|
-
if (node.tagName === 'BR') break;
|
|
114
|
-
if (node.className === 'linebreak') break;
|
|
115
|
-
}
|
|
111
|
+
if (typeof node === 'object' && node.tagName === 'BR') break;
|
|
116
112
|
}
|
|
117
113
|
return false;
|
|
118
114
|
}
|
|
@@ -144,8 +140,6 @@ function isVisible(node: HTMLElement | string, strpos?: number): boolean {
|
|
|
144
140
|
case 'BR':
|
|
145
141
|
case 'WBR':
|
|
146
142
|
return false;
|
|
147
|
-
case 'SPAN':
|
|
148
|
-
return node.className !== 'linebreak';
|
|
149
143
|
default:
|
|
150
144
|
return true;
|
|
151
145
|
}
|
package/src/renderer/render.ts
CHANGED
package/src/util/quote.ts
CHANGED
package/src/util/scope.ts
CHANGED
package/src/util/toc.ts
CHANGED
package/webpack.config.js
CHANGED
|
@@ -6,7 +6,7 @@ const { mergeWithRules } = require('webpack-merge');
|
|
|
6
6
|
const ESLintPlugin = require('eslint-webpack-plugin');
|
|
7
7
|
const pkg = require('./package.json');
|
|
8
8
|
|
|
9
|
-
shell('rm -rf coverage');
|
|
9
|
+
shell('rm -rf dist coverage');
|
|
10
10
|
|
|
11
11
|
module.exports = env => {
|
|
12
12
|
const merge = mergeWithRules({
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { japanese } from './ja';
|
|
2
|
-
|
|
3
|
-
describe('Unit: parser/locale/ja', () => {
|
|
4
|
-
describe('japanese', () => {
|
|
5
|
-
it('ja', () => {
|
|
6
|
-
assert(japanese('、'));
|
|
7
|
-
assert(japanese('。'));
|
|
8
|
-
assert(japanese('!'));
|
|
9
|
-
assert(japanese('?'));
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
});
|
package/src/parser/locale/ja.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { block } from './block';
|
|
2
|
-
import { some } from '../combinator';
|
|
3
|
-
import { inspect } from '../debug.test';
|
|
4
|
-
|
|
5
|
-
describe('Unit: parser/locale', () => {
|
|
6
|
-
describe('locale', () => {
|
|
7
|
-
const parser = (source: string) => some(block)({ source, context: {} });
|
|
8
|
-
|
|
9
|
-
it('basic', () => {
|
|
10
|
-
assert.deepStrictEqual(inspect(parser('。\\\n0')), [['<p>。<span class="linebreak"></span>0</p>'], '']);
|
|
11
|
-
assert.deepStrictEqual(inspect(parser('。 \\\n0')), [['<p>。<span class="linebreak"></span>0</p>'], '']);
|
|
12
|
-
assert.deepStrictEqual(inspect(parser('_。_\\\n0')), [['<p><em>。</em><span class="linebreak"></span>0</p>'], '']);
|
|
13
|
-
assert.deepStrictEqual(inspect(parser('!> 。\\\n0')), [['<blockquote><section><p>。<span class="linebreak"></span>0</p><h2>References</h2><ol class="references"></ol></section></blockquote>'], '']);
|
|
14
|
-
assert.deepStrictEqual(inspect(parser('[。](a)\\\n0')), [['<p><ruby>。<rp>(</rp><rt>a</rt><rp>)</rp></ruby><span class="linebreak"></span>0</p>'], '']);
|
|
15
|
-
assert.deepStrictEqual(inspect(parser('[。 ](a )\\\n0')), [['<p><ruby>。<rp>(</rp><rt>a</rt><rp>)</rp></ruby><span class="linebreak"></span>0</p>'], '']);
|
|
16
|
-
assert.deepStrictEqual(inspect(parser('。<wbr>\\\n0')), [['<p>。<wbr><span class="linebreak"></span>0</p>'], '']);
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it('ja', () => {
|
|
20
|
-
assert.deepStrictEqual(inspect(parser('。\\\n0')), [['<p>。<span class="linebreak"></span>0</p>'], '']);
|
|
21
|
-
assert.deepStrictEqual(inspect(parser('\\。\\\n0')), [['<p>。<span class="linebreak"></span>0</p>'], '']);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
});
|
package/src/parser/locale.ts
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { Parser } from '../combinator/data/parser';
|
|
2
|
-
import { fmap } from '../combinator';
|
|
3
|
-
import { japanese } from './locale/ja';
|
|
4
|
-
import { html } from 'typed-dom/dom';
|
|
5
|
-
|
|
6
|
-
export function localize<P extends Parser<HTMLElement | string>>(parser: P): P;
|
|
7
|
-
export function localize(parser: Parser<HTMLElement | string>): Parser<HTMLElement | string> {
|
|
8
|
-
return fmap(parser, ns => {
|
|
9
|
-
if (ns.length === 0) return ns;
|
|
10
|
-
const el = ns.length === 1 && typeof ns[0] === 'object'
|
|
11
|
-
? ns[0]
|
|
12
|
-
: html('div', ns);
|
|
13
|
-
for (let es = el.querySelectorAll('.linebreak:not(:empty)'),
|
|
14
|
-
len = es.length, i = 0; i < len; ++i) {
|
|
15
|
-
const el = es[i];
|
|
16
|
-
assert(el.firstChild!.textContent === ' ');
|
|
17
|
-
if (!check(el)) continue;
|
|
18
|
-
el.firstChild!.remove();
|
|
19
|
-
}
|
|
20
|
-
return ns;
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function check(el: Element): boolean {
|
|
25
|
-
const char = lastChar(el);
|
|
26
|
-
if (!char) return false;
|
|
27
|
-
assert([...char].length === 1);
|
|
28
|
-
return japanese(char);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function lastChar(node: Element | Text | null): string {
|
|
32
|
-
while (node = node?.previousSibling as typeof node) {
|
|
33
|
-
if (!('id' in node)) return [...node.data.slice(-2)].pop() ?? '';
|
|
34
|
-
if (node.firstChild) return [...text(node).slice(-2)].pop() ?? '';
|
|
35
|
-
switch (node.tagName) {
|
|
36
|
-
case 'BR':
|
|
37
|
-
return '';
|
|
38
|
-
case 'SPAN':
|
|
39
|
-
switch (node.className) {
|
|
40
|
-
case 'linebreak':
|
|
41
|
-
return '';
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return '';
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function text(el: Element): string {
|
|
49
|
-
switch (el.tagName) {
|
|
50
|
-
case 'RUBY':
|
|
51
|
-
for (let ns = el.childNodes, i = ns.length; i--;) {
|
|
52
|
-
const child = ns[i] as Text | Element;
|
|
53
|
-
if ('id' in child) continue;
|
|
54
|
-
return child.data;
|
|
55
|
-
}
|
|
56
|
-
assert(false);
|
|
57
|
-
return '';
|
|
58
|
-
default:
|
|
59
|
-
return el.textContent!;
|
|
60
|
-
}
|
|
61
|
-
}
|