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.
- package/batch/command.txt +60 -52
- package/batch/copy_core.nako3 +5 -1
- package/core/README.md +4 -10
- package/core/__report.txt +617 -0
- package/core/batch/clean.nako3 +23 -0
- package/core/bin/snako +18 -0
- package/core/bin/snako.bat +15 -0
- package/core/package-lock.json +5 -5
- package/core/package.json +2 -1
- package/core/src/nako_ast.mts +1 -0
- package/core/src/nako_core_version.mjs +2 -2
- package/core/src/nako_core_version.mts +2 -2
- package/core/src/nako_gen.mjs +8 -5
- package/core/src/nako_gen.mts +8 -5
- package/core/src/nako_parser3.mjs +8 -0
- package/core/src/nako_parser3.mts +4 -2
- package/core/test/dncl2_test.mjs +2 -2
- package/core/test/flow_test.mjs +18 -0
- package/core/tsconfig.json +2 -2
- package/package.json +4 -3
- package/release/_hash.txt +28 -28
- package/release/_script-tags.txt +33 -33
- package/release/command.json +1 -1
- package/release/command.json.js +1 -1
- package/release/command_cnako3.json +1 -1
- package/release/command_list.json +1 -1
- package/release/edit_main.js +5 -5
- package/release/edit_main.js.map +2 -2
- package/release/editor.js +5 -5
- package/release/version.js +1 -1
- package/release/version_main.js +1 -1
- package/release/version_main.js.map +1 -1
- package/release/wnako3.js +36 -35
- package/release/wnako3.js.map +3 -3
- package/release/wnako3webworker.js +50 -49
- package/release/wnako3webworker.js.map +3 -3
- package/src/nako_version.mjs +2 -2
- package/src/nako_version.mts +2 -2
- package/src/plugin_browser.mjs +4 -0
- package/src/plugin_browser.mts +4 -0
- package/src/plugin_browser_dom_event.mjs +50 -1
- package/src/plugin_browser_dom_event.mts +54 -5
- package/src/plugin_browser_dom_parts.mjs +20 -5
- package/src/plugin_browser_dom_parts.mts +16 -5
- package/tools/nako3edit/html/files.html +5 -1
- package/tools/nako3edit/html/plugins.html +134 -0
- package/tools/nako3edit/index.mjs +55 -7
- package/core/command/plugin_snako.mjs +0 -112
- package/core/command/snako.mjs +0 -114
- package/core/sample/hoge.mjs +0 -7
package/src/nako_version.mjs
CHANGED
package/src/nako_version.mts
CHANGED
package/src/plugin_browser.mjs
CHANGED
|
@@ -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) => {
|
package/src/plugin_browser.mts
CHANGED
|
@@ -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
|
-
'
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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('
|
|
524
|
+
console.log('mermaid.jsを読み込みました');
|
|
510
525
|
}
|
|
511
|
-
await
|
|
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
|
|
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
|
-
|
|
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('
|
|
484
|
+
console.log('mermaid.jsを読み込みました')
|
|
474
485
|
}
|
|
475
|
-
await
|
|
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"
|
|
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
|
+
> プラグインの追加
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|