securemark 0.225.2 → 0.226.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 CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.226.0
4
+
5
+ - Improve math parser.
6
+
3
7
  ## 0.225.2
4
8
 
5
9
  - Refactoring.
package/design.md CHANGED
@@ -69,7 +69,7 @@
69
69
 
70
70
  ### 自己完結性
71
71
 
72
- ドキュメントはすべて初期構成の閲覧環境で閲覧できなければならない。
72
+ ドキュメントはすべて初期(共通)構成の閲覧環境で閲覧できなければならない。
73
73
  よって閲覧に拡張機能等の追加が必要となってはならない
74
74
 
75
75
  ゆえにドキュメントはサードパーティツールなど自己完結性を損なうツールの使用をサポートしない。
@@ -139,7 +139,7 @@
139
139
 
140
140
  オートリンクは原則としてコピー&ペーストによる引用等を経た際にその解釈が変わってはならない。
141
141
 
142
- ゆえにハッシュタグ構文は構文が表示文字列と一致する構文であるオートリンク構文としてのみ構文化され、表示文字列からの構文の範囲の特定が不可能である通常の構文を持たない。
142
+ ゆえにハッシュタグ構文は構文が表示文字列と一致する構文であるオートリンク構文としてのみ構文化され、表示文字列からの構文の範囲の特定が不可能となる通常の構文を持たない。
143
143
 
144
144
  ### 自動附番
145
145
 
@@ -271,7 +271,7 @@ CodeMirrorが素では速いがVimModeでは数万文字程度でも耐え難く
271
271
  ### バックトラック
272
272
 
273
273
  SecuremarkのAnnotation構文に典型的であるようにスコープの生成規則を変える構文が存在する場合文脈の相違から解析結果を再利用不能な(`αA'β | αAB`)バックトラックが再帰的に生じ、このような言語を線形時間で解析することは基本的に不可能であり直ちに文脈を確定する任意の構文または記号の前に文脈の差異が生じない(`αAβ | αAB`)場合のみ再利用可能なバックトラックにより線形時間で解析できると思われる。
274
- このため線形時間で解析可能な文法に制約されるCommonMarkがこの制約を破らずこのような文脈不確定文法を導入することは不可能であり一例としてSecuremarkにおけるAnnotation構文のような文脈独立の構文とHTML構文のような構文の再帰または特定の包含関係での使用の禁止等の再帰制御の両立ができないという拡張性の限界が存在する。なおLink構文は自身を始めとするリンクを生成する構文を包含できないためリンクを生成するAnnotation構文との関係においてこの問題を生じない。
274
+ このため線形時間で解析可能な文法に制約されるCommonMarkがこの制約を破らずこのような文脈不確定文法を導入することは不可能であるという拡張性の限界が存在する。
275
275
 
276
276
  ### 標準化
277
277
 
@@ -279,8 +279,8 @@ Markdownのように自然言語と自身の文法を分離する汎用構造が
279
279
  このためCommonMarkは拡張構文を標準化した次期標準仕様との互換性を確保する役には立たずその有用性は構文の拡張を考慮しない範囲での効率的な実装方法の例示およびテストケースの集積による個別実装の支援ならびにその結果としての限定的互換性にとどまる。
280
280
  さらにCommonMarkは前述の解析時間の制約から拡張性が低く、高度な構文や機能の実装可能性を考慮していないことから拡張仕様において準拠すべき技術的正当性もない。
281
281
 
282
- よってMarkdownの標準化は後方互換性確保が不可能であることから発展性がなくスナップショット以上の意味を持たない。
283
- MarkdownはGFMのように最初から高機能で完成度の高い拡張不要な独自実装のほうが標準としての互換性を確保でき、構文に曖昧さがない形式言語と異なり最小限の標準仕様を策定し拡張していく通常の標準化方法が適さない特殊な言語である。
282
+ よってMarkdownの標準化は後方互換性確保が不可能であることから発展性がなくスナップショット以上の技術的意味を持たない。
283
+ MarkdownはGFMのように最初から高機能で完成度の高い拡張不要な独自実装のほうが標準としての互換性を確保でき、構文に曖昧さがない形式言語と異なりまず最小限の標準仕様を策定しのちに拡張していく通常の標準化方法が適さない特殊な言語である。
284
284
 
285
285
  ### トランスクルージョン
286
286
 
@@ -1,4 +1,4 @@
1
- /*! securemark v0.225.2 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED */
1
+ /*! securemark v0.226.0 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED */
2
2
  require = function () {
3
3
  function r(e, n, t) {
4
4
  function o(i, f) {
@@ -7763,8 +7763,8 @@ require = function () {
7763
7763
  const typed_dom_1 = _dereq_('typed-dom');
7764
7764
  const disallowedCommand = /\\(?:begin|tiny|huge|large)(?![0-9a-z])/i;
7765
7765
  exports.math = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.validate)('$', '$', '\n', (0, combinator_1.rewrite)((0, combinator_1.union)([
7766
- (0, combinator_1.surround)('$', bracket, '$'),
7767
- (0, combinator_1.surround)('$', (0, combinator_1.verify)((0, source_1.str)(/^(?=[\\^_[(|]|[A-Za-z][0-9A-Za-z]*'*[ ~]?(?:\$|([\\^_(|:=<>])(?!\1)))(?:\\\$|[\x20-\x23\x25-\x7E])*/), util_1.isEndTightNodes), /^\$(?![0-9A-Za-z])/)
7766
+ (0, combinator_1.surround)('$', (0, combinator_1.verify)((0, source_1.str)(/^(?![\s{}#$%&]|\d+(?:[,.]\d+)*(?:[\s,.!?()[\]{}]|[^\x00-\x7F])|-[\da-z]|[a-z]+-)(?:\\\$|[\x20-\x23\x25-\x7E])*/i), util_1.isEndTightNodes), /^\$(?![0-9a-z])/i),
7767
+ (0, combinator_1.surround)('$', bracket, '$')
7768
7768
  ]), (source, {
7769
7769
  caches: {math: cache} = {}
7770
7770
  }) => {
@@ -7786,7 +7786,7 @@ require = function () {
7786
7786
  }))));
7787
7787
  const bracket = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.surround)('{', (0, combinator_1.some)((0, combinator_1.union)([
7788
7788
  bracket,
7789
- (0, combinator_1.some)(source_1.escsource, /^[{}]/)
7789
+ (0, combinator_1.some)(source_1.escsource, /^(?:[{}]|\\?\n)/)
7790
7790
  ])), '}', true)));
7791
7791
  },
7792
7792
  {
@@ -8663,7 +8663,7 @@ require = function () {
8663
8663
  ];
8664
8664
  default:
8665
8665
  const b = source[0] !== '\n' && source[0].trimStart() === '';
8666
- const i = b || (0, text_1.isAlphanumeric)(source[0]) ? source.search(b ? text_1.nonWhitespace : text_1.nonAlphanumeric) : 1;
8666
+ const i = b ? source.search(text_1.nonWhitespace) : 1;
8667
8667
  return [
8668
8668
  [source.slice(0, i)],
8669
8669
  source.slice(i)
@@ -9027,9 +9027,10 @@ require = function () {
9027
9027
  if (nodes.length === 0)
9028
9028
  return true;
9029
9029
  for (let i = nodes.length; i--;) {
9030
- if (typeof nodes[i] === 'object' && nodes[i]['className'] === 'comment')
9030
+ const node = nodes[i];
9031
+ if (typeof node === 'object' && node.className === 'comment')
9031
9032
  continue;
9032
- return isVisible(nodes[i], -1);
9033
+ return isVisible(node, -1);
9033
9034
  }
9034
9035
  return false;
9035
9036
  }
package/markdown.d.ts CHANGED
@@ -988,6 +988,7 @@ export namespace MarkdownParser {
988
988
  Inline<'math'>,
989
989
  Parser<HTMLElement, Context, [
990
990
  SourceParser.StrParser,
991
+ MathParser.BracketParser,
991
992
  ]> {
992
993
  }
993
994
  export namespace MathParser {
package/package-lock.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.225.2",
3
+ "version": "0.226.0",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.225.2",
3
+ "version": "0.226.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",
@@ -23,6 +23,7 @@ export function focus<T>(scope: string | RegExp, parser: Parser<T>): Parser<T> {
23
23
  };
24
24
  }
25
25
 
26
+ //export function rewrite<T, C extends Ctx, D extends Parser<unknown, C>[]>(scope: Parser<unknown, C, D>, parser: Parser<T, C, never>): Parser<T, C, D>;
26
27
  export function rewrite<P extends Parser<unknown>>(scope: Parser<unknown, Context<P>>, parser: P): P;
27
28
  export function rewrite<T>(scope: Parser<unknown>, parser: Parser<T>): Parser<T> {
28
29
  assert(scope);
@@ -11,14 +11,14 @@ describe('Unit: parser/inline/math', () => {
11
11
  assert.deepStrictEqual(inspect(parser('$')), undefined);
12
12
  assert.deepStrictEqual(inspect(parser('$$')), undefined);
13
13
  assert.deepStrictEqual(inspect(parser('$$$')), undefined);
14
- assert.deepStrictEqual(inspect(parser('$0$')), undefined);
15
- assert.deepStrictEqual(inspect(parser('$0-$')), undefined);
16
- assert.deepStrictEqual(inspect(parser('$0-$1')), undefined);
17
- assert.deepStrictEqual(inspect(parser('$0 - $1')), undefined);
18
- assert.deepStrictEqual(inspect(parser('$0+$1')), undefined);
19
- assert.deepStrictEqual(inspect(parser('$0 + $1')), undefined);
20
- assert.deepStrictEqual(inspect(parser('$0-1$')), undefined);
21
- assert.deepStrictEqual(inspect(parser('$0+1$')), undefined);
14
+ assert.deepStrictEqual(inspect(parser('$0 $')), undefined);
15
+ assert.deepStrictEqual(inspect(parser('$0.$')), undefined);
16
+ assert.deepStrictEqual(inspect(parser('$1,000.99.$')), undefined);
17
+ assert.deepStrictEqual(inspect(parser('$0(a)$')), undefined);
18
+ assert.deepStrictEqual(inspect(parser('$0[a]$')), undefined);
19
+ assert.deepStrictEqual(inspect(parser('$0{a}$')), undefined);
20
+ assert.deepStrictEqual(inspect(parser('$0 - $')), undefined);
21
+ assert.deepStrictEqual(inspect(parser('$0 + $')), undefined);
22
22
  assert.deepStrictEqual(inspect(parser('$-0$')), undefined);
23
23
  assert.deepStrictEqual(inspect(parser('$-0$-1')), undefined);
24
24
  assert.deepStrictEqual(inspect(parser('$-a$')), undefined);
@@ -26,19 +26,14 @@ describe('Unit: parser/inline/math', () => {
26
26
  assert.deepStrictEqual(inspect(parser('$a $')), undefined);
27
27
  assert.deepStrictEqual(inspect(parser('$a-b$')), undefined);
28
28
  assert.deepStrictEqual(inspect(parser('$a-b$c-d')), undefined);
29
- assert.deepStrictEqual(inspect(parser('$a+b$')), undefined);
30
- assert.deepStrictEqual(inspect(parser('$a*b$')), undefined);
31
- assert.deepStrictEqual(inspect(parser('$a/b$')), undefined);
32
- assert.deepStrictEqual(inspect(parser('$a[b]$')), undefined);
33
- assert.deepStrictEqual(inspect(parser('$a{b}$')), undefined);
34
29
  assert.deepStrictEqual(inspect(parser('$a$b')), undefined);
35
30
  assert.deepStrictEqual(inspect(parser('$a$b$')), undefined);
36
31
  assert.deepStrictEqual(inspect(parser('$ $')), undefined);
37
32
  assert.deepStrictEqual(inspect(parser('$ a$')), undefined);
38
33
  assert.deepStrictEqual(inspect(parser('$ a $')), undefined);
39
34
  assert.deepStrictEqual(inspect(parser('$\n$')), undefined);
40
- assert.deepStrictEqual(inspect(parser('$a\nb$')), undefined);
41
- assert.deepStrictEqual(inspect(parser('$a\\\nb$')), undefined);
35
+ assert.deepStrictEqual(inspect(parser('$a\\$\nb$')), undefined);
36
+ assert.deepStrictEqual(inspect(parser('$a\\$\\\nb$')), undefined);
42
37
  assert.deepStrictEqual(inspect(parser('${')), undefined);
43
38
  assert.deepStrictEqual(inspect(parser('${a')), undefined);
44
39
  assert.deepStrictEqual(inspect(parser('${$')), undefined);
@@ -50,8 +45,8 @@ describe('Unit: parser/inline/math', () => {
50
45
  assert.deepStrictEqual(inspect(parser('${a}b}$')), undefined);
51
46
  assert.deepStrictEqual(inspect(parser('${\\}$')), undefined);
52
47
  assert.deepStrictEqual(inspect(parser('${\n}$')), undefined);
53
- assert.deepStrictEqual(inspect(parser('${a\nb}$')), undefined);
54
- assert.deepStrictEqual(inspect(parser('${a\\\nb}$')), undefined);
48
+ assert.deepStrictEqual(inspect(parser('${a\\$\nb}$')), undefined);
49
+ assert.deepStrictEqual(inspect(parser('${a\\$\\\nb}$')), undefined);
55
50
  assert.deepStrictEqual(inspect(parser('${\\begin}$')), [['<span class="invalid" translate="no">${\\begin}$</span>'], '']);
56
51
  assert.deepStrictEqual(inspect(parser('${\\Huge}$')), [['<span class="invalid" translate="no">${\\Huge}$</span>'], '']);
57
52
  assert.deepStrictEqual(inspect(parser('${a}b$')), undefined);
@@ -59,23 +54,18 @@ describe('Unit: parser/inline/math', () => {
59
54
  });
60
55
 
61
56
  it('basic', () => {
62
- assert.deepStrictEqual(inspect(parser('${}$')), [['<span class="math" translate="no" data-src="${}$">${}$</span>'], '']);
63
- assert.deepStrictEqual(inspect(parser('${ }$')), [['<span class="math" translate="no" data-src="${ }$">${ }$</span>'], '']);
64
- assert.deepStrictEqual(inspect(parser('${a}$')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '']);
65
- assert.deepStrictEqual(inspect(parser('${a}$$')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '$']);
66
- assert.deepStrictEqual(inspect(parser('${a}$0')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '0']);
67
- assert.deepStrictEqual(inspect(parser('${a}$b')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], 'b']);
68
- assert.deepStrictEqual(inspect(parser('${ab}$')), [['<span class="math" translate="no" data-src="${ab}$">${ab}$</span>'], '']);
69
- assert.deepStrictEqual(inspect(parser('${a b}$')), [['<span class="math" translate="no" data-src="${a b}$">${a b}$</span>'], '']);
70
- assert.deepStrictEqual(inspect(parser('${a }$')), [['<span class="math" translate="no" data-src="${a }$">${a }$</span>'], '']);
71
- assert.deepStrictEqual(inspect(parser('${ a}$')), [['<span class="math" translate="no" data-src="${ a}$">${ a}$</span>'], '']);
72
- assert.deepStrictEqual(inspect(parser('${ a }$')), [['<span class="math" translate="no" data-src="${ a }$">${ a }$</span>'], '']);
73
- assert.deepStrictEqual(inspect(parser('${$}$')), [['<span class="math" translate="no" data-src="${$}$">${$}$</span>'], '']);
74
- assert.deepStrictEqual(inspect(parser('${\\a}$')), [['<span class="math" translate="no" data-src="${\\a}$">${\\a}$</span>'], '']);
75
- assert.deepStrictEqual(inspect(parser('${\\$}$')), [['<span class="math" translate="no" data-src="${\\$}$">${\\$}$</span>'], '']);
76
- assert.deepStrictEqual(inspect(parser('${\\\\}$')), [['<span class="math" translate="no" data-src="${\\\\}$">${\\\\}$</span>'], '']);
57
+ assert.deepStrictEqual(inspect(parser('$0$')), [['<span class="math" translate="no" data-src="$0$">$0$</span>'], '']);
58
+ assert.deepStrictEqual(inspect(parser('$0$$')), [['<span class="math" translate="no" data-src="$0$">$0$</span>'], '$']);
59
+ assert.deepStrictEqual(inspect(parser('$0-1$')), [['<span class="math" translate="no" data-src="$0-1$">$0-1$</span>'], '']);
60
+ assert.deepStrictEqual(inspect(parser('$0+1$')), [['<span class="math" translate="no" data-src="$0+1$">$0+1$</span>'], '']);
61
+ assert.deepStrictEqual(inspect(parser('$0*1$')), [['<span class="math" translate="no" data-src="$0*1$">$0*1$</span>'], '']);
62
+ assert.deepStrictEqual(inspect(parser('$0/1$')), [['<span class="math" translate="no" data-src="$0/1$">$0/1$</span>'], '']);
77
63
  assert.deepStrictEqual(inspect(parser('$a$')), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '']);
78
64
  assert.deepStrictEqual(inspect(parser('$a$$')), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '$']);
65
+ assert.deepStrictEqual(inspect(parser('$a -b$')), [['<span class="math" translate="no" data-src="$a -b$">$a -b$</span>'], '']);
66
+ assert.deepStrictEqual(inspect(parser('$a+b$')), [['<span class="math" translate="no" data-src="$a+b$">$a+b$</span>'], '']);
67
+ assert.deepStrictEqual(inspect(parser('$a*b$')), [['<span class="math" translate="no" data-src="$a*b$">$a*b$</span>'], '']);
68
+ assert.deepStrictEqual(inspect(parser('$a/b$')), [['<span class="math" translate="no" data-src="$a/b$">$a/b$</span>'], '']);
79
69
  assert.deepStrictEqual(inspect(parser(`$a'$`)), [[`<span class="math" translate="no" data-src="$a'$">$a'$</span>`], '']);
80
70
  assert.deepStrictEqual(inspect(parser(`$a''$`)), [[`<span class="math" translate="no" data-src="$a''$">$a''$</span>`], '']);
81
71
  assert.deepStrictEqual(inspect(parser('$a$[A](a)')), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '[A](a)']);
@@ -95,6 +85,21 @@ describe('Unit: parser/inline/math', () => {
95
85
  assert.deepStrictEqual(inspect(parser('$f(x)$')), [['<span class="math" translate="no" data-src="$f(x)$">$f(x)$</span>'], '']);
96
86
  assert.deepStrictEqual(inspect(parser('$f: x \\to y$')), [['<span class="math" translate="no" data-src="$f: x \\to y$">$f: x \\to y$</span>'], '']);
97
87
  assert.deepStrictEqual(inspect(parser('$k$-space')), [['<span class="math" translate="no" data-src="$k$">$k$</span>'], '-space']);
88
+ assert.deepStrictEqual(inspect(parser('${}$')), [['<span class="math" translate="no" data-src="${}$">${}$</span>'], '']);
89
+ assert.deepStrictEqual(inspect(parser('${ }$')), [['<span class="math" translate="no" data-src="${ }$">${ }$</span>'], '']);
90
+ assert.deepStrictEqual(inspect(parser('${a}$')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '']);
91
+ assert.deepStrictEqual(inspect(parser('${a}$$')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '$']);
92
+ assert.deepStrictEqual(inspect(parser('${a}$0')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '0']);
93
+ assert.deepStrictEqual(inspect(parser('${a}$b')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], 'b']);
94
+ assert.deepStrictEqual(inspect(parser('${ab}$')), [['<span class="math" translate="no" data-src="${ab}$">${ab}$</span>'], '']);
95
+ assert.deepStrictEqual(inspect(parser('${a b}$')), [['<span class="math" translate="no" data-src="${a b}$">${a b}$</span>'], '']);
96
+ assert.deepStrictEqual(inspect(parser('${a }$')), [['<span class="math" translate="no" data-src="${a }$">${a }$</span>'], '']);
97
+ assert.deepStrictEqual(inspect(parser('${ a}$')), [['<span class="math" translate="no" data-src="${ a}$">${ a}$</span>'], '']);
98
+ assert.deepStrictEqual(inspect(parser('${ a }$')), [['<span class="math" translate="no" data-src="${ a }$">${ a }$</span>'], '']);
99
+ assert.deepStrictEqual(inspect(parser('${$}$')), [['<span class="math" translate="no" data-src="${$}$">${$}$</span>'], '']);
100
+ assert.deepStrictEqual(inspect(parser('${\\a}$')), [['<span class="math" translate="no" data-src="${\\a}$">${\\a}$</span>'], '']);
101
+ assert.deepStrictEqual(inspect(parser('${\\$}$')), [['<span class="math" translate="no" data-src="${\\$}$">${\\$}$</span>'], '']);
102
+ assert.deepStrictEqual(inspect(parser('${\\\\}$')), [['<span class="math" translate="no" data-src="${\\\\}$">${\\\\}$</span>'], '']);
98
103
  });
99
104
 
100
105
  it('nest', () => {
@@ -8,7 +8,6 @@ const disallowedCommand = /\\(?:begin|tiny|huge|large)(?![0-9a-z])/i;
8
8
 
9
9
  export const math: MathParser = lazy(() => creator(validate('$', '$', '\n', rewrite(
10
10
  union([
11
- surround('$', bracket, '$'),
12
11
  surround(
13
12
  '$',
14
13
  verify(
@@ -17,12 +16,11 @@ export const math: MathParser = lazy(() => creator(validate('$', '$', '\n', rewr
17
16
  // $[A-z]*- : Label
18
17
  // $[A-z]*(?!-) : Math
19
18
  // $[\^_[({|] : Math
20
- // $[#$%&] : Invalid first character in latex syntax
21
- // $[A-z]*[,.!?()] : Incomplete syntax before texts
22
- // $[A-z]*\s?[!@#&*+~=`$[]{<] : Incomplete syntax in or around another syntax
23
- str(/^(?=[\\^_[(|]|[A-Za-z][0-9A-Za-z]*'*[ ~]?(?:\$|([\\^_(|:=<>])(?!\1)))(?:\\\$|[\x20-\x23\x25-\x7E])*/),
19
+ // $[#$%&] : Invalid first character in Latex syntax
20
+ str(/^(?![\s{}#$%&]|\d+(?:[,.]\d+)*(?:[\s,.!?()[\]{}]|[^\x00-\x7F])|-[\da-z]|[a-z]+-)(?:\\\$|[\x20-\x23\x25-\x7E])*/i),
24
21
  isEndTightNodes),
25
- /^\$(?![0-9A-Za-z])/),
22
+ /^\$(?![0-9a-z])/i),
23
+ surround('$', bracket, '$'),
26
24
  ]),
27
25
  (source, { caches: { math: cache } = {} }) => [[
28
26
  cache?.get(source)?.cloneNode(true) ||
@@ -43,7 +41,7 @@ const bracket: MathParser.BracketParser = lazy(() => creator(surround(
43
41
  '{',
44
42
  some(union([
45
43
  bracket,
46
- some(escsource, /^[{}]/),
44
+ some(escsource, /^(?:[{}]|\\?\n)/),
47
45
  ])),
48
46
  '}',
49
47
  true)));
@@ -13,7 +13,15 @@ describe('Unit: parser/source/escsource', () => {
13
13
  it('basic', () => {
14
14
  assert.deepStrictEqual(inspect(parser('a')), [['a'], '']);
15
15
  assert.deepStrictEqual(inspect(parser('ab')), [['ab'], '']);
16
- assert.deepStrictEqual(inspect(parser('09AZaz')), [['09AZaz'], '']);
16
+ assert.deepStrictEqual(inspect(parser('09あいAZaz')), [['09あいAZaz'], '']);
17
+ });
18
+
19
+ it('space', () => {
20
+ assert.deepStrictEqual(inspect(parser(' ')), [[' '], '']);
21
+ assert.deepStrictEqual(inspect(parser(' ')), [[' '], '']);
22
+ assert.deepStrictEqual(inspect(parser(' ')), [[' '], '']);
23
+ assert.deepStrictEqual(inspect(parser(' \n')), [[' ', '\n'], '']);
24
+ assert.deepStrictEqual(inspect(parser(' \n')), [[' ', '\n'], '']);
17
25
  });
18
26
 
19
27
  it('linebreak', () => {
@@ -1,6 +1,6 @@
1
1
  import { EscapableSourceParser } from '../source';
2
2
  import { creator } from '../../combinator';
3
- import { nonWhitespace, nonAlphanumeric, isAlphanumeric } from './text';
3
+ import { nonWhitespace } from './text';
4
4
 
5
5
  const separator = /[\s\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]/;
6
6
 
@@ -17,8 +17,8 @@ export const escsource: EscapableSourceParser = creator(source => {
17
17
  return [[source.slice(0, 2)], source.slice(2)];
18
18
  default:
19
19
  const b = source[0] !== '\n' && source[0].trimStart() === '';
20
- const i = b || isAlphanumeric(source[0])
21
- ? source.search(b ? nonWhitespace : nonAlphanumeric)
20
+ const i = b
21
+ ? source.search(nonWhitespace)
22
22
  : 1;
23
23
  assert(i > 0);
24
24
  return [[source.slice(0, i)], source.slice(i)];
@@ -12,9 +12,8 @@ describe('Unit: parser/text/text', () => {
12
12
 
13
13
  it('basic', () => {
14
14
  assert.deepStrictEqual(inspect(parser('a')), [['a'], '']);
15
- assert.deepStrictEqual(inspect(parser('az')), [['az'], '']);
16
- assert.deepStrictEqual(inspect(parser('09')), [['09'], '']);
17
- assert.deepStrictEqual(inspect(parser('azあい09')), [['az', 'あい', '09'], '']);
15
+ assert.deepStrictEqual(inspect(parser('ab')), [['ab'], '']);
16
+ assert.deepStrictEqual(inspect(parser('09あいAZaz')), [['09', 'あい', 'AZaz'], '']);
18
17
  assert.deepStrictEqual(inspect(parser('a\nb')), [['a', '<br>', 'b'], '']);
19
18
  });
20
19
 
@@ -13,6 +13,15 @@ describe('Unit: parser/source/unescapable', () => {
13
13
  it('basic', () => {
14
14
  assert.deepStrictEqual(inspect(parser('a')), [['a'], '']);
15
15
  assert.deepStrictEqual(inspect(parser('ab')), [['ab'], '']);
16
+ assert.deepStrictEqual(inspect(parser('09あいAZaz')), [['09', 'あい', 'AZaz'], '']);
17
+ });
18
+
19
+ it('space', () => {
20
+ assert.deepStrictEqual(inspect(parser(' ')), [[' '], '']);
21
+ assert.deepStrictEqual(inspect(parser(' ')), [[' '], '']);
22
+ assert.deepStrictEqual(inspect(parser(' ')), [[' '], '']);
23
+ assert.deepStrictEqual(inspect(parser(' \n')), [[' ', '\n'], '']);
24
+ assert.deepStrictEqual(inspect(parser(' \n')), [[' ', '\n'], '']);
16
25
  });
17
26
 
18
27
  it('linebreak', () => {
@@ -136,8 +136,9 @@ export function isStartTightNodes(nodes: readonly (HTMLElement | string)[]): boo
136
136
  export function isEndTightNodes(nodes: readonly (HTMLElement | string)[]): boolean {
137
137
  if (nodes.length === 0) return true;
138
138
  for (let i = nodes.length; i--;) {
139
- if (typeof nodes[i] === 'object' && nodes[i]['className'] === 'comment') continue;
140
- return isVisible(nodes[i], -1);
139
+ const node = nodes[i];
140
+ if (typeof node === 'object' && node.className === 'comment') continue;
141
+ return isVisible(node, -1);
141
142
  }
142
143
  return false;
143
144
  }