helpline 0.1.18 → 0.2.1

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: 4da846a2097e73873989f053ae7acba666b64e9fb350ac543897ee2e10889311
4
- data.tar.gz: 4237c2757bdec52c46225849dd08169b5aed63a4031c5ece0e5ee4175548f8d7
3
+ metadata.gz: 5b1990a34e246aa29e6f04d43d72541dc2dea4a1a9051f96541ce4d1b161006b
4
+ data.tar.gz: c09e2c0ab0e5ad4d3848c7a4b1a6ab37913e8990f96bc0f260b2e8cfd719aac8
5
5
  SHA512:
6
- metadata.gz: 02b39b745ecd0c4088981a533283e2d4d5547b31ecd8d73e74146765d9cd7441460e2690c8d3e8c85ffe7425db30ce4535d7317e44c9283baf3182b39e947f01
7
- data.tar.gz: 3c0c888681502eb0ce5e548a02fb53c95fba00cba92dce8d62420fe17e1bce618f13e59101068714ab7b9370352e1286941bc65e288d1e94c941ed5e4bcac823
6
+ metadata.gz: 58cdbfd97c3030da1ef9f496ccd85efc5429693b276d87e95a61059a7a0edbcabee793fd9b6ae0f278e4a8f36de707853e071c4846998d64b90199e1c5d92e1a
7
+ data.tar.gz: 04f66e3949c0d9aa0a9e96b83fc68da053825f1ad5ec25d3c177f8f8c180aa4fbcc059bda63350f70c5838111407f5b22cced14e1df1cbe1cd1b986cf747c6ba
@@ -1,310 +1,40 @@
1
1
  #!/usr/bin/env ruby
2
2
  # -*- ruby -*-
3
3
 
4
- require 'json'
5
4
  require 'optparse'
6
5
 
7
- require 'scrapbox'
8
- require 're_expand'
9
-
10
- require 'io/console'
11
- require 'helpline/curses'
12
-
13
- puts
14
-
15
- class HelpLine
16
- LINES = 12
17
-
18
- def datafile
19
- File.expand_path("~/.helpline.json")
20
- end
21
-
22
- def initialize
23
- # @pagedata = {}
24
- # @project = Scrapbox::Project.new("HelpLine")
25
- end
26
-
27
- def update(sources) # sources = ['HelpLine', '~/ScrapboxData/masui.json', ...]
28
- dumpdata = {}
29
- dumpdata['codes'] = []
30
- dumpdata['defs'] = []
31
- dumpdata['pages'] = []
32
-
33
- sources.each { |source|
34
- pagedata = {}
35
- source = File.expand_path(source)
36
- if File.exist?(source)
37
- puts "-----------------ページデータをJSONデータ(#{source})から取得"
38
- data = JSON.parse(File.read(source))
39
- data['pages'].each { |page|
40
- title = page['title']
41
- puts "...#{title}"
42
- pagedata[title] = page['lines']
43
- }
44
- elsif source =~ /^[a-zA-Z\-]+$/ # たぶんHelpLineプロジェクト
45
- puts "-----------------ページデータをScrapbox(#{source})から取得"
46
- project = Scrapbox::Project.new(source)
47
- project.pages.each { |title,page|
48
- puts "...#{title}"
49
- pagedata[title] = page.text.split(/\n/)
50
- }
51
- else
52
- next
53
- end
54
-
55
- #
56
- # 関数/定数を評価"
57
- #
58
- puts "-----------------関数/定数を取得"
59
- src = nil
60
- code = []
61
- pagedata.each { |title,lines|
62
- puts "...#{title}"
63
- lines.each { |line|
64
- if src && line =~ /^\s+/ then
65
- code << line
66
- elsif line =~ /^code:(.*\.rb)$/ then
67
- if code.length > 0
68
- dumpdata['codes'] << code.join("\n")
69
- end
70
- src = $1
71
- code = []
72
- elsif src then
73
- dumpdata['codes'] << code.join("\n")
74
- src = nil
75
- code = []
76
- else
77
- end
78
- }
79
- if code.length > 0
80
- dumpdata['codes'] << code.join("\n")
81
- end
82
- }
83
- puts "-----------------HelpLineデータを検出"
84
- pagedata.each { |title,pagedata|
85
- puts "...#{title}"
86
- dumpdata['pages'] << title
87
- processing_defs = false
88
- codeindent = nil
89
- pagedata.each { |line|
90
- if !codeindent
91
- if line =~ /^code:/
92
- codeindent = 0
93
- next
94
- end
95
- else
96
- line =~ /^(\s*)/
97
- if $1.length < codeindent + 1
98
- codeindent = nil
99
- else
100
- next
101
- end
102
- end
103
- if line =~ /^[\$\%\?]/
104
- if line =~ /^\%/ && !processing_defs
105
- puts "'$'で始まる用例定義なしでコマンドを定義しようとしています"
106
- exit
107
- end
108
- dumpdata['defs'] << "#{line} {#{dumpdata['pages'].length-1}}"
109
- processing_defs = true
110
- else
111
- processing_defs = false
112
- end
113
- }
114
- }
115
- }
116
-
117
- File.open(datafile,"w"){ |f|
118
- f.puts dumpdata.to_json
119
- }
120
- end
121
-
122
- def disp(list,sel)
123
- Curses.move(0,0)
124
- lines = list.length
125
- lines = LINES if lines > LINES
126
- (0...lines).each { |i|
127
- Curses.move(i*2,0)
128
- s = "#{list[i][0]}"
129
- if i == sel
130
- Curses.print_inverse s
131
- else
132
- Curses.print_bold s
133
- end
134
- Curses.move(i*2+1,0)
135
- Curses.print " % " + list[i][1]
136
- }
137
- Curses.move(sel*2,0)
138
- end
139
-
140
- def helpline(sources,test=nil,debug=nil)
141
- data = JSON.parse(File.read(datafile))
142
- unless data['pages'] # データ型式変換があったので
143
- update sources
144
- data = JSON.parse(File.read(datafile))
145
- end
146
-
147
- #
148
- # 関数定義などをeval
149
- #
150
- data['codes'].each { |code|
151
- eval code
152
- }
153
-
154
- g = ExpandRuby::Generator.new # re_expandのジェネレータ
155
-
156
- #
157
- # HelpLineエントリ
158
- #
159
-
160
- logfile = (debug ? "/tmp/helpline-defs" : "/dev/null")
161
- File.open(logfile,"w"){ |f| # ログを残す場合
162
- entries = []
163
- data['defs'].each { |line|
164
- if line =~ /^[\$\?]\s*(.*)$/ # $....
165
- entries << $1
166
- elsif line =~ /^\%\s*(.*)$/ # %....
167
- cmd = $1
168
- entries.each { |l|
169
- desc = eval('"' + l + '"')
170
- f.puts "desc: #{desc}"
171
- g.add desc.force_encoding('utf-8'), cmd.force_encoding('utf-8')
172
- }
173
- f.puts "cmd: #{cmd}"
174
- entries = []
175
- end
176
- }
177
- }
178
-
179
- res = g.generate " #{ARGV.join(' ').sub(/\[/,'').sub(/\]/,'')} "
180
-
181
- File.open("/tmp/helpline.cmd","w"){ |f|
182
- f.puts ARGV.join(' ')
183
- }
184
-
185
- if res[0].length == 0
186
- puts "ヘルプがみつかりません"
187
- exit
188
- end
189
-
190
- git_repository = File.exist?(".git")
191
- listed = {}
192
- list = res[0].find_all { |a| # 0 ambig
193
- # a = ["現在の状況を表示する {56}", "git status {56}"], etc.
194
- if a[0] =~ /voidvoidvoid/
195
- false
196
- elsif a[0] =~ /^git:/ && !git_repository
197
- false
198
- else
199
- if listed[a[1]]
200
- false
201
- else
202
- listed[a[1]] = true
203
- end
204
- end
205
- }
206
-
207
- # if options['t'] || options['test'] then
208
- if test
209
- puts list
210
- exit
211
- end
212
-
213
- #
214
- # HelpLineメニュー表示し、カーソル移動で選択
215
- #
216
- help_number = {}
217
- list.each_with_index { |entry,ind|
218
- entry[0].sub!(/\s*{(\d*)}$/,'')
219
- entry[1].sub!(/\s*{(\d*)}$/,'')
220
- help_number[entry[0]] = $1.to_i
221
- }
222
-
223
- sel = 0
224
- disp(list,sel)
225
-
226
- lines = list.length
227
- lines = LINES if lines > LINES
228
-
229
- inputchars = ''
230
- while true
231
- c = STDIN.getch
232
- inputchars += c
233
-
234
- if inputchars == "\e"
235
- # process ESC
236
- elsif inputchars[0] == "\e" && inputchars.length == 2
237
- # 何もしない
238
- elsif inputchars == "\x06" || inputchars == "\e[C" || inputchars == "\eOC"
239
- # Curses.right
240
- inputchars = ''
241
- elsif inputchars == "\x02" || inputchars == "\e[D" || inputchars == "\eOD"
242
- # Curses.left
243
- inputchars = ''
244
- elsif inputchars == "\x0e" || inputchars == "\e[B" || inputchars == "\eOB"
245
- Curses.down
246
- sel = (sel + 1) if sel < lines-1
247
- inputchars = ''
248
- elsif inputchars == "\x10" || inputchars == "\e[A" || inputchars == "\eOA"
249
- Curses.up
250
- sel = sel - 1 if sel > 0
251
- inputchars = ''
252
- else
253
- inputchars = ''
254
- end
255
- STDIN.flush
256
- disp(list,sel)
257
-
258
- exit if c== 'q' || c == "\x03"
259
-
260
- if c == "\r" || c == "\n"
261
- break
262
- end
263
- end
264
-
265
- desc = list[sel.to_i][0]
266
- cmd = list[sel][1]
267
-
268
- Curses.move(lines*2,0)
269
- Curses.tol
270
-
271
- #Curses.move(0,0)
272
- ##Curses.down
273
-
274
- # Curses.print_inverse("「#{desc}」を実行")
275
- # puts " (ソース: http://scrapbox.io/HelpLine/#{data['pages'][help_number[desc]]})"
276
- File.open("/tmp/helpline.cmd","w"){ |f|
277
- f.puts cmd
278
- }
279
- end
280
- end
6
+ $:.unshift "lib"
7
+ require 'helpline/helpline'
8
+ require 'helpline/update'
9
+ require 'helpline/generate'
10
+ require 'helpline/run'
281
11
 
282
12
  # アップデート
283
13
  # % helpline -u
284
14
  # データを指定してアップデート
285
- # % helpline -u -s HelpLine,/Users/masui/ScrapboxData/masui-HelpLine.json
15
+ # % helpline -u HelpLine /Users/masui/ScrapboxData/masui-HelpLine.json
286
16
  # テスト
287
- # % helpline -t
17
+ # % helpline -t args
288
18
  #
289
19
 
290
20
  helpline = HelpLine.new
291
21
 
292
22
  options = ARGV.getopts('utds:','update','test','source:','debug')
293
- update = options['u'] || options['update']
294
- test = options['t'] || options['test']
295
- debug = options['d'] || options['debug']
296
- sources = ['HelpLine']
297
- if options['s'] || options['source']
298
- sources = (options['s'] || options['source']).split(/,/)
299
- end
300
23
 
301
- if !File.exist?(helpline.datafile) && !update
302
- puts "#{helpline.datafile}を作成します..."
24
+ #
25
+ # update
26
+ #
27
+ if options['u'] || options['update'] # ~/.helpline.json更新
28
+ sources = (ARGV.length > 0 ? ARGV : ['HelpLine'])
303
29
  helpline.update sources
30
+ exit
304
31
  end
305
32
 
306
- if update then
307
- helpline.update sources
308
- else
309
- helpline.helpline sources, test, debug
33
+ if options['t'] || options['test'] # テスト
34
+ puts helpline.generate " #{ARGV.join(' ')} "
35
+ exit
310
36
  end
37
+
38
+ debug = options['d'] || options['debug']
39
+ query = " #{ARGV.join(' ').sub(/\[/,'').sub(/\]/,'')} "
40
+ helpline.run query, debug
@@ -0,0 +1,76 @@
1
+ # -*- ruby -*-
2
+ #
3
+ # * datafileを読み、引数とマッチするものをリストする
4
+ # 引数はARGVに入っている
5
+ #
6
+
7
+ require 'json'
8
+ require 're_expand'
9
+
10
+ class HelpLine
11
+ def generate(query,debug=nil)
12
+ data = JSON.parse(File.read(datafile))
13
+
14
+ #
15
+ # 関数定義などをeval
16
+ #
17
+ data['codes'].each { |code|
18
+ eval code
19
+ }
20
+
21
+ g = ExpandRuby::Generator.new # re_expandのジェネレータ
22
+
23
+ #
24
+ # HelpLineエントリ
25
+ #
26
+
27
+ logfile = (debug ? "/tmp/helpline-defs" : "/dev/null")
28
+ File.open(logfile,"w"){ |f| # ログを残す場合
29
+ entries = []
30
+ data['defs'].each { |line|
31
+ if line =~ /^[\$\?]\s*(.*)$/ # $....
32
+ entries << $1
33
+ elsif line =~ /^\%\s*(.*)$/ # %....
34
+ cmd = $1
35
+ entries.each { |l|
36
+ desc = eval('"' + l + '"')
37
+ f.puts "desc: #{desc}"
38
+ g.add desc.force_encoding('utf-8'), cmd.force_encoding('utf-8')
39
+ }
40
+ f.puts "cmd: #{cmd}"
41
+ entries = []
42
+ end
43
+ }
44
+ }
45
+
46
+ res = g.generate query
47
+
48
+ File.open("/tmp/helpline.cmd","w"){ |f|
49
+ f.puts ARGV.join(' ')
50
+ }
51
+
52
+ if res[0].length == 0
53
+ puts "ヘルプがみつかりません"
54
+ exit
55
+ end
56
+
57
+ git_repository = File.exist?(".git")
58
+ listed = {}
59
+ list = res[0].find_all { |a| # 0 ambig
60
+ # a = ["現在の状況を表示する {56}", "git status {56}"], etc.
61
+ if a[0] =~ /voidvoidvoid/
62
+ false
63
+ elsif a[0] =~ /^git:/ && !git_repository
64
+ false
65
+ else
66
+ if listed[a[1]]
67
+ false
68
+ else
69
+ listed[a[1]] = true
70
+ end
71
+ end
72
+ }
73
+
74
+ list
75
+ end
76
+ end
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- ruby -*-
3
+
4
+ class HelpLine
5
+ def datafile
6
+ File.expand_path("~/.helpline.json")
7
+ end
8
+ end
@@ -0,0 +1,97 @@
1
+ # -*- ruby -*-
2
+ #
3
+ # * HelpLineのメインルーチン
4
+ # * datafileを読み、引数とマッチするものをリストする
5
+ # 引数はARGVに入っている
6
+ #
7
+
8
+ require 'io/console'
9
+ require 'helpline/curses'
10
+
11
+ class HelpLine
12
+ LINES = 12
13
+
14
+ def disp(list,sel)
15
+ Curses.move(0,0)
16
+ lines = list.length
17
+ lines = LINES if lines > LINES
18
+ (0...lines).each { |i|
19
+ Curses.move(i*2,0)
20
+ s = "#{list[i][0]}"
21
+ if i == sel
22
+ Curses.print_inverse s
23
+ else
24
+ Curses.print_bold s
25
+ end
26
+ Curses.move(i*2+1,0)
27
+ Curses.print " % " + list[i][1]
28
+ }
29
+ Curses.move(sel*2,0)
30
+ end
31
+
32
+ def run(query,debug=nil)
33
+ puts
34
+
35
+ list = generate(query,debug)
36
+ #
37
+ # HelpLineメニュー表示し、カーソル移動で選択
38
+ #
39
+ help_number = {}
40
+ list.each_with_index { |entry,ind|
41
+ entry[0].sub!(/\s*{(\d*)}$/,'')
42
+ entry[1].sub!(/\s*{(\d*)}$/,'')
43
+ help_number[entry[0]] = $1.to_i
44
+ }
45
+
46
+ sel = 0
47
+ disp(list,sel)
48
+
49
+ lines = list.length
50
+ lines = LINES if lines > LINES
51
+
52
+ inputchars = ''
53
+ while true
54
+ c = STDIN.getch
55
+ inputchars += c
56
+
57
+ if inputchars == "\e"
58
+ # process ESC
59
+ elsif inputchars[0] == "\e" && inputchars.length == 2
60
+ # 何もしない
61
+ elsif inputchars == "\x0e" || inputchars == "\e[B" || inputchars == "\eOB"
62
+ Curses.down
63
+ sel = (sel + 1) if sel < lines-1
64
+ inputchars = ''
65
+ elsif inputchars == "\x10" || inputchars == "\e[A" || inputchars == "\eOA"
66
+ Curses.up
67
+ sel = sel - 1 if sel > 0
68
+ inputchars = ''
69
+ else
70
+ inputchars = ''
71
+ end
72
+ STDIN.flush
73
+ disp(list,sel)
74
+
75
+ exit if c== 'q' || c == "\x03"
76
+
77
+ if c == "\r" || c == "\n"
78
+ break
79
+ end
80
+ end
81
+
82
+ desc = list[sel.to_i][0]
83
+ cmd = list[sel][1]
84
+
85
+ Curses.move(lines*2,0)
86
+ Curses.tol
87
+
88
+ #Curses.move(0,0)
89
+ ##Curses.down
90
+
91
+ # Curses.print_inverse("「#{desc}」を実行")
92
+ # puts " (ソース: http://scrapbox.io/HelpLine/#{data['pages'][help_number[desc]]})"
93
+ File.open("/tmp/helpline.cmd","w"){ |f|
94
+ f.puts cmd
95
+ }
96
+ end
97
+ end
@@ -0,0 +1,111 @@
1
+ # -*- ruby -*-
2
+ #
3
+ # HelpLineデータを読み込んでdatafileにセーブする
4
+ #
5
+
6
+ require 'json'
7
+ require 'scrapbox'
8
+
9
+ class HelpLine
10
+ def update(sources) # sources = ['HelpLine', '~/ScrapboxData/masui.json', ...]
11
+ dumpdata = {}
12
+ dumpdata['codes'] = []
13
+ dumpdata['defs'] = []
14
+ dumpdata['pages'] = []
15
+
16
+ sources.each { |source|
17
+ pagedata = {}
18
+ if File.exist?(source)
19
+ puts "-----------------ページデータをJSONデータ(#{source})から取得"
20
+ data = JSON.parse(File.read(source))
21
+ data['pages'].each { |page|
22
+ title = page['title']
23
+ puts "...#{title}"
24
+ pagedata[title] = page['lines']
25
+ }
26
+ elsif source =~ /^[a-zA-Z\-]+$/ # たぶんHelpLineプロジェクト
27
+ puts "-----------------ページデータをScrapbox(#{source})から取得"
28
+ project = Scrapbox::Project.new(source)
29
+ project.pages.each { |title,page|
30
+ puts "...#{title}"
31
+ pagedata[title] = page.text.split(/\n/)
32
+ }
33
+ else
34
+ next
35
+ end
36
+
37
+ #
38
+ # 関数/定数を評価"
39
+ #
40
+ puts "-----------------関数/定数を取得"
41
+ src = nil
42
+ code = []
43
+ pagedata.each { |title,lines|
44
+ # puts "...#{title}"
45
+ lines.each { |line|
46
+ if src && line =~ /^\s+/ then
47
+ code << line
48
+ elsif line =~ /^code:(.*\.rb)$/ then
49
+ if code.length > 0
50
+ puts "...#{title}"
51
+ puts code[0]
52
+ dumpdata['codes'] << code.join("\n")
53
+ end
54
+ src = $1
55
+ code = []
56
+ elsif src then
57
+ puts "...#{title}"
58
+ puts code[0]
59
+ dumpdata['codes'] << code.join("\n")
60
+ src = nil
61
+ code = []
62
+ else
63
+ end
64
+ }
65
+ if code.length > 0
66
+ puts "...#{title}"
67
+ puts code[0]
68
+ dumpdata['codes'] << code.join("\n")
69
+ src = nil
70
+ code = []
71
+ end
72
+ }
73
+ puts "-----------------HelpLineデータを検出"
74
+ pagedata.each { |title,pagedata|
75
+ # puts "...#{title}"
76
+ dumpdata['pages'] << title
77
+ processing_defs = false
78
+ codeindent = nil
79
+ pagedata.each { |line|
80
+ if !codeindent
81
+ if line =~ /^code:/
82
+ codeindent = 0
83
+ next
84
+ end
85
+ else
86
+ line =~ /^(\s*)/
87
+ if $1.length < codeindent + 1
88
+ codeindent = nil
89
+ else
90
+ next
91
+ end
92
+ end
93
+ if line =~ /^[\$\%\?]/
94
+ if line =~ /^\%/ && !processing_defs
95
+ puts "'$'で始まる用例定義なしでコマンドを定義しようとしています"
96
+ exit
97
+ end
98
+ dumpdata['defs'] << "#{line} {#{dumpdata['pages'].length-1}}"
99
+ processing_defs = true
100
+ else
101
+ processing_defs = false
102
+ end
103
+ }
104
+ }
105
+ }
106
+
107
+ File.open(datafile,"w"){ |f|
108
+ f.puts dumpdata.to_json
109
+ }
110
+ end
111
+ end
@@ -1,3 +1,3 @@
1
1
  module Helpline
2
- VERSION = "0.1.18"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: helpline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.18
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toshiyuki Masui
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-15 00:00:00.000000000 Z
11
+ date: 2020-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -111,6 +111,10 @@ files:
111
111
  - keydef.zsh
112
112
  - lib/helpline.rb
113
113
  - lib/helpline/curses.rb
114
+ - lib/helpline/generate.rb
115
+ - lib/helpline/helpline.rb
116
+ - lib/helpline/run.rb
117
+ - lib/helpline/update.rb
114
118
  - lib/helpline/version.rb
115
119
  - main.js
116
120
  - package.json