browser_app_base 0.0.3 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c4b88262d08f7de37833b5e1fafb1051947ff7f0d7eb4c62c11fc906d5869ede
4
- data.tar.gz: ca22c6db6f9788d0c098edffc25fabbdde4fcbfa43d15032f6a2a2ec72b16aec
3
+ metadata.gz: 70e5ff9237fd7823d8fef3d11b63e43cc65129318f9e77d161d835d0d769efda
4
+ data.tar.gz: 547b18815dc4d1bd495fbaa894fbb61d94af21ae471ee6f05629fd819838b6dd
5
5
  SHA512:
6
- metadata.gz: 2c761441fa372ee9c4dfb924991852d706348685315b30704865c70e28fb728586f3509b55d28cc951849879a3f39f6b67bb9abe49d73f3261f79449459b5202
7
- data.tar.gz: 1c02f7dcd2e3b6225762ae66182b4de6d4a1923f6918a19f962337b961e659cced031a714cbdf9949daef94a9c9a7a01262ae0a37a95af68f1e73e2ac7786eca
6
+ metadata.gz: 3ec9f83afee710c1fe4aa984823c7cded71ec3ca24dd586c24c428480156c4a37a7274de7feba4fd7890c7eae2964b6706fc83e53a3d9afe234f770b35323a91
7
+ data.tar.gz: 49f96d43d8eab8f61ccfc60b7506302d137193965b0f47cdf794c914b7d73e9f232b07b3413d128c4e1e2117a4f52ea6dd15a03d1e0fec452d3736a48a278b4f
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BrowserAppBase
4
- VERSION = "0.0.3"
4
+ VERSION = "0.0.7"
5
5
  end
@@ -19,6 +19,18 @@ module BrowserAppBase
19
19
  return app_file_name + ".rb"
20
20
  end
21
21
 
22
+ def self.get_app_name(app)
23
+ app_name = ""
24
+ app.each_char do |s|
25
+ if s =~ /[a-z]/ and app_name.size == 0
26
+ app_name += s.upcase
27
+ else
28
+ app_name += s
29
+ end
30
+ end
31
+ return app_name
32
+ end
33
+
22
34
  def self.create(arg)
23
35
  dir = arg[:dir]
24
36
  app = arg[:app]
@@ -36,8 +48,8 @@ module BrowserAppBase
36
48
  app_file = get_app_file(app)
37
49
 
38
50
  load_app = <<"EOS"
39
- require '#{app_file}'
40
- $app = MyApp.new
51
+ require '#{app_file}'
52
+ $app = #{get_app_name(app)}.new
41
53
  EOS
42
54
 
43
55
  File.open("#{dir}/app_load.rb", "w") do |f|
@@ -45,7 +57,10 @@ EOS
45
57
  end
46
58
 
47
59
  puts "create #{app_file}"
48
- FileUtils.cp "#{dir}/my_app_sample.rb", "#{dir}/#{app_file}"
60
+ new_file = "#{dir}/#{app_file}"
61
+ FileUtils.cp("#{dir}/my_app_sample.rb", new_file)
62
+ buf = File.binread(new_file)
63
+ File.binwrite(new_file, buf.gsub(/MyApp/, get_app_name(app)))
49
64
  end
50
65
  end
51
66
  end
@@ -1,4 +1,4 @@
1
1
  {
2
- "chrome_win": "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\"",
2
+ "chrome_win": "start chrome",
3
3
  "chrome_linux": "/bin/google-chrome"
4
4
  }
@@ -0,0 +1,50 @@
1
+ [
2
+ {
3
+ "name": "name1",
4
+ "value": "value1",
5
+ "type": "input",
6
+ "select": "",
7
+ "description": "設定項目1"
8
+ },
9
+ {
10
+ "name": "name2",
11
+ "value": true,
12
+ "type": "checkbox",
13
+ "select": "",
14
+ "description": "有効にする場合はチェック"
15
+ },
16
+ {
17
+ "name": "name3",
18
+ "value": "1",
19
+ "type": "select",
20
+ "select": [
21
+ "1",
22
+ "2",
23
+ "3",
24
+ "4",
25
+ "5"
26
+ ],
27
+ "description": "選択項目"
28
+ },
29
+ {
30
+ "name": "name4",
31
+ "value": "value4",
32
+ "type": "input",
33
+ "select": "",
34
+ "description": "設定項目4"
35
+ },
36
+ {
37
+ "name": "name5",
38
+ "value": "value5",
39
+ "type": "input",
40
+ "select": "",
41
+ "description": "設定項目5"
42
+ },
43
+ {
44
+ "name": "name6",
45
+ "value": "value6",
46
+ "type": "input",
47
+ "select": "",
48
+ "description": "設定項目6"
49
+ }
50
+ ]
@@ -24,6 +24,34 @@ get "/js/:name.js" do
24
24
  File.read "js/#{params[:name]}.js"
25
25
  end
26
26
 
27
+ get "/config/*.*" do |file, ext|
28
+ content_type "text/json", :charset => "utf-8"
29
+ puts "#{file}.#{ext}"
30
+ File.read "config/#{file}.#{ext}"
31
+ end
32
+
33
+ get "/open_dialog" do
34
+ dialog_html = <<'EOS'
35
+ <!DOCTYPE html>
36
+ <html>
37
+ <head>
38
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
39
+ <title>Message Dialog</title>
40
+ <style type="text/css">
41
+ <!--
42
+ body {
43
+ color: #000000;
44
+ background-color: #ffffff;
45
+ overflow: hidden;
46
+ font-size: 12px;
47
+ }
48
+ -->
49
+ </style>
50
+ </head>
51
+ EOS
52
+ dialog_html += "<body>" + params["msg"] + "</body></html>"
53
+ end
54
+
27
55
  map "/search" do
28
56
  run Search
29
57
  end
@@ -46,6 +74,6 @@ configure do
46
74
 
47
75
  end
48
76
 
49
- #\ --port 62857
77
+ #\ --port 55974
50
78
 
51
79
  run Sinatra::Application
@@ -2,6 +2,7 @@ body {
2
2
  color: #000000;
3
3
  background-color: #cac3ec4f;
4
4
  overflow: hidden;
5
+ font-size: 12px;
5
6
  }
6
7
 
7
8
  hr {
@@ -22,9 +23,9 @@ hr {
22
23
  padding: 5px;
23
24
  width: 95vw;
24
25
  height: 50vh;
26
+ overflow: auto;
25
27
  }
26
28
 
27
-
28
29
  .inarea {
29
30
  border: thin solid #000000;
30
31
  margin: 5px;
@@ -32,12 +33,6 @@ hr {
32
33
  width: 95%;
33
34
  }
34
35
 
35
- input {
36
- background-color: #FAFAFA;
37
- margin: 5px;
38
- padding: 5px;
39
- }
40
-
41
36
  input.long {
42
37
  width: 90%;
43
38
  background-color: #FAFAFA;
@@ -50,18 +45,22 @@ textarea.long {
50
45
  height: 50vh;
51
46
  }
52
47
 
48
+ .ui-widget {
49
+ font-size: 12px;
50
+ }
51
+
53
52
  .ui-autocomplete {
54
- max-height: 200px;
55
- max-width: 500px;
53
+ max-height: 45vh;
54
+ max-width: 90wh;
56
55
  overflow-y: auto;
57
- overflow-x: hidden;
58
- padding-right: 20px;
56
+ overflow-x: auto;
57
+ padding-right: 10px;
59
58
  }
59
+
60
60
  #jquery-ui-autocomplete label {
61
61
  float: left;
62
62
  margin-right: 0.5em;
63
63
  color: black;
64
- font-size: 15px;
65
64
  }
66
65
 
67
66
  .ui-dialog {
@@ -74,4 +73,32 @@ textarea.long {
74
73
 
75
74
  .long {
76
75
  width: 90%;
76
+ }
77
+
78
+ #setting_dialog {
79
+ color: #796fe9;
80
+ background-color: #000000;
81
+ }
82
+
83
+ .setting_name {
84
+ width: 200px;
85
+ color: #796fe9;
86
+ background-color: #000000;
87
+ }
88
+
89
+ .setting_value {
90
+ width: 300px;
91
+ color: #796fe9;
92
+ background-color: #000000;
93
+ }
94
+
95
+ .setting_checkbox {
96
+ color: #796fe9;
97
+ background-color: #000000;
98
+ }
99
+
100
+ ul.log {
101
+ list-style-type: decimal;
102
+ font-size: 12px;
103
+ color: #5d0a94;
77
104
  }
@@ -11,12 +11,15 @@
11
11
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
12
12
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
13
13
 
14
- <script src="http://localhost:62857/js/main.js"></script>
15
- <link rel="stylesheet" href="http://localhost:62857/css/index.css" type="text/css">
14
+ <script src="http://localhost:55974/js/main.js"></script>
15
+ <link rel="stylesheet" href="http://localhost:55974/css/index.css" type="text/css">
16
16
  </head>
17
17
 
18
18
  <body>
19
- <h3>サンプル</h3>
19
+ <div id="msg_dialog" style="display:none;">
20
+ <div id="msg_text">message</div>
21
+ </div>
22
+ <h4>GrepFind</h4>
20
23
  <hr>
21
24
  <table>
22
25
  <tr>
@@ -26,6 +29,12 @@
26
29
  <td>
27
30
  <input type="button" id="stop" name="stop" value="停止">
28
31
  </td>
32
+ <td>
33
+ <div id="setting_dialog" style="display:none;">
34
+ <dl id="wrap"></dl>
35
+ </div>
36
+ <input type="button" id="setting" value="設定" />
37
+ </td>
29
38
  </tr>
30
39
  </table>
31
40
 
@@ -49,7 +58,10 @@
49
58
  </tr>
50
59
  </table>
51
60
 
52
- <textarea name="log" id="log" class="outarea"></textarea><br />
61
+ <div class="outarea">
62
+ <ul name="log" id="log" class="log">
63
+ </ul>
64
+ </div>
53
65
 
54
66
  </body>
55
67
 
@@ -1,6 +1,51 @@
1
1
  // main.js
2
2
 
3
3
  var $ws = null;
4
+ var $auto_scroll = true;
5
+ var dialog = null;
6
+
7
+ function open_dialog(msg) {
8
+ console.log("msg=" + msg);
9
+ $("#msg_text").html(msg);
10
+ $("#msg_dialog").dialog({
11
+ modal: true
12
+ , show: "slide" //表示時のアニメーション
13
+ , hide: "slide" //閉じた時のアニメーション
14
+ , title: "Message" //ダイアログのタイトル
15
+ , width: 400 //ダイアログの横幅
16
+ , height: 200 //ダイアログの高さ
17
+ , resizable: true //リサイズ可
18
+ , closeOnEscape: false //[ESC]キーで閉じられなくする
19
+ , draggable: true //ダイアログの移動を可に
20
+ , buttons: {
21
+ "OK": function () { //Cancelボタン
22
+ $(this).dialog("close");
23
+ }
24
+ }
25
+ });
26
+ }
27
+
28
+ function open_dialog_org(msg) {
29
+ var top = window.screenTop + 10;
30
+ var left = window.screenLeft + 10;
31
+ if (dialog != null) {
32
+ dialog.close();
33
+ }
34
+ var dialog = window.open(
35
+ "/open_dialog?msg=" + msg,
36
+ "pop",
37
+ "width=300, height=100, left=" + left + ", top=" + top
38
+ );
39
+ console.log("open dialog dialog=" + dialog);
40
+ if (dialog == null) {
41
+ console.log("open dialog retry");
42
+ setTimeout(function () {
43
+ open_dialog(msg);
44
+ }, 1000);
45
+ } else {
46
+ dialog.focus();
47
+ }
48
+ }
4
49
 
5
50
  function server_connect(url) {
6
51
  var ws = new WebSocket(url);
@@ -10,18 +55,23 @@ function server_connect(url) {
10
55
  };
11
56
  ws.onmessage = function (evt) {
12
57
  //alert(evt.data);
58
+
13
59
  if (evt.data.match(/^startup:/)) {
14
60
  file_name = evt.data.replace(/^startup:/, "");
15
61
  //alert(file_name);
62
+ }
63
+ else if (evt.data.match(/^app_end:normal/)) {
64
+ open_dialog("終了しました");
65
+ }
66
+ else if (evt.data.match(/^app_end:error/)) {
67
+ open_dialog("<font color='red'>エラーが発生しました</font>");
16
68
  } else {
17
- var log = $('#log').val() + evt.data + "\n";
18
- $('#log').val(log);
19
- var psconsole = $('#log');
20
- psconsole.scrollTop(
21
- psconsole[0].scrollHeight - psconsole.height()
22
- );
69
+ var log = "<li>" + evt.data + "</li>";
70
+ $('#log').append(log);
71
+ if ($auto_scroll) {
72
+ $('.outarea').scrollTop($('.outarea').get(0).scrollHeight);
73
+ }
23
74
  }
24
-
25
75
  };
26
76
  ws.onclose = function () {
27
77
  alert("アプリケーションが終了しました!!");
@@ -44,14 +94,14 @@ function autocomp(id, file_kind) {
44
94
  minLength: 0,
45
95
  delay: 0,
46
96
  select: function (event, ui) {
47
- console.log(ui.item.value);
97
+ //console.log(ui.item.value);
48
98
  jQuery("#" + id).val(ui.item.value);
49
99
  //jQuery(this).autocomplete("search", "");
50
100
  $(this).keydown();
51
101
  },
52
102
  source: function (req, resp) {
53
103
  $.ajax({
54
- url: "http://localhost:62857/search?path=" + $("#" + id).val() + "&kind=" + file_kind,
104
+ url: "http://localhost:55974/search?path=" + $("#" + id).val() + "&kind=" + file_kind,
55
105
  type: "GET",
56
106
  cache: false,
57
107
  dataType: "json",
@@ -68,17 +118,14 @@ function autocomp(id, file_kind) {
68
118
 
69
119
  }
70
120
  }).focus(function () {
71
- console.log("forcus");
72
121
  //jQuery(this).autocomplete("search", "");
73
122
  $(this).keydown();
74
123
  });
75
124
  }
76
125
 
77
126
  function select_file_dialog(search_id, file_kind, dialog_id, select_file, file_name) {
78
- console.log("select_file_dialog select_file=" + select_file);
79
127
  $("#" + select_file).click(function () {
80
128
  autocomp(search_id, file_kind);
81
- console.log("open dialog dialog_id=", dialog_id);
82
129
  $(".ui-autocomplete").css("z-index", 1000);
83
130
  $("#" + search_id).val("/");
84
131
  $("#" + dialog_id).dialog({
@@ -88,9 +135,9 @@ function select_file_dialog(search_id, file_kind, dialog_id, select_file, file_n
88
135
  , title: "Select File" //ダイアログのタイトル
89
136
  , width: 580 //ダイアログの横幅
90
137
  , height: 400 //ダイアログの高さ
91
- , resizable: false //リサイズ不可
138
+ , resizable: true //リサイズ可
92
139
  , closeOnEscape: false //[ESC]キーで閉じられなくする
93
- , draggable: false //ダイアログの移動を不可に
140
+ , draggable: true //ダイアログの移動を可に
94
141
  , buttons: {
95
142
  "OK": function () { //OKボタン
96
143
  $("#" + file_name).val($("#" + search_id).val());
@@ -106,6 +153,109 @@ function select_file_dialog(search_id, file_kind, dialog_id, select_file, file_n
106
153
  });
107
154
  }
108
155
 
156
+ function setting_dialog(open_id, dialog_id, json_file) {
157
+ $("#" + open_id).click(function () {
158
+ $("#" + dialog_id).val = $(function () {
159
+ $("dl#wrap").empty();
160
+ $.getJSON(json_file, function (s) {
161
+ for (var i in s) {
162
+ if (s[i].type == "input") {
163
+ var h = "<table><tr>"
164
+ + "<td class='setting_name'>" + s[i].description + "</td>"
165
+ + "<td><input class='setting_value' type='text' " + "id=" + s[i].name + "_value " + "value=" + s[i].value + ">"
166
+ + "</td></tr></table>"
167
+ $("dl#wrap").append(h);
168
+ } else if (s[i].type == "checkbox") {
169
+ var h = "<table><tr>";
170
+ h += "<td class='setting_name'>" + s[i].description + "</td>";
171
+ if (s[i].value == true) {
172
+ h += "<td><input class='setting_checkbox' type='checkbox' " + "id=" + s[i].name + "_value checked ></td>";
173
+ } else {
174
+ h += "<td><input class='setting_checkbox' type='checkbox' " + "id=" + s[i].name + "_value ></td>";
175
+ }
176
+ h += "</tr></table>";
177
+ $("dl#wrap").append(h);
178
+ } else if (s[i].type == "select") {
179
+ var h = "<table><tr>";
180
+ h += "<td class='setting_name'>" + s[i].description + "</td>";
181
+ h += "<td> <select class='setting_value' id=" + s[i].name + "_value " + ">";
182
+ s[i].select.forEach(e => {
183
+ if (e == s[i].value) {
184
+ h += "<option value=" + e + " selected >" + e + "</option>";
185
+ } else {
186
+ h += "<option value=" + e + ">" + e + "</option>";
187
+ }
188
+ });
189
+ h += "</select></td>";
190
+ h += "</tr></table>";
191
+ $("dl#wrap").append(h);
192
+ } else {
193
+ //console.log("type=" + s[i].type);
194
+ }
195
+ }
196
+ });
197
+ });
198
+ $("#" + dialog_id).dialog({
199
+ modal: true
200
+ , show: "slide" //表示時のアニメーション
201
+ , hide: "explode" //閉じた時のアニメーション
202
+ , title: "Setting" //ダイアログのタイトル
203
+ , width: 580 //ダイアログの横幅
204
+ , height: 400 //ダイアログの高さ
205
+ , resizable: true //リサイズ可
206
+ , closeOnEscape: false //[ESC]キーで閉じられなくする
207
+ , draggable: true //ダイアログの移動を可に
208
+ , buttons: {
209
+ "OK": function () { //OKボタン
210
+ var json_data = []
211
+ $.getJSON(json_file, function (s) {
212
+ for (var i in s) {
213
+ //console.log(s[i].name);
214
+ if (s[i].type == "input") {
215
+ var data = {};
216
+ data["name"] = s[i].name;
217
+ data["value"] = $("#" + s[i].name + "_value").val();
218
+ data["type"] = s[i].type;
219
+ data["select"] = s[i].select;
220
+ data["description"] = s[i].description;
221
+ json_data.push(data);
222
+ }
223
+ else if (s[i].type == "checkbox") {
224
+ var data = {};
225
+ data["name"] = s[i].name;
226
+ if ($("#" + s[i].name + "_value:checked").val() == "on") {
227
+ data["value"] = true;
228
+ } else {
229
+ data["value"] = false;
230
+ }
231
+ data["type"] = s[i].type;
232
+ data["select"] = s[i].select;
233
+ data["description"] = s[i].description;
234
+ json_data.push(data);
235
+ } else if (s[i].type == "select") {
236
+ var data = {};
237
+ data["name"] = s[i].name;
238
+ data["value"] = $("#" + s[i].name + "_value" + " option:selected").val();
239
+ data["type"] = s[i].type;
240
+ data["select"] = s[i].select;
241
+ data["description"] = s[i].description;
242
+ json_data.push(data);
243
+ } else {
244
+ //console.log("type=" + s[i].type);
245
+ }
246
+ }
247
+ $ws.send("setting:" + JSON.stringify(json_data));
248
+ });
249
+ $(this).dialog("close");
250
+ },
251
+ "Cancel": function () { //Cancelボタン
252
+ $(this).dialog("close");
253
+ }
254
+ }
255
+ });
256
+ });
257
+ }
258
+
109
259
  function get_dirname(path) {
110
260
  var result = path.replace(/\\/g, '/').replace(/\/[^\/]*$/, '');
111
261
  if (result.match(/^[^\/]*\.[^\/\.]*$/)) {
@@ -119,18 +269,40 @@ function dispFile() {
119
269
  alert('選択したファイルの値は' + fName + 'です');
120
270
  }
121
271
 
272
+ function openFile(file) {
273
+ $ws.send("openfile:" + file);
274
+ }
275
+
122
276
  // 起動時の処理
123
277
  $(document).ready(function () {
124
278
  // サーバに接続
125
- server_connect("ws://localhost:62857/wsserver")
279
+ server_connect("ws://localhost:55974/wsserver")
126
280
  // ウインドウサイズ
127
281
  var width = 800;
128
282
  var height = 600;
283
+ $(window).resize(function () {
284
+ $(".outarea").height($(window).height() - 300);
285
+ });
129
286
  // ウインドウの位置
130
287
  $(function () {
131
288
  window.resizeTo(width, height);
132
289
  window.moveTo((window.screen.width / 2) - (width / 2), (screen.height / 2) - (height / 2));
133
290
  //window.moveTo(0,0);
291
+ $(".outarea").height($(window).height() - 300);
292
+ });
293
+
294
+ $('.outarea').scroll(function () {
295
+ var h = $('.outarea').get(0).scrollHeight - $('.outarea').innerHeight();
296
+ //console.log("scrollEnd=" + Math.abs($('.outarea').scrollTop() - h));
297
+ if (Math.abs($('.outarea').scrollTop() - h) < 30) {
298
+ // 最後までスクロールしている
299
+ // 自動スクロールON
300
+ $auto_scroll = true;
301
+ } else {
302
+ // 自動スクロールOFF
303
+ $auto_scroll = false;
304
+ }
305
+ //console.log("auto_scroll=" + $auto_scroll);
134
306
  });
135
307
 
136
308
  // ハンドラ登録
@@ -139,6 +311,7 @@ $(document).ready(function () {
139
311
  });
140
312
 
141
313
  $("#exec").click(function () {
314
+ $('#log').empty();
142
315
  send_message("exec:" + $("#upFile").val());
143
316
  });
144
317
 
@@ -146,5 +319,7 @@ $(document).ready(function () {
146
319
 
147
320
  select_file_dialog("search_str2", "dir", "dialog2", "select_dir", "upDir");
148
321
 
322
+ setting_dialog("setting", "setting_dialog", "config/setting.json");
323
+
149
324
  });
150
325
 
@@ -12,6 +12,7 @@ class MyApp < AppMainBase
12
12
  end
13
13
  while true
14
14
  yield Time.now.to_s if block_given?
15
+ yield @config["name1"]
15
16
  sleep 1
16
17
  break if @abort
17
18
  end
@@ -48,7 +48,8 @@ class Search < Sinatra::Base
48
48
  data = {}
49
49
  next if File.basename(file) == "."
50
50
  next if kind == "dir" and !File.directory?(file)
51
- data["label"] = File.expand_path(file)
51
+ data["label"] = File.basename(file)
52
+ data["label"] += "/" if (File.directory?(file))
52
53
  data["value"] = File.expand_path(file)
53
54
  res.push data
54
55
  end
@@ -1,11 +1,16 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  class AppMainBase
3
3
  def initialize
4
+ @config = nil
4
5
  @aboet = false
5
6
  @exec = false
6
7
  @suspend = false
7
8
  end
8
9
 
10
+ def set_config(config)
11
+ @config = config
12
+ end
13
+
9
14
  def start(argv)
10
15
  @exec = true
11
16
  end
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env ruby
1
2
  # -*- coding: utf-8 -*-
2
3
  $LOAD_PATH << File.dirname(File.expand_path(__FILE__))
3
4
 
@@ -49,7 +50,6 @@ Thread.start {
49
50
  else
50
51
  browser = json["chrome_win"]
51
52
  end
52
- #browser = "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\" -app=http://localhost:#{port}"
53
53
  browser += " -app=http://localhost:#{port}"
54
54
  puts browser
55
55
  system browser
@@ -1,7 +1,19 @@
1
1
  require "./server_app_base"
2
+ require "json"
3
+ require "cgi"
4
+
5
+ def config_json_hash(json)
6
+ config = {}
7
+ json.each do |j|
8
+ config[j["name"]] = j["value"]
9
+ end
10
+ return config
11
+ end
2
12
 
3
13
  class WsServer < Sinatra::Base
4
14
  $ws_list = []
15
+ json_config = nil
16
+ exec_thread = nil
5
17
  get "" do
6
18
  if !request.websocket?
7
19
  "no supported"
@@ -14,21 +26,61 @@ class WsServer < Sinatra::Base
14
26
  ws.onmessage do |msg|
15
27
  puts msg
16
28
  if msg =~ /^exec:/
17
- argv = msg.gsub(/^exec:/, "")
18
- Thread.new {
19
- $app.start(argv.split(",")) do |out|
20
- ws.send(out)
21
- end
22
- }
29
+ if exec_thread == nil
30
+ json = JSON.parse(File.read("config/setting.json"))
31
+ json_config = config_json_hash(json)
32
+ $app.set_config(json_config)
33
+ argv = msg.gsub(/^exec:/, "")
34
+ exec_thread = Thread.new {
35
+ begin
36
+ $app.start(argv.split(",")) do |out|
37
+ ws.send(out)
38
+ end
39
+ ws.send("app_end:normal")
40
+ rescue
41
+ puts $!
42
+ puts $@
43
+ puts "app_end:err"
44
+ ws.send("app_end:error")
45
+ ensure
46
+ puts "exit thread"
47
+ exec_thread = nil
48
+ end
49
+ }
50
+ else
51
+ puts "app_end:err"
52
+ ws.send("app_end:error")
53
+ end
23
54
  end
24
55
  if msg =~ /^stop/
25
- $app.stop
56
+ if exec_thread
57
+ $app.stop
58
+ end
26
59
  end
27
60
  if msg =~ /^suspend/
28
- $app.suspend
61
+ if exec_thread
62
+ $app.suspend
63
+ end
29
64
  end
30
65
  if msg =~ /^resume/
31
- $app.resume
66
+ if exec_thread
67
+ $app.resume
68
+ end
69
+ end
70
+ if msg =~ /^setting:/
71
+ json_string = msg.gsub(/^setting:/, "")
72
+ json = JSON.parse(json_string)
73
+ File.open("config/setting.json", "w") do |w|
74
+ w.puts JSON.pretty_generate(json)
75
+ end
76
+ json_config = config_json_hash(json)
77
+ $app.set_config(json_config)
78
+ end
79
+ if msg =~ /^openfile:/
80
+ file = msg.gsub(/^openfile:/, "")
81
+ Thread.new {
82
+ system "#{json_config["editor"]} #{CGI.unescapeHTML(file)}"
83
+ }
32
84
  end
33
85
 
34
86
  if msg == "exit"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: browser_app_base
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - masataka kuwayama
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-26 00:00:00.000000000 Z
11
+ date: 2021-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -116,6 +116,7 @@ files:
116
116
  - lib/template/app_load.rb
117
117
  - lib/template/config.ru
118
118
  - lib/template/config/browser.json
119
+ - lib/template/config/setting.json
119
120
  - lib/template/css/index.css
120
121
  - lib/template/index.html
121
122
  - lib/template/js/main.js