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
@@ -0,0 +1,403 @@
1
+ /**
2
+ * @fileOverview なでしこ3 plugin_system の分割ファイル
3
+ *
4
+ * 特殊命令・デバッグ支援・プラグイン管理の命令を定義する。
5
+ * このファイルは単独のプラグインではなく、plugin_system.mts へマージされる。(#2351)
6
+ */
7
+ import { NakoSystem } from './plugin_api.mjs'
8
+
9
+ export default {
10
+ // @特殊命令
11
+ 'JS実行': { // @JavaScriptのコードSRCを実行する(変数sysでなでしこシステムを参照できる) // @JSじっこう
12
+ type: 'func',
13
+ josi: [['を', 'で']],
14
+ pure: true,
15
+ fn: function(src: string, sys: NakoSystem) {
16
+ return sys.__evalJS(src, sys) // #1733
17
+ }
18
+ },
19
+ 'JSオブジェクト取得': { // @なでしこで定義した関数や変数nameのJavaScriptオブジェクトを取得する // @JSおぶじぇくとしゅとく
20
+ type: 'func',
21
+ josi: [['の']],
22
+ pure: false,
23
+ fn: function(name: string, sys: any) {
24
+ return sys.__findVar(name, null)
25
+ }
26
+ },
27
+ 'JS関数実行': { // @JavaScriptの関数NAMEを引数ARGS(配列)で実行する // @JSかんすうじっこう
28
+ type: 'func',
29
+ josi: [['を'], ['で']],
30
+ fn: function(name: any, args: any, sys: NakoSystem) {
31
+ // nameが文字列ならevalして関数を得る
32
+
33
+ if (typeof name === 'string') { name = sys.__evalJS(name, sys) }
34
+ if (typeof name !== 'function') { throw new Error('JS関数取得で実行できません。') }
35
+
36
+ // argsがArrayでなければArrayに変換する
37
+ if (!(args instanceof Array)) { args = [args] }
38
+
39
+ // 実行
40
+ // eslint-disable-next-line prefer-spread
41
+ return name.apply(null, args)
42
+ }
43
+ },
44
+ 'ASYNC': { // @なでしこのユーザー関数定義でASYNC(非同期関数である)ことを宣言する // @ASYNC
45
+ type: 'func',
46
+ josi: [],
47
+ asyncFn: true,
48
+ pure: true,
49
+ fn: async function() {
50
+ // empty
51
+ },
52
+ return_none: true
53
+ },
54
+ 'AWAIT実行': { // @JavaScriptの非同期関数(Promise/async関数)のFを引数ARGSでawait実行する // @AWAITじっこう
55
+ type: 'func',
56
+ josi: [['を'], ['で']],
57
+ pure: true,
58
+ asyncFn: true,
59
+ fn: async function(f: any, args: any, sys: any) {
60
+ // nameが文字列ならevalして関数を得る
61
+ if (typeof f === 'string') { f = sys.__findFunc(f, 'AWAIT実行') }
62
+ if (!(f instanceof Function)) { throw new Error('『AWAIT実行』の第一引数はなでしこ関数名かFunction型で指定してください。') }
63
+ // argsがArrayでなければArrayに変換する
64
+ if (!(args instanceof Array)) { args = [args] }
65
+ // 実行
66
+ return await f(...args)
67
+ }
68
+ },
69
+ 'JSメソッド実行': { // @JavaScriptのオブジェクトOBJのメソッドMを引数ARGS(配列)で実行する // @JSめそっどじっこう
70
+ type: 'func',
71
+ josi: [['の'], ['を'], ['で']],
72
+ fn: function(obj: any, m: any, args: any, sys: NakoSystem) {
73
+ // objが文字列ならevalして関数を得る
74
+
75
+ if (typeof obj === 'string') { obj = sys.__evalJS(obj, sys) }
76
+ if (typeof obj !== 'object') { throw new Error('JSオブジェクトを取得できませんでした。') }
77
+
78
+ // method を求める
79
+ if (typeof m !== 'function') {
80
+ m = obj[m]
81
+ }
82
+
83
+ // argsがArrayでなければArrayに変換する
84
+ if (!(args instanceof Array)) { args = [args] }
85
+
86
+ // 実行
87
+ return m.apply(obj, args)
88
+ }
89
+ },
90
+
91
+ 'ナデシコ': { // @なでしこのコードCODEを実行する // @なでしこする
92
+ type: 'func',
93
+ josi: [['を', 'で']],
94
+ pure: false,
95
+ asyncFn: true,
96
+ fn: async function(code: string, sys: any) {
97
+ const options = {
98
+ resetEnv: false,
99
+ resetAll: true,
100
+ nakoGlobal: sys
101
+ }
102
+ const tmpLog = String(sys.__getSysVar('表示ログ', ''))
103
+ sys.__setSysVar('表示ログ', '')
104
+ await sys.__self.runAsync(code, sys.__modName, options)
105
+ const outLog = String(sys.__getSysVar('表示ログ'))
106
+ sys.__setSysVar('表示ログ', tmpLog + outLog)
107
+ return outLog
108
+ }
109
+ },
110
+ 'ナデシコ続': { // @なでしこのコードCODEを実行する // @なでしこつづける
111
+ type: 'func',
112
+ josi: [['を', 'で']],
113
+ pure: false,
114
+ asyncFn: true,
115
+ fn: async function(code: string, sys: any) {
116
+ const options = {
117
+ resetEnv: false,
118
+ resetAll: false,
119
+ nakoGlobal: sys.__self
120
+ }
121
+ const tmpLog = sys.__getSysVar('表示ログ', '')
122
+ sys.__setSysVar('表示ログ', '')
123
+ await sys.__self.runAsync(code, sys.__modName, options)
124
+ const outLog = String(sys.__getSysVar('表示ログ'))
125
+ if (outLog) {
126
+ sys.logger.trace(outLog)
127
+ }
128
+ sys.__setSysVar('表示ログ', tmpLog + outLog)
129
+ return outLog
130
+ }
131
+ },
132
+ '実行': { // @ 無名関数(あるいは、文字列で関数名を指定)Fを実行する(Fが関数でなければ無視する) // @じっこう
133
+ type: 'func',
134
+ josi: [['を', 'に', 'で']],
135
+ pure: false,
136
+ fn: function(f: any, sys: any) {
137
+ // #938 の規則に従って処理
138
+ // 引数が関数なら実行
139
+ if (typeof f === 'function') { return f(sys) }
140
+ // 文字列なら関数に変換できるか判定して実行
141
+ if (typeof f === 'string') {
142
+ const tf = sys.__findFunc(f, '実行')
143
+ if (typeof tf === 'function') {
144
+ return tf(sys)
145
+ }
146
+ }
147
+ // それ以外ならそのまま値を返す
148
+ return f
149
+ }
150
+ },
151
+ '実行時間計測': { // @ 関数Fを実行して要した時間をミリ秒で返す // @じっこうじかんけいそく
152
+ type: 'func',
153
+ josi: [['の']],
154
+ pure: false,
155
+ fn: function(f: any, sys: any) {
156
+ if (typeof f === 'string') { f = sys.__findFunc(f, '実行時間計測') }
157
+ //
158
+ if (typeof performance !== 'undefined' && performance.now) {
159
+ const t1 = performance.now()
160
+ f(sys)
161
+ const t2 = performance.now()
162
+ return (t2 - t1)
163
+ } else {
164
+ const t1 = Date.now()
165
+ f(sys)
166
+ const t2 = Date.now()
167
+ return (t2 - t1)
168
+ }
169
+ }
170
+ },
171
+ '終': { // @終わる // @おわる
172
+ type: 'func',
173
+ josi: [],
174
+ pure: true,
175
+ fn: function(sys: NakoSystem) {
176
+ // デバッグモードでなければ例外を投げることでプログラムを終了させる
177
+ sys.__setSysVar('__forceClose', true)
178
+ if (!sys.__getSysVar('__useDebug')) { throw new Error('__終わる__') }
179
+ }
180
+ },
181
+
182
+ // @デバッグ支援
183
+ 'デバッグ表示': { // @デバッグ用にSを表示する // @でばっぐひょうじ
184
+ type: 'func',
185
+ josi: [['と', 'を', 'の']],
186
+ pure: true,
187
+ fn: function(s: any, sys: NakoSystem) {
188
+ // 行番号の情報を得る
189
+ const lineInfo: string = String(sys.__getSysVar('__line', 0)) + '::'
190
+ const a = lineInfo.split(':', 2)
191
+ const no = parseInt(String(a[0]).replace('l', '')) + 1
192
+ const fname = a[1]
193
+ // オブジェクトならJSON文字列に変換
194
+ if (typeof s === 'object') {
195
+ s = JSON.stringify(s)
196
+ }
197
+ s = `${fname}(${no}): ${s}`
198
+ sys.__exec('表示', [s, sys])
199
+ },
200
+ return_none: true
201
+ },
202
+ 'ハテナ関数設定': { // @ハテナ関数「?? (計算式)」の動作をカスタマイズする。文字列の配列を指定可能で、システム関数名か「js:code」を指定可能。 // @はてなかんすうせってい
203
+ type: 'func',
204
+ josi: [['を', 'の']],
205
+ pure: true,
206
+ fn: function(s: any, sys: NakoSystem) {
207
+ if (typeof s === 'function') {
208
+ sys.__hatena = s
209
+ return
210
+ }
211
+ if (typeof s === 'string') {
212
+ sys.__hatena = sys.__getSysVar(s, 'デバッグ表示')
213
+ return
214
+ }
215
+ if (s instanceof Array) {
216
+ const fa: ((s: string, sys: NakoSystem)=>string)[] = (s as Array<string>).map((fstr: string) => {
217
+ if (fstr.substring(0, 3) === 'JS:') {
218
+ const code = fstr.substring(3)
219
+ return sys.__evalJS(code, sys)
220
+ } else {
221
+ return sys.__getSysVar(fstr, 'デバッグ表示')
222
+ }
223
+ })
224
+ sys.__hatena = (p: any, sys: NakoSystem) => {
225
+ let param: any = p
226
+ for (const f of fa) {
227
+ param = f(param, sys)
228
+ }
229
+ }
230
+ return
231
+ }
232
+ sys.__hatena = sys.__getSysVar('デバッグ表示')
233
+ },
234
+ return_none: true
235
+ },
236
+ 'ハテナ関数実行': { // @『ハテナ関数設定』で設定した関数を実行する // @はてなかんすうじっこう
237
+ type: 'func',
238
+ josi: [['の', 'を', 'と']],
239
+ pure: true,
240
+ fn: function(s: any, sys: NakoSystem) {
241
+ sys.__hatena(s, sys)
242
+ },
243
+ return_none: true
244
+ },
245
+ 'エラー発生': { // @故意にエラーSを発生させる // @えらーはっせい
246
+ type: 'func',
247
+ josi: [['の', 'で']],
248
+ pure: true,
249
+ fn: function(s: any) {
250
+ throw new Error(s)
251
+ },
252
+ return_none: true
253
+ },
254
+ '__DEBUG': { // @デバッグモードにする // @__DEBUG
255
+ type: 'func',
256
+ josi: [],
257
+ pure: true,
258
+ fn: function(sys: NakoSystem) {
259
+ sys.isDebug = true
260
+ console.log(sys)
261
+ }
262
+ },
263
+ '__DEBUG強制待機': { type: 'const', value: 0 }, // @__DEBUGきょうせいたいき
264
+ '__DEBUGブレイクポイント一覧': { type: 'const', value: [] }, // @__DEBUGぶれいくぽいんといちらん
265
+ '__DEBUG待機フラグ': { type: 'const', value: 0 }, // @__DEBUGたいきふらぐ
266
+ '__DEBUG_BP_WAIT': { // @エディタのブレイクポイント機能のための待機 // @__DEBUG_BP_WAIT
267
+ type: 'func',
268
+ josi: [['で']],
269
+ pure: true,
270
+ asyncFn: true,
271
+ fn: function(curLine: number, sys: any) {
272
+ return new Promise((resolve) => {
273
+ const breakpoints = sys.__getSysVar('__DEBUGブレイクポイント一覧')
274
+ const forceLine = sys.__getSysVar('__DEBUG強制待機')
275
+ sys.__setSysVar('__DEBUG強制待機', 0)
276
+ // ブレイクポイント or __DEBUG強制待機 が指定されたか?
277
+ if (breakpoints.indexOf(curLine) >= 0 || forceLine) {
278
+ if (sys.__getSysVar('プラグイン名') !== 'メイン') { return } // 現状メインのみデバッグする
279
+ console.log(`@__DEBUG_BP_WAIT(${curLine})`)
280
+ const timerId = setInterval(() => {
281
+ if (sys.__getSysVar('__DEBUG待機フラグ') === 1) {
282
+ sys.__setSysVar('__DEBUG待機フラグ', 0)
283
+ clearInterval(timerId)
284
+ resolve(curLine)
285
+ }
286
+ }, 500)
287
+ } else {
288
+ resolve(curLine)
289
+ }
290
+ })
291
+ }
292
+ },
293
+ 'グローバル関数一覧取得': { // @グローバル変数にある関数一覧を取得 // @ぐろーばるかんすういちらんしゅとく
294
+ type: 'func',
295
+ josi: [],
296
+ pure: true,
297
+ fn: function(sys: NakoSystem) {
298
+ const vars: Map<string, any> = (sys as any).__varslist[1]
299
+ const res: string[] = []
300
+ for (const key of vars.keys()) {
301
+ res.push(key)
302
+ }
303
+ return res
304
+ }
305
+ },
306
+ 'システム関数一覧取得': { // @システム関数の一覧を取得 // @しすてむかんすういちらんしゅとく
307
+ type: 'func',
308
+ josi: [],
309
+ pure: true,
310
+ fn: function(sys: NakoSystem) {
311
+ const vars: Map<string, any> = (sys as any).__v0
312
+ const res: string[] = []
313
+ for (const key of vars.keys()) {
314
+ if (key.startsWith('__') || key.startsWith('!') || key === 'meta') { continue }
315
+ res.push(key)
316
+ }
317
+ return res
318
+ }
319
+ },
320
+ 'システム関数存在': { // @文字列で関数名を指定してシステム関数が存在するかを調べる // @しすてむかんすうそんざい
321
+ type: 'func',
322
+ josi: [['が', 'の']],
323
+ pure: true,
324
+ fn: function(fname: string, sys: any) {
325
+ return (typeof sys.__getSysVar(fname) !== 'undefined')
326
+ }
327
+ },
328
+ 'プラグイン一覧取得': { // @利用中のプラグイン一覧を得る // @ぷらぐいんいちらんしゅとく
329
+ type: 'func',
330
+ josi: [],
331
+ pure: true,
332
+ fn: function(sys: NakoSystem) {
333
+ const a = []
334
+ for (const f in (sys as any).pluginfiles) { a.push(f) }
335
+ return a
336
+ }
337
+ },
338
+ 'モジュール一覧取得': { // @取り込んだモジュール一覧を得る // @もじゅーるいちらんしゅとく
339
+ type: 'func',
340
+ josi: [],
341
+ pure: true,
342
+ fn: function(sys: NakoSystem) {
343
+ const a = []
344
+ for (const f in (sys as any).__module) { a.push(f) }
345
+ return a
346
+ }
347
+ },
348
+ '助詞一覧取得': { // @文法として定義されている助詞の一覧を取得する // @じょしいちらんしゅとく
349
+ type: 'func',
350
+ josi: [],
351
+ pure: true,
352
+ asyncFn: false,
353
+ fn: function(sys: NakoSystem) {
354
+ return sys.josiList
355
+ }
356
+ },
357
+ '予約語一覧取得': { // @文法として定義されている予約語の一覧を取得する // @よやくごいちらんしゅとく
358
+ type: 'func',
359
+ josi: [],
360
+ pure: true,
361
+ asyncFn: false,
362
+ fn: function(sys: NakoSystem) {
363
+ return sys.reservedWords
364
+ }
365
+ },
366
+ // @プラグイン管理
367
+ 'プラグイン名': { type: 'const', value: 'メイン' }, // @ぷらぐいんめい
368
+ 'プラグイン名設定': { // @プラグイン名をSに変更する(システムにより自動的に「メイン」あるいはプラグインのファイル名が呼ばれる) // @ぷらぐいんめいせってい
369
+ type: 'func',
370
+ josi: [['に', 'へ']],
371
+ pure: true,
372
+ fn: function(s: string, sys: any) {
373
+ sys.__setSysVar('プラグイン名', s)
374
+ },
375
+ return_none: true
376
+ },
377
+ '名前空間': { type: 'const', value: '' }, // @なまえくうかん
378
+ '名前空間設定': { // @名前空間をSに設定する(システムにより自動的に変更される。ファイル名から拡張子を削ったもの) // @なまえくうかんせってい
379
+ type: 'func',
380
+ josi: [['に', 'へ']],
381
+ pure: true,
382
+ fn: function(s: string, sys: NakoSystem) {
383
+ // push namespace
384
+ (sys as any).__namespaceList.push([sys.__getSysVar('名前空間'), sys.__getSysVar('プラグイン名')])
385
+ sys.__setSysVar('名前空間', s)
386
+ },
387
+ return_none: true
388
+ },
389
+ '名前空間ポップ': { // @システム利用のため呼ぶべからず。(名前空間を一つ前の値に戻す) // @なまえくうかんぽっぷ
390
+ type: 'func',
391
+ josi: [],
392
+ pure: true,
393
+ fn: function(sys: NakoSystem) {
394
+ // pop namespace
395
+ const a = (sys as any).__namespaceList.pop()
396
+ if (a) {
397
+ sys.__setSysVar('名前空間', a[0])
398
+ sys.__setSysVar('プラグイン名', a[1])
399
+ }
400
+ },
401
+ return_none: true
402
+ }
403
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * @fileOverview なでしこ3 plugin_system の分割ファイル
3
+ *
4
+ * 辞書型変数の操作・ハッシュの命令を定義する。
5
+ * このファイルは単独のプラグインではなく、plugin_system.mts へマージされる。(#2351)
6
+ */
7
+ export default {
8
+ // @辞書型変数の操作
9
+ '辞書キー列挙': { // @辞書型変数Aのキーの一覧を配列で返す。 // @じしょきーれっきょ
10
+ type: 'func',
11
+ josi: [['の']],
12
+ pure: true,
13
+ fn: function(a: any) {
14
+ const keys = []
15
+ if (a instanceof Object) { // オブジェクトのキーを返す
16
+ for (const key in a) { keys.push(key) }
17
+ return keys
18
+ }
19
+ if (a instanceof Array) { // 配列なら数字を返す
20
+ for (let i = 0; i < a.length; i++) { keys.push(i) }
21
+ return keys
22
+ }
23
+ throw new Error('『辞書キー列挙』でハッシュ以外が与えられました。')
24
+ }
25
+ },
26
+ '辞書キー削除': { // @辞書型変数AからキーKEYを削除して返す(A自体を変更する)。 // @じしょきーさくじょ
27
+ type: 'func',
28
+ josi: [['から', 'の'], ['を']],
29
+ pure: true,
30
+ fn: function(a: any, key: any) {
31
+ if (a instanceof Object) { // オブジェクトのキーを返す
32
+ if (key in a) { delete a[key] }
33
+ return a
34
+ }
35
+ throw new Error('『辞書キー削除』でハッシュ以外が与えられました。')
36
+ }
37
+ },
38
+ '辞書キー存在': { // @辞書型変数AのキーKEYが存在するか確認 // @じしょきーそんざい
39
+ type: 'func',
40
+ josi: [['の', 'に'], ['が']],
41
+ pure: true,
42
+ fn: function(a: any, key: any) {
43
+ return key in a
44
+ }
45
+ },
46
+
47
+ // @ハッシュ
48
+ 'ハッシュキー列挙': { // @ハッシュAのキー一覧を配列で返す。 // @はっしゅきーれっきょ
49
+ type: 'func',
50
+ josi: [['の']],
51
+ pure: true,
52
+ fn: function(a: any, sys: any) {
53
+ return sys.__exec('辞書キー列挙', [a, sys])
54
+ }
55
+ },
56
+ 'ハッシュ内容列挙': { // @ハッシュAの内容一覧を配列で返す。 // @はっしゅないようれっきょ
57
+ type: 'func',
58
+ josi: [['の']],
59
+ pure: true,
60
+ fn: function(a: any) {
61
+ const body = []
62
+ if (a instanceof Object) { // オブジェクトのキーを返す
63
+ for (const key in a) { body.push(a[key]) }
64
+ return body
65
+ }
66
+ throw new Error('『ハッシュ内容列挙』でハッシュ以外が与えられました。')
67
+ }
68
+ },
69
+ 'ハッシュキー削除': { // @ハッシュAからキーKEYを削除して返す。 // @はっしゅきーさくじょ
70
+ type: 'func',
71
+ josi: [['から', 'の'], ['を']],
72
+ pure: true,
73
+ fn: function(a: any, key: any, sys: any) {
74
+ return sys.__exec('辞書キー削除', [a, key, sys])
75
+ }
76
+ },
77
+ 'ハッシュキー存在': { // @ハッシュAのキーKEYが存在するか確認 // @はっしゅきーそんざい
78
+ type: 'func',
79
+ josi: [['の', 'に'], ['が']],
80
+ pure: true,
81
+ fn: function(a: any, key: any) {
82
+ return key in a
83
+ }
84
+ },
85
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @fileOverview なでしこ3 plugin_system の分割ファイル
3
+ *
4
+ * JSON処理の命令を定義する。
5
+ * このファイルは単独のプラグインではなく、plugin_system.mts へマージされる。(#2351)
6
+ */
7
+ export default {
8
+ // @JSON
9
+ 'JSON変換': { // @オブジェクトVをJSON形式の文字列に変換して返す // @JSONへんかん
10
+ type: 'func',
11
+ josi: [['を', 'の', 'から']],
12
+ pure: true,
13
+ fn: function(v: any) {
14
+ return JSON.stringify(v)
15
+ }
16
+ },
17
+ 'JSON取得': { // @JSON文字列をパースして、なでしこのオブジェクトとして返す // @JSONしゅとく
18
+ type: 'func',
19
+ josi: [['を', 'の', 'から']],
20
+ pure: true,
21
+ fn: function(v: any) {
22
+ return JSON.parse(v)
23
+ }
24
+ },
25
+ 'JSONエンコード': { // @オブジェクトVをJSON形式に変換して返す(『JSON変換』と同じ) // @JSONえんこーど
26
+ type: 'func',
27
+ josi: [['を', 'の']],
28
+ pure: true,
29
+ fn: function(v: any) {
30
+ return JSON.stringify(v)
31
+ }
32
+ },
33
+ 'JSONエンコード整形': { // @オブジェクトVをJSON形式の文字列(整形済み)に変換して整形して返す // @JSONえんこーどせいけい
34
+ type: 'func',
35
+ josi: [['を', 'の']],
36
+ pure: true,
37
+ fn: function(v: any) {
38
+ return JSON.stringify(v, null, 2)
39
+ }
40
+ },
41
+ 'JSONデコード': { // @JSON文字列Sをオブジェクトにして返す(『JSON取得』と同じ) // @JSONでこーど
42
+ type: 'func',
43
+ josi: [['を', 'の', 'から']],
44
+ pure: true,
45
+ fn: function(s: string): string {
46
+ return JSON.parse(s)
47
+ }
48
+ },
49
+ 'JSON_E': { // @オブジェクトVをJSON形式の文字列に変換して返す(『JSON変換』と同じ) // @JSON_E
50
+ type: 'func',
51
+ josi: [['を', 'の']],
52
+ pure: true,
53
+ fn: function(v: any) {
54
+ return JSON.stringify(v)
55
+ }
56
+ },
57
+ 'JSON_ES': { // @オブジェクトVをJSON形式の文字列(整形済み)に変換して返す(『JSONエンコード整形』と同じ) // @JSON_ES
58
+ type: 'func',
59
+ josi: [['を', 'の']],
60
+ pure: true,
61
+ fn: function(v: any) {
62
+ return JSON.stringify(v, null, 2)
63
+ }
64
+ },
65
+ 'JSON_D': { // @JSON文字列Sをオブジェクトにして返す(『JSON取得』と同じ) // @JSON_D
66
+ type: 'func',
67
+ josi: [['を', 'の', 'から']],
68
+ pure: true,
69
+ fn: function(s: string): string {
70
+ return JSON.parse(s)
71
+ }
72
+ },
73
+ }