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.
- package/batch/command.txt +370 -334
- package/batch/jsplugin2text.nako3 +1 -1
- package/batch/pickup_command.nako3 +12 -0
- package/core/command/snako.mts +5 -1
- package/core/deno/snako.ts +5 -1
- package/core/package-lock.json +382 -21
- package/core/package.json +4 -4
- package/core/src/nako3.mts +178 -614
- package/core/src/nako_basic_plugins.mts +39 -0
- package/core/src/nako_core_version.mts +2 -2
- package/core/src/nako_csv.mts +0 -1
- package/core/src/nako_event.mts +49 -0
- package/core/src/nako_gen.mts +291 -202
- package/core/src/nako_indent_inline.mts +2 -2
- package/core/src/nako_lex_rules.mts +1 -1
- package/core/src/nako_parser3.mts +106 -165
- package/core/src/nako_parser_async.mts +97 -0
- package/core/src/nako_parser_base.mts +4 -55
- package/core/src/nako_parser_message.mts +105 -0
- package/core/src/nako_parser_operator.mts +93 -0
- package/core/src/nako_plugin_manager.mts +260 -0
- package/core/src/nako_require.mts +292 -0
- package/core/src/nako_runner.mts +191 -0
- package/core/src/nako_tokenizer.mts +221 -0
- package/core/src/plugin_csv.mts +1 -1
- package/core/src/plugin_system.mts +34 -3259
- package/core/src/plugin_system_array.mts +699 -0
- package/core/src/plugin_system_datetime.mts +368 -0
- package/core/src/plugin_system_debug.mts +403 -0
- package/core/src/plugin_system_dict.mts +85 -0
- package/core/src/plugin_system_json.mts +73 -0
- package/core/src/plugin_system_math.mts +383 -0
- package/core/src/plugin_system_regexp.mts +120 -0
- package/core/src/plugin_system_stdio.mts +86 -0
- package/core/src/plugin_system_string.mts +666 -0
- package/core/src/plugin_system_timer.mts +152 -0
- package/core/src/plugin_system_types.mts +151 -0
- package/core/src/plugin_system_url.mts +193 -0
- package/core/src/plugin_toml.mts +3 -3
- package/core/test/fixtures/README.md +39 -0
- package/core/test/fixtures/make_parser_ast_golden.mjs +31 -0
- package/core/test/fixtures/parser_ast_golden.json +8027 -0
- package/core/test/fixtures/parser_corpus.mjs +120 -0
- package/core/test/indent_test.mjs +6 -0
- package/core/test/nako_basic_plugins_test.mjs +44 -0
- package/core/test/nako_event_test.mjs +85 -0
- package/core/test/nako_gen_perf_test.mjs +178 -0
- package/core/test/nako_parser_async_test.mjs +112 -0
- package/core/test/nako_parser_test.mjs +160 -0
- package/core/test/nako_plugin_manager_test.mjs +185 -0
- package/core/test/nako_require_test.mjs +153 -0
- package/core/test/nako_runner_test.mjs +114 -0
- package/core/test/nako_tokenizer_test.mjs +115 -0
- package/core/test/plugin_system_debug_test.mjs +141 -0
- package/core/test/plugin_system_split_test.mjs +179 -0
- package/core/test/plugin_system_test.mjs +6 -0
- package/core/tsconfig.json +0 -1
- package/package.json +17 -21
- package/release/_hash.txt +36 -36
- package/release/_script-tags.txt +16 -16
- package/release/command.json +1 -1
- package/release/command.json.js +1 -1
- package/release/command_cnako3.json +1 -1
- package/release/command_list.json +1 -1
- package/release/edit_main.js +6 -6
- package/release/edit_main.js.map +3 -3
- package/release/editor.js +6 -6
- package/release/plugin_keigo.js.map +3 -3
- package/release/plugin_markup.js +46 -46
- package/release/plugin_markup.js.map +3 -3
- package/release/plugin_weykturtle3d.js +1 -1
- package/release/plugin_weykturtle3d.js.map +3 -3
- package/release/version.js +2 -2
- package/release/version_main.js +2 -2
- package/release/version_main.js.map +1 -1
- package/release/wnako3.js +186 -213
- package/release/wnako3.js.map +4 -4
- package/release/wnako3webworker.js +172 -199
- package/release/wnako3webworker.js.map +4 -4
- package/src/cnako3mod.mjs +7 -2
- package/src/cnako3mod.mts +7 -2
- package/src/nako_version.mjs +2 -2
- package/src/nako_version.mts +2 -2
- package/src/plugin_browser_ajax.mjs +4 -4
- package/src/plugin_browser_ajax.mts +4 -4
- package/src/plugin_browser_audio.mjs +10 -10
- package/src/plugin_browser_audio.mts +10 -10
- package/src/plugin_browser_camera.mjs +4 -4
- package/src/plugin_browser_camera.mts +4 -4
- package/src/plugin_browser_canvas.mjs +2 -2
- package/src/plugin_browser_canvas.mts +2 -2
- package/src/plugin_browser_crypto.mjs +3 -3
- package/src/plugin_browser_crypto.mts +3 -3
- package/src/plugin_browser_dom_event.mjs +1 -1
- package/src/plugin_browser_dom_event.mts +1 -1
- package/src/plugin_browser_geolocation.mjs +1 -1
- package/src/plugin_browser_geolocation.mts +1 -1
- package/src/plugin_browser_hotkey.mjs +1 -1
- package/src/plugin_browser_hotkey.mts +1 -1
- package/src/plugin_browser_html.mjs +1 -1
- package/src/plugin_browser_html.mts +1 -1
- package/src/plugin_browser_location.mjs +1 -1
- package/src/plugin_browser_location.mts +1 -1
- package/src/plugin_browser_speech.mjs +1 -1
- package/src/plugin_browser_speech.mts +1 -1
- package/src/plugin_browser_storage.mjs +2 -2
- package/src/plugin_browser_storage.mts +2 -2
- package/src/plugin_httpserver.mjs +3 -3
- package/src/plugin_httpserver.mts +3 -3
- package/src/plugin_keigo.mjs +2 -2
- package/src/plugin_keigo.mts +2 -2
- package/src/plugin_node.mjs +48 -48
- package/src/plugin_node.mts +53 -53
- package/src/plugin_weykturtle3d.mjs +56 -56
- package/src/plugin_weykturtle3d.mts +56 -56
- package/src/wnako3.mjs +1 -1
- package/src/wnako3.mts +1 -1
- package/src/wnako3_editor.mjs +5 -5
- package/src/wnako3_editor.mts +5 -5
- package/src/wnako3mod.mjs +2 -2
- package/src/wnako3mod.mts +2 -2
- package/core/src/nako3.mjs +0 -1021
- package/core/src/nako_ast.mjs +0 -4
- package/core/src/nako_colors.mjs +0 -77
- package/core/src/nako_core_version.mjs +0 -8
- package/core/src/nako_csv.mjs +0 -193
- package/core/src/nako_errors.mjs +0 -166
- package/core/src/nako_from_dncl.mjs +0 -285
- package/core/src/nako_from_dncl2.mjs +0 -347
- package/core/src/nako_gen.mjs +0 -2500
- package/core/src/nako_global.mjs +0 -138
- package/core/src/nako_indent.mjs +0 -442
- package/core/src/nako_indent_chars.mjs +0 -29
- package/core/src/nako_indent_inline.mjs +0 -361
- package/core/src/nako_josi_list.mjs +0 -47
- package/core/src/nako_lex_rules.mjs +0 -319
- package/core/src/nako_lexer.mjs +0 -794
- package/core/src/nako_logger.mjs +0 -221
- package/core/src/nako_parser3.mjs +0 -3250
- package/core/src/nako_parser_base.mjs +0 -403
- package/core/src/nako_parser_const.mjs +0 -37
- package/core/src/nako_prepare.mjs +0 -329
- package/core/src/nako_reserved_words.mjs +0 -42
- package/core/src/nako_source_mapping.mjs +0 -207
- package/core/src/nako_test.mjs +0 -37
- package/core/src/nako_token.mjs +0 -1
- package/core/src/nako_tools.mjs +0 -53
- package/core/src/nako_types.mjs +0 -14
- package/core/src/plugin_api.mjs +0 -4
- package/core/src/plugin_csv.mjs +0 -97
- package/core/src/plugin_math.mjs +0 -352
- package/core/src/plugin_promise.mjs +0 -102
- package/core/src/plugin_system.mjs +0 -3810
- package/core/src/plugin_test.mjs +0 -52
- 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
|
+
}
|