Sha256: 2d05234f03a41bb6b18525c2f75afc6d775cb72bf6c0e878c69657b61029d9ab

Contents?: true

Size: 1.77 KB

Versions: 14

Compression:

Stored size: 1.77 KB

Contents

require 'term/ansicolor'

class Hackmac::SearchUI
  include Term::ANSIColor

  def initialize(
    match:,
    query:,
    found:,
    output: STDOUT,
    prompt: 'Search? %s'
  )
    @match        = match
    @query        = query
    @found        = found
    @output       = output
    @prompt       = prompt
    @selector     = 0
    @max_selector = nil
    @answer       = ''
  end

  def start
    @output.print reset
    @matches = @match.(@answer)
    @selector = [ 0, [ @selector, @matches.size - 1 ].min ].max
    result = @query.(@answer, @matches, @selector)
    @output.print clear_screen
    @output.print move_home { ?\n + result }
    loop do
      @output.print move_home { @prompt % @answer }
      case getc
      when true
        @output.print clear_screen, move_home, reset
        if result = @found.(@answer, @matches, @selector)
          return result
        else
          return nil
        end
      when false
        return nil
      end
      @matches = @match.(@answer)
      @selector = [ 0, [ @selector, @matches.size - 1 ].min ].max
      result = @query.(@answer, @matches, @selector)
      @output.print clear_screen
      @output.print move_home { ?\n + result }
    end
  end

  private

  def getc
    system 'stty raw -echo'
    c = STDIN.getc
    system 'stty cooked echo'
    case c
    when "\x03"
      false
    when "\e"
      STDIN.getc == ?[ or return nil
      STDIN.getc =~ /\A([AB])\z/ or return nil
      if $1 == ?A
        @selector -= 1
      else
        @selector += 1
      end
      nil
    when ?\r
      true
    when "\x7f"
      @selector = 0
      @answer.chop!
      nil
    when "\v"
      @selector = 0
      @answer.clear
      nil
    when /\A[\x00-\x1f]\z/
      nil
    else
      @selector = 0
      @answer << c
      nil
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
hackmac-0.3.4 lib/hackmac/search_ui.rb
hackmac-0.3.3 lib/hackmac/search_ui.rb
hackmac-0.3.2 lib/hackmac/search_ui.rb
hackmac-0.3.1 lib/hackmac/search_ui.rb
hackmac-0.3.0 lib/hackmac/search_ui.rb
hackmac-0.2.1 lib/hackmac/search_ui.rb
hackmac-0.2.0 lib/hackmac/search_ui.rb
hackmac-0.1.1 lib/hackmac/search_ui.rb
hackmac-0.1.0 lib/hackmac/search_ui.rb
hackmac-0.0.4 lib/hackmac/search_ui.rb
hackmac-0.0.3 lib/hackmac/search_ui.rb
hackmac-0.0.2 lib/hackmac/search_ui.rb
hackmac-0.0.1 lib/hackmac/search_ui.rb
hackmac-0.0.0 lib/hackmac/search_ui.rb