module CultomePlayer::Command::Reader

Public Instance Methods

command_reader() click to toggle source

Lazy getter for readline object.

@return [Readline] The readline object

# File lib/cultome_player/command/reader.rb, line 26
def command_reader
  return Readline if @command_reader_initialized

  Readline.completion_append_character = ""
  Readline.basic_word_break_characters = Readline.basic_word_break_characters.delete("@")
  Readline.completion_proc = completion_proc
  @command_reader_initialized = true
  return Readline
end
read_command(prompt) click to toggle source

Display a prompt and read user input.

@param prompt [String] The message to display to user for arcking for input. @return [String] The user input readed.

# File lib/cultome_player/command/reader.rb, line 10
def read_command(prompt)
  input = command_reader.readline(c5(prompt), true)

  # evitamos que comando consecutivos repetidos o vacios queden en el historial
  if input.empty?
    command_reader::HISTORY.pop
  elsif command_reader::HISTORY.to_a.reverse[1] == input
    command_reader::HISTORY.pop
  end

  return input
end

Private Instance Methods

complete_action(cmd, word) click to toggle source
# File lib/cultome_player/command/reader.rb, line 86
def complete_action(cmd, word)
  # escribio una parabra..
  get_command_param_options(cmd, word) do
    # incompleta! require acompletar el action actual
    semantics.keys.grep(/^#{Regexp.escape(Readline.line_buffer)}/).collect{|s| "#{s} "}
  end
end
complete_parameter(cmd, word) click to toggle source
# File lib/cultome_player/command/reader.rb, line 73
def complete_parameter(cmd, word)
  options = get_command_param_options(cmd, word) do
    # esta acompletando un parametro
    if word.start_with?("/") || word.start_with?("~/")
      expanded_path = File.expand_path(word)
      expanded_path += "/" if File.directory?(expanded_path)
      Dir[expanded_path + "*"].grep(/^#{Regexp.escape(expanded_path)}/).collect{|d| "#{d}/"}
    elsif word.start_with?("@")
      %w{@playlist @current @history @queue @search @song @artist @album @drives @artists @albums @genres @library @recently_added @recently_played @most_played @less_played @populars}.grep(/^#{word}/)
    end
  end
end
completion_proc() click to toggle source
# File lib/cultome_player/command/reader.rb, line 38
def completion_proc
  proc do |word|
    if Readline.line_buffer.empty?
      # linea en blanco y no sabe los comandos
      options = semantics.keys #return
    else
      tks = Readline.line_buffer.split
      if tks.length == 1
        options = complete_action(tks[0], word)
      elsif tks.length > 1
        options = complete_parameter(tks[0], word)
      end
    end

    options = [] if options.nil?
    options << word if options.empty?
    options << " " if options.all?{|o| o.start_with?("<")}
    options # final return
  end # proc
end
get_command_param_options(cmd, word) { || ... } click to toggle source
# File lib/cultome_player/command/reader.rb, line 59
def get_command_param_options(cmd, word)
  if word.empty?
    # completa! mostramos los parametros disponibles para el comando
    if semantics.keys.include?(cmd)
      # mostramos las opciones de parametros IFF acepta parametros
      params = semantics[cmd].source.gsub(/^\^literal/, '').gsub(/\[\\s\][+*]/, "").gsub(/[()*$]/, '')

      params.split(/[| ]/).collect{|p| "<#{p}>"} unless params.empty?
    end
  else
    yield if block_given?
  end
end