browser_app_base 0.0.1 → 0.0.5
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.
- checksums.yaml +4 -4
- data/.vscode/launch.json +15 -0
- data/README.md +31 -6
- data/bin/create_browser_app.rb +2 -1
- data/browser_app_base.gemspec +1 -1
- data/lib/browser_app_base/version.rb +1 -1
- data/lib/browser_app_base.rb +50 -4
- data/lib/template/app_load.rb +2 -0
- data/lib/template/config/browser.json +1 -1
- data/lib/template/config/setting.json +50 -0
- data/lib/template/config.ru +7 -1
- data/lib/template/css/index.css +58 -7
- data/lib/template/index.html +32 -6
- data/lib/template/js/main.js +179 -42
- data/lib/template/{server_app.rb → my_app_sample.rb} +10 -7
- data/lib/template/server.rb +28 -10
- data/lib/template/server_app_base.rb +32 -0
- data/lib/template/start.rb +7 -7
- data/lib/template/wsserver.rb +47 -9
- metadata +8 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3565687a000a2d7a0636d2ac47c09de24d87cfe1554777b58d8f9d9ab494102d
|
|
4
|
+
data.tar.gz: a305213755edff63ab70edff0f2011d52c33ee6fd53b9aaddce80865440107c3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f2f2cb63d6ff01e6bb39731fd36944a8a4ff96c9b5370ed9b386383bc6c67fe55586d1e6f278d8af17713b542079f1850de0afd820c9b78357d7afc4debb63d8
|
|
7
|
+
data.tar.gz: 200b7d9a67ef7421f52a2d3887b91d3d9c5ab99eda27ccebbf1725718204d25945bc0f31679811d0d4e959561ebed2906de8b98900c9272f80196b6fa9f7640a
|
data/.vscode/launch.json
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
// IntelliSense を使用して利用可能な属性を学べます。
|
|
3
|
+
// 既存の属性の説明をホバーして表示します。
|
|
4
|
+
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
|
|
5
|
+
"version": "0.2.0",
|
|
6
|
+
"configurations": [
|
|
7
|
+
{
|
|
8
|
+
"name": "Debug Local File",
|
|
9
|
+
"type": "Ruby",
|
|
10
|
+
"request": "launch",
|
|
11
|
+
"cwd": "${workspaceRoot}/lib/template/",
|
|
12
|
+
"program": "${workspaceRoot}/lib/template/start.rb"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
data/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# BrowserAppBase
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Windows and Linux browser-based desktop application templates.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
You need a Chrome browser to run it.
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
@@ -24,16 +24,41 @@ Or install it yourself as:
|
|
|
24
24
|
|
|
25
25
|
create_browser_app [options]
|
|
26
26
|
-d, --dir dir_name application directory
|
|
27
|
+
-a, --app app_name application name
|
|
27
28
|
-h, --help command help
|
|
28
29
|
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
## Create app templat
|
|
31
32
|
|
|
32
|
-
$ create_browser_app -d ~/test/
|
|
33
|
+
$ create_browser_app -d ~/test/ -a MyApp
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
## add application code
|
|
36
|
+
$ cd ~/test/
|
|
37
|
+
$ vi my_app.rb
|
|
35
38
|
|
|
36
|
-
|
|
39
|
+
```ruby
|
|
40
|
+
class MyApp < AppMainBase
|
|
41
|
+
def start(argv)
|
|
42
|
+
super
|
|
43
|
+
# add application code
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def stop()
|
|
47
|
+
super
|
|
48
|
+
# add application code
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
ui application sample
|
|
54
|
+
|
|
55
|
+
index.html
|
|
56
|
+
css/index.css
|
|
57
|
+
js/main.js
|
|
58
|
+
|
|
59
|
+
## Start application
|
|
60
|
+
|
|
61
|
+
$ cd ~/test/
|
|
37
62
|
$ ruby start.rb
|
|
38
63
|
|
|
39
64
|
## Development
|
data/bin/create_browser_app.rb
CHANGED
|
@@ -7,6 +7,7 @@ require "optparse"
|
|
|
7
7
|
opt = OptionParser.new
|
|
8
8
|
o = {}
|
|
9
9
|
opt.on("-d dir_name", "--dir dir_name", "application directory") { |v| o[:dir] = v }
|
|
10
|
+
opt.on("-a app_name", "--app app_name", "application name") { |v| o[:app] = v }
|
|
10
11
|
opt.on("-h", "--help", "command help") { puts opt; exit }
|
|
11
12
|
begin
|
|
12
13
|
opt.parse!(ARGV)
|
|
@@ -20,4 +21,4 @@ if o[:dir] == nil
|
|
|
20
21
|
exit
|
|
21
22
|
end
|
|
22
23
|
|
|
23
|
-
BrowserAppBase.create o
|
|
24
|
+
BrowserAppBase.create o
|
data/browser_app_base.gemspec
CHANGED
|
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
|
10
10
|
|
|
11
11
|
spec.summary = "browser app base"
|
|
12
12
|
spec.description = "browser application template"
|
|
13
|
-
spec.homepage = "https://github.com/
|
|
13
|
+
spec.homepage = "https://github.com/kuwayama1971/BrowserAppBase"
|
|
14
14
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
|
|
15
15
|
|
|
16
16
|
#spec.metadata["allowed_push_host"] = "http://mygemserver.com"
|
data/lib/browser_app_base.rb
CHANGED
|
@@ -1,20 +1,66 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative "browser_app_base/version"
|
|
4
|
-
|
|
5
4
|
require "fileutils"
|
|
6
5
|
|
|
7
6
|
module BrowserAppBase
|
|
8
7
|
class Error < StandardError; end
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
def self.get_app_file(app)
|
|
10
|
+
app_file_name = ""
|
|
11
|
+
app.each_char do |s|
|
|
12
|
+
if s =~ /[A-Z]/
|
|
13
|
+
app_file_name += "_" if app_file_name.size != 0
|
|
14
|
+
app_file_name += s.downcase
|
|
15
|
+
else
|
|
16
|
+
app_file_name += s
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
return app_file_name + ".rb"
|
|
20
|
+
end
|
|
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
|
|
11
33
|
|
|
12
|
-
def self.create(
|
|
34
|
+
def self.create(arg)
|
|
35
|
+
dir = arg[:dir]
|
|
36
|
+
app = arg[:app]
|
|
13
37
|
puts "create application base #{dir}"
|
|
14
38
|
|
|
15
39
|
FileUtils.mkdir_p dir
|
|
16
40
|
|
|
17
41
|
path = File.dirname(File.expand_path(__FILE__))
|
|
18
|
-
|
|
42
|
+
Dir.glob("#{path}/template/*") do |f|
|
|
43
|
+
puts "#{f} => #{dir}"
|
|
44
|
+
FileUtils.cp_r f, "#{dir}/"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
if app
|
|
48
|
+
app_file = get_app_file(app)
|
|
49
|
+
|
|
50
|
+
load_app = <<"EOS"
|
|
51
|
+
require '#{app_file}'
|
|
52
|
+
$app = #{get_app_name(app)}.new
|
|
53
|
+
EOS
|
|
54
|
+
|
|
55
|
+
File.open("#{dir}/app_load.rb", "w") do |f|
|
|
56
|
+
f.write load_app
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
puts "create #{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)))
|
|
64
|
+
end
|
|
19
65
|
end
|
|
20
66
|
end
|
|
@@ -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
|
+
]
|
data/lib/template/config.ru
CHANGED
|
@@ -24,6 +24,12 @@ 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
|
+
|
|
27
33
|
map "/search" do
|
|
28
34
|
run Search
|
|
29
35
|
end
|
|
@@ -46,6 +52,6 @@ configure do
|
|
|
46
52
|
|
|
47
53
|
end
|
|
48
54
|
|
|
49
|
-
#\ --port
|
|
55
|
+
#\ --port 52538
|
|
50
56
|
|
|
51
57
|
run Sinatra::Application
|
data/lib/template/css/index.css
CHANGED
|
@@ -22,9 +22,9 @@ hr {
|
|
|
22
22
|
padding: 5px;
|
|
23
23
|
width: 95vw;
|
|
24
24
|
height: 50vh;
|
|
25
|
+
overflow: auto;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
|
|
28
28
|
.inarea {
|
|
29
29
|
border: thin solid #000000;
|
|
30
30
|
margin: 5px;
|
|
@@ -32,12 +32,6 @@ hr {
|
|
|
32
32
|
width: 95%;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
input {
|
|
36
|
-
background-color: #FAFAFA;
|
|
37
|
-
margin: 5px;
|
|
38
|
-
padding: 5px;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
35
|
input.long {
|
|
42
36
|
width: 90%;
|
|
43
37
|
background-color: #FAFAFA;
|
|
@@ -50,3 +44,60 @@ textarea.long {
|
|
|
50
44
|
height: 50vh;
|
|
51
45
|
}
|
|
52
46
|
|
|
47
|
+
.ui-widget {
|
|
48
|
+
font-size: 12px;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.ui-autocomplete {
|
|
52
|
+
max-height: 200px;
|
|
53
|
+
max-width: 500px;
|
|
54
|
+
overflow-y: auto;
|
|
55
|
+
overflow-x: auto;
|
|
56
|
+
padding-right: 10px;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#jquery-ui-autocomplete label {
|
|
60
|
+
float: left;
|
|
61
|
+
margin-right: 0.5em;
|
|
62
|
+
color: black;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.ui-dialog {
|
|
66
|
+
position: absolute;
|
|
67
|
+
top: 0;
|
|
68
|
+
left: 0;
|
|
69
|
+
padding: .2em;
|
|
70
|
+
outline: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.long {
|
|
74
|
+
width: 90%;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
#setting_dialog {
|
|
78
|
+
color: #796fe9;
|
|
79
|
+
background-color: #000000;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.setting_name {
|
|
83
|
+
width: 200px;
|
|
84
|
+
color: #796fe9;
|
|
85
|
+
background-color: #000000;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.setting_value {
|
|
89
|
+
width: 300px;
|
|
90
|
+
color: #796fe9;
|
|
91
|
+
background-color: #000000;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.setting_checkbox {
|
|
95
|
+
color: #796fe9;
|
|
96
|
+
background-color: #000000;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
ul.log {
|
|
100
|
+
list-style-type: decimal;
|
|
101
|
+
font-size: 10px;
|
|
102
|
+
color: #5d0a94;
|
|
103
|
+
}
|
data/lib/template/index.html
CHANGED
|
@@ -11,8 +11,8 @@
|
|
|
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:
|
|
15
|
-
<link rel="stylesheet" href="http://localhost:
|
|
14
|
+
<script src="http://localhost:52538/js/main.js"></script>
|
|
15
|
+
<link rel="stylesheet" href="http://localhost:52538/css/index.css" type="text/css">
|
|
16
16
|
</head>
|
|
17
17
|
|
|
18
18
|
<body>
|
|
@@ -26,13 +26,39 @@
|
|
|
26
26
|
<td>
|
|
27
27
|
<input type="button" id="stop" name="stop" value="停止">
|
|
28
28
|
</td>
|
|
29
|
+
<td>
|
|
30
|
+
<div id="setting_dialog" style="display:none;">
|
|
31
|
+
<dl id="wrap"></dl>
|
|
32
|
+
</div>
|
|
33
|
+
<input type="button" id="setting" value="設定" />
|
|
34
|
+
</td>
|
|
35
|
+
</tr>
|
|
36
|
+
</table>
|
|
37
|
+
|
|
38
|
+
<div id="dialog1" style="display:none;">
|
|
39
|
+
<input class="inarea" type="text" name="search_str" id="search_str">
|
|
40
|
+
</div>
|
|
41
|
+
<table>
|
|
42
|
+
<tr>
|
|
43
|
+
<td class="long"><input class="inarea" type="text" id="upFile" name="upFile"></td>
|
|
44
|
+
<td><input type="button" id="select_file" value="ファイル選択" /></td>
|
|
45
|
+
</tr>
|
|
46
|
+
</table>
|
|
47
|
+
|
|
48
|
+
<div id="dialog2" style="display:none;">
|
|
49
|
+
<input class="inarea" type="text" name="search_str2" id="search_str2">
|
|
50
|
+
</div>
|
|
51
|
+
<table>
|
|
52
|
+
<tr>
|
|
53
|
+
<td class="long"><input class="inarea" type="text" id="upDir" name="upDir"></td>
|
|
54
|
+
<td><input type="button" id="select_dir" value="フォルダ選択" /></td>
|
|
29
55
|
</tr>
|
|
30
56
|
</table>
|
|
31
|
-
<input class="inarea" type="text" value="ファイル名を入力" name="search_str" id="search_str">
|
|
32
|
-
<input class="inarea" type="file" id="upFile" name="upFile" value="upFile"><br>
|
|
33
|
-
<input type="button" value="確認" onclick="dispFile()">
|
|
34
57
|
|
|
35
|
-
<
|
|
58
|
+
<div class="outarea">
|
|
59
|
+
<ul name="log" id="log" class="log">
|
|
60
|
+
</ul>
|
|
61
|
+
</div>
|
|
36
62
|
|
|
37
63
|
</body>
|
|
38
64
|
|
data/lib/template/js/main.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// main.js
|
|
2
2
|
|
|
3
3
|
var $ws = null;
|
|
4
|
+
var $auto_scroll = true;
|
|
4
5
|
|
|
5
6
|
function server_connect(url) {
|
|
6
7
|
var ws = new WebSocket(url);
|
|
@@ -13,18 +14,13 @@ function server_connect(url) {
|
|
|
13
14
|
if (evt.data.match(/^startup:/)) {
|
|
14
15
|
file_name = evt.data.replace(/^startup:/, "");
|
|
15
16
|
//alert(file_name);
|
|
16
|
-
var fs = new ActiveXObject("Scripting.FileSystemObject");
|
|
17
|
-
var file = fs.CreateTextFile(file_name);
|
|
18
|
-
file.Close();
|
|
19
17
|
} else {
|
|
20
|
-
var log =
|
|
21
|
-
$('#log').
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
);
|
|
18
|
+
var log = "<li>" + evt.data + "</li>";
|
|
19
|
+
$('#log').append(log);
|
|
20
|
+
if ($auto_scroll) {
|
|
21
|
+
$('.outarea').scrollTop($('.outarea').get(0).scrollHeight);
|
|
22
|
+
}
|
|
26
23
|
}
|
|
27
|
-
|
|
28
24
|
};
|
|
29
25
|
ws.onclose = function () {
|
|
30
26
|
alert("アプリケーションが終了しました!!");
|
|
@@ -41,11 +37,20 @@ function send_message(msg) {
|
|
|
41
37
|
}
|
|
42
38
|
}
|
|
43
39
|
|
|
44
|
-
function autocomp(id,
|
|
40
|
+
function autocomp(id, file_kind) {
|
|
45
41
|
$("#" + id).autocomplete({
|
|
42
|
+
autoFocus: true,
|
|
43
|
+
minLength: 0,
|
|
44
|
+
delay: 0,
|
|
45
|
+
select: function (event, ui) {
|
|
46
|
+
console.log(ui.item.value);
|
|
47
|
+
jQuery("#" + id).val(ui.item.value);
|
|
48
|
+
//jQuery(this).autocomplete("search", "");
|
|
49
|
+
$(this).keydown();
|
|
50
|
+
},
|
|
46
51
|
source: function (req, resp) {
|
|
47
52
|
$.ajax({
|
|
48
|
-
url:
|
|
53
|
+
url: "http://localhost:52538/search?path=" + $("#" + id).val() + "&kind=" + file_kind,
|
|
49
54
|
type: "GET",
|
|
50
55
|
cache: false,
|
|
51
56
|
dataType: "json",
|
|
@@ -61,6 +66,142 @@ function autocomp(id, url) {
|
|
|
61
66
|
});
|
|
62
67
|
|
|
63
68
|
}
|
|
69
|
+
}).focus(function () {
|
|
70
|
+
//jQuery(this).autocomplete("search", "");
|
|
71
|
+
$(this).keydown();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function select_file_dialog(search_id, file_kind, dialog_id, select_file, file_name) {
|
|
76
|
+
$("#" + select_file).click(function () {
|
|
77
|
+
autocomp(search_id, file_kind);
|
|
78
|
+
$(".ui-autocomplete").css("z-index", 1000);
|
|
79
|
+
$("#" + search_id).val("/");
|
|
80
|
+
$("#" + dialog_id).dialog({
|
|
81
|
+
modal: true
|
|
82
|
+
, show: "slide" //表示時のアニメーション
|
|
83
|
+
, hide: "explode" //閉じた時のアニメーション
|
|
84
|
+
, title: "Select File" //ダイアログのタイトル
|
|
85
|
+
, width: 580 //ダイアログの横幅
|
|
86
|
+
, height: 400 //ダイアログの高さ
|
|
87
|
+
, resizable: true //リサイズ可
|
|
88
|
+
, closeOnEscape: false //[ESC]キーで閉じられなくする
|
|
89
|
+
, draggable: true //ダイアログの移動を可に
|
|
90
|
+
, buttons: {
|
|
91
|
+
"OK": function () { //OKボタン
|
|
92
|
+
$("#" + file_name).val($("#" + search_id).val());
|
|
93
|
+
$(this).dialog("close");
|
|
94
|
+
$("#" + search_id).autocomplete("destroy");
|
|
95
|
+
},
|
|
96
|
+
"Cancel": function () { //Cancelボタン
|
|
97
|
+
$(this).dialog("close");
|
|
98
|
+
$("#" + search_id).autocomplete("destroy");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function setting_dialog(open_id, dialog_id, json_file) {
|
|
106
|
+
$("#" + open_id).click(function () {
|
|
107
|
+
$("#" + dialog_id).val = $(function () {
|
|
108
|
+
$("dl#wrap").empty();
|
|
109
|
+
$.getJSON(json_file, function (s) {
|
|
110
|
+
for (var i in s) {
|
|
111
|
+
if (s[i].type == "input") {
|
|
112
|
+
var h = "<table><tr>"
|
|
113
|
+
+ "<td class='setting_name'>" + s[i].description + "</td>"
|
|
114
|
+
+ "<td><input class='setting_value' type='text' " + "id=" + s[i].name + "_value " + "value=" + s[i].value + ">"
|
|
115
|
+
+ "</td></tr></table>"
|
|
116
|
+
$("dl#wrap").append(h);
|
|
117
|
+
} else if (s[i].type == "checkbox") {
|
|
118
|
+
var h = "<table><tr>";
|
|
119
|
+
h += "<td class='setting_name'>" + s[i].description + "</td>";
|
|
120
|
+
if (s[i].value == true) {
|
|
121
|
+
h += "<td><input class='setting_checkbox' type='checkbox' " + "id=" + s[i].name + "_value checked ></td>";
|
|
122
|
+
} else {
|
|
123
|
+
h += "<td><input class='setting_checkbox' type='checkbox' " + "id=" + s[i].name + "_value ></td>";
|
|
124
|
+
}
|
|
125
|
+
h += "</tr></table>";
|
|
126
|
+
$("dl#wrap").append(h);
|
|
127
|
+
} else if (s[i].type == "select") {
|
|
128
|
+
var h = "<table><tr>";
|
|
129
|
+
h += "<td class='setting_name'>" + s[i].description + "</td>";
|
|
130
|
+
h += "<td> <select class='setting_value' id=" + s[i].name + "_value " + ">";
|
|
131
|
+
s[i].select.forEach(e => {
|
|
132
|
+
if (e == s[i].value) {
|
|
133
|
+
h += "<option value=" + e + " selected >" + e + "</option>";
|
|
134
|
+
} else {
|
|
135
|
+
h += "<option value=" + e + ">" + e + "</option>";
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
h += "</select></td>";
|
|
139
|
+
h += "</tr></table>";
|
|
140
|
+
$("dl#wrap").append(h);
|
|
141
|
+
} else {
|
|
142
|
+
console.log("type=" + s[i].type);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
$("#" + dialog_id).dialog({
|
|
148
|
+
modal: true
|
|
149
|
+
, show: "slide" //表示時のアニメーション
|
|
150
|
+
, hide: "explode" //閉じた時のアニメーション
|
|
151
|
+
, title: "Setting" //ダイアログのタイトル
|
|
152
|
+
, width: 580 //ダイアログの横幅
|
|
153
|
+
, height: 400 //ダイアログの高さ
|
|
154
|
+
, resizable: true //リサイズ可
|
|
155
|
+
, closeOnEscape: false //[ESC]キーで閉じられなくする
|
|
156
|
+
, draggable: true //ダイアログの移動を可に
|
|
157
|
+
, buttons: {
|
|
158
|
+
"OK": function () { //OKボタン
|
|
159
|
+
var json_data = []
|
|
160
|
+
$.getJSON(json_file, function (s) {
|
|
161
|
+
for (var i in s) {
|
|
162
|
+
console.log(s[i].name);
|
|
163
|
+
if (s[i].type == "input") {
|
|
164
|
+
var data = {};
|
|
165
|
+
data["name"] = s[i].name;
|
|
166
|
+
data["value"] = $("#" + s[i].name + "_value").val();
|
|
167
|
+
data["type"] = s[i].type;
|
|
168
|
+
data["select"] = s[i].select;
|
|
169
|
+
data["description"] = s[i].description;
|
|
170
|
+
json_data.push(data);
|
|
171
|
+
}
|
|
172
|
+
else if (s[i].type == "checkbox") {
|
|
173
|
+
var data = {};
|
|
174
|
+
data["name"] = s[i].name;
|
|
175
|
+
if ($("#" + s[i].name + "_value:checked").val() == "on") {
|
|
176
|
+
data["value"] = true;
|
|
177
|
+
} else {
|
|
178
|
+
data["value"] = false;
|
|
179
|
+
}
|
|
180
|
+
data["type"] = s[i].type;
|
|
181
|
+
data["select"] = s[i].select;
|
|
182
|
+
data["description"] = s[i].description;
|
|
183
|
+
json_data.push(data);
|
|
184
|
+
} else if (s[i].type == "select") {
|
|
185
|
+
var data = {};
|
|
186
|
+
data["name"] = s[i].name;
|
|
187
|
+
data["value"] = $("#" + s[i].name + "_value" + " option:selected").val();
|
|
188
|
+
data["type"] = s[i].type;
|
|
189
|
+
data["select"] = s[i].select;
|
|
190
|
+
data["description"] = s[i].description;
|
|
191
|
+
json_data.push(data);
|
|
192
|
+
} else {
|
|
193
|
+
console.log("type=" + s[i].type);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
$ws.send("setting:" + JSON.stringify(json_data));
|
|
197
|
+
});
|
|
198
|
+
$(this).dialog("close");
|
|
199
|
+
},
|
|
200
|
+
"Cancel": function () { //Cancelボタン
|
|
201
|
+
$(this).dialog("close");
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
});
|
|
64
205
|
});
|
|
65
206
|
}
|
|
66
207
|
|
|
@@ -72,22 +213,6 @@ function get_dirname(path) {
|
|
|
72
213
|
return result.replace(/\//g, "\\");
|
|
73
214
|
}
|
|
74
215
|
|
|
75
|
-
function select_file(id) {
|
|
76
|
-
var file = $("#" + id).val();
|
|
77
|
-
var dir = get_dirname(file);
|
|
78
|
-
if (dir != "") {
|
|
79
|
-
dir = dir + "\\*.*";
|
|
80
|
-
} else {
|
|
81
|
-
dir = "c:\\*.*";
|
|
82
|
-
}
|
|
83
|
-
var path = "";
|
|
84
|
-
//alert(dir);
|
|
85
|
-
//path = HtmlDlgHelper.openfiledlg(dir,"*.db","database(*.db)|*.db|all(*.*)|*.*|Text file(*.txt)|*.txt|");
|
|
86
|
-
path = HtmlDlgHelper.openfiledlg(dir, "", "all(*.*)|*.*|Text file(*.txt)|*.txt|");
|
|
87
|
-
$("#" + id).val(path);
|
|
88
|
-
return (path);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
216
|
function dispFile() {
|
|
92
217
|
var fName = $("#upFile").val();
|
|
93
218
|
alert('選択したファイルの値は' + fName + 'です');
|
|
@@ -96,10 +221,10 @@ function dispFile() {
|
|
|
96
221
|
// 起動時の処理
|
|
97
222
|
$(document).ready(function () {
|
|
98
223
|
// サーバに接続
|
|
99
|
-
server_connect("ws://localhost:
|
|
224
|
+
server_connect("ws://localhost:52538/wsserver")
|
|
100
225
|
// ウインドウサイズ
|
|
101
|
-
var width =
|
|
102
|
-
var height =
|
|
226
|
+
var width = 800;
|
|
227
|
+
var height = 600;
|
|
103
228
|
// ウインドウの位置
|
|
104
229
|
$(function () {
|
|
105
230
|
window.resizeTo(width, height);
|
|
@@ -107,23 +232,35 @@ $(document).ready(function () {
|
|
|
107
232
|
//window.moveTo(0,0);
|
|
108
233
|
});
|
|
109
234
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
235
|
+
$('.outarea').scroll(function () {
|
|
236
|
+
var h = $('.outarea').get(0).scrollHeight - $('.outarea').innerHeight();
|
|
237
|
+
console.log("scrollEnd=" + Math.abs($('.outarea').scrollTop() - h));
|
|
238
|
+
if (Math.abs($('.outarea').scrollTop() - h) < 5) {
|
|
239
|
+
// 最後までスクロールしている
|
|
240
|
+
// 自動スクロールON
|
|
241
|
+
$auto_scroll = true;
|
|
242
|
+
} else {
|
|
243
|
+
// 自動スクロールOFF
|
|
244
|
+
$auto_scroll = false;
|
|
245
|
+
}
|
|
246
|
+
//console.log("auto_scroll=" + $auto_scroll);
|
|
247
|
+
});
|
|
116
248
|
|
|
117
249
|
// ハンドラ登録
|
|
118
|
-
$("#
|
|
119
|
-
|
|
250
|
+
$("#stop").click(function () {
|
|
251
|
+
send_message("stop");
|
|
120
252
|
});
|
|
253
|
+
|
|
121
254
|
$("#exec").click(function () {
|
|
255
|
+
$('#log').empty();
|
|
122
256
|
send_message("exec:" + $("#upFile").val());
|
|
123
257
|
});
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
258
|
+
|
|
259
|
+
select_file_dialog("search_str", "file", "dialog1", "select_file", "upFile");
|
|
260
|
+
|
|
261
|
+
select_file_dialog("search_str2", "dir", "dialog2", "select_dir", "upDir");
|
|
262
|
+
|
|
263
|
+
setting_dialog("setting", "setting_dialog", "config/setting.json");
|
|
127
264
|
|
|
128
265
|
});
|
|
129
266
|
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
|
-
def initialize
|
|
4
|
-
@aboet = false
|
|
5
|
-
end
|
|
2
|
+
require "server_app_base.rb"
|
|
6
3
|
|
|
7
|
-
|
|
4
|
+
class MyApp < AppMainBase
|
|
5
|
+
def start(argv)
|
|
6
|
+
super
|
|
8
7
|
begin
|
|
9
8
|
@abort = false
|
|
10
|
-
puts
|
|
9
|
+
puts argv
|
|
10
|
+
argv.each do |v|
|
|
11
|
+
yield v if block_given?
|
|
12
|
+
end
|
|
11
13
|
while true
|
|
12
14
|
yield Time.now.to_s if block_given?
|
|
15
|
+
yield @config["name1"]
|
|
13
16
|
sleep 1
|
|
14
17
|
break if @abort
|
|
15
18
|
end
|
|
@@ -20,6 +23,6 @@ class AppMain
|
|
|
20
23
|
end
|
|
21
24
|
|
|
22
25
|
def stop()
|
|
23
|
-
|
|
26
|
+
super
|
|
24
27
|
end
|
|
25
28
|
end
|
data/lib/template/server.rb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
require
|
|
2
|
-
require
|
|
1
|
+
require "json"
|
|
2
|
+
require "kconv"
|
|
3
3
|
|
|
4
4
|
class Search < Sinatra::Base
|
|
5
5
|
helpers Sinatra::Streaming
|
|
6
|
-
get
|
|
6
|
+
get "" do
|
|
7
7
|
q_hash = {}
|
|
8
8
|
puts request.query_string
|
|
9
9
|
request.query_string.split("&").each do |q|
|
|
@@ -14,27 +14,45 @@ class Search < Sinatra::Base
|
|
|
14
14
|
q_hash[work[0]] = ""
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
|
-
str = q_hash["path"].gsub(/\\/,"/")
|
|
17
|
+
str = q_hash["path"].gsub(/\\/, "/")
|
|
18
18
|
puts "str=#{str}"
|
|
19
|
+
kind = q_hash["kind"].gsub(/\\/, "/")
|
|
20
|
+
puts "kind=#{kind}"
|
|
19
21
|
res = []
|
|
20
22
|
str = str.gsub(/\\/, "/")
|
|
21
23
|
dir = File.dirname(str)
|
|
22
|
-
dir = "c:/" if dir == nil
|
|
23
24
|
file = File.basename(str)
|
|
24
|
-
|
|
25
|
+
puts "dir=#{dir}"
|
|
26
|
+
puts "file=#{file}"
|
|
27
|
+
|
|
28
|
+
kernel = Facter.value(:kernel)
|
|
29
|
+
if kernel == "windows"
|
|
30
|
+
dir = "c:/" if dir == nil
|
|
31
|
+
dir = "c:/" if dir == "/"
|
|
32
|
+
elsif kernel == "Linux"
|
|
33
|
+
dir = "/" if dir == nil
|
|
34
|
+
else
|
|
35
|
+
dir = "c:/" if dir == nil
|
|
36
|
+
dir = "c:/" if dir == "/"
|
|
37
|
+
end
|
|
38
|
+
|
|
25
39
|
path = "#{dir}/#{file}"
|
|
26
|
-
if File.
|
|
40
|
+
if File.directory?(path)
|
|
27
41
|
path = path + "/*"
|
|
28
42
|
else
|
|
29
43
|
path = path + "*"
|
|
30
44
|
end
|
|
45
|
+
path.gsub!(/[\/]+/, "/")
|
|
31
46
|
puts path
|
|
32
|
-
Dir.glob(path).each do |file|
|
|
47
|
+
Dir.glob(path, File::FNM_DOTMATCH).each do |file|
|
|
33
48
|
data = {}
|
|
49
|
+
next if File.basename(file) == "."
|
|
50
|
+
next if kind == "dir" and !File.directory?(file)
|
|
34
51
|
data["label"] = File.basename(file)
|
|
35
|
-
data["
|
|
52
|
+
data["label"] += "/" if (File.directory?(file))
|
|
53
|
+
data["value"] = File.expand_path(file)
|
|
36
54
|
res.push data
|
|
37
55
|
end
|
|
38
|
-
JSON.generate res
|
|
56
|
+
JSON.generate res.sort { |a, b| a["value"] <=> b["value"] }
|
|
39
57
|
end
|
|
40
58
|
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
class AppMainBase
|
|
3
|
+
def initialize
|
|
4
|
+
@config = nil
|
|
5
|
+
@aboet = false
|
|
6
|
+
@exec = false
|
|
7
|
+
@suspend = false
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def set_config(config)
|
|
11
|
+
@config = config
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def start(argv)
|
|
15
|
+
@exec = true
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def stop()
|
|
19
|
+
@abort = true
|
|
20
|
+
@exec = false
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def suspend()
|
|
24
|
+
@suspend = true
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def resume()
|
|
28
|
+
@suspend = false
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
require "app_load.rb"
|
data/lib/template/start.rb
CHANGED
|
@@ -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
|
|
|
@@ -22,19 +23,19 @@ port = get_unused_port
|
|
|
22
23
|
puts "port=#{port}"
|
|
23
24
|
|
|
24
25
|
# config.ruの編集
|
|
25
|
-
buf = File.
|
|
26
|
+
buf = File.binread("config.ru").toutf8
|
|
26
27
|
buf.gsub!(/port [0-9]+/, "port #{port}")
|
|
27
|
-
File.
|
|
28
|
+
File.binwrite("config.ru", buf)
|
|
28
29
|
|
|
29
30
|
# main.jsの編集
|
|
30
|
-
buf = File.
|
|
31
|
+
buf = File.binread("js/main.js").toutf8
|
|
31
32
|
buf.gsub!(/localhost:[0-9]+\//, "localhost:#{port}/")
|
|
32
|
-
File.
|
|
33
|
+
File.binwrite("js/main.js", buf)
|
|
33
34
|
|
|
34
35
|
# index.htaの編集
|
|
35
|
-
buf = File.
|
|
36
|
+
buf = File.binread("index.html").toutf8
|
|
36
37
|
buf.gsub!(/localhost:[0-9]+\//, "localhost:#{port}/")
|
|
37
|
-
File.
|
|
38
|
+
File.binwrite("index.html", buf)
|
|
38
39
|
|
|
39
40
|
Thread.start {
|
|
40
41
|
puts "start browser"
|
|
@@ -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
|
data/lib/template/wsserver.rb
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
require "./
|
|
2
|
-
|
|
1
|
+
require "./server_app_base"
|
|
2
|
+
require "json"
|
|
3
|
+
|
|
4
|
+
def config_json_hash(json)
|
|
5
|
+
config = {}
|
|
6
|
+
json.each do |j|
|
|
7
|
+
config[j["name"]] = j["value"]
|
|
8
|
+
end
|
|
9
|
+
return config
|
|
10
|
+
end
|
|
3
11
|
|
|
4
12
|
class WsServer < Sinatra::Base
|
|
5
13
|
$ws_list = []
|
|
14
|
+
json_config = nil
|
|
15
|
+
exec_thread = nil
|
|
6
16
|
get "" do
|
|
7
17
|
if !request.websocket?
|
|
8
18
|
"no supported"
|
|
@@ -15,16 +25,44 @@ class WsServer < Sinatra::Base
|
|
|
15
25
|
ws.onmessage do |msg|
|
|
16
26
|
puts msg
|
|
17
27
|
if msg =~ /^exec:/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
if exec_thread == nil
|
|
29
|
+
json = JSON.parse(File.read("config/setting.json"))
|
|
30
|
+
json_config = config_json_hash(json)
|
|
31
|
+
$app.set_config(json_config)
|
|
32
|
+
argv = msg.gsub(/^exec:/, "")
|
|
33
|
+
exec_thread = Thread.new {
|
|
34
|
+
$app.start(argv.split(",")) do |out|
|
|
35
|
+
ws.send(out)
|
|
36
|
+
end
|
|
37
|
+
exec_thread = nil
|
|
38
|
+
}
|
|
39
|
+
end
|
|
24
40
|
end
|
|
25
41
|
if msg =~ /^stop/
|
|
26
|
-
|
|
42
|
+
if exec_thread
|
|
43
|
+
$app.stop
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
if msg =~ /^suspend/
|
|
47
|
+
if exec_thread
|
|
48
|
+
$app.suspend
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
if msg =~ /^resume/
|
|
52
|
+
if exec_thread
|
|
53
|
+
$app.resume
|
|
54
|
+
end
|
|
27
55
|
end
|
|
56
|
+
if msg =~ /^setting:/
|
|
57
|
+
json_string = msg.gsub(/^setting:/, "")
|
|
58
|
+
json = JSON.parse(json_string)
|
|
59
|
+
File.open("config/setting.json", "w") do |w|
|
|
60
|
+
w.puts JSON.pretty_generate(json)
|
|
61
|
+
end
|
|
62
|
+
json_config = config_json_hash(json)
|
|
63
|
+
$app.set_config(json_config)
|
|
64
|
+
end
|
|
65
|
+
|
|
28
66
|
if msg == "exit"
|
|
29
67
|
unless ENV["OCRA"] == "true"
|
|
30
68
|
halt
|
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.
|
|
4
|
+
version: 0.0.5
|
|
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-
|
|
11
|
+
date: 2021-09-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: sinatra
|
|
@@ -104,6 +104,7 @@ extra_rdoc_files: []
|
|
|
104
104
|
files:
|
|
105
105
|
- ".gitignore"
|
|
106
106
|
- ".rspec"
|
|
107
|
+
- ".vscode/launch.json"
|
|
107
108
|
- Gemfile
|
|
108
109
|
- LICENSE.txt
|
|
109
110
|
- README.md
|
|
@@ -112,16 +113,19 @@ files:
|
|
|
112
113
|
- browser_app_base.gemspec
|
|
113
114
|
- lib/browser_app_base.rb
|
|
114
115
|
- lib/browser_app_base/version.rb
|
|
116
|
+
- lib/template/app_load.rb
|
|
115
117
|
- lib/template/config.ru
|
|
116
118
|
- lib/template/config/browser.json
|
|
119
|
+
- lib/template/config/setting.json
|
|
117
120
|
- lib/template/css/index.css
|
|
118
121
|
- lib/template/index.html
|
|
119
122
|
- lib/template/js/main.js
|
|
123
|
+
- lib/template/my_app_sample.rb
|
|
120
124
|
- lib/template/server.rb
|
|
121
|
-
- lib/template/
|
|
125
|
+
- lib/template/server_app_base.rb
|
|
122
126
|
- lib/template/start.rb
|
|
123
127
|
- lib/template/wsserver.rb
|
|
124
|
-
homepage: https://github.com/
|
|
128
|
+
homepage: https://github.com/kuwayama1971/BrowserAppBase
|
|
125
129
|
licenses: []
|
|
126
130
|
metadata: {}
|
|
127
131
|
post_install_message:
|