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