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.
Files changed (49) hide show
  1. package/README.md +3 -2
  2. package/batch/command.txt +93 -17
  3. package/batch/command_nakopad.txt +75 -3
  4. package/batch/pickup_command.nako3 +2 -0
  5. package/core/deno/snako.ts +1 -1
  6. package/core/package-lock.json +586 -628
  7. package/core/package.json +1 -1
  8. package/core/src/nako3.mjs +29 -1
  9. package/core/src/nako3.mts +27 -1
  10. package/core/src/nako_core_version.mjs +2 -2
  11. package/core/src/nako_core_version.mts +2 -2
  12. package/core/src/nako_lex_rules.mts +1 -1
  13. package/core/src/nako_parser3.mjs +33 -34
  14. package/core/src/nako_parser3.mts +45 -53
  15. package/core/src/plugin_system.mts +2 -2
  16. package/demo/index.html +3 -6
  17. package/package.json +2 -2
  18. package/release/_hash.txt +24 -24
  19. package/release/_script-tags.txt +14 -14
  20. package/release/command.json +1 -1
  21. package/release/command.json.js +1 -1
  22. package/release/command_cnako3.json +1 -1
  23. package/release/command_list.json +1 -1
  24. package/release/editor.js +1 -1
  25. package/release/editor.js.map +1 -1
  26. package/release/nako_gen_async.js +1 -1
  27. package/release/nako_gen_async.js.map +1 -1
  28. package/release/stats.json +1 -1
  29. package/release/version.js +1 -1
  30. package/release/version.js.map +1 -1
  31. package/release/wnako3.js +1 -1
  32. package/release/wnako3.js.map +1 -1
  33. package/release/wnako3webworker.js +1 -1
  34. package/release/wnako3webworker.js.map +1 -1
  35. package/src/browsers.json +1 -1
  36. package/src/nako_version.mjs +2 -2
  37. package/src/nako_version.mts +2 -2
  38. package/src/plugin_browser.mjs +15 -2
  39. package/src/plugin_browser.mts +15 -2
  40. package/src/plugin_browser_chart.mjs +29 -23
  41. package/src/plugin_browser_chart.mts +29 -23
  42. package/src/plugin_browser_dialog.mjs +3 -2
  43. package/src/plugin_browser_dialog.mts +4 -3
  44. package/src/plugin_browser_dom_parts.mjs +20 -0
  45. package/src/plugin_browser_dom_parts.mts +20 -0
  46. package/test/common/plugin_browser_ut_dialog_test.mjs +2 -2
  47. package/test/node/plugin_node_test.mjs +8 -0
  48. package/test/selenium/requirements.txt +1 -1
  49. package/test/selenium/test_chrome.py +1 -1
package/core/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nadesiko3core",
3
- "version": "3.4.21",
3
+ "version": "3.4.23",
4
4
  "description": "Japanese Programming Language Nadesiko v3 core",
5
5
  "main": "index.mjs",
6
6
  "type": "module",
@@ -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: tokens[i + 1].value + '',
166
+ value: filename,
139
167
  firstToken: tokens[i],
140
168
  lastToken: tokens[i + 2]
141
169
  });
@@ -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: tokens[i + 1].value + '',
245
+ value: filename,
220
246
  firstToken: tokens[i],
221
247
  lastToken: tokens[i + 2]
222
248
  })
@@ -1,8 +1,8 @@
1
1
  // 実際のバージョン定義 (自動生成されるので以下を編集しない)
2
2
  const coreVersion = {
3
- version: '3.4.21',
3
+ version: '3.4.23',
4
4
  major: 3,
5
5
  minor: 4,
6
- patch: 21
6
+ patch: 23
7
7
  };
8
8
  export default coreVersion;
@@ -11,9 +11,9 @@ export interface NakoCoreVersion {
11
11
  }
12
12
  // 実際のバージョン定義 (自動生成されるので以下を編集しない)
13
13
  const coreVersion: NakoCoreVersion = {
14
- version: '3.4.21',
14
+ version: '3.4.23',
15
15
  major: 3,
16
16
  minor: 4,
17
- patch: 21
17
+ patch: 23
18
18
  }
19
19
  export default coreVersion
@@ -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: /^(←|<--)/ }, // 関数呼び出し演算子 #891 #899
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.check2(['func', ''])) {
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 === '公開' ? true : false;
222
+ this.isExportDefault = mode === '公開';
229
223
  this.moduleExport[this.modName] = this.isExportDefault;
230
224
  return { type: 'eol', ...map, end: this.peekSourceMap() };
231
225
  }
232
- /** @returns {Ast} */
233
- yRequire() {
234
- const nameToken = this.y[1];
235
- const filename = nameToken.value;
236
- const modName = NakoLexer.filenameToModName(filename);
237
- if (this.modList.indexOf(modName) < 0) {
238
- // 優先度が最も高いのは modList[0]
239
- // [memo] モジュールの検索優先度は、下に書くほど高くなる
240
- const modSelf = this.modList.shift();
241
- if (modSelf) {
242
- this.modList.unshift(modName);
243
- this.modList.unshift(modSelf);
244
- }
245
- }
246
- return {
247
- type: 'require',
248
- value: filename,
249
- josi: '',
250
- ...this.peekSourceMap(),
251
- end: this.peekSourceMap()
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 === '公開' ? true : false
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
- /** @returns {Ast} */
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
- if (a.josi === 'が') {
369
- const tmpI = this.index
370
- const b = this.yGetArg()
371
- if (!b) {
372
- throw NakoSyntaxError.fromNode(
373
- 'もし文の条件「AがBならば」でBがないか条件が複雑過ぎます。' +
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('ここまで')) { this.get() }
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('ここまで')) { this.get() }
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: '' , isExport }
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を変換変換して返す(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
- <!-- editor script -->
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.21",
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": "^8.5.0",
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): ff4c23c17de8d510016d4e245a5d15e2
3
- sha256(hex): 6f012372497b0458e804f985cde97291e023e49576cd308ca2d4922646728c95
4
- sha256(base64): bwEjckl7BFjoBPmFzelykeAj5JV2zTCMotSSJkZyjJU=
5
- sha512(base64): qr3wjbCe82ouRpjUJGJb2lRQ/MsKRA9ebZwNPHcdQRYV9r+MdXNiJOvg6ZW44B1quwvoQs0Vf+a9woviBEOhQg==
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): 1be41b434af6b5ba1875e1e618c09e15
8
- sha256(hex): fe79653da108b32dbfc58ee0c27d05eb9b27bf33140815d8a7be1b15b893246f
9
- sha256(base64): /nllPaEIsy2/xY7gwn0F65snvzMUCBXYp74bFbiTJG8=
10
- sha512(base64): xMuxgCqPsdh0eQfRwwm30HqcQHG5DEj9SphmZDNM2JIlutsplyEVnQT+sOwkNHcv0F4WHM4bWsHh3KtjAO9fNA==
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): bd4f9e023e094582ab4c7ca0e4b1f58a
13
- sha256(hex): d92af4f5c38f9e9dff62ff771f69952be797590eeaaa1ff38d76f71b16ab887a
14
- sha256(base64): 2Sr09cOPnp3/Yv93H2mVK+eXWQ7qqh/zjXb3GxariHo=
15
- sha512(base64): YvDL++ikWzQIBjEIpFyDNYnRKxpSWhNYS6+nLOr7Nklp/DsypuZ9zw+vaFt4wXybFXarpWe1xr8GyH7Cw4J7yA==
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): 8074089b6087168f77419b67b4058f73
58
- sha256(hex): 368b917da5b712e18705f7a39acfdebb417ab982ac3bafd851c3d0444abeb8d0
59
- sha256(base64): NouRfaW3EuGHBfejms/eu0F6uYKsO6/YUcPQREq+uNA=
60
- sha512(base64): F1TfMs89RUT6DfzjdAdTVexvAtpLNMfXw5Rk3sKv4PCo8OZTKwFptKHLGBUcN/AWZqxKuliOF+e73wrEQpZGKg==
57
+ md5(hex): 27f4765decab0bce96353d34539970e1
58
+ sha256(hex): 7e1a8396070487b4d33cb7ce80f5537dd65d1aaa92b906f12f19c12a3d702d23
59
+ sha256(base64): fhqDlgcEh7TTPLfOgPVTfdZdGqqSuQbxLxnBKj1wLSM=
60
+ sha512(base64): qP4ERwhliqa7IzLL84oCDjUjlPaG6tUyolaxpRo8RmaP5v4fCxP2h7pLMoS4otpfK2mPX4Q2j2sqz2M8H5iFeQ==
61
61
  wnako3.js:
62
- md5(hex): 6654a78817efa9b6bc2ca709405ac05f
63
- sha256(hex): 40c978d8f7480dbf09f267ad7bfd931e2b0f39095a6d3fa1a40d9a8c78d155c2
64
- sha256(base64): QMl42PdIDb8J8mete/2THisPOQlabT+hpA2ajHjRVcI=
65
- sha512(base64): S/qNFkPLPy3/fzl2iAz6JzFzseS11Ss3fVhnKv94V1c8PXoFLxJACGPr27U1Ld1bOhg1rDTsHY7sMSFxNPER2w==
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): 3d187d7fab97bf1c696ec5b183d13c47
68
- sha256(hex): 13a7220a1c4063a01f162a9bf67db1d11c0d0420f1e1582c7cac77987228c354
69
- sha256(base64): E6ciChxAY6AfFiqb9n2x0RwNBCDx4VgsfKx3mHIow1Q=
70
- sha512(base64): kWMFjOtnCXW5UV3IVdwdFXnmdj70z5TFmaVclnPcglQkEF6IMAlPctuz718M4hSbZYKwriCqMm05qpukLGqeEQ==
67
+ md5(hex): 80692ea2e49b81576a1a7bc07d559a49
68
+ sha256(hex): ed2e0b7e6847ac9d3eb256770d34dfc7ac4058380c2488f4fe3e7a24833cbc63
69
+ sha256(base64): 7S4LfmhHrJ0+slZ3DTTfx6xAWDgMJIj0/j56JIM8vGM=
70
+ sha512(base64): VMYlx+Scm1Z2KQKRss3R+KkIjELdUcY6GnZc7GW8zzKHHiVuf82JpPwxKURCvO0vKusg4MiH4OH94qG88tTuUg==
@@ -1,14 +1,14 @@
1
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.4.21&f=release/command.json.js" integrity="sha512-qr3wjbCe82ouRpjUJGJb2lRQ/MsKRA9ebZwNPHcdQRYV9r+MdXNiJOvg6ZW44B1quwvoQs0Vf+a9woviBEOhQg==" crossorigin="anonymous"></script>
2
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.4.21&f=release/editor.js" integrity="sha512-xMuxgCqPsdh0eQfRwwm30HqcQHG5DEj9SphmZDNM2JIlutsplyEVnQT+sOwkNHcv0F4WHM4bWsHh3KtjAO9fNA==" crossorigin="anonymous"></script>
3
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.4.21&f=release/nako_gen_async.js" integrity="sha512-YvDL++ikWzQIBjEIpFyDNYnRKxpSWhNYS6+nLOr7Nklp/DsypuZ9zw+vaFt4wXybFXarpWe1xr8GyH7Cw4J7yA==" crossorigin="anonymous"></script>
4
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.4.21&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.21&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.21&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.21&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.21&f=release/plugin_markup.js" integrity="sha512-3gTGPjzEOVBXtYveX8p6mDVfx1wVsYdJclwiWp6qPHIkou9Cyb9PGoZ9yXww4REvRdxKCoHYMF1jHrBIKFDSTg==" crossorigin="anonymous"></script>
9
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.4.21&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.21&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.21&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.21&f=release/version.js" integrity="sha512-F1TfMs89RUT6DfzjdAdTVexvAtpLNMfXw5Rk3sKv4PCo8OZTKwFptKHLGBUcN/AWZqxKuliOF+e73wrEQpZGKg==" crossorigin="anonymous"></script>
13
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.4.21&f=release/wnako3.js" integrity="sha512-S/qNFkPLPy3/fzl2iAz6JzFzseS11Ss3fVhnKv94V1c8PXoFLxJACGPr27U1Ld1bOhg1rDTsHY7sMSFxNPER2w==" crossorigin="anonymous"></script>
14
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.4.21&f=release/wnako3webworker.js" integrity="sha512-kWMFjOtnCXW5UV3IVdwdFXnmdj70z5TFmaVclnPcglQkEF6IMAlPctuz718M4hSbZYKwriCqMm05qpukLGqeEQ==" crossorigin="anonymous"></script>
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>