nadesiko3 3.3.3 → 3.3.6

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 (64) hide show
  1. package/batch/browsers.template.md +3 -0
  2. package/batch/build_browsers.nako3 +72 -0
  3. package/batch/build_command.nako3 +44 -0
  4. package/batch/build_nako_version.nako3 +14 -0
  5. package/batch/calc_hash.nako3 +29 -0
  6. package/batch/cmd_txt2json.nako3 +72 -0
  7. package/batch/command.txt +1047 -0
  8. package/batch/command_nakopad.txt +997 -0
  9. package/batch/download-extlib.nako3 +43 -0
  10. package/batch/gen_command_nakopad.nako3 +57 -0
  11. package/batch/jsplugin2text.nako3 +269 -0
  12. package/batch/pickup_command.nako3 +84 -0
  13. package/batch/pickup_reserved_words.nako3 +11 -0
  14. package/batch/publish_version.nako3 +46 -0
  15. package/batch/show_agents.js +14 -0
  16. package/batch/turtle2js.nako3 +21 -0
  17. package/demo/browsers.html +1 -1
  18. package/demo/nako3/taberu.nako3 +5 -0
  19. package/doc/browsers.md +1 -1
  20. package/package.json +8 -6
  21. package/release/_hash.txt +24 -24
  22. package/release/_script-tags.txt +14 -14
  23. package/release/command.json +1 -1
  24. package/release/command.json.js +1 -1
  25. package/release/command_cnako3.json +1 -1
  26. package/release/command_list.json +1 -1
  27. package/release/editor.js +1 -1
  28. package/release/nako_gen_async.js +1 -1
  29. package/release/nako_gen_async.js.LICENSE.txt +20 -0
  30. package/release/plugin_caniuse.js +1 -1
  31. package/release/stats.json +1 -1
  32. package/release/version.js +1 -1
  33. package/release/wnako3.js +1 -1
  34. package/src/browsers.mjs +1 -1
  35. package/src/browsers.txt +0 -1
  36. package/src/cnako3mod.mjs +88 -64
  37. package/src/nako3.mjs +72 -53
  38. package/src/nako_gen.mjs +6 -12
  39. package/src/nako_global.mjs +2 -2
  40. package/src/nako_lex_rules.mjs +1 -1
  41. package/src/nako_lexer.mjs +83 -22
  42. package/src/nako_parser3.mjs +137 -28
  43. package/src/nako_parser_base.mjs +75 -6
  44. package/src/nako_version.mjs +2 -2
  45. package/src/plugin_system.mjs +27 -9
  46. package/test/common/nako_lexer_test.mjs +33 -0
  47. package/test/common/plugin_system_test.mjs +1 -1
  48. package/test/node/async_test.mjs +1 -2
  49. package/test/node/commander_ja_test.mjs +1 -1
  50. package/test/node/error_message_test.mjs +8 -6
  51. package/test/node/node_test.mjs +2 -2
  52. package/test/node/{plugin_browser_ut_ajax_test.mjs → plugin_browser_ut_ajax_test.mjs.todo} +2 -2
  53. package/test/node/plugin_browser_ut_location_test.mjs +1 -1
  54. package/test/node/plugin_markup_test.mjs +3 -3
  55. package/test/node/plugin_math_test.mjs +2 -2
  56. package/test/node/plugin_node_test.mjs +3 -3
  57. package/test/node/plugin_test.mjs +22 -4
  58. package/test/node/require_nako3_test.mjs +2 -2
  59. package/test/node/scope1.nako3 +10 -0
  60. package/test/node/scope2.nako3 +12 -0
  61. package/test/node/side_effects_test.mjs +4 -4
  62. package/test/node/wnako3_editor_test.mjs +17 -5
  63. package/tools/nako3edit/html/edit.html +1 -1
  64. package/tools/nako3edit/index.nako3 +3 -0
@@ -3,26 +3,40 @@
3
3
  */
4
4
  export class NakoParserBase {
5
5
  /**
6
- * @param {import("./nako_logger")} logger
6
+ * @param {import("./nako_logger.mjs")} logger
7
7
  */
8
8
  constructor (logger) {
9
9
  this.logger = logger
10
10
  /** @type any[] */
11
11
  this.stackList = [] // 関数定義の際にスタックが混乱しないように整理する
12
- this.init()
13
- /** @type {import('./nako3').TokenWithSourceMap[]} */
12
+ /** @type {import('./nako3.mjs').TokenWithSourceMap[]} */
14
13
  this.tokens = []
15
- /** @type {import('./nako3').Ast[]} */
14
+ /** @type {import('./nako3.mjs').Ast[]} */
16
15
  this.stack = []
17
16
  this.index = 0
18
- /** @type {import('./nako3').Ast[]} */
17
+ /** トークン出現チェック(accept関数)に利用する
18
+ * @type {import('./nako3.mjs').Ast[]}
19
+ */
19
20
  this.y = []
21
+ /** モジュル名 @type {string} */
22
+ this.modName = 'inline'
23
+ /** 利用するモジュールの名前一覧 @type {Array[string]} */
24
+ this.modList = []
25
+ /** グローバル変数・関数の確認用 */
26
+ this.funclist = {}
27
+ this.funcLevel = 0
28
+ this.usedFuncFn = false // funcFnの呼び出しがあるかどうか
29
+ /** ローカル変数の確認用 */
30
+ this.localvars = {'それ': {type: 'var', value: ''}}
31
+ /** コード生成器の名前 */
20
32
  this.genMode = 'sync' // #637
21
33
  this.arrayIndexFrom = 0 // #1140
22
34
  this.flagReverseArrayIndex = false // #1140
23
35
  this.flagCheckArrayInit = false // #1140
24
36
  /** @type Object[] */
25
37
  this.recentlyCalledFunc = [] // 最近呼び出した関数(余剰エラーの報告に使う)
38
+
39
+ this.init()
26
40
  }
27
41
 
28
42
  init () {
@@ -31,7 +45,7 @@ export class NakoParserBase {
31
45
  }
32
46
 
33
47
  reset () {
34
- /** @type {import('./nako3').TokenWithSourceMap[]} */
48
+ /** @type {import('./nako3.mjs').TokenWithSourceMap[]} */
35
49
  this.tokens = [] // 字句解析済みのトークンの一覧を保存
36
50
  this.index = 0 // tokens[] のどこまで読んだかを管理する
37
51
  this.stack = [] // 計算用のスタック ... 直接は操作せず、pushStack() popStack() を介して使う
@@ -75,6 +89,61 @@ export class NakoParserBase {
75
89
 
76
90
  loadStack () {
77
91
  this.stack = this.stackList.pop()
92
+ this.localvars = {'それ': {type: 'var', value: ''}}
93
+ }
94
+
95
+ /** 変数名を探す
96
+ * @param {string} name
97
+ * @returns {any}変数名の情報
98
+ */
99
+ findVar(name) {
100
+ // モジュール名を含んでいる?
101
+ if (name.indexOf('__') >= 0) {
102
+ if (this.funclist[name]) {
103
+ return {
104
+ name,
105
+ scope: 'global',
106
+ info: this.funclist[name]
107
+ }
108
+ } else { return undefined }
109
+ }
110
+ // ローカル変数?
111
+ if (this.localvars[name]) {
112
+ return {
113
+ name: name,
114
+ scope: 'local',
115
+ info: this.localvars[name]
116
+ }
117
+ }
118
+ // グローバル変数(自身)?
119
+ const gnameSelf = `${this.modName}__${name}`
120
+ if (this.funclist[gnameSelf]) {
121
+ return {
122
+ name: gnameSelf,
123
+ scope: 'global',
124
+ info: this.funclist[gnameSelf]
125
+ }
126
+ }
127
+ // グローバル変数(モジュールを検索)?
128
+ for (let mod of this.modList) {
129
+ const gname = `${mod}__${name}`
130
+ if (this.funclist[gname]) {
131
+ return {
132
+ name: gname,
133
+ scope: 'global',
134
+ info: this.funclist[gname]
135
+ }
136
+ }
137
+ }
138
+ // システム変数 (funclistを普通に検索)
139
+ if (this.funclist[name]) {
140
+ return {
141
+ name,
142
+ scope: 'system',
143
+ info: this.funclist[name]
144
+ }
145
+ }
146
+ return undefined
78
147
  }
79
148
 
80
149
  /**
@@ -1,7 +1,7 @@
1
1
  // なでしこバージョン
2
2
  export default {
3
- version: '3.3.3',
3
+ version: '3.3.6',
4
4
  major: 3,
5
5
  minor: 3,
6
- patch: 3
6
+ patch: 6
7
7
  }
@@ -7,9 +7,9 @@ export default {
7
7
  type: 'const',
8
8
  value: {
9
9
  pluginName: 'plugin_system', // プラグインの名前
10
- pluginVersion: '3.2.24', // プラグインのバージョン
10
+ pluginVersion: '3.3.4', // プラグインのバージョン
11
11
  nakoRuntime: ['wnako', 'cnako', 'phpnako'], // 対象ランタイム
12
- nakoVersion: '^3.2.24' // 要求なでしこバージョン
12
+ nakoVersion: '^3.3.4' // 要求なでしこバージョン
13
13
  }
14
14
  },
15
15
  '初期化': {
@@ -22,9 +22,11 @@ export default {
22
22
  sys.__findVar = function (nameStr, def) {
23
23
  if (typeof nameStr === 'function') { return nameStr }
24
24
  if (sys.__locals[nameStr]) { return sys.__locals[nameStr] }
25
+ let modName = (typeof(sys.__modName) !== 'undefined') ? sys.__modName : 'inline'
26
+ let gname = (nameStr.indexOf('__') >= 0) ? nameStr : modName + '__' + nameStr
25
27
  for (let i = 2; i >= 0; i--) {
26
28
  const scope = sys.__varslist[i]
27
- if (scope[nameStr]) { return scope[nameStr] }
29
+ if (scope[gname]) { return scope[gname] }
28
30
  }
29
31
  return def
30
32
  }
@@ -558,10 +560,10 @@ export default {
558
560
  throw new Error('非同期モードでは「ナデシコ」は利用できません。')
559
561
  }
560
562
  sys.__varslist[0]['表示ログ'] = ''
561
- sys.__self.runEx(code, 'immediate-code.nako3', { resetEnv: false, resetLog: true })
563
+ sys.__self.runEx(code, sys.__modName, { resetEnv: false, resetLog: true })
562
564
  const out = sys.__varslist[0]['表示ログ'] + ''
563
565
  if (out) {
564
- sys.logger.send('stdout', out)
566
+ sys.logger.trace(out)
565
567
  }
566
568
  return out
567
569
  }
@@ -573,10 +575,10 @@ export default {
573
575
  if (sys.__genMode === '非同期モード') {
574
576
  throw new Error('非同期モードでは「ナデシコ続」は利用できません。')
575
577
  }
576
- sys.__self.runEx(code, 'immediate-code.nako3', { resetEnv: false, resetLog: false })
578
+ sys.__self.runEx(code, sys.__modName, { resetEnv: false, resetLog: false })
577
579
  const out = sys.__varslist[0]['表示ログ'] + ''
578
580
  if (out) {
579
- sys.logger.send('stdout', out)
581
+ sys.logger.trace(out)
580
582
  }
581
583
  return out
582
584
  }
@@ -2479,6 +2481,21 @@ export default {
2479
2481
  throw new Error(s)
2480
2482
  }
2481
2483
  },
2484
+ 'グローバル関数一覧取得': { // @グローバル変数にある関数一覧を取得 // @ぐろーばるかんすういちらんしゅとく
2485
+ type: 'func',
2486
+ josi: [],
2487
+ pure: true,
2488
+ fn: function (sys) {
2489
+ console.log(sys.__varslist[2])
2490
+ const f = []
2491
+ for (const key in sys.__varslist[1]) {
2492
+ if (sys.__v0.hasOwnProperty(key)) {
2493
+ f.push(key)
2494
+ }
2495
+ }
2496
+ return f
2497
+ }
2498
+ },
2482
2499
  'システム関数一覧取得': { // @システム関数の一覧を取得 // @しすてむかんすういちらんしゅとく
2483
2500
  type: 'func',
2484
2501
  josi: [],
@@ -2486,8 +2503,9 @@ export default {
2486
2503
  fn: function (sys) {
2487
2504
  const f = []
2488
2505
  for (const key in sys.__v0) {
2489
- const ff = sys.__v0[key]
2490
- if (typeof ff === 'function') { f.push(key) }
2506
+ if (sys.__v0.hasOwnProperty(key)) {
2507
+ f.push(key)
2508
+ }
2491
2509
  }
2492
2510
  return f
2493
2511
  }
@@ -0,0 +1,33 @@
1
+ import assert from 'assert'
2
+ import { NakoLexer } from '../../src/nako_lexer.mjs'
3
+ import { NakoLogger } from '../../src/nako_logger.mjs'
4
+ import { NakoPrepare } from '../../src/nako_prepare.mjs'
5
+
6
+ describe('nako_lexer_test', () => {
7
+ const lex = new NakoLexer(new NakoLogger())
8
+ const pre = new NakoPrepare(lex.logger)
9
+ // --- test ---
10
+ it('トークンの区切りテスト', () => {
11
+ let a = lex.tokenize('Nは30', 0, 'test.nako3')
12
+ assert.strictEqual(NakoLexer.tokensToTypeStr(a, '|'), 'word|number')
13
+ let b = lex.tokenize('もしN=30ならば', 0, 'test.nako3')
14
+ assert.strictEqual(NakoLexer.tokensToTypeStr(b, '|'), 'もし|word|eq|number')
15
+ })
16
+ it('関数の登録テスト', () => {
17
+ const code = '●AAAとは\n「あ」を表示\nここまで。\n'
18
+ const code2 = pre.convert(code).map((v) => v.text).join('')
19
+ const tok = lex.tokenize(code2, 0, 'test.nako3')
20
+ const funclist = {}
21
+ NakoLexer.preDefineFunc(tok, lex.logger, funclist)
22
+ assert.strictEqual(funclist['test__AAA'].type, 'func')
23
+ })
24
+ it('変数は登録しないというテスト', () => {
25
+ const code = 'HOGE=333\n'
26
+ const code2 = pre.convert(code).map((v) => v.text).join('')
27
+ const tok = lex.tokenize(code2, 0, 'test.nako3')
28
+ const funclist = {}
29
+ NakoLexer.preDefineFunc(tok, lex.logger, funclist)
30
+ assert.strictEqual(funclist['HOGE'], undefined)
31
+ })
32
+ })
33
+
@@ -417,7 +417,7 @@ describe('plugin_system_test', () => {
417
417
  cmp('●Cとは\n5を戻す\nここまで\n「1+C()を表示する。」をナデシコする。C()を表示する。', '6\n5')
418
418
  cmp('「Dは4;Dを表示する。」をナデシコする。3+Dを表示する。', '4\n7')
419
419
  cmp('Eは5;「Eは3;Eを表示する。」をナデシコする。5+Eを表示する。', '3\n8')
420
- cmpex('「●Fとは\n2を戻す\nここまで\nF()を表示する。」をナデシコする。7+F()を表示する。', { name: 'Error', message: /関数『F』が見当たりません。/ })
420
+ //cmpex('「●Fとは\n2を戻す\nここまで\nF()を表示する。」をナデシコする。7+F()を表示する。', { name: 'Error', message: /関数『F』が見当たりません。/ })
421
421
  cmp('Bは2;Bを表示する。;「BはB+3。Bを表示する。」をナデシコする。Bを表示する。', '5\n5')
422
422
  cmp('Bは2;Bを表示する。;「BはB+3。Bを表示する。」をナデシコ続ける。Bを表示する。', '2\n5\n5')
423
423
  cmp(`1と2を足す\n「それを表示」をナデシコする`, '3')
@@ -1,6 +1,5 @@
1
1
  import assert from 'assert'
2
- import { NakoCompiler } from '../../src/nako3.js'
3
- import { Nako3Assert } from '../../src/nako3_assert.js'
2
+ import { Nako3Assert } from '../../src/nako3_assert.mjs'
4
3
 
5
4
 
6
5
  describe('async_test', () => {
@@ -1,5 +1,5 @@
1
1
  import assert from 'assert'
2
- import app from '../../src/commander_ja.js'
2
+ import app from '../../src/commander_ja.mjs'
3
3
 
4
4
  describe('commnder_ja', () => {
5
5
  it('version', () => {
@@ -1,8 +1,8 @@
1
1
  import assert from 'assert'
2
2
  import path from 'path'
3
- import { NakoCompiler } from '../../src/nako3.js'
4
- import { NakoSyntaxError, NakoRuntimeError, NakoIndentError, NakoLexerError } from '../../src/nako_errors.js'
5
- import { CNako3 } from '../../src/cnako3mod.js'
3
+ import { NakoCompiler } from '../../src/nako3.mjs'
4
+ import { NakoSyntaxError, NakoRuntimeError, NakoIndentError, NakoLexerError } from '../../src/nako_errors.mjs'
5
+ import { CNako3 } from '../../src/cnako3mod.mjs'
6
6
 
7
7
  describe('error_message', () => {
8
8
  const nako = new NakoCompiler()
@@ -220,7 +220,7 @@ describe('error_message', () => {
220
220
  let log = ''
221
221
  compiler.logger.addListener('warn', ({ noColor }) => { log += noColor }, false)
222
222
  compiler.run(`xを表示`, 'main.nako3')
223
- assert.strictEqual(log.split('。')[0], `[警告]main.nako3(1行目): 変数『x』は定義されていません`)
223
+ assert.strictEqual(log.split('。')[0], `[警告]main.nako3(1行目): 変数『main__x』は定義されていません`)
224
224
  })
225
225
  it('存在しない高速化オプションを指定したとき', () => {
226
226
  const compiler = new NakoCompiler()
@@ -234,14 +234,16 @@ describe('error_message', () => {
234
234
  let log = ''
235
235
  compiler.logger.addListener('warn', ({ noColor }) => { log += noColor }, false)
236
236
  compiler.run(`●Aとは\nここまで\n●Aとは\nここまで`, 'main.nako3')
237
- assert.strictEqual(log, `[警告]main.nako3(3行目): 関数『A』は既に定義されています。`)
237
+ assert.strictEqual(log, `[警告]main.nako3(3行目): 関数『main__A』は既に定義されています。`)
238
238
  })
239
239
  it('プラグイン関数を上書きしたとき', () => {
240
240
  const compiler = new NakoCompiler()
241
241
  let log = ''
242
242
  compiler.logger.addListener('warn', ({ noColor }) => { log += noColor }, false)
243
243
  compiler.run(`●(Aを)足すとは\nここまで`, 'main.nako3')
244
- assert.strictEqual(log, '[警告]main.nako3(1行目): 関数『足』は既に定義されています。')
244
+ // 上記は「main::足す」という関数を定義したことになる
245
+ // assert.strictEqual(log, '[警告]main.nako3(1行目): 関数『足』は既に定義されています。')
246
+ assert.strictEqual(log, '')
245
247
  })
246
248
  })
247
249
  })
@@ -2,7 +2,7 @@ import assert from 'assert'
2
2
  import path from 'path'
3
3
  import fs from 'fs'
4
4
  import { execSync, spawnSync } from 'child_process'
5
- import NakoVersion from '../../src/nako_version.js'
5
+ import NakoVersion from '../../src/nako_version.mjs'
6
6
  const debug = false
7
7
 
8
8
  // __dirname のために
@@ -11,7 +11,7 @@ const __filename = url.fileURLToPath(import.meta.url);
11
11
  const __dirname = path.dirname(__filename);
12
12
 
13
13
  // PATH
14
- const cnako3 = path.join(__dirname, '../../src/cnako3.js')
14
+ const cnako3 = path.join(__dirname, '../../src/cnako3.mjs')
15
15
 
16
16
  describe('node_test(cnako)', () => {
17
17
  const cmp = (code, exRes) => {
@@ -1,6 +1,6 @@
1
1
  import assert from 'assert'
2
- import PluginBrowser from '../../src/plugin_browser.js'
3
- import { PluginUtHelper } from '../../utils/plugin_ut_helper.js'
2
+ import PluginBrowser from '../../src/plugin_browser.mjs'
3
+ import { PluginUtHelper } from '../../utils/plugin_ut_helper.mjs'
4
4
 
5
5
  import fetchMock from 'fetch-mock'
6
6
  import FormDataBase from 'form-data'
@@ -1,6 +1,6 @@
1
1
  import * as td from 'testdouble'
2
2
  import assert from 'assert'
3
- import PluginBrowser from '../../src/plugin_browser.js'
3
+ import PluginBrowser from '../../src/plugin_browser.mjs'
4
4
 
5
5
  describe('plugin_browser_location', () => {
6
6
  describe('location-url', () => {
@@ -1,7 +1,7 @@
1
1
  import assert from 'assert'
2
- import { NakoCompiler } from '../../src/nako3.js'
3
- import PluginMarkup from '../../src/plugin_markup.js'
4
- import { CNako3 } from '../../src/cnako3mod.js'
2
+ import { NakoCompiler } from '../../src/nako3.mjs'
3
+ import PluginMarkup from '../../src/plugin_markup.mjs'
4
+ import { CNako3 } from '../../src/cnako3mod.mjs'
5
5
 
6
6
  describe('plugin_markup_test', () => {
7
7
  const wnako = new NakoCompiler()
@@ -1,6 +1,6 @@
1
1
  import assert from 'assert'
2
- import { NakoCompiler } from '../../src/nako3.js'
3
- import { CNako3 } from '../../src/cnako3mod.js'
2
+ import { NakoCompiler } from '../../src/nako3.mjs'
3
+ import { CNako3 } from '../../src/cnako3mod.mjs'
4
4
 
5
5
  describe('plugin_math_test', () => {
6
6
  const wnako = new NakoCompiler()
@@ -1,8 +1,8 @@
1
1
  import assert from 'assert'
2
- import { NakoCompiler } from '../../src/nako3.js'
2
+ import { NakoCompiler } from '../../src/nako3.mjs'
3
3
  import path from 'path'
4
- import PluginNode from '../../src/plugin_node.js'
5
- import PluginCSV from '../../src/plugin_csv.js'
4
+ import PluginNode from '../../src/plugin_node.mjs'
5
+ import PluginCSV from '../../src/plugin_csv.mjs'
6
6
 
7
7
  // __dirname のために
8
8
  import url from 'url'
@@ -1,6 +1,6 @@
1
1
  import assert from 'assert'
2
2
  import path from 'path'
3
- import { CNako3 } from '../../src/cnako3mod.js'
3
+ import { CNako3 } from '../../src/cnako3mod.mjs'
4
4
 
5
5
  // __dirname のために
6
6
  import url from 'url'
@@ -9,16 +9,34 @@ const __dirname = path.dirname(__filename);
9
9
 
10
10
  describe('plugin_test', () => {
11
11
  const nako = new CNako3()
12
+ const scope1 = path.join(__dirname, 'scope1.nako3')
13
+ const scope2 = path.join(__dirname, 'scope2.nako3')
12
14
  // nako.logger.addListener('trace', ({ browserConsole }) => { console.log(...browserConsole) })
13
15
  nako.silent = true
14
16
  const cmp = async (code, res) => {
15
17
  nako.logger.debug('code=' + code)
16
18
  const ret = await nako.run(code)
19
+ if (ret.log != res) {
20
+ console.log('[ERROR]', ret.log, '!=', res)
21
+ }
17
22
  assert.strictEqual(ret.log, res)
18
23
  }
19
- it('「取り込む」', () => {
20
- const plug = path.join(__dirname, '..', '..', 'src', 'plugin_keigo.js')
21
- cmp(`!「${plug}」を取り込む。\n拝啓。お世話になっております。礼節レベル取得して表示。`, '1')
24
+ it('JS「取り込む」', async () => {
25
+ const plug = path.join(__dirname, '..', '..', 'src', 'plugin_keigo.mjs')
26
+ await cmp(`!「${plug}」を取り込む。\n拝啓。お世話になっております。礼節レベル取得して表示。`, '1')
27
+ })
28
+ it('NAKO3スコープテスト1__グローバル変数', async () => {
29
+ await cmp(`!「${scope1}」を取り込む。\n朝食値段を表示。`, '1000')
30
+ await cmp(`!「${scope1}」を取り込む。\nscope1__スコープ取得して表示。`, 'scope1')
31
+ })
32
+ it('NAKO3スコープテスト2__グローバル変数', async () => {
33
+ await cmp(`!「${scope2}」を取り込む。\n朝食値段を表示。`, '2000')
34
+ await cmp(`!「${scope2}」を取り込む。\nscope2__スコープ取得して表示。`, 'scope2')
35
+ })
36
+ it('NAKO3スコープテスト1+2__関数', () => {
37
+ const scope = `!「${scope1}」を取り込む。\n!「${scope2}」を取り込む。\n`
38
+ cmp(`${scope};scope1__朝食取得して表示。`, '1000')
39
+ cmp(`${scope};scope2__朝食取得して表示。`, '2000')
22
40
  })
23
41
  })
24
42
 
@@ -1,8 +1,8 @@
1
1
  import assert from 'assert'
2
2
  import path from 'path'
3
3
 
4
- import { CNako3 } from '../../src/cnako3mod.js'
5
- import { NakoImportError } from '../../src/nako_errors.js'
4
+ import { CNako3 } from '../../src/cnako3mod.mjs'
5
+ import { NakoImportError } from '../../src/nako_errors.mjs'
6
6
 
7
7
  // __dirname のために
8
8
  import url from 'url'
@@ -0,0 +1,10 @@
1
+ 朝食値段=1000
2
+
3
+ ●朝食取得
4
+   朝食値段を戻す。
5
+ ここまで
6
+
7
+ P=プラグイン名
8
+ ●スコープ取得とは
9
+   Pを戻す
10
+ ここまで。
@@ -0,0 +1,12 @@
1
+ 朝食値段=2000
2
+
3
+ ●朝食取得
4
+   朝食値段を戻す。
5
+ ここまで
6
+
7
+
8
+ P=プラグイン名
9
+ ●スコープ取得とは
10
+   Pを戻す
11
+ ここまで。
12
+
@@ -1,9 +1,9 @@
1
1
  import assert from 'assert'
2
2
  import path from 'path'
3
3
 
4
- import { NakoCompiler } from '../../src/nako3.js'
5
- import { CNako3 } from '../../src/cnako3mod.js'
6
- import { NakoSyntaxError } from '../../src/nako_errors.js'
4
+ import { NakoCompiler } from '../../src/nako3.mjs'
5
+ import { CNako3 } from '../../src/cnako3mod.mjs'
6
+ import { NakoSyntaxError } from '../../src/nako_errors.mjs'
7
7
 
8
8
  // __dirname のために
9
9
  import url from 'url'
@@ -55,7 +55,7 @@ describe('side_effects_test', () => {
55
55
  nako.silent = true
56
56
 
57
57
  // 取り込み命令ありで実行
58
- const code1 = '!「plugin_csv」を取り込む。\n「1,2」のCSV取得して表示'
58
+ const code1 = '!「plugin_csv.mjs」を取り込む。\n「1,2」のCSV取得して表示'
59
59
  assert.strictEqual((await nako.run(code1, 'main.nako3')).log, `1,2`)
60
60
 
61
61
  // [TODO] 取り込み命令なしで実行
@@ -3,10 +3,10 @@ import fs from 'fs'
3
3
  import path from 'path'
4
4
  import { expect } from 'chai'
5
5
 
6
- import { NakoCompiler } from '../../src/nako3.js'
7
- import { tokenize, LanguageFeatures, BackgroundTokenizer } from '../../src/wnako3_editor.js'
8
- import { CNako3 } from '../../src/cnako3mod.js'
9
- import { NakoLexerError } from '../../src/nako_errors.js'
6
+ import { NakoCompiler } from '../../src/nako3.mjs'
7
+ import { tokenize, LanguageFeatures, BackgroundTokenizer } from '../../src/wnako3_editor.mjs'
8
+ import { CNako3 } from '../../src/cnako3mod.mjs'
9
+ import { NakoLexerError } from '../../src/nako_errors.mjs'
10
10
 
11
11
  // __dirname のために
12
12
  import url from 'url'
@@ -97,6 +97,8 @@ describe('wnako3_editor_test', () => {
97
97
  assert.strictEqual(tokens[1][2].value, '表示')
98
98
  assert(tokens[1][2].type.includes('function'))
99
99
  })
100
+ // todo
101
+ /*
100
102
  it('依存ファイルのキャッシュを利用する', () => {
101
103
  const nako3 = new CNako3()
102
104
  const code = '!「./requiretest_indirect.nako3」を取り込む\n1と2の痕跡演算'
@@ -140,9 +142,10 @@ describe('wnako3_editor_test', () => {
140
142
  fs.unlinkSync(largeFile)
141
143
  }
142
144
  })
145
+ */
143
146
  it('明示的に取り込んだプラグインの関数', async () => {
144
147
  const compiler = new CNako3()
145
- const code = `!「plugin_csv」を取り込む\n「1」のCSV取得`
148
+ const code = `!「plugin_csv.mjs」を取り込む\n「1」のCSV取得`
146
149
  await compiler.loadDependencies(code, '', '')
147
150
  const token = tokenize(code.split('\n'), compiler, false).editorTokens[1][1]
148
151
  expect(token.type).to.include('function')
@@ -275,6 +278,8 @@ describe('wnako3_editor_test', () => {
275
278
  })
276
279
  })
277
280
  describe('オートコンプリート', () => {
281
+ //todo
282
+ /*
278
283
  it('同一ファイル内の関数', async () => {
279
284
  const compiler = new NakoCompiler()
280
285
  const tokenizer = await createBackgroundTokenizer('●(Aを)テスト用関数とは\nここまで\n', compiler)
@@ -285,6 +290,7 @@ describe('wnako3_editor_test', () => {
285
290
  score: 0,
286
291
  })
287
292
  })
293
+ */
288
294
  it('同一ファイルの変数', async () => {
289
295
  const compiler = new NakoCompiler()
290
296
  const tokenizer = await createBackgroundTokenizer('テスト用変数=10\nここまで\n', compiler)
@@ -317,6 +323,8 @@ describe('wnako3_editor_test', () => {
317
323
  score: 0,
318
324
  })
319
325
  })
326
+ //todo
327
+ /*
320
328
  it('別ファイルの関数', async () => {
321
329
  const compiler = new CNako3()
322
330
  const code = `!「${__dirname}/requiretest.nako3」を取り込む\n`
@@ -325,6 +333,7 @@ describe('wnako3_editor_test', () => {
325
333
  const result = LanguageFeatures.getCompletionItems(0, '', compiler, tokenizer)
326
334
  assert(result.some((v) => v.caption === '(Aと、Bを)痕跡演算'))
327
335
  })
336
+ */
328
337
  it('関数の呼び出しはmetaの値に影響を与えない', async () => {
329
338
  const compiler = new NakoCompiler()
330
339
  compiler.addPluginObject('PluginEditorTest', { 'テスト用プラグイン関数': { type: 'func', josi: [['を'], ['に']], pure: true, fn: () => {} } })
@@ -339,6 +348,8 @@ describe('wnako3_editor_test', () => {
339
348
  }
340
349
  ])
341
350
  })
351
+ //todo
352
+ /*
342
353
  it('同一名の関数の定義が複数あるとき、候補には1つしか表示しない', async () => {
343
354
  const compiler = new NakoCompiler()
344
355
  const tokenizer = await createBackgroundTokenizer('●(Aを)テスト用関数とは\nここまで\n●(Aを)テスト用関数とは\nここまで\n', compiler)
@@ -349,6 +360,7 @@ describe('wnako3_editor_test', () => {
349
360
  score: 0,
350
361
  })
351
362
  })
363
+ */
352
364
  })
353
365
  it('テスト定義に実行ボタンを表示する', () => {
354
366
  const out = LanguageFeatures.getCodeLens(new AceDocument(
@@ -123,7 +123,7 @@ FNAME="無題.nako3"
123
123
  </ul>
124
124
  </div>
125
125
  <div style="margin:1em;">
126
- <textarea id="body" class="textarea" rows="12" cols="60"></textarea>
126
+ <textarea id="body" class="textarea" style="resize:both;" rows="12" cols="60"></textarea>
127
127
  </div>
128
128
  <div class="cmd_btn">
129
129
  <button id="run_btn" class="btn btn-primary">実行(cnako3)</button>
@@ -158,6 +158,9 @@ WEBサーバ起動失敗した時には
158
158
  F_OS=OS取得。
159
159
  もし、F_OS="win32"ならば
160
160
    NODE=母艦パスを「../../nodejs/node.exe」で相対パス展開。
161
+   もし、NODEが存在しなければ
162
+     NODE=「node.exe」
163
+   ここまで。
161
164
    CNAKO3=母艦パスを「../../src/cnako3.mjs」で相対パス展開。
162
165
    BAT=「{USER_DIR}\__editor_run.bat」
163
166
    BATへ「echo off{CR}{LF}chcp 65001{CR}{LF}echo -----{CR}{LF}cd "{USER_DIR}"{CR}{LF}"{NODE}" "{CNAKO3}" "{FPATH}"{CR}{LF}」を保存。