browser_app_base 0.0.2 → 0.0.3

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: 63c1acfb3f65ae7519a6f74b1a0b2b138fd04f129585070c11e4211850c0a880
4
- data.tar.gz: df7982ee9fe63c7442ac7f53404921aec97bd83fce49a36888df10b6dd58be8b
3
+ metadata.gz: c4b88262d08f7de37833b5e1fafb1051947ff7f0d7eb4c62c11fc906d5869ede
4
+ data.tar.gz: ca22c6db6f9788d0c098edffc25fabbdde4fcbfa43d15032f6a2a2ec72b16aec
5
5
  SHA512:
6
- metadata.gz: 9610604a065b31f377798eb211b13ac92b50770d353058d7ad9a969b4b2071c82e9f927725ca3c76fe494b09edb6842ff98323991a126f50ca2dfe51fda2aa3d
7
- data.tar.gz: 4db1d41f410dc0f546d4db93895118821530d955cb0b098506b823c2906538c6a131460afea3b156773253e8ca6c8c98bd3564e5ed8a952b2dffefbc7fd3b56d
6
+ metadata.gz: 2c761441fa372ee9c4dfb924991852d706348685315b30704865c70e28fb728586f3509b55d28cc951849879a3f39f6b67bb9abe49d73f3261f79449459b5202
7
+ data.tar.gz: 1c02f7dcd2e3b6225762ae66182b4de6d4a1923f6918a19f962337b961e659cced031a714cbdf9949daef94a9c9a7a01262ae0a37a95af68f1e73e2ac7786eca
@@ -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
@@ -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
- create app templat
31
+ ## Create app templat
31
32
 
32
- $ create_browser_app -d ~/test/
33
+ $ create_browser_app -d ~/test/ -a MyApp
33
34
 
34
- start application
35
+ ## add application code
36
+ $ cd ~/test/
37
+ $ vi my_app.rb
35
38
 
36
- $ cd ~/test/app
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
@@ -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[:dir]
24
+ BrowserAppBase.create o
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BrowserAppBase
4
- VERSION = "0.0.2"
4
+ VERSION = "0.0.3"
5
5
  end
@@ -1,20 +1,51 @@
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
- # Your code goes here...
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
11
21
 
12
- def self.create(dir)
22
+ def self.create(arg)
23
+ dir = arg[:dir]
24
+ app = arg[:app]
13
25
  puts "create application base #{dir}"
14
26
 
15
27
  FileUtils.mkdir_p dir
16
28
 
17
29
  path = File.dirname(File.expand_path(__FILE__))
18
- FileUtils.cp_r "#{path}/template", "#{dir}/app"
30
+ Dir.glob("#{path}/template/*") do |f|
31
+ puts "#{f} => #{dir}"
32
+ FileUtils.cp_r f, "#{dir}/"
33
+ end
34
+
35
+ if app
36
+ app_file = get_app_file(app)
37
+
38
+ load_app = <<"EOS"
39
+ require '#{app_file}'
40
+ $app = MyApp.new
41
+ EOS
42
+
43
+ File.open("#{dir}/app_load.rb", "w") do |f|
44
+ f.write load_app
45
+ end
46
+
47
+ puts "create #{app_file}"
48
+ FileUtils.cp "#{dir}/my_app_sample.rb", "#{dir}/#{app_file}"
49
+ end
19
50
  end
20
51
  end
@@ -0,0 +1,2 @@
1
+ require "my_app_sample.rb"
2
+ $app = MyApp.new
@@ -46,6 +46,6 @@ configure do
46
46
 
47
47
  end
48
48
 
49
- #\ --port 61820
49
+ #\ --port 62857
50
50
 
51
51
  run Sinatra::Application
@@ -50,3 +50,28 @@ textarea.long {
50
50
  height: 50vh;
51
51
  }
52
52
 
53
+ .ui-autocomplete {
54
+ max-height: 200px;
55
+ max-width: 500px;
56
+ overflow-y: auto;
57
+ overflow-x: hidden;
58
+ padding-right: 20px;
59
+ }
60
+ #jquery-ui-autocomplete label {
61
+ float: left;
62
+ margin-right: 0.5em;
63
+ color: black;
64
+ font-size: 15px;
65
+ }
66
+
67
+ .ui-dialog {
68
+ position: absolute;
69
+ top: 0;
70
+ left: 0;
71
+ padding: .2em;
72
+ outline: 0;
73
+ }
74
+
75
+ .long {
76
+ width: 90%;
77
+ }
@@ -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:61820/js/main.js"></script>
15
- <link rel="stylesheet" href="http://localhost:61820/css/index.css" type="text/css">
14
+ <script src="http://localhost:62857/js/main.js"></script>
15
+ <link rel="stylesheet" href="http://localhost:62857/css/index.css" type="text/css">
16
16
  </head>
17
17
 
18
18
  <body>
@@ -28,11 +28,28 @@
28
28
  </td>
29
29
  </tr>
30
30
  </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
31
 
35
- <textarea name="log" id="log" class="outarea"></textarea><br/>
32
+ <div id="dialog1" style="display:none;">
33
+ <input class="inarea" type="text" name="search_str" id="search_str">
34
+ </div>
35
+ <table>
36
+ <tr>
37
+ <td class="long"><input class="inarea" type="text" id="upFile" name="upFile"></td>
38
+ <td><input type="button" id="select_file" value="ファイル選択" /></td>
39
+ </tr>
40
+ </table>
41
+
42
+ <div id="dialog2" style="display:none;">
43
+ <input class="inarea" type="text" name="search_str2" id="search_str2">
44
+ </div>
45
+ <table>
46
+ <tr>
47
+ <td class="long"><input class="inarea" type="text" id="upDir" name="upDir"></td>
48
+ <td><input type="button" id="select_dir" value="フォルダ選択" /></td>
49
+ </tr>
50
+ </table>
51
+
52
+ <textarea name="log" id="log" class="outarea"></textarea><br />
36
53
 
37
54
  </body>
38
55
 
@@ -13,9 +13,6 @@ function server_connect(url) {
13
13
  if (evt.data.match(/^startup:/)) {
14
14
  file_name = evt.data.replace(/^startup:/, "");
15
15
  //alert(file_name);
16
- var fs = new ActiveXObject("Scripting.FileSystemObject");
17
- var file = fs.CreateTextFile(file_name);
18
- file.Close();
19
16
  } else {
20
17
  var log = $('#log').val() + evt.data + "\n";
21
18
  $('#log').val(log);
@@ -24,7 +21,7 @@ function server_connect(url) {
24
21
  psconsole[0].scrollHeight - psconsole.height()
25
22
  );
26
23
  }
27
-
24
+
28
25
  };
29
26
  ws.onclose = function () {
30
27
  alert("アプリケーションが終了しました!!");
@@ -41,11 +38,20 @@ function send_message(msg) {
41
38
  }
42
39
  }
43
40
 
44
- function autocomp(id, url) {
41
+ function autocomp(id, file_kind) {
45
42
  $("#" + id).autocomplete({
43
+ autoFocus: true,
44
+ minLength: 0,
45
+ delay: 0,
46
+ select: function (event, ui) {
47
+ console.log(ui.item.value);
48
+ jQuery("#" + id).val(ui.item.value);
49
+ //jQuery(this).autocomplete("search", "");
50
+ $(this).keydown();
51
+ },
46
52
  source: function (req, resp) {
47
53
  $.ajax({
48
- url: url(),
54
+ url: "http://localhost:62857/search?path=" + $("#" + id).val() + "&kind=" + file_kind,
49
55
  type: "GET",
50
56
  cache: false,
51
57
  dataType: "json",
@@ -61,6 +67,42 @@ function autocomp(id, url) {
61
67
  });
62
68
 
63
69
  }
70
+ }).focus(function () {
71
+ console.log("forcus");
72
+ //jQuery(this).autocomplete("search", "");
73
+ $(this).keydown();
74
+ });
75
+ }
76
+
77
+ 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
+ $("#" + select_file).click(function () {
80
+ autocomp(search_id, file_kind);
81
+ console.log("open dialog dialog_id=", dialog_id);
82
+ $(".ui-autocomplete").css("z-index", 1000);
83
+ $("#" + search_id).val("/");
84
+ $("#" + dialog_id).dialog({
85
+ modal: true
86
+ , show: "slide" //表示時のアニメーション
87
+ , hide: "explode" //閉じた時のアニメーション
88
+ , title: "Select File" //ダイアログのタイトル
89
+ , width: 580 //ダイアログの横幅
90
+ , height: 400 //ダイアログの高さ
91
+ , resizable: false //リサイズ不可
92
+ , closeOnEscape: false //[ESC]キーで閉じられなくする
93
+ , draggable: false //ダイアログの移動を不可に
94
+ , buttons: {
95
+ "OK": function () { //OKボタン
96
+ $("#" + file_name).val($("#" + search_id).val());
97
+ $(this).dialog("close");
98
+ $("#" + search_id).autocomplete("destroy");
99
+ },
100
+ "Cancel": function () { //Cancelボタン
101
+ $(this).dialog("close");
102
+ $("#" + search_id).autocomplete("destroy");
103
+ }
104
+ }
105
+ });
64
106
  });
65
107
  }
66
108
 
@@ -72,22 +114,6 @@ function get_dirname(path) {
72
114
  return result.replace(/\//g, "\\");
73
115
  }
74
116
 
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
117
  function dispFile() {
92
118
  var fName = $("#upFile").val();
93
119
  alert('選択したファイルの値は' + fName + 'です');
@@ -96,10 +122,10 @@ function dispFile() {
96
122
  // 起動時の処理
97
123
  $(document).ready(function () {
98
124
  // サーバに接続
99
- server_connect("ws://localhost:61820/wsserver")
125
+ server_connect("ws://localhost:62857/wsserver")
100
126
  // ウインドウサイズ
101
- var width = 600;
102
- var height = 700;
127
+ var width = 800;
128
+ var height = 600;
103
129
  // ウインドウの位置
104
130
  $(function () {
105
131
  window.resizeTo(width, height);
@@ -107,23 +133,18 @@ $(document).ready(function () {
107
133
  //window.moveTo(0,0);
108
134
  });
109
135
 
110
- // オートコンプリート設定
111
- var getUrl = function () {
112
- var url = "http://localhost:61820/search?path=" + $("#search_str").val();
113
- return url;
114
- };
115
- autocomp("search_str", getUrl);
116
-
117
136
  // ハンドラ登録
118
- $("#file").click(function () {
119
- select_file("search_str");
137
+ $("#stop").click(function () {
138
+ send_message("stop");
120
139
  });
140
+
121
141
  $("#exec").click(function () {
122
142
  send_message("exec:" + $("#upFile").val());
123
143
  });
124
- $("#stop").click(function () {
125
- send_message("stop");
126
- });
144
+
145
+ select_file_dialog("search_str", "file", "dialog1", "select_file", "upFile");
146
+
147
+ select_file_dialog("search_str2", "dir", "dialog2", "select_dir", "upDir");
127
148
 
128
149
  });
129
150
 
@@ -1,13 +1,15 @@
1
1
  # -*- coding: utf-8 -*-
2
- class AppMain
3
- def initialize
4
- @aboet = false
5
- end
2
+ require "server_app_base.rb"
6
3
 
7
- def start(file)
4
+ class MyApp < AppMainBase
5
+ def start(argv)
6
+ super
8
7
  begin
9
8
  @abort = false
10
- puts file
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?
13
15
  sleep 1
@@ -20,6 +22,6 @@ class AppMain
20
22
  end
21
23
 
22
24
  def stop()
23
- @abort = true
25
+ super
24
26
  end
25
27
  end
@@ -1,9 +1,9 @@
1
- require 'json'
2
- require 'kconv'
1
+ require "json"
2
+ require "kconv"
3
3
 
4
4
  class Search < Sinatra::Base
5
5
  helpers Sinatra::Streaming
6
- get '' do
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,44 @@ 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
- file = "/" if file == nil
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.exists?(path)
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 = {}
34
- data["label"] = File.basename(file)
35
- data["value"] = file
49
+ next if File.basename(file) == "."
50
+ next if kind == "dir" and !File.directory?(file)
51
+ data["label"] = File.expand_path(file)
52
+ data["value"] = File.expand_path(file)
36
53
  res.push data
37
54
  end
38
- JSON.generate res
55
+ JSON.generate res.sort { |a, b| a["value"] <=> b["value"] }
39
56
  end
40
57
  end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ class AppMainBase
3
+ def initialize
4
+ @aboet = false
5
+ @exec = false
6
+ @suspend = false
7
+ end
8
+
9
+ def start(argv)
10
+ @exec = true
11
+ end
12
+
13
+ def stop()
14
+ @abort = true
15
+ @exec = false
16
+ end
17
+
18
+ def suspend()
19
+ @suspend = true
20
+ end
21
+
22
+ def resume()
23
+ @suspend = false
24
+ end
25
+ end
26
+
27
+ require "app_load.rb"
@@ -22,19 +22,19 @@ port = get_unused_port
22
22
  puts "port=#{port}"
23
23
 
24
24
  # config.ruの編集
25
- buf = File.read("config.ru").toutf8
25
+ buf = File.binread("config.ru").toutf8
26
26
  buf.gsub!(/port [0-9]+/, "port #{port}")
27
- File.write("config.ru", buf)
27
+ File.binwrite("config.ru", buf)
28
28
 
29
29
  # main.jsの編集
30
- buf = File.read("js/main.js").toutf8
30
+ buf = File.binread("js/main.js").toutf8
31
31
  buf.gsub!(/localhost:[0-9]+\//, "localhost:#{port}/")
32
- File.write("js/main.js", buf)
32
+ File.binwrite("js/main.js", buf)
33
33
 
34
34
  # index.htaの編集
35
- buf = File.read("index.html").toutf8
35
+ buf = File.binread("index.html").toutf8
36
36
  buf.gsub!(/localhost:[0-9]+\//, "localhost:#{port}/")
37
- File.write("index.html", buf)
37
+ File.binwrite("index.html", buf)
38
38
 
39
39
  Thread.start {
40
40
  puts "start browser"
@@ -1,5 +1,4 @@
1
- require "./server_app"
2
- $app = AppMain.new
1
+ require "./server_app_base"
3
2
 
4
3
  class WsServer < Sinatra::Base
5
4
  $ws_list = []
@@ -15,9 +14,9 @@ class WsServer < Sinatra::Base
15
14
  ws.onmessage do |msg|
16
15
  puts msg
17
16
  if msg =~ /^exec:/
18
- fname = msg.gsub(/^exec:/, "")
17
+ argv = msg.gsub(/^exec:/, "")
19
18
  Thread.new {
20
- $app.start fname do |out|
19
+ $app.start(argv.split(",")) do |out|
21
20
  ws.send(out)
22
21
  end
23
22
  }
@@ -25,6 +24,13 @@ class WsServer < Sinatra::Base
25
24
  if msg =~ /^stop/
26
25
  $app.stop
27
26
  end
27
+ if msg =~ /^suspend/
28
+ $app.suspend
29
+ end
30
+ if msg =~ /^resume/
31
+ $app.resume
32
+ end
33
+
28
34
  if msg == "exit"
29
35
  unless ENV["OCRA"] == "true"
30
36
  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.2
4
+ version: 0.0.3
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-15 00:00:00.000000000 Z
11
+ date: 2021-08-26 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,13 +113,15 @@ 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
117
119
  - lib/template/css/index.css
118
120
  - lib/template/index.html
119
121
  - lib/template/js/main.js
122
+ - lib/template/my_app_sample.rb
120
123
  - lib/template/server.rb
121
- - lib/template/server_app.rb
124
+ - lib/template/server_app_base.rb
122
125
  - lib/template/start.rb
123
126
  - lib/template/wsserver.rb
124
127
  homepage: https://github.com/kuwayama1971/BrowserAppBase