Окно поиска с Ruby Shoes - PullRequest
       4

Окно поиска с Ruby Shoes

0 голосов
/ 18 мая 2011

У меня есть короткий скрипт, который использует регулярные выражения для поиска в файле определенной фразы, в которую вводит пользователь. По сути, это простое поле поиска.

Я сейчас пытаюсь сделать это окно поиска с графическим интерфейсом, чтобы пользователи могли печатать в поле и получать уведомления о своих совпадениях.

Я новичок в использовании рубиновой обуви во всех подробностях и использую примеры на веб-сайте TheShoeBox.

Кто-нибудь может указать, где я ошибаюсь с моим кодом?

Вот моя версия командной строки, которая работает:

string = File.read('db.txt')
puts "Enter what you're looking for below"


begin
while(true)
  break if string.empty? 
  print "Search> "; STDOUT.flush; phrase = gets.chop
  break if phrase.empty?
  names = string.split(/\n/)
  matches = names.select { |name| name[/#{phrase}/i] } 
  puts "\n \n"
  puts matches
  puts "\n \n"

   end
end

Вот моя попытка использовать его в Ruby Shoes:

Shoes.app :title => "Search v0.1", :width => 300, :height => 150 do

string = File.read('db.txt')

    names = string.split(/\n/)
    matches = names.select { |name| name[/#{phrase}/i] } 


def search(text)
    text.tr! "A-Za-z", "N-ZA-Mn-za-m"
end

@usage = <<USAGE
     Search - This will search for the inputted text within the database
USAGE

stack :margin => 10 do 
    para @usage
    @input = edit_box :width => 200
end

flow :margin => 10 do
    button('Search') { @output.matches }

end
    stack(:margin => 0) { @output = para }
end

Большое спасибо

1 Ответ

1 голос
/ 19 мая 2011

Ну, для начала, первый бит кода может быть сгенерирован.

file = File.open 'db.txt', 'rb'
puts "Enter (regex) search term or quit:"

exit 1 unless file.size > 0
loop do
  puts
  print "query> "
  redo if ( query = gets.chomp ).empty?
  exit 0 if query == "quit"
  file.each_line do |line|
    puts "#{file.lineno}: #{line}" if line =~ /#{query}/i
  end
  file.rewind
end

Параметр rb позволяет ему работать должным образом в Windows (особенно с Shoes, вы должны попытаться быть независимыми от платформы). Например, chomp удаляет \r\n и \n, но не a, в то время как chop просто слепо снимает последний символ. loop do end лучше, чем while true. И зачем хранить совпадения в переменной? Просто прочитайте файл построчно (что учитывает окончания CRLF), в отличие от разделения на \n, хотя остаток \r на самом деле не представляет большой проблемы ...

Что касается ботинок, то немного:

Shoes.app :title => "Search v0.2", :width => 500, :height => 600 do

  @file = File.open 'db.txt', 'rb'

  def search( file, query )
    file.rewind
    file.select {|line| line =~ /#{query}/i }.map {|match| match.chomp }
  end

  stack :margin => 10 do
    @input  = edit_line :width => 400

    button "search" do
      matches = search( @file, @input.text )
      @output.clear
      @output.append do
        matches.empty? ?
          title( "Nothing found :(" ) :
          title( "Results\n" )
      end
      matches.each do |match|
        @output.append { para match }
      end
    end

    @output = stack { title "Search for something." }

  end

end

Вы никогда не определяли @output.matches или не вызывали свой search() метод. Посмотрите, имеет ли это смысл сейчас.

...