nadesiko3 3.7.21 → 3.7.22

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 (155) hide show
  1. package/batch/command.txt +370 -334
  2. package/batch/jsplugin2text.nako3 +1 -1
  3. package/batch/pickup_command.nako3 +12 -0
  4. package/core/command/snako.mts +5 -1
  5. package/core/deno/snako.ts +5 -1
  6. package/core/package-lock.json +382 -21
  7. package/core/package.json +4 -4
  8. package/core/src/nako3.mts +178 -614
  9. package/core/src/nako_basic_plugins.mts +39 -0
  10. package/core/src/nako_core_version.mts +2 -2
  11. package/core/src/nako_csv.mts +0 -1
  12. package/core/src/nako_event.mts +49 -0
  13. package/core/src/nako_gen.mts +291 -202
  14. package/core/src/nako_indent_inline.mts +2 -2
  15. package/core/src/nako_lex_rules.mts +1 -1
  16. package/core/src/nako_parser3.mts +106 -165
  17. package/core/src/nako_parser_async.mts +97 -0
  18. package/core/src/nako_parser_base.mts +4 -55
  19. package/core/src/nako_parser_message.mts +105 -0
  20. package/core/src/nako_parser_operator.mts +93 -0
  21. package/core/src/nako_plugin_manager.mts +260 -0
  22. package/core/src/nako_require.mts +292 -0
  23. package/core/src/nako_runner.mts +191 -0
  24. package/core/src/nako_tokenizer.mts +221 -0
  25. package/core/src/plugin_csv.mts +1 -1
  26. package/core/src/plugin_system.mts +34 -3259
  27. package/core/src/plugin_system_array.mts +699 -0
  28. package/core/src/plugin_system_datetime.mts +368 -0
  29. package/core/src/plugin_system_debug.mts +403 -0
  30. package/core/src/plugin_system_dict.mts +85 -0
  31. package/core/src/plugin_system_json.mts +73 -0
  32. package/core/src/plugin_system_math.mts +383 -0
  33. package/core/src/plugin_system_regexp.mts +120 -0
  34. package/core/src/plugin_system_stdio.mts +86 -0
  35. package/core/src/plugin_system_string.mts +666 -0
  36. package/core/src/plugin_system_timer.mts +152 -0
  37. package/core/src/plugin_system_types.mts +151 -0
  38. package/core/src/plugin_system_url.mts +193 -0
  39. package/core/src/plugin_toml.mts +3 -3
  40. package/core/test/fixtures/README.md +39 -0
  41. package/core/test/fixtures/make_parser_ast_golden.mjs +31 -0
  42. package/core/test/fixtures/parser_ast_golden.json +8027 -0
  43. package/core/test/fixtures/parser_corpus.mjs +120 -0
  44. package/core/test/indent_test.mjs +6 -0
  45. package/core/test/nako_basic_plugins_test.mjs +44 -0
  46. package/core/test/nako_event_test.mjs +85 -0
  47. package/core/test/nako_gen_perf_test.mjs +178 -0
  48. package/core/test/nako_parser_async_test.mjs +112 -0
  49. package/core/test/nako_parser_test.mjs +160 -0
  50. package/core/test/nako_plugin_manager_test.mjs +185 -0
  51. package/core/test/nako_require_test.mjs +153 -0
  52. package/core/test/nako_runner_test.mjs +114 -0
  53. package/core/test/nako_tokenizer_test.mjs +115 -0
  54. package/core/test/plugin_system_debug_test.mjs +141 -0
  55. package/core/test/plugin_system_split_test.mjs +179 -0
  56. package/core/test/plugin_system_test.mjs +6 -0
  57. package/core/tsconfig.json +0 -1
  58. package/package.json +17 -21
  59. package/release/_hash.txt +36 -36
  60. package/release/_script-tags.txt +16 -16
  61. package/release/command.json +1 -1
  62. package/release/command.json.js +1 -1
  63. package/release/command_cnako3.json +1 -1
  64. package/release/command_list.json +1 -1
  65. package/release/edit_main.js +6 -6
  66. package/release/edit_main.js.map +3 -3
  67. package/release/editor.js +6 -6
  68. package/release/plugin_keigo.js.map +3 -3
  69. package/release/plugin_markup.js +46 -46
  70. package/release/plugin_markup.js.map +3 -3
  71. package/release/plugin_weykturtle3d.js +1 -1
  72. package/release/plugin_weykturtle3d.js.map +3 -3
  73. package/release/version.js +2 -2
  74. package/release/version_main.js +2 -2
  75. package/release/version_main.js.map +1 -1
  76. package/release/wnako3.js +186 -213
  77. package/release/wnako3.js.map +4 -4
  78. package/release/wnako3webworker.js +172 -199
  79. package/release/wnako3webworker.js.map +4 -4
  80. package/src/cnako3mod.mjs +7 -2
  81. package/src/cnako3mod.mts +7 -2
  82. package/src/nako_version.mjs +2 -2
  83. package/src/nako_version.mts +2 -2
  84. package/src/plugin_browser_ajax.mjs +4 -4
  85. package/src/plugin_browser_ajax.mts +4 -4
  86. package/src/plugin_browser_audio.mjs +10 -10
  87. package/src/plugin_browser_audio.mts +10 -10
  88. package/src/plugin_browser_camera.mjs +4 -4
  89. package/src/plugin_browser_camera.mts +4 -4
  90. package/src/plugin_browser_canvas.mjs +2 -2
  91. package/src/plugin_browser_canvas.mts +2 -2
  92. package/src/plugin_browser_crypto.mjs +3 -3
  93. package/src/plugin_browser_crypto.mts +3 -3
  94. package/src/plugin_browser_dom_event.mjs +1 -1
  95. package/src/plugin_browser_dom_event.mts +1 -1
  96. package/src/plugin_browser_geolocation.mjs +1 -1
  97. package/src/plugin_browser_geolocation.mts +1 -1
  98. package/src/plugin_browser_hotkey.mjs +1 -1
  99. package/src/plugin_browser_hotkey.mts +1 -1
  100. package/src/plugin_browser_html.mjs +1 -1
  101. package/src/plugin_browser_html.mts +1 -1
  102. package/src/plugin_browser_location.mjs +1 -1
  103. package/src/plugin_browser_location.mts +1 -1
  104. package/src/plugin_browser_speech.mjs +1 -1
  105. package/src/plugin_browser_speech.mts +1 -1
  106. package/src/plugin_browser_storage.mjs +2 -2
  107. package/src/plugin_browser_storage.mts +2 -2
  108. package/src/plugin_httpserver.mjs +3 -3
  109. package/src/plugin_httpserver.mts +3 -3
  110. package/src/plugin_keigo.mjs +2 -2
  111. package/src/plugin_keigo.mts +2 -2
  112. package/src/plugin_node.mjs +48 -48
  113. package/src/plugin_node.mts +53 -53
  114. package/src/plugin_weykturtle3d.mjs +56 -56
  115. package/src/plugin_weykturtle3d.mts +56 -56
  116. package/src/wnako3.mjs +1 -1
  117. package/src/wnako3.mts +1 -1
  118. package/src/wnako3_editor.mjs +5 -5
  119. package/src/wnako3_editor.mts +5 -5
  120. package/src/wnako3mod.mjs +2 -2
  121. package/src/wnako3mod.mts +2 -2
  122. package/core/src/nako3.mjs +0 -1021
  123. package/core/src/nako_ast.mjs +0 -4
  124. package/core/src/nako_colors.mjs +0 -77
  125. package/core/src/nako_core_version.mjs +0 -8
  126. package/core/src/nako_csv.mjs +0 -193
  127. package/core/src/nako_errors.mjs +0 -166
  128. package/core/src/nako_from_dncl.mjs +0 -285
  129. package/core/src/nako_from_dncl2.mjs +0 -347
  130. package/core/src/nako_gen.mjs +0 -2500
  131. package/core/src/nako_global.mjs +0 -138
  132. package/core/src/nako_indent.mjs +0 -442
  133. package/core/src/nako_indent_chars.mjs +0 -29
  134. package/core/src/nako_indent_inline.mjs +0 -361
  135. package/core/src/nako_josi_list.mjs +0 -47
  136. package/core/src/nako_lex_rules.mjs +0 -319
  137. package/core/src/nako_lexer.mjs +0 -794
  138. package/core/src/nako_logger.mjs +0 -221
  139. package/core/src/nako_parser3.mjs +0 -3250
  140. package/core/src/nako_parser_base.mjs +0 -403
  141. package/core/src/nako_parser_const.mjs +0 -37
  142. package/core/src/nako_prepare.mjs +0 -329
  143. package/core/src/nako_reserved_words.mjs +0 -42
  144. package/core/src/nako_source_mapping.mjs +0 -207
  145. package/core/src/nako_test.mjs +0 -37
  146. package/core/src/nako_token.mjs +0 -1
  147. package/core/src/nako_tools.mjs +0 -53
  148. package/core/src/nako_types.mjs +0 -14
  149. package/core/src/plugin_api.mjs +0 -4
  150. package/core/src/plugin_csv.mjs +0 -97
  151. package/core/src/plugin_math.mjs +0 -352
  152. package/core/src/plugin_promise.mjs +0 -102
  153. package/core/src/plugin_system.mjs +0 -3810
  154. package/core/src/plugin_test.mjs +0 -52
  155. package/core/src/plugin_toml.mjs +0 -39
@@ -1,319 +0,0 @@
1
- /**
2
- * なでしこ3字句解析のためのルール
3
- */
4
- import { josiRE, removeJosiMap } from './nako_josi_list.mjs';
5
- const kanakanji = /^[\u3005\u4E00-\u9FCF_a-zA-Z0-9ァ-ヶー\u2460-\u24FF\u2776-\u277F\u3251-\u32BF]+/;
6
- const hira = /^[ぁ-ん]/;
7
- const allHiragana = /^[ぁ-ん]+$/;
8
- const wordHasIjoIka = /^.+(以上|以下|超|未満)$/;
9
- const wordSpecial = /^(かつ|または)/;
10
- const errorRead = (ch) => {
11
- return function () { throw new Error('突然の『' + ch + '』があります。'); };
12
- };
13
- // 数値の後の単位は自動的に省略されるルール (#994)
14
- export const unitRE = /^(円|ドル|元|歩|㎡|坪|度|℃|°|個|つ|本|冊|才|歳|匹|枚|皿|セット|羽|人|件|行|列|機|品|m|mm|cm|km|g|kg|t|b|mb|kb|gb)/;
15
- // CSSの単位であれば自動的に文字列に変換するルール (#1811)
16
- export const cssUnitRE = /^(px|em|ex|rem|vw|vh|vmin|vmax)/;
17
- /** トークンに区切るルールの一覧 */
18
- export const rules = [
19
- // 上から順にマッチさせていく
20
- { name: 'ここまで', pattern: /^;;;/ }, // #925
21
- { name: 'eol', pattern: /^\n/ },
22
- { name: 'eol', pattern: /^;/ },
23
- // eslint-disable-next-line no-irregular-whitespace
24
- { name: 'space', pattern: /^(\x20|\x09| |・|⎿ |└||)+/ }, // #877,#1015
25
- { name: 'comma', pattern: /^,/ },
26
- { name: 'line_comment', pattern: /^#[^\n]*/ },
27
- { name: 'line_comment', pattern: /^\/\/[^\n]*/ },
28
- { name: 'range_comment', pattern: /^\/\*/, cbParser: cbRangeComment },
29
- { name: 'def_test', pattern: /^●テスト:/ },
30
- { name: 'def_func', pattern: /^●/ },
31
- { name: '…', pattern: /^…/ }, // 範囲オブジェクト(#1704)
32
- { name: '…', pattern: /^\.{2,3}/ }, // 範囲オブジェクト(#1704)
33
- // 多倍長整数リテラルの判定。整数の末尾に「n」がついているだけな為、数値判定より上に書かないとただの整数にされる
34
- { name: 'bigint', pattern: /^0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*n/, readJosi: true },
35
- { name: 'bigint', pattern: /^0[oO][0-7]+(_[0-7]+)*n/, readJosi: true },
36
- { name: 'bigint', pattern: /^0[bB][0-1]+(_[0-1]+)*n/, readJosi: true },
37
- { name: 'bigint', pattern: /^\d+(_\d+)*?n/, readJosi: true },
38
- // 16進/8進/2進法の数値判定 --- この後nako_lexerにて単位を読む処理が入る(#994)
39
- { name: 'number', pattern: /^0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*/, readJosi: true, cb: parseNumber },
40
- { name: 'number', pattern: /^0[oO][0-7]+(_[0-7]+)*/, readJosi: true, cb: parseNumber },
41
- { name: 'number', pattern: /^0[bB][0-1]+(_[0-1]+)*/, readJosi: true, cb: parseNumber },
42
- // 下の三つは小数点が挟まっている場合、小数点から始まっている場合、小数点がない場合の十進法の数値にマッチする
43
- { name: 'number', pattern: /^\d+(_\d+)*\.(\d+(_\d+)*)?([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
44
- { name: 'number', pattern: /^\.\d+(_\d+)*([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
45
- { name: 'number', pattern: /^\d+(_\d+)*([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
46
- { name: 'ここから', pattern: /^(ここから),?/ },
47
- { name: 'ここまで', pattern: /^(ここまで|💧)/ },
48
- { name: 'もし', pattern: /^もしも?/ },
49
- // 「ならば」は助詞として定義している
50
- { name: '違えば', pattern: /^違(えば)?/ },
51
- // 「回」「間」「繰返」「反復」「抜」「続」「戻」「代入」「条件分岐」などは NakoLexer._replaceWord で word から変換
52
- // @see nako_reserved_words.js
53
- { name: 'shift_r0', pattern: /^>>>/ },
54
- { name: 'shift_r', pattern: /^>>/ },
55
- { name: 'shift_l', pattern: /^<</ },
56
- { name: '===', pattern: /^===/ }, // #999
57
- { name: '!==', pattern: /^!==/ }, // #999
58
- { name: 'gteq', pattern: /^(≧|>=|=>)/ },
59
- { name: 'lteq', pattern: /^(≦|<=|=<)/ },
60
- { name: 'noteq', pattern: /^(≠|<>|!=)/ },
61
- { name: '←', pattern: /^(←|<--)/ }, // 矢印 --- ただし(core#140)で廃止された演算子(#891,#899)
62
- { name: 'eq', pattern: /^(==|🟰🟰)/ },
63
- { name: 'eq', pattern: /^(=|🟰)/ },
64
- { name: 'line_comment', pattern: /^(!|💡)(インデント構文|ここまでだるい|DNCLモード|DNCL2モード|DNCL2)[^\n]*/ }, // #1184
65
- { name: 'not', pattern: /^(!|💡)/ }, // #1184 #1457
66
- { name: 'gt', pattern: /^>/ },
67
- { name: 'lt', pattern: /^</ },
68
- { name: 'and', pattern: /^(かつ|&&|and\s)/ },
69
- { name: 'or', pattern: /^(または|或いは|あるいは|or\s|\|\|)/ },
70
- { name: '@', pattern: /^@/ },
71
- { name: '+', pattern: /^\+/ },
72
- { name: '-', pattern: /^-/ },
73
- { name: '**', pattern: /^(××|\*\*)/ }, // Python風べき乗演算子
74
- { name: '*', pattern: /^(×|\*)/ },
75
- { name: '÷÷', pattern: /^÷÷/ }, // 整数の割り算
76
- { name: '÷', pattern: /^(÷|\/)/ }, // 普通の割り算
77
- { name: '%', pattern: /^%/ },
78
- { name: '^', pattern: /^\^/ },
79
- { name: '&', pattern: /^&/ },
80
- { name: '[', pattern: /^\[/ },
81
- { name: ']', pattern: /^]/, readJosi: true },
82
- { name: '(', pattern: /^\(/ },
83
- { name: ')', pattern: /^\)/, readJosi: true },
84
- { name: '|', pattern: /^\|/ },
85
- { name: '??', pattern: /^\?\?/ }, // 「表示」のエイリアス #1745
86
- { name: 'word', pattern: /^\$\{.+?\}/, cbParser: src => cbExtWord(src) }, // 特別名前トークン(#1836)(#672)
87
- { name: '$', pattern: /^(\$|\.)/ }, // プロパティアクセス (#1793)(#1807)
88
- { name: 'string', pattern: /^🌿/, cbParser: src => cbString('🌿', '🌿', src) },
89
- { name: 'string_ex', pattern: /^🌴/, cbParser: src => cbString('🌴', '🌴', src) },
90
- { name: 'string_ex', pattern: /^「/, cbParser: src => cbString('「', '」', src) },
91
- { name: 'string', pattern: /^『/, cbParser: src => cbString('『', '』', src) },
92
- { name: 'string_ex', pattern: /^“/, cbParser: src => cbString('“', '”', src) },
93
- { name: 'string_ex', pattern: /^"/, cbParser: src => cbString('"', '"', src) },
94
- { name: 'string', pattern: /^'/, cbParser: src => cbString('\'', '\'', src) },
95
- { name: '」', pattern: /^」/, cbParser: errorRead('」') }, // error
96
- { name: '』', pattern: /^』/, cbParser: errorRead('』') }, // error
97
- { name: 'func', pattern: /^\{関数\},?/ },
98
- { name: '{', pattern: /^\{/ },
99
- { name: '}', pattern: /^\}/, readJosi: true },
100
- { name: ':', pattern: /^:/ },
101
- { name: '_eol', pattern: /^_\s*\n/ },
102
- { name: 'dec_lineno', pattern: /^‰/ },
103
- // 絵文字変数 = (絵文字)英数字*
104
- { name: 'word', pattern: /^[\uD800-\uDBFF][\uDC00-\uDFFF][_a-zA-Z0-9]*/, readJosi: true },
105
- { name: 'word', pattern: /^[\u1F60-\u1F6F][_a-zA-Z0-9]*/, readJosi: true }, // 絵文字
106
- { name: 'word', pattern: /^《.+?》/, readJosi: true }, // 《特別名前トークン》(#672)
107
- // 単語句
108
- {
109
- name: 'word',
110
- pattern: /^[_a-zA-Z\u3005\u4E00-\u9FCFぁ-んァ-ヶ\u2460-\u24FF\u2776-\u277F\u3251-\u32BF]/,
111
- cbParser: cbWordParser
112
- }
113
- ];
114
- export function trimOkurigana(s) {
115
- // ひらがなから始まらない場合、送り仮名を削除。(例)置換する
116
- if (!hira.test(s)) {
117
- return s.replace(/[ぁ-ん]+/g, '');
118
- }
119
- // 全てひらがな? (例) どうぞ
120
- if (allHiragana.test(s)) {
121
- return s;
122
- }
123
- // 末尾のひらがなのみ (例)お願いします →お願
124
- return s.replace(/[ぁ-ん]+$/g, '');
125
- }
126
- // Utility for Rule
127
- function cbRangeComment(src) {
128
- let res = '';
129
- const josi = '';
130
- let numEOL = 0;
131
- src = src.substring(2); // skip /*
132
- const i = src.indexOf('*/');
133
- if (i < 0) { // not found
134
- res = src;
135
- src = '';
136
- }
137
- else {
138
- res = src.substring(0, i);
139
- src = src.substring(i + 2);
140
- }
141
- // 改行を数える
142
- for (let i = 0; i < res.length; i++) {
143
- if (res.charAt(i) === '\n') {
144
- numEOL++;
145
- }
146
- }
147
- res = res.replace(/(^\s+|\s+$)/, ''); // trim
148
- return { src, res, josi, numEOL };
149
- }
150
- /**
151
- * @param {string} src
152
- */
153
- function cbWordParser(src, isTrimOkurigana = true) {
154
- /*
155
- kanji = [\u3005\u4E00-\u9FCF]
156
- hiragana = [ぁ-ん]
157
- katakana = [ァ-ヶー]
158
- emoji = [\u1F60-\u1F6F]
159
- uni_extra = [\uD800-\uDBFF] [\uDC00-\uDFFF]
160
- alphabet = [_a-zA-Z]
161
- numchars = [0-9]
162
- */
163
- let res = '';
164
- let josi = '';
165
- while (src !== '') {
166
- // 1文字以上のとき
167
- if (res.length > 0) {
168
- // 「かつ」「または」なら分割する (#1379 core#84)
169
- const jsw = wordSpecial.exec(src);
170
- if (jsw) {
171
- break;
172
- }
173
- // 助詞の判定
174
- const j = josiRE.exec(src);
175
- if (j) {
176
- josi = j[0].replace(/^\s+/, '');
177
- src = src.substring(j[0].length);
178
- // 助詞の直後にある「,」を飛ばす #877
179
- if (src.charAt(0) === ',') {
180
- src = src.substring(1);
181
- }
182
- break;
183
- }
184
- }
185
- // カタカナ漢字英数字か?
186
- const m = kanakanji.exec(src);
187
- if (m) {
188
- res += m[0];
189
- src = src.substring(m[0].length);
190
- continue;
191
- }
192
- // ひらがな?
193
- const h = hira.test(src);
194
- if (h) {
195
- res += src.charAt(0);
196
- src = src.substring(1);
197
- continue;
198
- }
199
- break; // other chars
200
- }
201
- // --- 単語分割における特殊ルール ---
202
- // 「間」の特殊ルール (#831)
203
- // 「等しい間」や「一致する間」なら「間」をsrcに戻す。ただし「システム時間」はそのままにする。
204
- if (/[ぁ-ん]間$/.test(res)) {
205
- src = res.charAt(res.length - 1) + src;
206
- res = res.slice(0, -1);
207
- }
208
- // 「以上」「以下」「超」「未満」 #918
209
- const ii = wordHasIjoIka.exec(res);
210
- if (ii) {
211
- src = ii[1] + josi + src;
212
- josi = '';
213
- res = res.substring(0, res.length - ii[1].length);
214
- }
215
- // 「もの」構文 #1614
216
- if (josi.substring(0, 2) === 'もの') {
217
- josi = josi.substring(2);
218
- }
219
- // 助詞「こと」「である」「です」などは「**すること」のように使うので削除 #936 #939 #974
220
- if (removeJosiMap[josi]) {
221
- josi = '';
222
- }
223
- // 送り仮名の省略ルール
224
- // 漢字カタカナ英語から始まる語句 --- 送り仮名を省略
225
- if (isTrimOkurigana) {
226
- res = trimOkurigana(res);
227
- }
228
- // 助詞だけの語句の場合
229
- if (res === '' && josi !== '') {
230
- res = josi;
231
- josi = '';
232
- }
233
- return { src, res, josi, numEOL: 0 };
234
- }
235
- function cbString(beginTag, closeTag, src) {
236
- let res = '';
237
- let josi = '';
238
- let numEOL = 0;
239
- src = src.substring(beginTag.length); // skip beginTag
240
- const i = src.indexOf(closeTag);
241
- if (i < 0) { // not found
242
- res = src;
243
- src = '';
244
- throw new Error(`『${beginTag}』で始めた文字列の終端記号『${closeTag}』が見つかりません。`);
245
- }
246
- else {
247
- res = src.substring(0, i);
248
- src = src.substring(i + closeTag.length);
249
- // res の中に beginTag があればエラーにする #953
250
- if (res.indexOf(beginTag) >= 0) {
251
- if (beginTag === '『') {
252
- throw new Error('「『」で始めた文字列の中に「『」を含めることはできません。');
253
- }
254
- else {
255
- throw new Error(`『${beginTag}』で始めた文字列の中に『${beginTag}』を含めることはできません。`);
256
- }
257
- }
258
- }
259
- // 文字列直後の助詞を取得
260
- const j = josiRE.exec(src);
261
- if (j) {
262
- josi = j[0].replace(/^\s+/, '');
263
- src = src.substring(j[0].length);
264
- // 助詞の後のカンマ #877
265
- if (src.charAt(0) === ',') {
266
- src = src.substring(1);
267
- }
268
- }
269
- // 助詞「こと」「である」「です」などは「**すること」のように使うので削除 #936 #939 #974
270
- if (removeJosiMap[josi]) {
271
- josi = '';
272
- }
273
- // 「もの」構文 (#1614)
274
- if (josi.substring(0, 2) === 'もの') {
275
- josi = josi.substring(2);
276
- }
277
- // 改行を数える
278
- for (let i = 0; i < res.length; i++) {
279
- if (res.charAt(i) === '\n') {
280
- numEOL++;
281
- }
282
- }
283
- return { src, res, josi, numEOL };
284
- }
285
- function cbExtWord(src) {
286
- let res = '';
287
- let josi = '';
288
- let numEOL = 0;
289
- src = src.substring(2); // skip '${'
290
- const i = src.indexOf('}');
291
- if (i < 0) { // not found
292
- throw new Error('変数名の終わりが見つかりません。');
293
- }
294
- res = src.substring(0, i);
295
- src = src.substring(i + 1);
296
- // 文字列直後の助詞を取得
297
- const j = josiRE.exec(src);
298
- if (j) {
299
- josi = j[0].replace(/^\s+/, '');
300
- src = src.substring(j[0].length);
301
- // 助詞の後のカンマ #877
302
- if (src.charAt(0) === ',') {
303
- src = src.substring(1);
304
- }
305
- }
306
- // 改行を数える(あり得ないけど)
307
- for (let i = 0; i < res.length; i++) {
308
- if (res.charAt(i) === '\n') {
309
- numEOL++;
310
- }
311
- }
312
- if (numEOL > 0) {
313
- throw new Error('変数名に改行を含めることはできません。');
314
- }
315
- return { src, res, josi, numEOL };
316
- }
317
- function parseNumber(n) {
318
- return Number(n.replace(/_/g, ''));
319
- }