class HelpLine
Constants
- LINES
Public Instance Methods
datafile()
click to toggle source
# File lib/helpline/helpline.rb, line 5 def datafile File.expand_path("~/.helpline.json") end
disp(list,sel)
click to toggle source
# File lib/helpline/run.rb, line 13 def disp(list,sel) Curses.move(0,0) lines = list.length lines = LINES if lines > LINES (0...lines).each { |i| Curses.move(i*2,0) s = "#{list[i][0]}" if i == sel Curses.print_inverse s else Curses.print_bold s end Curses.move(i*2+1,0) Curses.print " % " + list[i][1] } Curses.move(sel*2,0) end
generate(query,debug=nil)
click to toggle source
# File lib/helpline/generate.rb, line 10 def generate(query,debug=nil) data = JSON.parse(File.read(datafile)) # # 関数定義などをeval # data['codes'].each { |code| eval code } g = ExpandRuby::Generator.new # re_expandのジェネレータ # # HelpLineエントリ # logfile = (debug ? "/tmp/helpline-defs" : "/dev/null") File.open(logfile,"w"){ |f| # ログを残す場合 entries = [] data['defs'].each { |line| if line =~ /^[\$\?]\s*(.*)$/ # $.... entries << $1 elsif line =~ /^\%\s*(.*)$/ # %.... cmd = $1 entries.each { |l| desc = eval('"' + l + '"') f.puts "desc: #{desc}" g.add desc.force_encoding('utf-8'), cmd.force_encoding('utf-8') # puts "g.add(\"#{desc.force_encoding('utf-8')}\",\"#{cmd.force_encoding('utf-8')}\")" } f.puts "cmd: #{cmd}" entries = [] end } } res = g.generate query File.open("/tmp/helpline.cmd","w"){ |f| f.puts ARGV.join(' ') } if res[0].length == 0 puts "ヘルプがみつかりません" exit end git_repository = File.exist?(".git") listed = {} list = res[0].find_all { |a| # 0 ambig # a = ["現在の状況を表示する {56}", "git status {56}"], etc. if a[0] =~ /voidvoidvoid/ false elsif a[0] =~ /^git:/ && !git_repository false else if listed[a[1]] false else listed[a[1]] = true end end } list end
run(query,debug=nil)
click to toggle source
# File lib/helpline/run.rb, line 31 def run(query,debug=nil) puts list = generate(query,debug) # # HelpLineメニュー表示し、カーソル移動で選択 # help_number = {} list.each_with_index { |entry,ind| entry[0].sub!(/\s*{(\d*)}$/,'') entry[1].sub!(/\s*{(\d*)}$/,'') help_number[entry[0]] = $1.to_i } sel = 0 disp(list,sel) lines = list.length lines = LINES if lines > LINES inputchars = '' while true c = STDIN.getch inputchars += c if inputchars == "\e" # process ESC elsif inputchars[0] == "\e" && inputchars.length == 2 # 何もしない elsif inputchars == "\x0e" || inputchars == "\e[B" || inputchars == "\eOB" Curses.down sel = (sel + 1) if sel < lines-1 inputchars = '' elsif inputchars == "\x10" || inputchars == "\e[A" || inputchars == "\eOA" Curses.up sel = sel - 1 if sel > 0 inputchars = '' else inputchars = '' end STDIN.flush disp(list,sel) exit if c== 'q' || c == "\x03" if c == "\r" || c == "\n" break end end desc = list[sel.to_i][0] cmd = list[sel][1] Curses.move(lines*2,0) Curses.tol #Curses.move(0,0) ##Curses.down # Curses.print_inverse("「#{desc}」を実行") # puts " (ソース: http://scrapbox.io/HelpLine/#{data['pages'][help_number[desc]]})" File.open("/tmp/helpline.cmd","w"){ |f| f.puts cmd } end
update(sources)
click to toggle source
# File lib/helpline/update.rb, line 9 def update(sources) # sources = ['HelpLine', '~/ScrapboxData/masui.json', ...] dumpdata = {} dumpdata['codes'] = [] dumpdata['defs'] = [] dumpdata['pages'] = [] sources.each { |source| pagedata = {} projectname = '' if File.exist?(source) puts "-----------------ページデータをJSONデータ(#{source})から取得" data = JSON.parse(File.read(source)) projectname = data['name'] data['pages'].each { |page| title = page['title'] puts "...#{title}" pagedata[title] = page['lines'] } elsif source =~ /^[a-zA-Z\-]+$/ # たぶんHelpLineプロジェクト puts "-----------------ページデータをScrapbox(#{source})から取得" projectname = source project = Scrapbox::Project.new(source) project.pages.each { |title,page| puts "...#{title}" pagedata[title] = page.text.split(/\n/) } else next end # # 関数/定数を評価" # puts "-----------------関数/定数を取得" src = nil code = [] pagedata.each { |title,lines| # puts "...#{title}" lines.each { |line| if src && line =~ /^\s+/ then code << line elsif line =~ /^code:(.*\.rb)$/ then if code.length > 0 puts "...#{title}" puts code[0] dumpdata['codes'] << code.join("\n") end src = $1 code = [] elsif src then puts "...#{title}" puts code[0] dumpdata['codes'] << code.join("\n") src = nil code = [] else end } if code.length > 0 puts "...#{title}" puts code[0] dumpdata['codes'] << code.join("\n") src = nil code = [] end } puts "-----------------HelpLineデータを検出" pagedata.each { |title,data| # puts "...#{title}" dumpdata['pages'] << title processing_defs = false cmd_defined = false data.each { |line| if line =~ /^[\$\?]/ dumpdata['defs'] << "#{line} {#{dumpdata['pages'].length-1}}" cmd_defined = false processing_defs = true elsif line =~ /^\%/ if !processing_defs puts "'$'で始まる用例定義なしでコマンドを定義しようとしています (#{title})" exit end dumpdata['defs'] << "#{line} {#{dumpdata['pages'].length-1}}" cmd_defined = true processing_defs = false elsif processing_defs && !cmd_defined dumpdata['defs'] << "% open 'https://Scrapbox.io/#{projectname}/#{title}' {#{dumpdata['pages'].length-1}}" cmd_defined = false processing_defs = false else cmd_defined = false processing_defs = false end } if processing_defs && !cmd_defined dumpdata['defs'] << "% open 'https://Scrapbox.io/#{projectname}/#{title}' {#{dumpdata['pages'].length-1}}" end } } File.open(datafile,"w"){ |f| f.puts dumpdata.to_json } end