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.
Files changed (88) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/index.js +1483 -3326
  3. package/index.ts +0 -1
  4. package/markdown.d.ts +1 -1
  5. package/package.json +19 -19
  6. package/src/combinator/control/constraint/block.ts +1 -2
  7. package/src/combinator/control/constraint/contract.ts +3 -3
  8. package/src/combinator/control/constraint/line.ts +1 -2
  9. package/src/combinator/control/manipulation/indent.ts +0 -1
  10. package/src/combinator/control/manipulation/match.ts +1 -2
  11. package/src/combinator/control/manipulation/scope.ts +3 -4
  12. package/src/combinator/control/manipulation/surround.ts +1 -2
  13. package/src/combinator/control/monad/bind.ts +2 -3
  14. package/src/combinator/data/parser/context.ts +3 -3
  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/combinator/data/parser/union.ts +4 -12
  19. package/src/parser/api/bind.test.ts +1 -1
  20. package/src/parser/api/bind.ts +0 -1
  21. package/src/parser/api/parse.test.ts +3 -3
  22. package/src/parser/api/parse.ts +0 -1
  23. package/src/parser/block/blockquote.test.ts +3 -3
  24. package/src/parser/block/codeblock.ts +0 -1
  25. package/src/parser/block/dlist.ts +2 -3
  26. package/src/parser/block/extension/example.test.ts +1 -1
  27. package/src/parser/block/extension/fig.ts +2 -1
  28. package/src/parser/block/extension/figure.ts +2 -4
  29. package/src/parser/block/extension/table.ts +2 -4
  30. package/src/parser/block/heading.test.ts +1 -1
  31. package/src/parser/block/mathblock.ts +0 -1
  32. package/src/parser/block/olist.ts +0 -1
  33. package/src/parser/block/paragraph.test.ts +1 -1
  34. package/src/parser/block/paragraph.ts +2 -3
  35. package/src/parser/block/reply.ts +2 -3
  36. package/src/parser/block.ts +0 -1
  37. package/src/parser/context.ts +15 -19
  38. package/src/parser/inline/annotation.ts +1 -2
  39. package/src/parser/inline/bracket.test.ts +1 -1
  40. package/src/parser/inline/bracket.ts +1 -2
  41. package/src/parser/inline/deletion.test.ts +2 -2
  42. package/src/parser/inline/emphasis.test.ts +2 -2
  43. package/src/parser/inline/emphasis.ts +2 -2
  44. package/src/parser/inline/extension/index.test.ts +28 -32
  45. package/src/parser/inline/extension/index.ts +1 -2
  46. package/src/parser/inline/extension/indexee.ts +22 -13
  47. package/src/parser/inline/extension/label.ts +0 -1
  48. package/src/parser/inline/extension/placeholder.test.ts +10 -12
  49. package/src/parser/inline/extension/placeholder.ts +7 -7
  50. package/src/parser/inline/html.test.ts +1 -1
  51. package/src/parser/inline/html.ts +2 -3
  52. package/src/parser/inline/htmlentity.ts +0 -1
  53. package/src/parser/inline/insertion.test.ts +2 -2
  54. package/src/parser/inline/link.test.ts +6 -5
  55. package/src/parser/inline/link.ts +43 -43
  56. package/src/parser/inline/mark.test.ts +11 -11
  57. package/src/parser/inline/mark.ts +12 -6
  58. package/src/parser/inline/media.ts +0 -1
  59. package/src/parser/inline/reference.ts +0 -1
  60. package/src/parser/inline/ruby.ts +0 -1
  61. package/src/parser/inline/strong.test.ts +2 -2
  62. package/src/parser/inline/strong.ts +2 -2
  63. package/src/parser/inline/template.ts +0 -1
  64. package/src/parser/inline.test.ts +8 -7
  65. package/src/parser/processor/figure.ts +0 -1
  66. package/src/parser/processor/footnote.ts +0 -1
  67. package/src/parser/segment.ts +0 -1
  68. package/src/parser/source/escapable.test.ts +1 -1
  69. package/src/parser/source/escapable.ts +7 -1
  70. package/src/parser/source/line.ts +0 -1
  71. package/src/parser/source/str.ts +0 -1
  72. package/src/parser/source/text.test.ts +24 -35
  73. package/src/parser/source/text.ts +2 -16
  74. package/src/parser/visibility.ts +1 -7
  75. package/src/renderer/render/math.ts +0 -1
  76. package/src/renderer/render/media/image.ts +0 -1
  77. package/src/renderer/render/media/twitter.ts +0 -1
  78. package/src/renderer/render/media/video.ts +0 -1
  79. package/src/renderer/render/media/youtube.ts +0 -1
  80. package/src/renderer/render.ts +0 -1
  81. package/src/util/quote.ts +0 -1
  82. package/src/util/scope.ts +0 -2
  83. package/src/util/toc.ts +0 -1
  84. package/webpack.config.js +1 -1
  85. package/src/parser/locale/ja.test.ts +0 -14
  86. package/src/parser/locale/ja.ts +0 -3
  87. package/src/parser/locale.test.ts +0 -26
  88. 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) => [[html('mark', defrag(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';
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { ReferenceParser } from '../inline';
3
2
  import { union, subsequence, some, context, syntax, creation, constraint, surround, open, lazy, bind } from '../../combinator';
4
3
  import { inline } from '../inline';
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { RubyParser } from '../inline';
3
2
  import { eval, exec } from '../../combinator/data/parser';
4
3
  import { sequence, syntax, creation, validate, verify, surround, lazy, fmap } from '../../combinator';
@@ -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],
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { TemplateParser } from '../inline';
3
2
  import { union, some, syntax, creation, precedence, surround, lazy } from '../../combinator';
4
3
  import { escsource, str } from '../source';
@@ -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}')), [['[', '<span class="linebreak"> </span>', ']', '<a class="url" href="a">a</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">&lt;bdi&gt;</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*b\nc*]')), [['[', '<a class="hashtag" href="/hashtags/a">#a</a>', '<strong>b<br>c</strong>', ']'], '']);
93
- assert.deepStrictEqual(inspect(parser('[*a\nb*]{/}')), [['[', '<strong>a<br>b</strong>', ']', '<a class="url" href="/">/</a>'], '']);
94
- assert.deepStrictEqual(inspect(parser('[*a\nb]*')), [['[', '*', 'a', '<br>', 'b', ']', '*'], '']);
95
- assert.deepStrictEqual(inspect(parser('[*[a\nb*]')), [['', '[', '*', '[', 'a', '<br>', 'b', '*', ']'], '']);
96
- assert.deepStrictEqual(inspect(parser('[[*a\nb*]]')), [['[', '[', '<strong>a<br>b</strong>', ']', ']'], '']);
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', '<span class="linebreak"> </span>', '<a class="hashtag" href="/hashtags/b">#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>'], '']);
@@ -1,4 +1,3 @@
1
- import { Infinity, Set, Map } from 'spica/global';
2
1
  import { number as calculate, isFixed } from '../inline/extension/label';
3
2
  import { MultiQueue } from 'spica/queue';
4
3
  import { push } from 'spica/array';
@@ -1,4 +1,3 @@
1
- import { undefined, Infinity, Map, Node } from 'spica/global';
2
1
  import { text } from '../inline/extension/indexee';
3
2
  import { MultiQueue } from 'spica/queue';
4
3
  import { frag, html, define } from 'typed-dom/dom';
@@ -1,4 +1,3 @@
1
- import { Blob } from 'spica/global';
2
1
  import { MarkdownParser } from '../../markdown';
3
2
  import { eval, exec } from '../combinator/data/parser';
4
3
  import { union, some } from '../combinator';
@@ -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')), [['\\\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
- return [[source.slice(0, 2)], source.slice(2)];
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
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { AnyLineParser, EmptyLineParser, ContentLineParser } from '../source';
3
2
  import { line, isEmpty } from '../../combinator';
4
3
 
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { StrParser } from '../source';
3
2
  import { Parser, Context } from '../../combinator/data/parser';
4
3
  import { creation } from '../../combinator';
@@ -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')), [['<span class="linebreak"> </span>'], '']);
28
- assert.deepStrictEqual(inspect(parser(' \\\n')), [['<span class="linebreak"> </span>'], '']);
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', '<span class="linebreak"> </span>'], '']);
37
- assert.deepStrictEqual(inspect(parser('a \\\n')), [['a', '<span class="linebreak"> </span>'], '']);
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')), [['<span class="linebreak"> </span>'], '']);
70
- assert.deepStrictEqual(inspect(parser('\\\n ')), [['<span class="linebreak"> </span>'], '']);
71
- assert.deepStrictEqual(inspect(parser('\\\na')), [['<span class="linebreak"> </span>', 'a'], '']);
72
- assert.deepStrictEqual(inspect(parser('a\\\n')), [['a', '<span class="linebreak"> </span>'], '']);
73
- assert.deepStrictEqual(inspect(parser('a\\\nb\\\n')), [['a', '<span class="linebreak"> </span>', 'b', '<span class="linebreak"> </span>'], '']);
74
- assert.deepStrictEqual(inspect(parser('\\\\\\\n')), [['\\', '<span class="linebreak"> </span>'], '']);
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[#>]|[\p{Ideo}\p{scx=Hiragana}\p{scx=Katakana}~!?][^\S\n]*(?=\\\n)/u;
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 [[html('span', { class: 'linebreak' }, ' ')], source.slice(2)];
25
+ return [[], source.slice(1)];
40
26
  default:
41
27
  return [[source.slice(1, 2)], source.slice(2)];
42
28
  }
@@ -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
  }
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { Dict } from 'spica/dict';
3
2
  import { html, define } from 'typed-dom/dom';
4
3
 
@@ -1,4 +1,3 @@
1
- import { Object } from 'spica/global';
2
1
  import { Dict } from 'spica/dict';
3
2
  import { define } from 'typed-dom/dom';
4
3
 
@@ -1,4 +1,3 @@
1
- import { window, document } from 'spica/global';
2
1
  import { parse } from '../../../parser';
3
2
  import { html as h, define } from 'typed-dom/dom';
4
3
  import DOMPurify from 'dompurify';
@@ -1,4 +1,3 @@
1
- import { undefined, Object } from 'spica/global';
2
1
  import { html } from 'typed-dom/dom';
3
2
 
4
3
  const extensions = [
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { html } from 'typed-dom/dom';
3
2
 
4
3
  export function youtube(source: HTMLImageElement, url: URL): HTMLElement | undefined {
@@ -1,4 +1,3 @@
1
- import { location } from 'spica/global';
2
1
  import { RenderingOptions } from '../../';
3
2
  import { code } from './render/code';
4
3
  import { math } from './render/math';
package/src/util/quote.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { Element } from 'spica/global';
2
1
  import { exec } from '../combinator/data/parser';
3
2
  import { cite } from '../parser/block/reply/cite';
4
3
  import { define } from 'typed-dom/dom';
package/src/util/scope.ts CHANGED
@@ -1,5 +1,3 @@
1
- import { undefined, WeakMap } from 'spica/global';
2
-
3
1
  export function scope(
4
2
  base: DocumentFragment | HTMLElement | ShadowRoot,
5
3
  filter: string = '',
package/src/util/toc.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { undefined } from 'spica/global';
2
1
  import { push } from 'spica/array';
3
2
  import { html } from 'typed-dom/dom';
4
3
 
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
- });
@@ -1,3 +0,0 @@
1
- export function japanese(char: string): boolean {
2
- return /^[\p{Ideo}\p{scx=Hiragana}\p{scx=Katakana}~!?]/u.test(char);
3
- }
@@ -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
- });
@@ -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
- }