nadesiko3 3.6.21 → 3.6.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 (50) hide show
  1. package/batch/command.txt +60 -52
  2. package/batch/copy_core.nako3 +5 -1
  3. package/core/README.md +4 -10
  4. package/core/__report.txt +617 -0
  5. package/core/batch/clean.nako3 +23 -0
  6. package/core/bin/snako +18 -0
  7. package/core/bin/snako.bat +15 -0
  8. package/core/package-lock.json +5 -5
  9. package/core/package.json +2 -1
  10. package/core/src/nako_ast.mts +1 -0
  11. package/core/src/nako_core_version.mjs +2 -2
  12. package/core/src/nako_core_version.mts +2 -2
  13. package/core/src/nako_gen.mjs +8 -5
  14. package/core/src/nako_gen.mts +8 -5
  15. package/core/src/nako_parser3.mjs +8 -0
  16. package/core/src/nako_parser3.mts +4 -2
  17. package/core/test/dncl2_test.mjs +2 -2
  18. package/core/test/flow_test.mjs +18 -0
  19. package/core/tsconfig.json +2 -2
  20. package/package.json +4 -3
  21. package/release/_hash.txt +28 -28
  22. package/release/_script-tags.txt +33 -33
  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/edit_main.js +5 -5
  28. package/release/edit_main.js.map +2 -2
  29. package/release/editor.js +5 -5
  30. package/release/version.js +1 -1
  31. package/release/version_main.js +1 -1
  32. package/release/version_main.js.map +1 -1
  33. package/release/wnako3.js +36 -35
  34. package/release/wnako3.js.map +3 -3
  35. package/release/wnako3webworker.js +50 -49
  36. package/release/wnako3webworker.js.map +3 -3
  37. package/src/nako_version.mjs +2 -2
  38. package/src/nako_version.mts +2 -2
  39. package/src/plugin_browser.mjs +4 -0
  40. package/src/plugin_browser.mts +4 -0
  41. package/src/plugin_browser_dom_event.mjs +50 -1
  42. package/src/plugin_browser_dom_event.mts +54 -5
  43. package/src/plugin_browser_dom_parts.mjs +20 -5
  44. package/src/plugin_browser_dom_parts.mts +16 -5
  45. package/tools/nako3edit/html/files.html +5 -1
  46. package/tools/nako3edit/html/plugins.html +134 -0
  47. package/tools/nako3edit/index.mjs +55 -7
  48. package/core/command/plugin_snako.mjs +0 -112
  49. package/core/command/snako.mjs +0 -114
  50. package/core/sample/hoge.mjs +0 -7
@@ -1,8 +1,8 @@
1
1
  // 実際のバージョン定義 (自動生成されるので以下を編集しない)
2
2
  const nakoVersion = {
3
- version: '3.6.21',
3
+ version: '3.6.23',
4
4
  major: 3,
5
5
  minor: 6,
6
- patch: 21
6
+ patch: 23
7
7
  };
8
8
  export default nakoVersion;
@@ -11,9 +11,9 @@ export interface NakoVersion {
11
11
  }
12
12
  // 実際のバージョン定義 (自動生成されるので以下を編集しない)
13
13
  const nakoVersion: NakoVersion = {
14
- version: '3.6.21',
14
+ version: '3.6.23',
15
15
  major: 3,
16
16
  minor: 6,
17
- patch: 21
17
+ patch: 23
18
18
  }
19
19
  export default nakoVersion
@@ -123,6 +123,10 @@ const PluginBrowser = {
123
123
  const box = e.target.getBoundingClientRect();
124
124
  sys.__setSysVar('マウスX', e.clientX - box.left);
125
125
  sys.__setSysVar('マウスY', e.clientY - box.top);
126
+ if (e.button !== undefined) {
127
+ const buttonLabels = ['左', '中央', '右'];
128
+ sys.__setSysVar('押ボタン', buttonLabels[e.button]);
129
+ }
126
130
  };
127
131
  // タッチイベントハンドラ
128
132
  sys.__touchHandler = (e, sys) => {
@@ -120,6 +120,10 @@ const PluginBrowser = {
120
120
  const box = e.target.getBoundingClientRect()
121
121
  sys.__setSysVar('マウスX', e.clientX - box.left)
122
122
  sys.__setSysVar('マウスY', e.clientY - box.top)
123
+ if (e.button !== undefined) {
124
+ const buttonLabels = ['左', '中央', '右']
125
+ sys.__setSysVar('押ボタン', buttonLabels[e.button])
126
+ }
123
127
  }
124
128
  // タッチイベントハンドラ
125
129
  sys.__touchHandler = (e, sys) => {
@@ -40,7 +40,25 @@ export default {
40
40
  },
41
41
  'クリック時': {
42
42
  type: 'func',
43
- josi: [['で'], ['を']],
43
+ josi: [['で'], ['を', 'の']],
44
+ pure: true,
45
+ fn: function (func, dom, sys) {
46
+ sys.__addEvent(dom, 'click', func, sys.__mouseHandler);
47
+ },
48
+ return_none: true
49
+ },
50
+ 'ダブルクリック時': {
51
+ type: 'func',
52
+ josi: [['で'], ['を', 'の']],
53
+ pure: true,
54
+ fn: function (func, dom, sys) {
55
+ sys.__addEvent(dom, 'dblclick', func, sys.__mouseHandler);
56
+ },
57
+ return_none: true
58
+ },
59
+ '変更時': {
60
+ type: 'func',
61
+ josi: [['で'], ['を', 'の']],
44
62
  pure: true,
45
63
  fn: function (func, dom, sys) {
46
64
  sys.__addEvent(dom, 'click', func, null);
@@ -95,6 +113,7 @@ export default {
95
113
  },
96
114
  'マウスX': { type: 'const', value: 0 }, // @まうすX
97
115
  'マウスY': { type: 'const', value: 0 }, // @まうすY
116
+ '押ボタン': { type: 'const', value: 0 }, // @おされたぼたん
98
117
  'マウス押時': {
99
118
  type: 'func',
100
119
  josi: [['で'], ['を', 'の']],
@@ -122,6 +141,36 @@ export default {
122
141
  },
123
142
  return_none: true
124
143
  },
144
+ 'マウス入時': {
145
+ type: 'func',
146
+ josi: [['で'], ['を', 'の']],
147
+ pure: true,
148
+ fn: function (func, dom, sys) {
149
+ sys.__addEvent(dom, 'mouseover', func, sys.__mouseHandler);
150
+ },
151
+ return_none: true
152
+ },
153
+ 'マウス出時': {
154
+ type: 'func',
155
+ josi: [['で'], ['を', 'の']],
156
+ pure: true,
157
+ fn: function (func, dom, sys) {
158
+ sys.__addEvent(dom, 'mouseout', func, sys.__mouseHandler);
159
+ },
160
+ return_none: true
161
+ },
162
+ 'マウスホイール値': { type: 'const', value: 0 }, // @まうすほいーるち
163
+ 'マウスホイール時': {
164
+ type: 'func',
165
+ josi: [['で'], ['を', 'の']],
166
+ pure: true,
167
+ fn: function (func, dom, sys) {
168
+ sys.__addEvent(dom, 'wheel', func, (e) => {
169
+ sys.__setSysVar('マウスホイール値', e.deltaY);
170
+ });
171
+ },
172
+ return_none: true
173
+ },
125
174
  'タッチX': { type: 'const', value: 0 }, // @たっちX
126
175
  'タッチY': { type: 'const', value: 0 }, // @たっちY
127
176
  'タッチ配列': { type: 'const', value: [] }, // @たっちはいれつ
@@ -38,9 +38,27 @@ export default {
38
38
  },
39
39
  return_none: true
40
40
  },
41
- 'クリック時': { // @無名関数FでDOMをクリックした時に実行するイベントを設定 // @くりっくしたとき
41
+ 'クリック時': { // @無名関数FでDOMをクリックした時に実行するイベントを設定。『押したボタン』に「左」「中央」「右」が設定される。 // @くりっくしたとき
42
42
  type: 'func',
43
- josi: [['で'], ['を']],
43
+ josi: [['で'], ['を', 'の']],
44
+ pure: true,
45
+ fn: function (func: any, dom: any, sys: any) {
46
+ sys.__addEvent(dom, 'click', func, sys.__mouseHandler)
47
+ },
48
+ return_none: true
49
+ },
50
+ 'ダブルクリック時': { // @無名関数FでDOMをダブルクリックした時に実行するイベントを設定。『押したボタン』に「左」「中央」「右」が設定される。 // @だぶるくりっくしたとき
51
+ type: 'func',
52
+ josi: [['で'], ['を', 'の']],
53
+ pure: true,
54
+ fn: function (func: any, dom: any, sys: any) {
55
+ sys.__addEvent(dom, 'dblclick', func, sys.__mouseHandler)
56
+ },
57
+ return_none: true
58
+ },
59
+ '変更時': { // @無名関数FでDOMを変更した時に実行するイベントを設定 // @へんこうしたとき
60
+ type: 'func',
61
+ josi: [['で'], ['を', 'の']],
44
62
  pure: true,
45
63
  fn: function (func: any, dom: any, sys: any) {
46
64
  sys.__addEvent(dom, 'click', func, null)
@@ -95,7 +113,8 @@ export default {
95
113
  },
96
114
  'マウスX': { type: 'const', value: 0 }, // @まうすX
97
115
  'マウスY': { type: 'const', value: 0 }, // @まうすY
98
- 'マウス押時': { // @無名関数FでDOMに対してマウスボタンを押した時に実行するイベントを設定。『マウスX』『マウスY』に座標が設定される。『対象』にイベントDOM。『対象イベント』にイベント引数。 // @まうすおしたとき
116
+ '押ボタン': { type: 'const', value: 0 }, // @おされたぼたん
117
+ 'マウス押時': { // @無名関数FでDOMに対してマウスボタンを押した時に実行するイベントを設定。『マウスX』『マウスY』に座標が、『押したボタン』に押したボタン(左,中央,右)が設定される。『対象』にイベントDOM。『対象イベント』にイベント引数。 // @まうすおしたとき
99
118
  type: 'func',
100
119
  josi: [['で'], ['を', 'の']],
101
120
  pure: true,
@@ -104,7 +123,7 @@ export default {
104
123
  },
105
124
  return_none: true
106
125
  },
107
- 'マウス移動時': { // @無名関数FでDOMに対してマウスカーソルが移動した時に実行するイベントを設定。『マウスX』『マウスY』に座標が設定される。『対象』にイベントDOM。『対象イベント』にイベント引数。 // @まうすいどうしたとき
126
+ 'マウス移動時': { // @無名関数FでDOMに対してマウスカーソルが移動した時に実行するイベントを設定。『マウスX』『マウスY』に座標が、『押したボタン』に押したボタンが設定される。『対象』にイベントDOM。『対象イベント』にイベント引数。 // @まうすいどうしたとき
108
127
  type: 'func',
109
128
  josi: [['で'], ['を', 'の']],
110
129
  pure: true,
@@ -113,7 +132,7 @@ export default {
113
132
  },
114
133
  return_none: true
115
134
  },
116
- 'マウス離時': { // @無名関数FでDOMに対してマウスボタンを離した時に実行するイベントを設定。『マウスX』『マウスY』に座標が設定される。『対象』にイベントDOM。『対象イベント』にイベント引数。 // @まうすはなしたとき
135
+ 'マウス離時': { // @無名関数FでDOMに対してマウスボタンを離した時に実行するイベントを設定。『マウスX』『マウスY』に座標が、『押したボタン』に押したボタン(左,中央,右)が設定される。『対象』にイベントDOM。『対象イベント』にイベント引数。 // @まうすはなしたとき
117
136
  type: 'func',
118
137
  josi: [['で'], ['を', 'の']],
119
138
  pure: true,
@@ -122,6 +141,36 @@ export default {
122
141
  },
123
142
  return_none: true
124
143
  },
144
+ 'マウス入時': { // @無名関数FでDOMに対してマウスカーソルが入った時のイベントを設定。『マウスX』『マウスY』に座標が設定される。『対象』にイベントDOM。『対象イベント』にイベント引数。 // @まうすはいったとき
145
+ type: 'func',
146
+ josi: [['で'], ['を', 'の']],
147
+ pure: true,
148
+ fn: function (func: any, dom: any, sys: any) {
149
+ sys.__addEvent(dom, 'mouseover', func, sys.__mouseHandler)
150
+ },
151
+ return_none: true
152
+ },
153
+ 'マウス出時': { // @無名関数FでDOMに対してマウスカーソルが出た時のイベントを設定。『マウスX』『マウスY』に座標が設定される。『対象』にイベントDOM。『対象イベント』にイベント引数。 // @まうすでたとき
154
+ type: 'func',
155
+ josi: [['で'], ['を', 'の']],
156
+ pure: true,
157
+ fn: function (func: any, dom: any, sys: any) {
158
+ sys.__addEvent(dom, 'mouseout', func, sys.__mouseHandler)
159
+ },
160
+ return_none: true
161
+ },
162
+ 'マウスホイール値': { type: 'const', value: 0 }, // @まうすほいーるち
163
+ 'マウスホイール時': { // @無名関数FでDOMに対してマウスホイールを回した時のイベントを設定。『マウスホイール値』に値が設定される。『対象』にイベントDOM。『対象イベント』にイベント引数。 // @まうすほいーるしたとき
164
+ type: 'func',
165
+ josi: [['で'], ['を', 'の']],
166
+ pure: true,
167
+ fn: function (func: any, dom: any, sys: any) {
168
+ sys.__addEvent(dom, 'wheel', func, (e) => {
169
+ sys.__setSysVar('マウスホイール値', e.deltaY)
170
+ })
171
+ },
172
+ return_none: true
173
+ },
125
174
  'タッチX': { type: 'const', value: 0 }, // @たっちX
126
175
  'タッチY': { type: 'const', value: 0 }, // @たっちY
127
176
  'タッチ配列': { type: 'const', value: [] }, // @たっちはいれつ
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  export default {
2
3
  // @DOM部品操作
3
4
  'DOM親要素': { type: 'const', value: '' }, // @DOMおやようそ
@@ -58,6 +59,20 @@ export default {
58
59
  return btn;
59
60
  }
60
61
  },
62
+ 'DOM部品削除': {
63
+ type: 'func',
64
+ josi: [['の', 'を']],
65
+ pure: true,
66
+ fn: function (elm) {
67
+ if (typeof elm === 'string') {
68
+ elm = document.querySelector(elm);
69
+ }
70
+ if (elm) {
71
+ elm.parentNode.removeChild(elm);
72
+ }
73
+ },
74
+ return_none: true
75
+ },
61
76
  'ボタン作成': {
62
77
  type: 'func',
63
78
  josi: [['の']],
@@ -175,7 +190,7 @@ export default {
175
190
  type: 'func',
176
191
  josi: [['を'], ['へ', 'に']],
177
192
  pure: true,
178
- fn: function (options, dom, sys) {
193
+ fn: function (options, dom) {
179
194
  if (typeof dom === 'string') {
180
195
  dom = document.querySelector(dom);
181
196
  }
@@ -498,17 +513,17 @@ export default {
498
513
  pure: true,
499
514
  asyncFn: true,
500
515
  fn: async function (src, sys) {
501
- console.log('aaa');
502
516
  const div = sys.__exec('DOM部品作成', ['div', sys]);
503
517
  div.classList.add('mermaid');
504
518
  div.innerHTML = src;
505
519
  // ライブラリを読み込む
506
- if (typeof sys.__v0.WINDOW.mermaid === 'undefined') {
520
+ const win = sys.__getSysVar('WINDOW');
521
+ if (typeof win.mermaid === 'undefined') {
507
522
  console.log('try to load mermaid');
508
523
  await sys.__loadScript('https://cdn.jsdelivr.net/npm/mermaid@10.5.0/dist/mermaid.min.js');
509
- console.log('loaded mermaid');
524
+ console.log('mermaid.jsを読み込みました');
510
525
  }
511
- await sys.__v0.WINDOW.mermaid.run();
526
+ await win.mermaid.run();
512
527
  return div;
513
528
  }
514
529
  }
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  export default {
2
3
  // @DOM部品操作
3
4
  'DOM親要素': { type: 'const', value: '' }, // @DOMおやようそ
@@ -54,6 +55,16 @@ export default {
54
55
  return btn
55
56
  }
56
57
  },
58
+ 'DOM部品削除': { // @elmの要素を削除する // @DOMぶひんさくじょ
59
+ type: 'func',
60
+ josi: [['の', 'を']],
61
+ pure: true,
62
+ fn: function (elm: any) {
63
+ if (typeof elm === 'string') { elm = document.querySelector(elm) }
64
+ if (elm) { elm.parentNode.removeChild(elm) }
65
+ },
66
+ return_none: true
67
+ },
57
68
  'ボタン作成': { // @ラベルlabelを持つbutton要素を追加しDOMオブジェクトを返す // @ぼたんさくせい
58
69
  type: 'func',
59
70
  josi: [['の']],
@@ -171,7 +182,7 @@ export default {
171
182
  type: 'func',
172
183
  josi: [['を'], ['へ', 'に']],
173
184
  pure: true,
174
- fn: function (options: any, dom: any, sys: any) {
185
+ fn: function (options: any, dom: any) {
175
186
  if (typeof dom === 'string') { dom = document.querySelector(dom) }
176
187
  // 既存のoptionsをクリア
177
188
  dom.options.length = 0
@@ -462,17 +473,17 @@ export default {
462
473
  pure: true,
463
474
  asyncFn: true,
464
475
  fn: async function (src: string, sys: any) {
465
- console.log('aaa')
466
476
  const div = sys.__exec('DOM部品作成', ['div', sys])
467
477
  div.classList.add('mermaid')
468
478
  div.innerHTML = src
469
479
  // ライブラリを読み込む
470
- if (typeof sys.__v0.WINDOW.mermaid === 'undefined') {
480
+ const win = sys.__getSysVar('WINDOW')
481
+ if (typeof win.mermaid === 'undefined') {
471
482
  console.log('try to load mermaid')
472
483
  await sys.__loadScript('https://cdn.jsdelivr.net/npm/mermaid@10.5.0/dist/mermaid.min.js')
473
- console.log('loaded mermaid')
484
+ console.log('mermaid.jsを読み込みました')
474
485
  }
475
- await sys.__v0.WINDOW.mermaid.run()
486
+ await win.mermaid.run()
476
487
  return div
477
488
  }
478
489
  }
@@ -26,6 +26,9 @@ Pを表示。
26
26
  「#new_btn」をクリックした時には
27
27
    「/html/edit.html?file=new&appkey={APPKEY}」へブラウザ移動。
28
28
  ここまで。
29
+ 「#add_plugins」をクリックした時には
30
+   「/html/plugins.html?appkey={APPKEY}」へブラウザ移動。
31
+ ここまで。
29
32
  #-----------
30
33
  ●ファイル一覧取得処理
31
34
  「/files?appkey={APPKEY}」へAJAX送信した時には
@@ -121,7 +124,8 @@ Pを表示。
121
124
  </div>
122
125
  <div id="filesbox">
123
126
  <div class="menu-box">
124
- <a class="btn btn-info" id="new_btn">→新規作成</a>
127
+ <a class="btn btn-info" id="new_btn">→ファイルの新規作成</a>
128
+ <a class="btn btn-info" id="add_plugins">🔌プラグインの追加</a>
125
129
  </div>
126
130
  <div>
127
131
  <ul id="files_ul"></ul>
@@ -0,0 +1,134 @@
1
+ <!DOCTYPE html>
2
+ <html data-theme="winter">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>プラグインの追加</title>
6
+ <!-- daisyUI-->
7
+ <link href="daisyui/tailwind.min.css" rel="stylesheet" type="text/css" />
8
+ <link href="daisyui/full.css" rel="stylesheet" type="text/css" />
9
+ <!-- nako3edit -->
10
+ <link href="/html/nako3edit.css" rel="stylesheet" type="text/css" />
11
+ <script defer type="text/javascript" src="/release/wnako3.js"></script>
12
+ <script defer type="text/javascript" src="/html/edit_plugin.js"></script>
13
+
14
+ <script type="なでしこ">
15
+ #-----------
16
+ PLUGINS=[]
17
+ APPKEY=""
18
+ HREF=WINDOW["location"]["href"]
19
+ HREFを表示。
20
+ P=HREFをURLパラメータ解析
21
+ Pを表示。
22
+ APPKEY=P["appkey"]
23
+ Pを表示。
24
+ プラグイン取得処理
25
+ #-----------
26
+ # 新規ボタン
27
+ 「#new_btn」をクリックした時には
28
+   「/html/edit.html?file=new&appkey={APPKEY}」へブラウザ移動。
29
+ ここまで。
30
+ #-----------
31
+ ●プラグイン取得処理
32
+ API=「/get_plugins?appkey={APPKEY}」
33
+ J=APIからHTTP取得
34
+ JをJSONデコードしてFILESに代入。
35
+ FILESを表示。
36
+ S=「<table>」
37
+ FILESを反復
38
+   NAME=対象["name"]
39
+   # --- リストに表示したくない場合はここに記述 ---
40
+   もし、NAME=「nadesiko3」ならば、続ける。
41
+   もし、NAME=「nadesiko3-googlehome」ならば、続ける。
42
+   # --- ここまで
43
+   NAMEで「-」が何文字目
44
+   もし、それが0ならば、続ける。
45
+   DESC=対象["description"]
46
+   AUTH="-"
47
+   もし、対象["maintainers"]ならば
48
+     AUTH=対象["maintainers"][0]["username"]
49
+   ここまで。
50
+   もし、対象["author"]ならば
51
+     AUTH=対象["author"]["name"]
52
+   ここまで。
53
+   もし、AUTH="kujirahand"ならば
54
+     AUTH="公式"
55
+   ここまで。
56
+   VER=対象["version"]
57
+   AV="{VER}.0.0.0"を「.」で区切る
58
+   MAJOR=AV[0]
59
+   MINOR=AV[1]
60
+   PATCH=AV[2]
61
+   # v3.6以下のプラグインは表示しない
62
+   もし、AUTH="公式"かつ(MAJOR≠3)ならば、続ける
63
+   もし、AUTH="公式"かつ(MINOR<6)ならば、続ける
64
+   URL=""
65
+   もし、対象["links"]ならば
66
+     URL=対象["links"]["npm"]
67
+   ここまで。
68
+   NAME_ENC=NAMEをURLエンコード
69
+   NO=PLUGINSの要素数
70
+   PLUGINSにNAMEを配列追加。
71
+   NAME_H=NAMEをHTML変換
72
+   AUTH_H=AUTHをHTML変換
73
+   URL_H=URLをHTML変換
74
+   DESC_H=DESCをHTML変換
75
+   VER_H=VERをHTML変換
76
+   S=S&「<TR>
77
+ <TH style="text-align: left">
78
+ <a class="btn" id="btn-{NO}" data-no="{NO}">追加</a>
79
+ {NAME_H}
80
+ </TH>
81
+ <TD>{AUTH_H}</TD>
82
+ <TD><a target="_new" href="{URL_H}">🔗</a> {DESC_H}({VER_H})<TD></TR>」
83
+   「{対象キー}@」&NAMEを表示。
84
+ ここまで。
85
+ S=S&「</table>」
86
+ 「#files」にSをHTML設定。
87
+ # ボタンに対応するイベントを設定する
88
+ PLUGINSを反復
89
+   NO=対象キー
90
+   「#btn-{NO}」をクリックした時には
91
+     PLUGINSを表示。
92
+     対象を表示。
93
+     NO=INT(対象["dataset"]["no"])
94
+     NOを表示。
95
+     NAME=PLUGINS[NO]
96
+     NAMEを表示。
97
+     NAME_ENC=NAMEをURLエンコード
98
+     URL="/add_plugins?appkey={APPKEY}&name={NAME_ENC}"
99
+     「#stdout」に「インストールしています。少々お待ちください。」をDOM_HTML設定。
100
+     R=URLをHTTP取得
101
+     「#stdout」にRをDOM_HTML設定。
102
+   ここまで。
103
+ ここまで。
104
+ ここまで。
105
+ #-----------
106
+ </script>
107
+ </head>
108
+ <body>
109
+ <div class="navbar bg-base-100">
110
+ <div class="flex-1">
111
+ <a class="btn btn-ghost normal-case text-xl" href="files.html">Node版 なでしこ3 エディタ</a>
112
+ &gt; プラグインの追加
113
+ </div>
114
+ </div>
115
+ <div id="filesbox">
116
+ <div class="menu-box">
117
+ 「追加」ボタンを押すと、システムにプラグインを追加します。
118
+ 以下に列挙したプラグインはnpmに登録されているものを全て表示しています。
119
+ <b>信用できるプラグインのみ</b>を追加してください。
120
+ 「🔗」をクリックするとnpmで詳細を確認できます。
121
+ </div>
122
+ <br>
123
+ <div class="menu-box">
124
+ <div id="files">現在取得中です。少々お待ちください。</div>
125
+ </div>
126
+ <br>
127
+ <div class="menu-box">
128
+ <div class="result_output">出力結果:</div>
129
+ <div id="stdout"></div>
130
+ </div>
131
+ </div>
132
+ </body>
133
+
134
+ </html>
@@ -16,7 +16,7 @@ const SERVER_PORT = 8888
16
16
  const rootDir = path.resolve(__dirname)
17
17
  const releaseDir = path.resolve(path.join(__dirname, '../../release'))
18
18
  const isWin = process.platform === 'win32'
19
- const homeDir = process.env[isWin ? 'USERPROFILE' : 'HOME']
19
+ const homeDir = process.env[isWin ? 'USERPROFILE' : 'HOME'] ?? '.'
20
20
  const userDir = path.join(homeDir, 'nadesiko3_user')
21
21
  const CNAKO3 = path.resolve(path.join(__dirname, '../../src/cnako3.mjs'))
22
22
  const NODE = process.argv[0]
@@ -86,6 +86,14 @@ const server = http.createServer(function (req, res) {
86
86
  apiDelete(res, params)
87
87
  return
88
88
  }
89
+ if (uri === '/get_plugins') {
90
+ apiGetPlugins(res, params)
91
+ return
92
+ }
93
+ if (uri === '/add_plugins') {
94
+ apiAddPlugins(res, params)
95
+ return
96
+ }
89
97
 
90
98
  // ファイルパスを生成
91
99
  let filePath = path.join(rootDir, uri)
@@ -155,7 +163,8 @@ function isDir (pathName) {
155
163
  if (stats && stats.isDirectory()) {
156
164
  return true
157
165
  }
158
- } catch (err) {
166
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
167
+ } catch (_err) {
159
168
  return false
160
169
  }
161
170
  }
@@ -193,7 +202,8 @@ function apiSave (res, params) {
193
202
  console.log('body=', body)
194
203
  console.log('--------------------------------')
195
204
  res.end('ok')
196
- } catch (err) {
205
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
206
+ } catch (_err) {
197
207
  res.end('[ERROR] 保存に失敗しました😭')
198
208
  }
199
209
  }
@@ -220,8 +230,7 @@ function apiRun (res, params) {
220
230
  const cmd = `"${NODE}" "${CNAKO3}" "${fullpath}"`
221
231
  let result = ''
222
232
  try {
223
- result = execSync(cmd)
224
- result = String(result)
233
+ result = execSync(cmd).toString()
225
234
  } catch (err) {
226
235
  console.error(err)
227
236
  res.end('[ERROR]実行に失敗しました。' + err.toString())
@@ -252,8 +261,7 @@ function apiRunDirect(res, params) {
252
261
  console.log("@run=", cmd)
253
262
  let result = ''
254
263
  try {
255
- result = execSync(cmd)
256
- result = String(result)
264
+ result = execSync(cmd).toString()
257
265
  } catch (err) {
258
266
  console.error(err)
259
267
  res.end('[ERROR]実行に失敗しました。' + err.toString())
@@ -304,3 +312,43 @@ function apiGetNewFilename (res) {
304
312
  res.writeHead(200, { 'Content-Type': 'text/plaing; charset=utf-8' })
305
313
  res.end(`"${fname}"`)
306
314
  }
315
+
316
+ function apiGetPlugins (res, params) {
317
+ res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })
318
+ const appkeyUser = params.appkey
319
+ if (appkey !== appkeyUser) {
320
+ res.end('"[ERROR] キーが違います"')
321
+ return
322
+ }
323
+ try {
324
+ // コマンドを実行してプラグインを取得
325
+ const cmd = 'npm search "nadesiko3\\-" --json'
326
+ const result = execSync(cmd).toString()
327
+ res.end(result)
328
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
329
+ } catch (err) {
330
+ res.end('"[ERROR] プラグインの取得に失敗しました。"')
331
+ }
332
+ }
333
+
334
+ function apiAddPlugins(res, params) {
335
+ res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })
336
+ const appkeyUser = params.appkey
337
+ if (appkey !== appkeyUser) {
338
+ res.end('"[ERROR] キーが違います"')
339
+ return
340
+ }
341
+ try {
342
+ const name = params.name
343
+ if (!name) {
344
+ res.end('"[ERROR] プラグイン名が指定されていません。"')
345
+ return
346
+ }
347
+ const cmd = `npm install "${name}"`
348
+ const result = execSync(cmd).toString()
349
+ res.end("実行しました:" + result)
350
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
351
+ } catch (err) {
352
+ res.end('"[ERROR] プラグインの取得に失敗しました。"')
353
+ }
354
+ }