nadesiko3 3.2.51 → 3.3.2

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 (169) hide show
  1. package/README.md +1 -1
  2. package/bin/cnako3 +1 -1
  3. package/bin/cnako3.bat +1 -1
  4. package/demo/browsers.html +9 -10
  5. package/demo/flow.html +1 -0
  6. package/demo/turtle3.html +18 -17
  7. package/demo/turtle3d.html +1 -1
  8. package/demo/turtle3d2.html +1 -1
  9. package/doc/browsers.md +9 -10
  10. package/package.json +58 -57
  11. package/release/_hash.txt +57 -52
  12. package/release/_script-tags.txt +14 -13
  13. package/release/command.json +1 -1
  14. package/release/command.json.js +1 -1
  15. package/release/command_cnako3.json +1 -1
  16. package/release/command_list.json +1 -1
  17. package/release/editor.js +1 -1
  18. package/release/editor.js.LICENSE.txt +9 -12
  19. package/release/nako_gen_async.js +1 -1
  20. package/release/nako_gen_async.js.LICENSE.txt +10 -666
  21. package/release/plugin_caniuse.js +1 -1
  22. package/release/plugin_caniuse.js.LICENSE.txt +9 -425
  23. package/release/plugin_csv.js +1 -1
  24. package/release/plugin_csv.js.LICENSE.txt +3 -419
  25. package/release/plugin_datetime.js +1 -1
  26. package/release/plugin_datetime.js.LICENSE.txt +6 -530
  27. package/release/plugin_kansuji.js +1 -1
  28. package/release/plugin_kansuji.js.LICENSE.txt +3 -559
  29. package/release/plugin_markup.js +1 -1
  30. package/release/plugin_markup.js.LICENSE.txt +4 -420
  31. package/release/plugin_turtle.js +1 -1
  32. package/release/plugin_turtle.js.LICENSE.txt +12 -500
  33. package/release/plugin_webworker.js +1 -1
  34. package/release/plugin_webworker.js.LICENSE.txt +3 -563
  35. package/release/plugin_weykturtle3d.js +1 -0
  36. package/release/stats.json +1 -1
  37. package/release/version.js +1 -1
  38. package/release/version.js.LICENSE.txt +9 -12
  39. package/release/wnako3.js +1 -1
  40. package/release/wnako3.js.LICENSE.txt +1 -1
  41. package/release/wnako3webworker.js +1 -1
  42. package/release/wnako3webworker.js.LICENSE.txt +1 -1117
  43. package/src/browsers.mjs +1 -0
  44. package/src/browsers.txt +15 -15
  45. package/src/browsers_agents.mjs +1 -0
  46. package/src/cnako3.mjs +13 -0
  47. package/src/{cnako3.js → cnako3mod.mjs} +46 -53
  48. package/src/{commander_ja.js → commander_ja.mjs} +16 -11
  49. package/src/{enako3.js → enako3.mjs} +0 -0
  50. package/src/{era.json → era.mjs} +1 -1
  51. package/src/image_turtle-elephant.mjs +5 -0
  52. package/src/image_turtle-panda.mjs +5 -0
  53. package/src/image_turtle64.mjs +5 -0
  54. package/src/index.mjs +9 -0
  55. package/src/{nako3.js → nako3.mjs} +56 -52
  56. package/src/{nako3_assert.js → nako3_assert.mjs} +7 -6
  57. package/src/{nako3server.js → nako3server.mjs} +12 -5
  58. package/src/{nako_colors.js → nako_colors.mjs} +1 -1
  59. package/src/{nako_errors.js → nako_errors.mjs} +8 -18
  60. package/src/{nako_from_dncl.js → nako_from_dncl.mjs} +8 -6
  61. package/src/{nako_gen.js → nako_gen.mjs} +107 -89
  62. package/src/{nako_gen_async.js → nako_gen_async.mjs} +5 -8
  63. package/src/{nako_global.js → nako_global.mjs} +4 -5
  64. package/src/{nako_indent.js → nako_indent.mjs} +4 -4
  65. package/src/{nako_josi_list.js → nako_josi_list.mjs} +16 -14
  66. package/src/nako_lex_rules.mjs +244 -0
  67. package/src/{nako_lexer.js → nako_lexer.mjs} +7 -10
  68. package/src/{nako_logger.js → nako_logger.mjs} +3 -4
  69. package/src/{nako_parser3.js → nako_parser3.mjs} +5 -5
  70. package/src/{nako_parser_base.js → nako_parser_base.mjs} +1 -9
  71. package/src/{nako_parser_const.js → nako_parser_const.mjs} +2 -6
  72. package/src/{nako_prepare.js → nako_prepare.mjs} +1 -2
  73. package/src/{nako_reserved_words.js → nako_reserved_words.mjs} +1 -1
  74. package/src/{nako_source_mapping.js → nako_source_mapping.mjs} +4 -11
  75. package/src/{nako_test.js → nako_test.mjs} +0 -0
  76. package/src/nako_version.mjs +7 -0
  77. package/src/{plugin_browser.js → plugin_browser.mjs} +30 -30
  78. package/src/{plugin_browser_ajax.js → plugin_browser_ajax.mjs} +7 -7
  79. package/src/{plugin_browser_audio.js → plugin_browser_audio.mjs} +1 -1
  80. package/src/{plugin_browser_canvas.js → plugin_browser_canvas.mjs} +1 -1
  81. package/src/{plugin_browser_chart.js → plugin_browser_chart.mjs} +1 -1
  82. package/src/{plugin_browser_color.js → plugin_browser_color.mjs} +1 -1
  83. package/src/{plugin_browser_crypto.js → plugin_browser_crypto.mjs} +1 -1
  84. package/src/{plugin_browser_dialog.js → plugin_browser_dialog.mjs} +1 -1
  85. package/src/{plugin_browser_dom_basic.js → plugin_browser_dom_basic.mjs} +1 -1
  86. package/src/{plugin_browser_dom_event.js → plugin_browser_dom_event.mjs} +1 -1
  87. package/src/{plugin_browser_dom_parts.js → plugin_browser_dom_parts.mjs} +1 -1
  88. package/src/{plugin_browser_geolocation.js → plugin_browser_geolocation.mjs} +1 -1
  89. package/src/{plugin_browser_hotkey.js → plugin_browser_hotkey.mjs} +2 -2
  90. package/src/{plugin_browser_html.js → plugin_browser_html.mjs} +1 -1
  91. package/src/{plugin_browser_in_worker.js → plugin_browser_in_worker.mjs} +4 -4
  92. package/src/{plugin_browser_location.js → plugin_browser_location.mjs} +1 -1
  93. package/src/{plugin_browser_speech.js → plugin_browser_speech.mjs} +1 -1
  94. package/src/{plugin_browser_storage.js → plugin_browser_storage.mjs} +1 -1
  95. package/src/{plugin_browser_system.js → plugin_browser_system.mjs} +1 -1
  96. package/src/{plugin_browser_websocket.js → plugin_browser_websocket.mjs} +1 -1
  97. package/src/{plugin_caniuse.js → plugin_caniuse.mjs} +8 -3
  98. package/src/{plugin_csv.js → plugin_csv.mjs} +4 -5
  99. package/src/{plugin_datetime.js → plugin_datetime.mjs} +19 -26
  100. package/src/{plugin_express.js → plugin_express.mjs} +4 -3
  101. package/src/{plugin_kansuji.js → plugin_kansuji.mjs} +1 -1
  102. package/src/{plugin_keigo.js → plugin_keigo.mjs} +0 -0
  103. package/src/{plugin_markup.js → plugin_markup.mjs} +6 -6
  104. package/src/{plugin_math.js → plugin_math.mjs} +1 -4
  105. package/src/{plugin_node.js → plugin_node.mjs} +25 -57
  106. package/src/{plugin_promise.js → plugin_promise.mjs} +1 -3
  107. package/src/{plugin_system.js → plugin_system.mjs} +32 -15
  108. package/src/{plugin_test.js → plugin_test.mjs} +1 -3
  109. package/src/{plugin_turtle.js → plugin_turtle.mjs} +5 -4
  110. package/src/{plugin_webworker.js → plugin_webworker.mjs} +3 -3
  111. package/src/{plugin_weykturtle3d.js → plugin_weykturtle3d.mjs} +1 -3
  112. package/src/{plugin_worker.js → plugin_worker.mjs} +4 -1
  113. package/src/{wnako3.js → wnako3.mjs} +5 -5
  114. package/src/{wnako3_editor.js → wnako3_editor.mjs} +24 -18
  115. package/src/{wnako3webworker.js → wnako3webworker.mjs} +0 -0
  116. package/test/async/{async_basic_test.js → async_basic_test.mjs} +3 -4
  117. package/test/browser/karma.config.js +9 -0
  118. package/test/browser/test/plugin_browser_test.js +2 -2
  119. package/test/browser/test/plugin_turtle_test.js +2 -2
  120. package/test/browser/test/plugin_webworker_test.js +3 -3
  121. package/test/browser/test/require_test.js +2 -2
  122. package/test/common/{array_test.js → array_test.mjs} +3 -3
  123. package/test/common/{basic_test.js → basic_test.mjs} +3 -13
  124. package/test/common/{calc_test.js → calc_test.mjs} +2 -2
  125. package/test/common/{debug_test.js → debug_test.mjs} +2 -2
  126. package/test/common/{dncl_test.js → dncl_test.mjs} +3 -3
  127. package/test/common/{error_test.js → error_test.mjs} +2 -2
  128. package/test/common/{flow_test.js → flow_test.mjs} +2 -2
  129. package/test/common/{func_call.js → func_call.mjs} +3 -3
  130. package/test/common/{func_test.js → func_test.mjs} +2 -2
  131. package/test/common/{indent_test.js → indent_test.mjs} +3 -2
  132. package/test/common/{lex_test.js → lex_test.mjs} +2 -2
  133. package/test/common/{literal_test.js → literal_test.mjs} +3 -2
  134. package/test/common/{nako_logger_test.js → nako_logger_test.mjs} +3 -3
  135. package/test/common/{plugin_browser_test.js → plugin_browser_test.mjs} +4 -4
  136. package/test/common/{plugin_browser_ut_audio_test.js → plugin_browser_ut_audio_test.mjs} +4 -4
  137. package/test/common/{plugin_browser_ut_color_test.js → plugin_browser_ut_color_test.mjs} +2 -2
  138. package/test/common/{plugin_browser_ut_dialog_test.js → plugin_browser_ut_dialog_test.mjs} +3 -3
  139. package/test/common/{plugin_browser_ut_html_test.js → plugin_browser_ut_html_test.mjs} +2 -2
  140. package/test/common/{plugin_browser_ut_system_test.js → plugin_browser_ut_system_test.mjs} +2 -2
  141. package/test/common/{plugin_csv_test.js → plugin_csv_test.mjs} +3 -3
  142. package/test/common/{plugin_datetime_test.js → plugin_datetime_test.mjs} +4 -4
  143. package/test/common/{plugin_kansuji_test.js → plugin_kansuji_test.mjs} +3 -3
  144. package/test/common/{plugin_markup_test.js → plugin_markup_test.mjs} +3 -3
  145. package/test/common/{plugin_promise_test.js → plugin_promise_test.mjs} +2 -2
  146. package/test/common/{plugin_system_test.js → plugin_system_test.mjs} +2 -2
  147. package/test/common/{prepare_test.js → prepare_test.mjs} +2 -2
  148. package/test/common/{re_test.js → re_test.mjs} +2 -2
  149. package/test/common/{variable_scope_test.js → variable_scope_test.mjs} +2 -2
  150. package/test/karma.config.js +3 -3
  151. package/test/node/{async_test.js → async_test.mjs} +4 -2
  152. package/test/node/{commander_ja_test.js → commander_ja_test.mjs} +17 -12
  153. package/test/node/{error_message_test.js → error_message_test.mjs} +13 -10
  154. package/test/node/node_test.mjs +57 -0
  155. package/test/node/{plugin_browser_ut_ajax_test.js → plugin_browser_ut_ajax_test.mjs} +7 -5
  156. package/test/node/{plugin_browser_ut_location_test.js → plugin_browser_ut_location_test.mjs} +3 -3
  157. package/test/node/{plugin_markup_test.js → plugin_markup_test.mjs} +6 -7
  158. package/test/node/{plugin_math_test.js → plugin_math_test.mjs} +5 -5
  159. package/test/node/{plugin_node_test.js → plugin_node_test.mjs} +11 -7
  160. package/test/node/{plugin_test.js → plugin_test.mjs} +11 -5
  161. package/test/node/{require_nako3_test.js → require_nako3_test.mjs} +19 -12
  162. package/test/node/{side_effects_test.js → side_effects_test.mjs} +24 -13
  163. package/test/node/{wnako3_editor_test.js → wnako3_editor_test.mjs} +16 -9
  164. package/tools/nako3edit/index.nako3 +1 -1
  165. package/tools/nako3edit/{run.js → run.mjs} +8 -2
  166. package/src/index.js +0 -5
  167. package/src/nako_lex_rules.js +0 -260
  168. package/src/nako_version.js +0 -8
  169. package/test/node/node_test.js +0 -43
@@ -0,0 +1,244 @@
1
+ /**
2
+ * なでしこ3字句解析のためのルール
3
+ */
4
+
5
+ import { josiRE, removeJosiMap } from './nako_josi_list.mjs'
6
+
7
+ const kanakanji = /^[\u3005\u4E00-\u9FCF_a-zA-Z0-9ァ-ヶー\u2460-\u24FF\u2776-\u277F\u3251-\u32BF]+/
8
+ const hira = /^[ぁ-ん]/
9
+ const allHiragana = /^[ぁ-ん]+$/
10
+ const wordHasIjoIka = /^.+(以上|以下|超|未満)$/
11
+ const errorRead = (ch) => {
12
+ return function () { throw new Error('突然の『' + ch + '』があります。') }
13
+ }
14
+
15
+ export const unitRE = /^(円|ドル|元|歩|㎡|坪|度|℃|°|個|つ|本|冊|才|歳|匹|枚|皿|セット|羽|人|件|行|列|機|品|m|mm|cm|km|g|kg|t|px|dot|pt|em|b|mb|kb|gb)/
16
+ export const rules = [
17
+ // 上から順にマッチさせていく
18
+ { name: 'ここまで', pattern: /^;;;/ }, // #925
19
+ { name: 'eol', pattern: /^\n/ },
20
+ { name: 'eol', pattern: /^;/ },
21
+ // eslint-disable-next-line no-control-regex
22
+ { name: 'space', pattern: /^(\x20|\x09|・)+/ }, // #877,#1015
23
+ { name: 'comma', pattern: /^,/ },
24
+ { name: 'line_comment', pattern: /^#[^\n]*/ },
25
+ { name: 'line_comment', pattern: /^\/\/[^\n]*/ },
26
+ { name: 'range_comment', pattern: /^\/\*/, cbParser: cbRangeComment },
27
+ { name: 'def_test', pattern: /^●テスト:/ },
28
+ { name: 'def_func', pattern: /^●/ },
29
+ // 数値の判定 --- この後nako_lexerにて単位を読む処理が入る(#994)
30
+ { name: 'number', pattern: /^0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*/, readJosi: true, cb: parseNumber },
31
+ { name: 'number', pattern: /^0[oO][0-7]+(_[0-7]+)*/, readJosi: true, cb: parseNumber },
32
+ { name: 'number', pattern: /^0[bB][0-1]+(_[0-1]+)*/, readJosi: true, cb: parseNumber },
33
+ // 下の三つは小数点が挟まっている場合、小数点から始まっている場合、小数点がない場合の十進法の数値にマッチします
34
+ { name: 'number', pattern: /^\d+(_\d+)*\.(\d+(_\d+)*)?([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
35
+ { name: 'number', pattern: /^\.\d+(_\d+)*([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
36
+ { name: 'number', pattern: /^\d+(_\d+)*([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
37
+ { name: 'ここから', pattern: /^(ここから),?/ },
38
+ { name: 'ここまで', pattern: /^(ここまで|💧)/ },
39
+ { name: 'もし', pattern: /^もしも?/ },
40
+ // 「ならば」は助詞として定義している
41
+ { name: '違えば', pattern: /^違(えば)?/ },
42
+ // 「回」「間」「繰返」「反復」「抜」「続」「戻」「代入」「条件分岐」などは replaceWord で word から変換
43
+ // @see nako_reserved_words.js
44
+ { name: 'shift_r0', pattern: /^>>>/ },
45
+ { name: 'shift_r', pattern: /^>>/ },
46
+ { name: 'shift_l', pattern: /^<</ },
47
+ { name: '===', pattern: /^===/ }, // #999
48
+ { name: '!==', pattern: /^!==/ }, // #999
49
+ { name: 'gteq', pattern: /^(≧|>=|=>)/ },
50
+ { name: 'lteq', pattern: /^(≦|<=|=<)/ },
51
+ { name: 'noteq', pattern: /^(≠|<>|!=)/ },
52
+ { name: '←', pattern: /^(←|<--)/ }, // 関数呼び出し演算子 #891 #899
53
+ { name: 'eq', pattern: /^(=|🟰)/ },
54
+ { name: 'line_comment', pattern: /^(!|💡)(インデント構文|ここまでだるい)[^\n]*/ }, // #1184
55
+ { name: 'not', pattern: /^(!|💡)/ }, // #1184
56
+ { name: 'gt', pattern: /^>/ },
57
+ { name: 'lt', pattern: /^</ },
58
+ { name: 'and', pattern: /^(かつ|&&)/ },
59
+ { name: 'or', pattern: /^(または|或いは|あるいは|\|\|)/ },
60
+ { name: '@', pattern: /^@/ },
61
+ { name: '+', pattern: /^\+/ },
62
+ { name: '-', pattern: /^-/ },
63
+ { name: '*', pattern: /^(×|\*)/ },
64
+ { name: '÷÷', pattern: /^÷÷/ }, // 整数の割り算
65
+ { name: '÷', pattern: /^(÷|\/)/ }, // 普通の割り算
66
+ { name: '%', pattern: /^%/ },
67
+ { name: '^', pattern: /^\^/ },
68
+ { name: '&', pattern: /^&/ },
69
+ { name: '[', pattern: /^\[/ },
70
+ { name: ']', pattern: /^]/, readJosi: true },
71
+ { name: '(', pattern: /^\(/ },
72
+ { name: ')', pattern: /^\)/, readJosi: true },
73
+ { name: '|', pattern: /^\|/ },
74
+ { name: 'string', pattern: /^🌿/, cbParser: src => cbString('🌿', '🌿', src) },
75
+ { name: 'string_ex', pattern: /^🌴/, cbParser: src => cbString('🌴', '🌴', src) },
76
+ { name: 'string_ex', pattern: /^「/, cbParser: src => cbString('「', '」', src) },
77
+ { name: 'string', pattern: /^『/, cbParser: src => cbString('『', '』', src) },
78
+ { name: 'string_ex', pattern: /^“/, cbParser: src => cbString('“', '”', src) },
79
+ { name: 'string_ex', pattern: /^"/, cbParser: src => cbString('"', '"', src) },
80
+ { name: 'string', pattern: /^'/, cbParser: src => cbString('\'', '\'', src) },
81
+ { name: '」', pattern: /^」/, cbParser: errorRead('」') }, // error
82
+ { name: '』', pattern: /^』/, cbParser: errorRead('』') }, // error
83
+ { name: 'func', pattern: /^\{関数\},?/ },
84
+ { name: '{', pattern: /^\{/ },
85
+ { name: '}', pattern: /^\}/, readJosi: true },
86
+ { name: ':', pattern: /^:/ },
87
+ { name: '_eol', pattern: /^_\s*\n/ },
88
+ { name: 'dec_lineno', pattern: /^‰/ },
89
+ // 絵文字変数 = (絵文字)英数字*
90
+ { name: 'word', pattern: /^[\uD800-\uDBFF][\uDC00-\uDFFF][_a-zA-Z0-9]*/, readJosi: true },
91
+ { name: 'word', pattern: /^[\u1F60-\u1F6F][_a-zA-Z0-9]*/, readJosi: true }, // 絵文字
92
+ { name: 'word', pattern: /^《.+?》/, readJosi: true }, // 《特別名前トークン》(#672)
93
+ // 単語句
94
+ {
95
+ name: 'word',
96
+ pattern: /^[_a-zA-Z\u3005\u4E00-\u9FCFぁ-んァ-ヶ\u2460-\u24FF\u2776-\u277F\u3251-\u32BF]/,
97
+ cbParser: cbWordParser
98
+ }
99
+ ]
100
+
101
+ export function trimOkurigana (s) {
102
+ // ひらがなから始まらない場合、送り仮名を削除。(例)置換する
103
+ if (!hira.test(s)) {
104
+ return s.replace(/[ぁ-ん]+/g, '')
105
+ }
106
+ // 全てひらがな? (例) どうぞ
107
+ if (allHiragana.test(s)) { return s }
108
+ // 末尾のひらがなのみ (例)お願いします →お願
109
+ return s.replace(/[ぁ-ん]+$/g, '')
110
+ }
111
+
112
+ // Utility for Rule
113
+ function cbRangeComment (src) {
114
+ let res = ''
115
+ const josi = ''
116
+ let numEOL = 0
117
+ src = src.substr(2) // skip /*
118
+ const i = src.indexOf('*/')
119
+ if (i < 0) { // not found
120
+ res = src
121
+ src = ''
122
+ } else {
123
+ res = src.substr(0, i)
124
+ src = src.substr(i + 2)
125
+ }
126
+ // 改行を数える
127
+ for (let i = 0; i < res.length; i++) { if (res.charAt(i) === '\n') { numEOL++ } }
128
+
129
+ res = res.replace(/(^\s+|\s+$)/, '') // trim
130
+ return { src: src, res: res, josi: josi, numEOL: numEOL }
131
+ }
132
+
133
+ /**
134
+ * @param {string} src
135
+ */
136
+ function cbWordParser (src, isTrimOkurigana = true) {
137
+ /*
138
+ kanji = [\u3005\u4E00-\u9FCF]
139
+ hiragana = [ぁ-ん]
140
+ katakana = [ァ-ヶー]
141
+ emoji = [\u1F60-\u1F6F]
142
+ uni_extra = [\uD800-\uDBFF] [\uDC00-\uDFFF]
143
+ alphabet = [_a-zA-Z]
144
+ numchars = [0-9]
145
+ */
146
+ let res = ''
147
+ let josi = ''
148
+ while (src !== '') {
149
+ if (res.length > 0) {
150
+ // 助詞の判定
151
+ const j = josiRE.exec(src)
152
+ if (j) {
153
+ josi = j[0].replace(/^\s+/, '')
154
+ src = src.substr(j[0].length)
155
+ // 助詞の直後にある「,」を飛ばす #877
156
+ if (src.charAt(0) === ',') { src = src.substr(1) }
157
+ break
158
+ }
159
+ }
160
+ // カタカナ漢字英数字か?
161
+ const m = kanakanji.exec(src)
162
+ if (m) {
163
+ res += m[0]
164
+ src = src.substr(m[0].length)
165
+ continue
166
+ }
167
+ // ひらがな?
168
+ const h = hira.test(src)
169
+ if (h) {
170
+ res += src.charAt(0)
171
+ src = src.substr(1)
172
+ continue
173
+ }
174
+ break // other chars
175
+ }
176
+ // 「間」の特殊ルール (#831)
177
+ // 「等しい間」や「一致する間」なら「間」をsrcに戻す。ただし「システム時間」はそのままにする。
178
+ if (/[ぁ-ん]間$/.test(res)) {
179
+ src = res.charAt(res.length - 1) + src
180
+ res = res.slice(0, -1)
181
+ }
182
+ // 「以上」「以下」「超」「未満」 #918
183
+ const ii = wordHasIjoIka.exec(res)
184
+ if (ii) {
185
+ src = ii[1] + josi + src
186
+ josi = ''
187
+ res = res.substr(0, res.length - ii[1].length)
188
+ }
189
+ // 助詞「こと」「である」「です」などは「**すること」のように使うので削除 #936 #939 #974
190
+ if (removeJosiMap[josi]) { josi = '' }
191
+
192
+ // 漢字カタカナ英語から始まる語句 --- 送り仮名を省略
193
+ if (isTrimOkurigana) {
194
+ res = trimOkurigana(res)
195
+ }
196
+ // 助詞だけの語句の場合
197
+ if (res === '' && josi !== '') {
198
+ res = josi
199
+ josi = ''
200
+ }
201
+ return { src: src, res: res, josi: josi, numEOL: 0 }
202
+ }
203
+
204
+ function cbString (beginTag, closeTag, src) {
205
+ let res = ''
206
+ let josi = ''
207
+ let numEOL = 0
208
+ src = src.substr(beginTag.length) // skip beginTag
209
+ const i = src.indexOf(closeTag)
210
+ if (i < 0) { // not found
211
+ res = src
212
+ src = ''
213
+ } else {
214
+ res = src.substr(0, i)
215
+ src = src.substr(i + closeTag.length)
216
+ // res の中に beginTag があればエラーにする #953
217
+ if (res.indexOf(beginTag) >= 0) {
218
+ if (beginTag === '『') {
219
+ throw new Error('「『」で始めた文字列の中に「『」を含めることはできません。')
220
+ } else {
221
+ throw new Error(`『${beginTag}』で始めた文字列の中に『${beginTag}』を含めることはできません。`)
222
+ }
223
+ }
224
+ }
225
+ // 文字列直後の助詞を取得
226
+ const j = josiRE.exec(src)
227
+ if (j) {
228
+ josi = j[0].replace(/^\s+/, '')
229
+ src = src.substr(j[0].length)
230
+ // 助詞の後のカンマ #877
231
+ if (src.charAt(0) === ',') { src = src.substr(1) }
232
+ }
233
+ // 助詞「こと」「である」「です」などは「**すること」のように使うので削除 #936 #939 #974
234
+ if (removeJosiMap[josi]) { josi = '' }
235
+
236
+ // 改行を数える
237
+ for (let i = 0; i < res.length; i++) { if (res.charAt(i) === '\n') { numEOL++ } }
238
+
239
+ return { src: src, res: res, josi: josi, numEOL: numEOL }
240
+ }
241
+
242
+ function parseNumber (n) {
243
+ return Number(n.replace(/_/g, ''))
244
+ }
@@ -1,19 +1,18 @@
1
1
  // なでしこの字句解析を行う
2
2
  // 既に全角半角を揃えたコードに対して字句解析を行う
3
- const { opPriority } = require('./nako_parser_const')
3
+ import { opPriority } from './nako_parser_const.mjs'
4
4
 
5
5
  // 予約語句
6
6
  // (memo)「回」「間」「繰返」「反復」「抜」「続」「戻」「代入」などは replaceWord で word から変換
7
- const reservedWords = require('./nako_reserved_words')
7
+ import reservedWords from './nako_reserved_words.mjs'
8
8
 
9
9
  // 助詞の一覧
10
- const { josiRE, removeJosiMap, tararebaMap } = require('./nako_josi_list')
10
+ import { josiRE, removeJosiMap, tararebaMap } from './nako_josi_list.mjs'
11
11
 
12
12
  // 字句解析ルールの一覧
13
- const lexRules = require('./nako_lex_rules')
14
- const rules = lexRules.rules
13
+ import { rules, unitRE } from './nako_lex_rules.mjs'
15
14
 
16
- const { NakoLexerError, InternalLexerError } = require('./nako_errors')
15
+ import { NakoLexerError, InternalLexerError } from './nako_errors.mjs'
17
16
 
18
17
  /**
19
18
  * @typedef {import('./nako3').TokenWithSourceMap} TokenWithSourceMap
@@ -43,7 +42,7 @@ const { NakoLexerError, InternalLexerError } = require('./nako_errors')
43
42
  * )>} FuncList
44
43
  */
45
44
 
46
- class NakoLexer {
45
+ export class NakoLexer {
47
46
  /**
48
47
  * @param {import("./nako_logger")} logger
49
48
  */
@@ -508,7 +507,7 @@ class NakoLexer {
508
507
  // 数値なら単位を持つか? --- #994
509
508
  if (rule.name === 'number') {
510
509
  // 単位があれば読み飛ばす
511
- const um = lexRules.unitRE.exec(src)
510
+ const um = unitRE.exec(src)
512
511
  if (um) {
513
512
  src = src.substring(um[0].length)
514
513
  column += m[0].length
@@ -573,5 +572,3 @@ class NakoLexer {
573
572
  return result
574
573
  }
575
574
  }
576
-
577
- module.exports = NakoLexer
@@ -3,8 +3,8 @@
3
3
  * @typedef {'trace' | 'debug' | 'info' | 'warn' | 'error' | 'stdout'} LogLevel
4
4
  */
5
5
 
6
- const { NakoError } = require('./nako_errors')
7
- const NakoColors = require('./nako_colors')
6
+ import { NakoError } from './nako_errors.mjs'
7
+ import { NakoColors } from './nako_colors.mjs'
8
8
 
9
9
  /**
10
10
  * @typedef {{ startOffset?: number | null, endOffset?: number | null, line?: number, file?: string }} Position
@@ -34,7 +34,7 @@ const levels = ['trace', 'debug', 'info', 'warn', 'error', 'stdout']
34
34
  * trace(), debug(), info(), warn(), error() はそれぞれメッセージに `[警告]` などのタグとエラー位置の日本語表現を付けて表示する。
35
35
  * error() は引数にエラーオブジェクトを受け取ることもでき、その場合エラーオブジェクトからエラーメッセージとエラー位置が取り出される。
36
36
  */
37
- class NakoLogger {
37
+ export class NakoLogger {
38
38
  constructor () {
39
39
  /** @type {{ level: LogLevel, callback: LogListener, includeHigherLevels: boolean }[]} */
40
40
  this.listeners = []
@@ -135,4 +135,3 @@ class NakoLogger {
135
135
  }
136
136
  }
137
137
 
138
- module.exports = NakoLogger
@@ -1,8 +1,10 @@
1
1
  /**
2
2
  * nadesiko v3 parser (demo version)
3
3
  */
4
- const { opPriority, keizokuJosi } = require('./nako_parser_const')
5
- const { NakoParserBase, NakoSyntaxError } = require('./nako_parser_base')
4
+ import { opPriority, keizokuJosi } from './nako_parser_const.mjs'
5
+ import { NakoParserBase } from './nako_parser_base.mjs'
6
+ import { NakoSyntaxError } from './nako_errors.mjs'
7
+
6
8
  /**
7
9
  * @type {string[]}
8
10
  */
@@ -15,7 +17,7 @@ for (const key in opPriority) { operatorList.push(key) }
15
17
  */
16
18
 
17
19
  // @ts-ignore
18
- class NakoParser extends NakoParserBase {
20
+ export class NakoParser extends NakoParserBase {
19
21
  /**
20
22
  * @param {TokenWithSourceMap[]} tokens 字句解析済みのトークンの配列
21
23
  * @return {Ast} AST(構文木)
@@ -2015,5 +2017,3 @@ class NakoParser extends NakoParserBase {
2015
2017
  }
2016
2018
  }
2017
2019
  }
2018
-
2019
- module.exports = NakoParser
@@ -1,10 +1,7 @@
1
1
  /**
2
2
  * なでしこの構文解析のためのユーティリティクラス
3
3
  */
4
-
5
- const { NakoSyntaxError } = require('./nako_errors')
6
-
7
- class NakoParserBase {
4
+ export class NakoParserBase {
8
5
  /**
9
6
  * @param {import("./nako_logger")} logger
10
7
  */
@@ -264,8 +261,3 @@ class NakoParserBase {
264
261
  }
265
262
  }
266
263
  }
267
-
268
- module.exports = {
269
- NakoParserBase,
270
- NakoSyntaxError
271
- }
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable quote-props */
2
- const opPriority = {
2
+ export const opPriority = {
3
3
  // and or
4
4
  'and': 1,
5
5
  'or': 1,
@@ -29,11 +29,7 @@ const opPriority = {
29
29
  '^': 6
30
30
  }
31
31
 
32
- const keizokuJosi = [
32
+ export const keizokuJosi = [
33
33
  'いて', 'えて', 'きて', 'けて', 'して', 'って', 'にて', 'みて', 'めて', 'ねて', 'には', 'んで'
34
34
  ]
35
35
 
36
- module.exports = {
37
- opPriority,
38
- keizokuJosi
39
- }
@@ -68,7 +68,7 @@ class Replace {
68
68
  // 字句解析を行う前に全角文字を半角に揃える
69
69
  // ただし、文字列部分だけは、そのまま全角で出力するようにする
70
70
  // for https://github.com/kujirahand/nadesiko3/issues/94
71
- class NakoPrepare {
71
+ export class NakoPrepare {
72
72
  /**
73
73
  * @param {import("./nako_logger")} logger
74
74
  */
@@ -294,4 +294,3 @@ class NakoPrepare {
294
294
  }
295
295
  }
296
296
 
297
- module.exports = NakoPrepare
@@ -3,7 +3,7 @@
3
3
  * 予約語
4
4
  */
5
5
 
6
- module.exports = {
6
+ export default {
7
7
  '回': '回',
8
8
  '回繰返': '回', // (#924)
9
9
  '間': '間',
@@ -1,5 +1,5 @@
1
1
  /** prepareとtokenizeのソースマッピング */
2
- class SourceMappingOfTokenization {
2
+ export class SourceMappingOfTokenization {
3
3
  /**
4
4
  * @param {number} sourceCodeLength
5
5
  * @param {{ text: string; sourcePosition: number }[]} preprocessed
@@ -62,7 +62,7 @@ class SourceMappingOfTokenization {
62
62
  }
63
63
  }
64
64
 
65
- class SourceMappingOfIndentSyntax {
65
+ export class SourceMappingOfIndentSyntax {
66
66
  /**
67
67
  * @param {string} codeAfterProcessingIndentationSyntax
68
68
  * @param {readonly number[]} linesInsertedByIndentationSyntax
@@ -165,7 +165,7 @@ class SourceMappingOfIndentSyntax {
165
165
  }
166
166
 
167
167
  /** offsetから (line, column) へ変換する。 */
168
- class OffsetToLineColumn {
168
+ export class OffsetToLineColumn {
169
169
  /**
170
170
  * @param {string} code
171
171
  */
@@ -220,7 +220,7 @@ class OffsetToLineColumn {
220
220
  * preCodeの分、ソースマップのoffset、行数、列数を減らす。
221
221
  * @type {<T extends {line?: number, column?: number, startOffset: number | null, endOffset: number | null }>(sourceMap: T, preCode: string) => T}
222
222
  */
223
- function subtractSourceMapByPreCodeLength (sourceMap, preCode) {
223
+ export function subtractSourceMapByPreCodeLength (sourceMap, preCode) {
224
224
  // offsetは単純に引くだけでよい
225
225
  if (typeof sourceMap.startOffset === 'number') {
226
226
  sourceMap.startOffset -= preCode.length
@@ -242,10 +242,3 @@ function subtractSourceMapByPreCodeLength (sourceMap, preCode) {
242
242
 
243
243
  return sourceMap
244
244
  }
245
-
246
- module.exports = {
247
- SourceMappingOfTokenization,
248
- SourceMappingOfIndentSyntax,
249
- OffsetToLineColumn,
250
- subtractSourceMapByPreCodeLength
251
- }
File without changes
@@ -0,0 +1,7 @@
1
+ // なでしこバージョン
2
+ export default {
3
+ version: '3.3.2',
4
+ major: 3,
5
+ minor: 3,
6
+ patch: 2
7
+ }
@@ -1,23 +1,23 @@
1
1
  // @ts-nocheck
2
2
  // plugin_browser.js
3
- const PartBrowserColor = require('./plugin_browser_color.js')
4
- const PartBrowserSystem = require('./plugin_browser_system.js')
5
- const PartBrowserDialog = require('./plugin_browser_dialog.js')
6
- const PartBrowserLocation = require('./plugin_browser_location.js')
7
- const PartBrowserAjax = require('./plugin_browser_ajax.js')
8
- const PartBrowserDomBasic = require('./plugin_browser_dom_basic.js')
9
- const PartBrowserDomEvent = require('./plugin_browser_dom_event.js')
10
- const PartBrowserDomParts = require('./plugin_browser_dom_parts.js')
11
- const PartBrowserHtml = require('./plugin_browser_html.js')
12
- const PartBrowserStorage = require('./plugin_browser_storage.js')
13
- const PartBrowserCanvas = require('./plugin_browser_canvas.js')
14
- const PartBrowserGeolocation = require('./plugin_browser_geolocation.js')
15
- const PartBrowserSpeech = require('./plugin_browser_speech.js')
16
- const PartBrowserWebsocket = require('./plugin_browser_websocket.js')
17
- const PartBrowserAudio = require('./plugin_browser_audio.js')
18
- const PartBrowserHotkey = require('./plugin_browser_hotkey.js')
19
- const PartBrowserChart = require('./plugin_browser_chart.js')
20
- const PartBrowserCrypto = require('./plugin_browser_crypto.js')
3
+ import PartBrowserColor from './plugin_browser_color.mjs'
4
+ import PartBrowserSystem from './plugin_browser_system.mjs'
5
+ import PartBrowserDialog from './plugin_browser_dialog.mjs'
6
+ import PartBrowserLocation from './plugin_browser_location.mjs'
7
+ import PartBrowserAjax from './plugin_browser_ajax.mjs'
8
+ import PartBrowserDomBasic from './plugin_browser_dom_basic.mjs'
9
+ import PartBrowserDomEvent from './plugin_browser_dom_event.mjs'
10
+ import PartBrowserDomParts from './plugin_browser_dom_parts.mjs'
11
+ import PartBrowserHtml from './plugin_browser_html.mjs'
12
+ import PartBrowserStorage from './plugin_browser_storage.mjs'
13
+ import PartBrowserCanvas from './plugin_browser_canvas.mjs'
14
+ import PartBrowserGeolocation from './plugin_browser_geolocation.mjs'
15
+ import PartBrowserSpeech from './plugin_browser_speech.mjs'
16
+ import PartBrowserWebsocket from './plugin_browser_websocket.mjs'
17
+ import PartBrowserAudio from './plugin_browser_audio.mjs'
18
+ import PartBrowserHotkey from './plugin_browser_hotkey.mjs'
19
+ import PartBrowserChart from './plugin_browser_chart.mjs'
20
+ import PartBrowserCrypto from './plugin_browser_crypto.mjs'
21
21
 
22
22
  const BrowserParts = [
23
23
  PartBrowserColor,
@@ -56,18 +56,18 @@ const PluginBrowser = {
56
56
  pure: true,
57
57
  fn: function (sys) {
58
58
  /* eslint no-global-assign: 0 */
59
- if (typeof document === 'undefined') { document = { 'body': {} } }
60
- if (typeof window === 'undefined') { window = { 'location': { 'href': '' } } }
61
- if (typeof navigator === 'undefined') { navigator = {} }
59
+ const doc = (typeof document === 'undefined') ? {'body': {}} : document
60
+ const win = (typeof window === 'undefined') ? {'location': { 'href': '' }} : window
61
+ const nav = (typeof navigator === 'undefined') ? {} : navigator
62
62
 
63
63
  // 定数を初期化
64
64
  sys.__v0['AJAX:ONERROR'] = (err) => { console.log(err) }
65
65
  // オブジェクトを初期化
66
- sys.__v0.DOCUMENT = document
67
- sys.__v0.WINDOW = window
68
- sys.__v0.NAVIGATOR = navigator
69
- sys.__v0['DOM親要素'] = document.body
70
- sys.__v0['ブラウザURL'] = window.location.href
66
+ sys.__v0.DOCUMENT = doc
67
+ sys.__v0.WINDOW = win
68
+ sys.__v0.NAVIGATOR = nav
69
+ sys.__v0['DOM親要素'] = doc.body
70
+ sys.__v0['ブラウザURL'] = win.location.href
71
71
 
72
72
  // 便利なメソッドを定義
73
73
  sys.__tohtml = (text) => {
@@ -88,7 +88,7 @@ const PluginBrowser = {
88
88
  sys.__addEvent = (dom, event, func, setHandler) => {
89
89
  // dom
90
90
  if (typeof (dom) === 'string') {
91
- dom = document.querySelector(dom)
91
+ dom = doc.querySelector(dom)
92
92
  if (!dom) { throw new Error('DOMイベントが追加できません。要素が見当たりません。') }
93
93
  }
94
94
  // func
@@ -142,7 +142,7 @@ const PluginBrowser = {
142
142
  sys.__removeEvent = (dom, event, func) => {
143
143
  // dom
144
144
  if (typeof (dom) === 'string') {
145
- dom = document.querySelector(dom)
145
+ dom = doc.querySelector(dom)
146
146
  if (!dom) { throw new Error('DOMイベントが削除できません。要素が見当たりません。') }
147
147
  }
148
148
  // func
@@ -171,7 +171,7 @@ const PluginBrowser = {
171
171
  sys.__dom_events = []
172
172
  // requestAnimationFrame
173
173
  if (sys.__requestAnimationFrameLastId > 0) {
174
- window.cancelAnimationFrame(sys.__requestAnimationFrameLastId)
174
+ win.cancelAnimationFrame(sys.__requestAnimationFrameLastId)
175
175
  sys.__requestAnimationFrameLastId = 0
176
176
  }
177
177
  }
@@ -202,4 +202,4 @@ BrowserParts.forEach((a) => {
202
202
  Object.assign(PluginBrowser, b)
203
203
  })
204
204
 
205
- module.exports = PluginBrowser
205
+ export default PluginBrowser
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  /* eslint-disable quote-props */
3
- module.exports = {
3
+ export default {
4
4
  // @AJAXとHTTP
5
5
  'AJAX送信時': { // @非同期通信(Ajax)でURLにデータを送信し、成功するとcallbackが実行される。その際『対象』にデータが代入される。『AJAXオプション』を指定できる。 // @AJAXそうしんしたとき
6
6
  type: 'func',
@@ -22,7 +22,7 @@ module.exports = {
22
22
  },
23
23
  return_none: true
24
24
  },
25
- 'AJAX受信': { // @「!非同期モード」で非同期通信(Ajax)でURLからデータを受信する。『AJAXオプション』を指定できる。結果は変数『対象』に入る// @AJAXじゅしん
25
+ 'AJAX受信': { // @ (非推奨)『AJAXテキスト取得』をご利用ください。-「!非同期モード」で非同期通信(Ajax)でURLからデータを受信する。『AJAXオプション』を指定できる。結果は変数『対象』に入る// @AJAXじゅしん
26
26
  type: 'func',
27
27
  josi: [['から', 'を']],
28
28
  pure: true,
@@ -162,7 +162,7 @@ module.exports = {
162
162
  },
163
163
  return_none: true
164
164
  },
165
- 'AJAX送信': { // @逐次実行構文にて、非同期通信(Ajax)でURLにデータを送信する。成功すると『対象』にデータが代入される。 // @AJAXそうしん
165
+ 'AJAX送信': { // @(非推奨)『AJAXテキスト取得』をご利用ください。- 逐次実行構文にて、非同期通信(Ajax)でURLにデータを送信する。成功すると『対象』にデータが代入される。 // @AJAXそうしん
166
166
  type: 'func',
167
167
  josi: [['まで', 'へ', 'に']],
168
168
  pure: true,
@@ -172,7 +172,7 @@ module.exports = {
172
172
  },
173
173
  return_none: true
174
174
  },
175
- 'AJAX逐次送信': { // @逐次実行構文にて、非同期通信(Ajax)でURLにデータを送信する。成功すると『対象』にデータが代入される。 // @AJAXちくじそうしん
175
+ 'AJAX逐次送信': { // @(非推奨)『AJAXテキスト取得』をご利用ください。- 逐次実行構文にて、非同期通信(Ajax)でURLにデータを送信する。成功すると『対象』にデータが代入される。 // @AJAXちくじそうしん
176
176
  type: 'func',
177
177
  josi: [['まで', 'へ', 'に']],
178
178
  pure: true,
@@ -205,17 +205,17 @@ module.exports = {
205
205
  },
206
206
  return_none: false
207
207
  },
208
- 'HTTP取得': { // @逐次実行構文にて、非同期通信(Ajax)でURLにデータを送信する。成功すると『対象』にデータが代入される。失敗すると『AJAX失敗時』を実行。 // @HTTPしゅとく
208
+ 'HTTP取得': { // @(非推奨)『AJAXテキスト取得』をご利用ください。- 逐次実行構文にて、非同期通信(Ajax)でURLにデータを送信する。成功すると『対象』にデータが代入される。失敗すると『AJAX失敗時』を実行。 // @HTTPしゅとく
209
209
  type: 'func',
210
210
  josi: [['の', 'から', 'を']],
211
- pure: false,
211
+ pure: true,
212
212
  fn: function (url, sys) {
213
213
  if (!sys.resolve) { throw new Error('『HTTP取得』は『逐次実行』構文内で利用する必要があります。') }
214
214
  sys.__exec('AJAX逐次送信', [url, sys])
215
215
  },
216
216
  return_none: true
217
217
  },
218
- 'HTTP逐次取得': { // @逐次実行構文にて、非同期通信(Ajax)でURLにデータを送信する。成功すると『対象』にデータが代入される。失敗すると『AJAX失敗時』を実行。 // @HTTPちくじしゅとく
218
+ 'HTTP逐次取得': { // @(非推奨)『AJAXテキスト取得』をご利用ください。- 逐次実行構文にて、非同期通信(Ajax)でURLにデータを送信する。成功すると『対象』にデータが代入される。失敗すると『AJAX失敗時』を実行。 // @HTTPちくじしゅとく
219
219
  type: 'func',
220
220
  josi: [['の', 'から', 'を']],
221
221
  pure: false,
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable quote-props */
2
- module.exports = {
2
+ export default {
3
3
  // @オーディオ
4
4
  'オーディオ開': { // @オーディオファイルのURLを指定して、オーディオを読み込み、Audioオブジェクトを返す // @おーでぃおひらく
5
5
  type: 'func',
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable quote-props */
2
2
  const errMsgCanvasInit = '描画を行うためには、HTML内にcanvasを配置し、idを振って『描画開始』命令に指定します。'
3
3
 
4
- module.exports = {
4
+ export default {
5
5
  // @描画
6
6
  '描画開始': { // @描画先にCanvas(文字列でクエリの指定も可)を指定して描画API(2D)の利用準備する // @びょうがかいし
7
7
  type: 'func',
@@ -1,5 +1,5 @@
1
1
  // @ts-nocheck
2
- module.exports = {
2
+ export default {
3
3
  // @グラフ描画_CHARTJS
4
4
  'グラフ描画': { // @ Chart.jsを利用して、DATAのグラフを描画 // @ぐらふびょうが
5
5
  type: 'func',