nadesiko3 3.4.21 → 3.4.23
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/README.md +3 -2
- package/batch/command.txt +93 -17
- package/batch/command_nakopad.txt +75 -3
- package/batch/pickup_command.nako3 +2 -0
- package/core/deno/snako.ts +1 -1
- package/core/package-lock.json +586 -628
- package/core/package.json +1 -1
- package/core/src/nako3.mjs +29 -1
- package/core/src/nako3.mts +27 -1
- package/core/src/nako_core_version.mjs +2 -2
- package/core/src/nako_core_version.mts +2 -2
- package/core/src/nako_lex_rules.mts +1 -1
- package/core/src/nako_parser3.mjs +33 -34
- package/core/src/nako_parser3.mts +45 -53
- package/core/src/plugin_system.mts +2 -2
- package/demo/index.html +3 -6
- package/package.json +2 -2
- package/release/_hash.txt +24 -24
- package/release/_script-tags.txt +14 -14
- 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/editor.js +1 -1
- package/release/editor.js.map +1 -1
- package/release/nako_gen_async.js +1 -1
- package/release/nako_gen_async.js.map +1 -1
- package/release/stats.json +1 -1
- package/release/version.js +1 -1
- package/release/version.js.map +1 -1
- package/release/wnako3.js +1 -1
- package/release/wnako3.js.map +1 -1
- package/release/wnako3webworker.js +1 -1
- package/release/wnako3webworker.js.map +1 -1
- package/src/browsers.json +1 -1
- package/src/nako_version.mjs +2 -2
- package/src/nako_version.mts +2 -2
- package/src/plugin_browser.mjs +15 -2
- package/src/plugin_browser.mts +15 -2
- package/src/plugin_browser_chart.mjs +29 -23
- package/src/plugin_browser_chart.mts +29 -23
- package/src/plugin_browser_dialog.mjs +3 -2
- package/src/plugin_browser_dialog.mts +4 -3
- package/src/plugin_browser_dom_parts.mjs +20 -0
- package/src/plugin_browser_dom_parts.mts +20 -0
- package/test/common/plugin_browser_ut_dialog_test.mjs +2 -2
- package/test/node/plugin_node_test.mjs +8 -0
- package/test/selenium/requirements.txt +1 -1
- package/test/selenium/test_chrome.py +1 -1
package/core/package.json
CHANGED
package/core/src/nako3.mjs
CHANGED
|
@@ -131,11 +131,39 @@ export class NakoCompiler {
|
|
|
131
131
|
tokens[i + 2].value === '取込')) {
|
|
132
132
|
continue;
|
|
133
133
|
}
|
|
134
|
+
// 取り込むライブラリ
|
|
135
|
+
let filename = tokens[i + 1].value + '';
|
|
136
|
+
// 『取り込む』文で「拡張プラグイン:」機構を追加する #139
|
|
137
|
+
// (ex) !『拡張プラグイン:music.js@1.0.2』を取り込む → https://cdn.jsdelivr.net/npm/nadesiko3-music@1.0.2/nadesiko3-music.js
|
|
138
|
+
if (filename.startsWith('拡張プラグイン:')) {
|
|
139
|
+
const name = filename.split(':')[1];
|
|
140
|
+
const m = name.match(/^([a-zA-Z0-9_-]+)\.(js|mjs|nako3)(@[0-9.]+)?$/);
|
|
141
|
+
if (m) {
|
|
142
|
+
let basename = m[1];
|
|
143
|
+
const ext = m[2];
|
|
144
|
+
const version = m[3] || '@latest';
|
|
145
|
+
if (ext === 'js' || ext === 'mjs') {
|
|
146
|
+
// JSプラグイン
|
|
147
|
+
if (!basename.startsWith('nadesiko3-')) {
|
|
148
|
+
basename = `nadesiko3-${basename}`;
|
|
149
|
+
}
|
|
150
|
+
filename = `https://cdn.jsdelivr.net/npm/${basename}${version}/${basename}.${ext}`;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// なでしこ3プラグイン
|
|
154
|
+
filename = `https://n3s.nadesi.com/plain/${basename}.${ext}`;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
throw new NakoImportError('『取込』の指定エラー。『拡張プラグイン:(ファイル名).(js|nako3)(@ver)』の書式で指定してください。', tokens[i].file, tokens[i].line);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// push
|
|
134
162
|
requireStatements.push({
|
|
135
163
|
...tokens[i],
|
|
136
164
|
start: i,
|
|
137
165
|
end: i + 3,
|
|
138
|
-
value:
|
|
166
|
+
value: filename,
|
|
139
167
|
firstToken: tokens[i],
|
|
140
168
|
lastToken: tokens[i + 2]
|
|
141
169
|
});
|
package/core/src/nako3.mts
CHANGED
|
@@ -212,11 +212,37 @@ export class NakoCompiler {
|
|
|
212
212
|
tokens[i + 2].value === '取込')) {
|
|
213
213
|
continue
|
|
214
214
|
}
|
|
215
|
+
// 取り込むライブラリ
|
|
216
|
+
let filename = tokens[i + 1].value + ''
|
|
217
|
+
// 『取り込む』文で「拡張プラグイン:」機構を追加する #139
|
|
218
|
+
// (ex) !『拡張プラグイン:music.js@1.0.2』を取り込む → https://cdn.jsdelivr.net/npm/nadesiko3-music@1.0.2/nadesiko3-music.js
|
|
219
|
+
if (filename.startsWith('拡張プラグイン:')) {
|
|
220
|
+
const name = filename.split(':')[1]
|
|
221
|
+
const m = name.match(/^([a-zA-Z0-9_-]+)\.(js|mjs|nako3)(@[0-9.]+)?$/)
|
|
222
|
+
if (m) {
|
|
223
|
+
let basename = m[1]
|
|
224
|
+
const ext = m[2]
|
|
225
|
+
const version = m[3] || '@latest'
|
|
226
|
+
if (ext === 'js' || ext === 'mjs') {
|
|
227
|
+
// JSプラグイン
|
|
228
|
+
if (!basename.startsWith('nadesiko3-')) {
|
|
229
|
+
basename = `nadesiko3-${basename}`
|
|
230
|
+
}
|
|
231
|
+
filename = `https://cdn.jsdelivr.net/npm/${basename}${version}/${basename}.${ext}`
|
|
232
|
+
} else {
|
|
233
|
+
// なでしこ3プラグイン
|
|
234
|
+
filename = `https://n3s.nadesi.com/plain/${basename}.${ext}`
|
|
235
|
+
}
|
|
236
|
+
} else {
|
|
237
|
+
throw new NakoImportError('『取込』の指定エラー。『拡張プラグイン:(ファイル名).(js|nako3)(@ver)』の書式で指定してください。', tokens[i].file, tokens[i].line)
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// push
|
|
215
241
|
requireStatements.push({
|
|
216
242
|
...tokens[i],
|
|
217
243
|
start: i,
|
|
218
244
|
end: i + 3,
|
|
219
|
-
value:
|
|
245
|
+
value: filename,
|
|
220
246
|
firstToken: tokens[i],
|
|
221
247
|
lastToken: tokens[i + 2]
|
|
222
248
|
})
|
|
@@ -72,7 +72,7 @@ export const rules: NakoLexRule[] = [
|
|
|
72
72
|
{ name: 'gteq', pattern: /^(≧|>=|=>)/ },
|
|
73
73
|
{ name: 'lteq', pattern: /^(≦|<=|=<)/ },
|
|
74
74
|
{ name: 'noteq', pattern: /^(≠|<>|!=)/ },
|
|
75
|
-
{ name: '←', pattern: /^(←|<--)/ }, //
|
|
75
|
+
{ name: '←', pattern: /^(←|<--)/ }, // 矢印 --- ただし(core#140)で廃止された演算子(#891,#899)
|
|
76
76
|
{ name: 'eq', pattern: /^(==|🟰🟰)/ },
|
|
77
77
|
{ name: 'eq', pattern: /^(=|🟰)/ },
|
|
78
78
|
{ name: 'line_comment', pattern: /^(!|💡)(インデント構文|ここまでだるい|DNCLモード|DNCL2モード|DNCL2)[^\n]*/ }, // #1184
|
|
@@ -128,9 +128,6 @@ export class NakoParser extends NakoParserBase {
|
|
|
128
128
|
if (this.accept(['続ける'])) {
|
|
129
129
|
return { type: 'continue', josi: '', ...map, end: this.peekSourceMap() };
|
|
130
130
|
}
|
|
131
|
-
if (this.accept(['require', 'string', '取込'])) {
|
|
132
|
-
return this.yRequire();
|
|
133
|
-
}
|
|
134
131
|
if (this.accept(['not', '非同期モード'])) {
|
|
135
132
|
return this.yASyncMode();
|
|
136
133
|
}
|
|
@@ -146,11 +143,8 @@ export class NakoParser extends NakoParserBase {
|
|
|
146
143
|
if (this.accept(['not', 'モジュール公開既定値', 'eq', 'string'])) {
|
|
147
144
|
return this.yExportDefault(this.y[3].value);
|
|
148
145
|
}
|
|
149
|
-
//
|
|
150
|
-
if (this.
|
|
151
|
-
const word = this.get() || NewEmptyToken();
|
|
152
|
-
throw NakoSyntaxError.fromNode(`関数代入演算子『←』は廃止されました。『${word.value}←』の部分。`, word);
|
|
153
|
-
}
|
|
146
|
+
// (memo) 現状「取込」はプリプロセス段階(NakoCompiler.listRequireStatements)で処理される
|
|
147
|
+
// if (this.accept(['require', 'string', '取込'])) { return this.yRequire() }
|
|
154
148
|
if (this.check2(['func', 'eq'])) {
|
|
155
149
|
const word = this.get() || NewEmptyToken();
|
|
156
150
|
throw NakoSyntaxError.fromNode(`関数『${word.value}』に代入できません。`, word);
|
|
@@ -225,32 +219,35 @@ export class NakoParser extends NakoParserBase {
|
|
|
225
219
|
/** @returns {Ast} */
|
|
226
220
|
yExportDefault(mode) {
|
|
227
221
|
const map = this.peekSourceMap();
|
|
228
|
-
this.isExportDefault = mode === '公開'
|
|
222
|
+
this.isExportDefault = mode === '公開';
|
|
229
223
|
this.moduleExport[this.modName] = this.isExportDefault;
|
|
230
224
|
return { type: 'eol', ...map, end: this.peekSourceMap() };
|
|
231
225
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
226
|
+
/*
|
|
227
|
+
// NakoCompiler.listRequireStatements で実装されているので不要
|
|
228
|
+
yRequire (): Ast {
|
|
229
|
+
console.log('@@@yRequire')
|
|
230
|
+
const nameToken = this.y[1]
|
|
231
|
+
const filename: string = nameToken.value
|
|
232
|
+
const modName = NakoLexer.filenameToModName(filename)
|
|
233
|
+
if (this.modList.indexOf(modName) < 0) {
|
|
234
|
+
// 優先度が最も高いのは modList[0]
|
|
235
|
+
// [memo] モジュールの検索優先度は、下に書くほど高くなる
|
|
236
|
+
const modSelf: string|undefined = this.modList.shift()
|
|
237
|
+
if (modSelf) {
|
|
238
|
+
this.modList.unshift(modName)
|
|
239
|
+
this.modList.unshift(modSelf)
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
type: 'require',
|
|
244
|
+
value: filename,
|
|
245
|
+
josi: '',
|
|
246
|
+
...this.peekSourceMap(),
|
|
247
|
+
end: this.peekSourceMap()
|
|
248
|
+
}
|
|
253
249
|
}
|
|
250
|
+
*/
|
|
254
251
|
/** @returns {Ast} */
|
|
255
252
|
yBlock() {
|
|
256
253
|
const map = this.peekSourceMap();
|
|
@@ -960,6 +957,9 @@ export class NakoParser extends NakoParserBase {
|
|
|
960
957
|
if (this.check('ここまで')) {
|
|
961
958
|
this.get();
|
|
962
959
|
}
|
|
960
|
+
else {
|
|
961
|
+
throw NakoSyntaxError.fromNode('『ここまで』がありません。『間』...『ここまで』を対応させてください。', map);
|
|
962
|
+
}
|
|
963
963
|
return {
|
|
964
964
|
type: 'while',
|
|
965
965
|
cond,
|
|
@@ -1137,6 +1137,9 @@ export class NakoParser extends NakoParserBase {
|
|
|
1137
1137
|
if (this.check('ここまで')) {
|
|
1138
1138
|
this.get();
|
|
1139
1139
|
}
|
|
1140
|
+
else {
|
|
1141
|
+
throw NakoSyntaxError.fromNode('『ここまで』がありません。『反復』...『ここまで』を対応させてください。', map);
|
|
1142
|
+
}
|
|
1140
1143
|
}
|
|
1141
1144
|
else {
|
|
1142
1145
|
block = this.ySentence();
|
|
@@ -2271,10 +2274,6 @@ export class NakoParser extends NakoParserBase {
|
|
|
2271
2274
|
}
|
|
2272
2275
|
throw NakoSyntaxError.fromNode('C風関数呼び出しのエラー', f || NewEmptyToken());
|
|
2273
2276
|
}
|
|
2274
|
-
// 関数呼び出し演算子(core #83)で廃止
|
|
2275
|
-
if (this.check2(['func', '←'])) {
|
|
2276
|
-
throw new Error('関数呼び出し演算子は廃止されました。');
|
|
2277
|
-
}
|
|
2278
2277
|
// 無名関数(関数オブジェクト)
|
|
2279
2278
|
if (this.check('def_func')) {
|
|
2280
2279
|
return this.yMumeiFunc();
|
|
@@ -110,18 +110,14 @@ export class NakoParser extends NakoParserBase {
|
|
|
110
110
|
if (this.check('逐次実行')) { return this.yTikuji() }
|
|
111
111
|
if (this.accept(['抜ける'])) { return { type: 'break', josi: '', ...map, end: this.peekSourceMap() } }
|
|
112
112
|
if (this.accept(['続ける'])) { return { type: 'continue', josi: '', ...map, end: this.peekSourceMap() } }
|
|
113
|
-
if (this.accept(['require', 'string', '取込'])) { return this.yRequire() }
|
|
114
113
|
if (this.accept(['not', '非同期モード'])) { return this.yASyncMode() }
|
|
115
114
|
if (this.accept(['DNCLモード'])) { return this.yDNCLMode(1) }
|
|
116
115
|
if (this.accept(['DNCL2モード'])) { return this.yDNCLMode(2) }
|
|
117
116
|
if (this.accept(['not', 'string', 'モード設定'])) { return this.ySetGenMode(this.y[1].value) }
|
|
118
117
|
if (this.accept(['not', 'モジュール公開既定値', 'eq', 'string'])) { return this.yExportDefault(this.y[3].value) }
|
|
118
|
+
// (memo) 現状「取込」はプリプロセス段階(NakoCompiler.listRequireStatements)で処理される
|
|
119
|
+
// if (this.accept(['require', 'string', '取込'])) { return this.yRequire() }
|
|
119
120
|
|
|
120
|
-
// 関数呼び出し演算子
|
|
121
|
-
if (this.check2(['func', '←'])) {
|
|
122
|
-
const word: Token = this.get() || NewEmptyToken()
|
|
123
|
-
throw NakoSyntaxError.fromNode(`関数代入演算子『←』は廃止されました。『${word.value}←』の部分。`, word)
|
|
124
|
-
}
|
|
125
121
|
if (this.check2(['func', 'eq'])) {
|
|
126
122
|
const word: Token = this.get() || NewEmptyToken()
|
|
127
123
|
throw NakoSyntaxError.fromNode(`関数『${word.value}』に代入できません。`, word)
|
|
@@ -191,15 +187,17 @@ export class NakoParser extends NakoParserBase {
|
|
|
191
187
|
/** @returns {Ast} */
|
|
192
188
|
yExportDefault (mode: string): Ast {
|
|
193
189
|
const map = this.peekSourceMap()
|
|
194
|
-
this.isExportDefault = mode === '公開'
|
|
190
|
+
this.isExportDefault = mode === '公開'
|
|
195
191
|
this.moduleExport[this.modName] = this.isExportDefault
|
|
196
192
|
return { type: 'eol', ...map, end: this.peekSourceMap() }
|
|
197
193
|
}
|
|
198
194
|
|
|
199
|
-
|
|
195
|
+
/*
|
|
196
|
+
// NakoCompiler.listRequireStatements で実装されているので不要
|
|
200
197
|
yRequire (): Ast {
|
|
198
|
+
console.log('@@@yRequire')
|
|
201
199
|
const nameToken = this.y[1]
|
|
202
|
-
const filename = nameToken.value
|
|
200
|
+
const filename: string = nameToken.value
|
|
203
201
|
const modName = NakoLexer.filenameToModName(filename)
|
|
204
202
|
if (this.modList.indexOf(modName) < 0) {
|
|
205
203
|
// 優先度が最も高いのは modList[0]
|
|
@@ -218,6 +216,7 @@ export class NakoParser extends NakoParserBase {
|
|
|
218
216
|
end: this.peekSourceMap()
|
|
219
217
|
}
|
|
220
218
|
}
|
|
219
|
+
*/
|
|
221
220
|
|
|
222
221
|
/** @returns {Ast} */
|
|
223
222
|
yBlock (): Ast {
|
|
@@ -365,31 +364,31 @@ export class NakoParser extends NakoParserBase {
|
|
|
365
364
|
a = this.yCall()
|
|
366
365
|
} else
|
|
367
366
|
// チェック : AがBならば --- 「A = B」のとき
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
367
|
+
if (a.josi === 'が') {
|
|
368
|
+
const tmpI = this.index
|
|
369
|
+
const b = this.yGetArg()
|
|
370
|
+
if (!b) {
|
|
371
|
+
throw NakoSyntaxError.fromNode(
|
|
372
|
+
'もし文の条件「AがBならば」でBがないか条件が複雑過ぎます。' +
|
|
374
373
|
this.nodeToStr(this.peek(), { depth: 1 }, false), map)
|
|
375
|
-
}
|
|
376
|
-
if (this.check('ならば')) {
|
|
377
|
-
const naraba = this.get() || { 'value': 'ならば' }
|
|
378
|
-
b.josi = naraba.value
|
|
379
|
-
}
|
|
380
|
-
if (b && (b.josi === 'ならば' || b.josi === 'でなければ')) {
|
|
381
|
-
return {
|
|
382
|
-
type: 'op',
|
|
383
|
-
operator: (b.josi === 'でなければ') ? 'noteq' : 'eq',
|
|
384
|
-
left: a,
|
|
385
|
-
right: b,
|
|
386
|
-
josi: '',
|
|
387
|
-
...map,
|
|
388
|
-
end: this.peekSourceMap()
|
|
389
374
|
}
|
|
375
|
+
if (this.check('ならば')) {
|
|
376
|
+
const naraba = this.get() || { 'value': 'ならば' }
|
|
377
|
+
b.josi = naraba.value
|
|
378
|
+
}
|
|
379
|
+
if (b && (b.josi === 'ならば' || b.josi === 'でなければ')) {
|
|
380
|
+
return {
|
|
381
|
+
type: 'op',
|
|
382
|
+
operator: (b.josi === 'でなければ') ? 'noteq' : 'eq',
|
|
383
|
+
left: a,
|
|
384
|
+
right: b,
|
|
385
|
+
josi: '',
|
|
386
|
+
...map,
|
|
387
|
+
end: this.peekSourceMap()
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
this.index = tmpI
|
|
390
391
|
}
|
|
391
|
-
this.index = tmpI
|
|
392
|
-
}
|
|
393
392
|
// もし文で追加の関数呼び出しがある場合
|
|
394
393
|
if (!this.check('ならば')) {
|
|
395
394
|
this.stack.push(a)
|
|
@@ -832,9 +831,12 @@ export class NakoParser extends NakoParserBase {
|
|
|
832
831
|
if (!this.checkTypes(['ここから', 'eol'])) {
|
|
833
832
|
throw NakoSyntaxError.fromNode('『間』の直後は改行が必要です', map)
|
|
834
833
|
}
|
|
835
|
-
|
|
836
834
|
const block = this.yBlock()
|
|
837
|
-
if (this.check('ここまで')) {
|
|
835
|
+
if (this.check('ここまで')) {
|
|
836
|
+
this.get()
|
|
837
|
+
} else {
|
|
838
|
+
throw NakoSyntaxError.fromNode('『ここまで』がありません。『間』...『ここまで』を対応させてください。', map)
|
|
839
|
+
}
|
|
838
840
|
return {
|
|
839
841
|
type: 'while',
|
|
840
842
|
cond,
|
|
@@ -981,7 +983,11 @@ export class NakoParser extends NakoParserBase {
|
|
|
981
983
|
|
|
982
984
|
if (multiline) {
|
|
983
985
|
block = this.yBlock()
|
|
984
|
-
if (this.check('ここまで')) {
|
|
986
|
+
if (this.check('ここまで')) {
|
|
987
|
+
this.get()
|
|
988
|
+
} else {
|
|
989
|
+
throw NakoSyntaxError.fromNode('『ここまで』がありません。『反復』...『ここまで』を対応させてください。', map)
|
|
990
|
+
}
|
|
985
991
|
} else { block = this.ySentence() }
|
|
986
992
|
|
|
987
993
|
return {
|
|
@@ -1166,10 +1172,7 @@ export class NakoParser extends NakoParserBase {
|
|
|
1166
1172
|
throw NakoSyntaxError.fromNode('定める『' + word.value + '』の定義エラー', word)
|
|
1167
1173
|
}
|
|
1168
1174
|
const attr = attrNode.value
|
|
1169
|
-
if (attr === '公開') { isExport = true }
|
|
1170
|
-
else if (attr === '非公開') { isExport = false }
|
|
1171
|
-
else if (attr === 'エクスポート') { isExport = true }
|
|
1172
|
-
else { this.logger.warn(`不明な変数属性『${attr}』が指定されています。`) }
|
|
1175
|
+
if (attr === '公開') { isExport = true } else if (attr === '非公開') { isExport = false } else if (attr === 'エクスポート') { isExport = true } else { this.logger.warn(`不明な変数属性『${attr}』が指定されています。`) }
|
|
1173
1176
|
this.get()
|
|
1174
1177
|
}
|
|
1175
1178
|
// 変数を生成する
|
|
@@ -1483,10 +1486,7 @@ export class NakoParser extends NakoParserBase {
|
|
|
1483
1486
|
throw NakoSyntaxError.fromNode('ローカル変数『' + wordToken.value + '』の定義エラー', wordToken)
|
|
1484
1487
|
}
|
|
1485
1488
|
const attr = attrNode.value
|
|
1486
|
-
if (attr === '公開') { isExport = true }
|
|
1487
|
-
else if (attr === '非公開') { isExport = false }
|
|
1488
|
-
else if (attr === 'エクスポート') { isExport = true }
|
|
1489
|
-
else { this.logger.warn(`不明な変数属性『${attr}』が指定されています。`) }
|
|
1489
|
+
if (attr === '公開') { isExport = true } else if (attr === '非公開') { isExport = false } else if (attr === 'エクスポート') { isExport = true } else { this.logger.warn(`不明な変数属性『${attr}』が指定されています。`) }
|
|
1490
1490
|
this.get()
|
|
1491
1491
|
}
|
|
1492
1492
|
const word = this.createVar(wordToken, vtype.type === '定数', isExport)
|
|
@@ -1523,10 +1523,7 @@ export class NakoParser extends NakoParserBase {
|
|
|
1523
1523
|
if (this.accept(['変数', 'word', '{', 'word', '}', 'eq', this.yCalc])) {
|
|
1524
1524
|
let isExport : boolean = this.isExportDefault
|
|
1525
1525
|
const attr = this.y[3].value
|
|
1526
|
-
if (attr === '公開') { isExport = true }
|
|
1527
|
-
else if (attr === '非公開') { isExport = false }
|
|
1528
|
-
else if (attr === 'エクスポート') { isExport = true }
|
|
1529
|
-
else { this.logger.warn(`不明な変数属性『${attr}』が指定されています。`) }
|
|
1526
|
+
if (attr === '公開') { isExport = true } else if (attr === '非公開') { isExport = false } else if (attr === 'エクスポート') { isExport = true } else { this.logger.warn(`不明な変数属性『${attr}』が指定されています。`) }
|
|
1530
1527
|
const word = this.createVar(this.y[1], false, isExport)
|
|
1531
1528
|
return {
|
|
1532
1529
|
type: 'def_local_var',
|
|
@@ -1554,10 +1551,7 @@ export class NakoParser extends NakoParserBase {
|
|
|
1554
1551
|
if (this.accept(['定数', 'word', '{', 'word', '}', 'eq', this.yCalc])) {
|
|
1555
1552
|
let isExport : boolean = this.isExportDefault
|
|
1556
1553
|
const attr = this.y[3].value
|
|
1557
|
-
if (attr === '公開') { isExport = true }
|
|
1558
|
-
else if (attr === '非公開') { isExport = false }
|
|
1559
|
-
else if (attr === 'エクスポート') { isExport = true }
|
|
1560
|
-
else { this.logger.warn(`不明な定数属性『${attr}』が指定されています。`) }
|
|
1554
|
+
if (attr === '公開') { isExport = true } else if (attr === '非公開') { isExport = false } else if (attr === 'エクスポート') { isExport = true } else { this.logger.warn(`不明な定数属性『${attr}』が指定されています。`) }
|
|
1561
1555
|
const word = this.createVar(this.y[1], true, isExport)
|
|
1562
1556
|
return {
|
|
1563
1557
|
type: 'def_local_var',
|
|
@@ -2008,8 +2002,6 @@ export class NakoParser extends NakoParserBase {
|
|
|
2008
2002
|
}
|
|
2009
2003
|
throw NakoSyntaxError.fromNode('C風関数呼び出しのエラー', f || NewEmptyToken())
|
|
2010
2004
|
}
|
|
2011
|
-
// 関数呼び出し演算子(core #83)で廃止
|
|
2012
|
-
if (this.check2(['func', '←'])) { throw new Error('関数呼び出し演算子は廃止されました。') }
|
|
2013
2005
|
// 無名関数(関数オブジェクト)
|
|
2014
2006
|
if (this.check('def_func')) { return this.yMumeiFunc() }
|
|
2015
2007
|
// 変数
|
|
@@ -2113,7 +2105,7 @@ export class NakoParser extends NakoParserBase {
|
|
|
2113
2105
|
if (this.funcLevel === 0) {
|
|
2114
2106
|
// global ?
|
|
2115
2107
|
if (gname.indexOf('__') < 0) { gname = this.modName + '__' + gname }
|
|
2116
|
-
this.funclist[gname] = { type: typeName, value: ''
|
|
2108
|
+
this.funclist[gname] = { type: typeName, value: '', isExport }
|
|
2117
2109
|
word.value = gname
|
|
2118
2110
|
return word
|
|
2119
2111
|
} else {
|
|
@@ -574,7 +574,7 @@ export default {
|
|
|
574
574
|
return sys.__findVar(name, null)
|
|
575
575
|
}
|
|
576
576
|
},
|
|
577
|
-
'JS関数実行': { // @JavaScriptの関数NAMEを引数ARGS(配列)で実行する // @JS
|
|
577
|
+
'JS関数実行': { // @JavaScriptの関数NAMEを引数ARGS(配列)で実行する // @JSかんすじっこう
|
|
578
578
|
type: 'func',
|
|
579
579
|
josi: [['を'], ['で']],
|
|
580
580
|
fn: function (name: any, args: any) {
|
|
@@ -1595,7 +1595,7 @@ export default {
|
|
|
1595
1595
|
throw new Error('『配列ソート』で配列以外が指定されました。')
|
|
1596
1596
|
}
|
|
1597
1597
|
},
|
|
1598
|
-
'配列数値変換': { // @配列A
|
|
1598
|
+
'配列数値変換': { // @配列Aの各要素を数値に変換して返す(変数A自体を変更) // @はいれつすうちへんかん
|
|
1599
1599
|
type: 'func',
|
|
1600
1600
|
josi: [['の', 'を']],
|
|
1601
1601
|
pure: true,
|
package/demo/index.html
CHANGED
|
@@ -104,20 +104,17 @@
|
|
|
104
104
|
</div>
|
|
105
105
|
</div>
|
|
106
106
|
|
|
107
|
-
<!--
|
|
108
|
-
<!--React.jsのスクリプトはHTMLの末尾で読み込む-->
|
|
109
|
-
<!-- なでしこ-->
|
|
107
|
+
<!-- なでしこ(必須の宣言) -->
|
|
110
108
|
<script src="../release/wnako3.js"></script>
|
|
109
|
+
<!-- なでしこ(エディタを使うための宣言) -->
|
|
111
110
|
<script src="../release/editor.js"></script>
|
|
112
111
|
<script src="../release/version.js"></script>
|
|
112
|
+
<!-- なでしこ(オプションプラグインの宣言) -->
|
|
113
113
|
<script src="../release/plugin_markup.js"></script>
|
|
114
114
|
<script src="../release/plugin_kansuji.js"></script>
|
|
115
115
|
<script src="../release/plugin_turtle.js"></script>
|
|
116
116
|
<script src="../release/plugin_caniuse.js"></script>
|
|
117
117
|
<script src="../release/plugin_webworker.js"></script>
|
|
118
|
-
<script src="../release/nako_gen_async.js"></script>
|
|
119
|
-
<!-- Chart.js -->
|
|
120
|
-
<script defer src="extlib/chart.js@3.2.1/chart.min.js"></script>
|
|
121
118
|
<script>
|
|
122
119
|
// 部品スキル実装 #1033
|
|
123
120
|
(function(){
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nadesiko3",
|
|
3
|
-
"version": "3.4.
|
|
3
|
+
"version": "3.4.23",
|
|
4
4
|
"description": "Japanese Programming Language",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.mjs",
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
"css-loader": "^6.7.1",
|
|
112
112
|
"es6-promise": "^4.2.8",
|
|
113
113
|
"eslint": "^8.17.0",
|
|
114
|
-
"eslint-config-prettier": "^
|
|
114
|
+
"eslint-config-prettier": "^9.0.0",
|
|
115
115
|
"eslint-config-standard": "^17.1.0",
|
|
116
116
|
"eslint-plugin-import": "^2.26.0",
|
|
117
117
|
"eslint-plugin-json": "^3.1.0",
|
package/release/_hash.txt
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
command.json.js:
|
|
2
|
-
md5(hex):
|
|
3
|
-
sha256(hex):
|
|
4
|
-
sha256(base64):
|
|
5
|
-
sha512(base64):
|
|
2
|
+
md5(hex): 41152b670665084132597e5f9889463c
|
|
3
|
+
sha256(hex): d73e7ab988ad74a2aacb496328c39d858905e6ffa6dd113b6d5bb89077b6d0aa
|
|
4
|
+
sha256(base64): 1z56uYitdKKqy0ljKMOdhYkF5v+m3RE7bVu4kHe20Ko=
|
|
5
|
+
sha512(base64): ofIMIuouDq6i+Rg8XSFMfO+NcECxfBwUanXpGCmRKvdq9yn2XhFj5Ix3ILrzcLYItQCed7bYhl0CdAm1kBn89w==
|
|
6
6
|
editor.js:
|
|
7
|
-
md5(hex):
|
|
8
|
-
sha256(hex):
|
|
9
|
-
sha256(base64): /
|
|
10
|
-
sha512(base64):
|
|
7
|
+
md5(hex): 6517b94277b0c2dd5efb211ce740d322
|
|
8
|
+
sha256(hex): 97050152757b6ad19cdb63e8f76c7d9711bfdd88d312396fe2d655aae87f2501
|
|
9
|
+
sha256(base64): lwUBUnV7atGc22Po92x9lxG/3YjTEjlv4tZVquh/JQE=
|
|
10
|
+
sha512(base64): pMGCGQ1ZB3J1UTeimk+aJy+KiDVEPjnDk3w2tMFy4uq5j1QVyu21sk3+HGL8XWsLQQFcsccvmzsOf10Uc8PD9w==
|
|
11
11
|
nako_gen_async.js:
|
|
12
|
-
md5(hex):
|
|
13
|
-
sha256(hex):
|
|
14
|
-
sha256(base64):
|
|
15
|
-
sha512(base64):
|
|
12
|
+
md5(hex): c8819d312d92f8485b99bb11efc9e72c
|
|
13
|
+
sha256(hex): a9b43154c3dc6acac0edcef9f3f3621d9537bea29782b98486f7a89830b7dce7
|
|
14
|
+
sha256(base64): qbQxVMPcasrA7c758/NiHZU3vqKXgrmEhveomDC33Oc=
|
|
15
|
+
sha512(base64): nBl4k/StQVWOGc6KdvQGe9HR6wdniwygTrEvvoXl9fhMkukxPvs+P4EfYPLQ6KtkdZ+2N8Jno30LnPVDT0Cm+A==
|
|
16
16
|
plugin_caniuse.js:
|
|
17
17
|
md5(hex): 299a09a12914920b4f57c6a36e36cd3c
|
|
18
18
|
sha256(hex): f29babf69539b536a852148da7225497f237bf0cb1759473cbe61f83f2b22f97
|
|
@@ -54,17 +54,17 @@ plugin_weykturtle3d.js:
|
|
|
54
54
|
sha256(base64): FO/zhIcbO4hNPDHd+ZxPlHIg2r4/3exT7LNYvG5LwTs=
|
|
55
55
|
sha512(base64): TH7Xjq3mkiXW4wy88JLUIASpIN7lYEMlPR62yDlFEJ6vx8oKKv13hoW0Oyx/U0OEjUPZ1vI9zGUHck9UKg+mwQ==
|
|
56
56
|
version.js:
|
|
57
|
-
md5(hex):
|
|
58
|
-
sha256(hex):
|
|
59
|
-
sha256(base64):
|
|
60
|
-
sha512(base64):
|
|
57
|
+
md5(hex): 27f4765decab0bce96353d34539970e1
|
|
58
|
+
sha256(hex): 7e1a8396070487b4d33cb7ce80f5537dd65d1aaa92b906f12f19c12a3d702d23
|
|
59
|
+
sha256(base64): fhqDlgcEh7TTPLfOgPVTfdZdGqqSuQbxLxnBKj1wLSM=
|
|
60
|
+
sha512(base64): qP4ERwhliqa7IzLL84oCDjUjlPaG6tUyolaxpRo8RmaP5v4fCxP2h7pLMoS4otpfK2mPX4Q2j2sqz2M8H5iFeQ==
|
|
61
61
|
wnako3.js:
|
|
62
|
-
md5(hex):
|
|
63
|
-
sha256(hex):
|
|
64
|
-
sha256(base64):
|
|
65
|
-
sha512(base64):
|
|
62
|
+
md5(hex): ace396b29972622f9e032ed07b1949b1
|
|
63
|
+
sha256(hex): 3d087e3ce7d25bb4f5cde8e9523448b0c5e10ee957f6b0cc811d78b047f650ac
|
|
64
|
+
sha256(base64): PQh+POfSW7T1zejpUjRIsMXhDulX9rDMgR14sEf2UKw=
|
|
65
|
+
sha512(base64): ssrzvVAUASBjeURHFWIfRMY8gITLWSWxmHAZnKiuGTyFjoVTxwxAsPeXxI+A3UEmojeXYF63HXXOkYd4uqIIIw==
|
|
66
66
|
wnako3webworker.js:
|
|
67
|
-
md5(hex):
|
|
68
|
-
sha256(hex):
|
|
69
|
-
sha256(base64):
|
|
70
|
-
sha512(base64):
|
|
67
|
+
md5(hex): 80692ea2e49b81576a1a7bc07d559a49
|
|
68
|
+
sha256(hex): ed2e0b7e6847ac9d3eb256770d34dfc7ac4058380c2488f4fe3e7a24833cbc63
|
|
69
|
+
sha256(base64): 7S4LfmhHrJ0+slZ3DTTfx6xAWDgMJIj0/j56JIM8vGM=
|
|
70
|
+
sha512(base64): VMYlx+Scm1Z2KQKRss3R+KkIjELdUcY6GnZc7GW8zzKHHiVuf82JpPwxKURCvO0vKusg4MiH4OH94qG88tTuUg==
|
package/release/_script-tags.txt
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
2
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
3
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
4
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
5
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
6
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
7
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
8
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
9
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
10
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
11
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
12
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
13
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
14
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.
|
|
1
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/command.json.js" integrity="sha512-ofIMIuouDq6i+Rg8XSFMfO+NcECxfBwUanXpGCmRKvdq9yn2XhFj5Ix3ILrzcLYItQCed7bYhl0CdAm1kBn89w==" crossorigin="anonymous"></script>
|
|
2
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/editor.js" integrity="sha512-pMGCGQ1ZB3J1UTeimk+aJy+KiDVEPjnDk3w2tMFy4uq5j1QVyu21sk3+HGL8XWsLQQFcsccvmzsOf10Uc8PD9w==" crossorigin="anonymous"></script>
|
|
3
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/nako_gen_async.js" integrity="sha512-nBl4k/StQVWOGc6KdvQGe9HR6wdniwygTrEvvoXl9fhMkukxPvs+P4EfYPLQ6KtkdZ+2N8Jno30LnPVDT0Cm+A==" crossorigin="anonymous"></script>
|
|
4
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/plugin_caniuse.js" integrity="sha512-L5Ho2mB44KLA61vGPHTm9BdDD9b1gUsXDRcBMwtlCrT+kep/2Z6TlrHMU/5ShCNZF/WcdBFqtsfRfS0iLupwBQ==" crossorigin="anonymous"></script>
|
|
5
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/plugin_csv.js" integrity="sha512-mQvmj25L2Nc2L7gN1rTjayHVMMPhc7TCSiBsuKS4JKOQqN+91uj9qpLAOejzR1ib5jIOBdtrhN+secNTU9BJtw==" crossorigin="anonymous"></script>
|
|
6
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/plugin_datetime.js" integrity="sha512-fTSneDauNmb+HmA65Lhif57XXCiOyYO3A6Ui/wKvz0yAXWN6/5DaKHVCaUJnaLHlrO7f8lGyCvCG8bGAEHnc/w==" crossorigin="anonymous"></script>
|
|
7
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/plugin_kansuji.js" integrity="sha512-5/TRx8Ke69YV9s8M67sOWrJmhhHK4MMLbMJh5nKg3oV8spmOOTn6tXl/TxYk8YWkTurOTCaXtRFuR9h2yEDt7w==" crossorigin="anonymous"></script>
|
|
8
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/plugin_markup.js" integrity="sha512-3gTGPjzEOVBXtYveX8p6mDVfx1wVsYdJclwiWp6qPHIkou9Cyb9PGoZ9yXww4REvRdxKCoHYMF1jHrBIKFDSTg==" crossorigin="anonymous"></script>
|
|
9
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/plugin_turtle.js" integrity="sha512-eQGdHJUa8h8N8hu3N4U/7YpdPCeqDH3zw2nAHtnzrFpUtYmIOSclURwNVt9CjtANG6SdzATVIvzY6lBKc7Kagw==" crossorigin="anonymous"></script>
|
|
10
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/plugin_webworker.js" integrity="sha512-ckRx+9bm94iJ1vss+zGim86mXAogxinCFrLhHnsvMAofRmlNQqYULQVLqruTp/zLOW9l/zUEU2lS3Rtg7JB9jA==" crossorigin="anonymous"></script>
|
|
11
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/plugin_weykturtle3d.js" integrity="sha512-TH7Xjq3mkiXW4wy88JLUIASpIN7lYEMlPR62yDlFEJ6vx8oKKv13hoW0Oyx/U0OEjUPZ1vI9zGUHck9UKg+mwQ==" crossorigin="anonymous"></script>
|
|
12
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/version.js" integrity="sha512-qP4ERwhliqa7IzLL84oCDjUjlPaG6tUyolaxpRo8RmaP5v4fCxP2h7pLMoS4otpfK2mPX4Q2j2sqz2M8H5iFeQ==" crossorigin="anonymous"></script>
|
|
13
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/wnako3.js" integrity="sha512-ssrzvVAUASBjeURHFWIfRMY8gITLWSWxmHAZnKiuGTyFjoVTxwxAsPeXxI+A3UEmojeXYF63HXXOkYd4uqIIIw==" crossorigin="anonymous"></script>
|
|
14
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.4.23&f=release/wnako3webworker.js" integrity="sha512-VMYlx+Scm1Z2KQKRss3R+KkIjELdUcY6GnZc7GW8zzKHHiVuf82JpPwxKURCvO0vKusg4MiH4OH94qG88tTuUg==" crossorigin="anonymous"></script>
|