class Dramaturg::Parser

Public Class Methods

call(cmd) click to toggle source
# File lib/dramaturg/parser.rb, line 4
def call(cmd)
  tokens = tokenize(cmd.to_s)

  tokens.each do |t|
    case t
    when /^\{(\w+):(.+)\}$/
      add_named_value(cmd, $1.to_sym, $2)
    when /^\{([^\$].*)\}$/
      add_anon_value(cmd, $1)
    when /^\{(\$.+)\}/
      add_var_value(cmd, $1)
    else
      cmd << Value::Fixed.new(t)
    end
  end

  if cmd.allow_suffix
    suffix = Value::OrDefault.new("")
    cmd[:_suffix] = suffix
    cmd << suffix
  end

  if cmd.save_to_file
    cmd << Value::Silent.new(" | tee #{cmd.save_to_file}")
  end
end

Private Class Methods

add_anon_value(cmd, expression) click to toggle source
# File lib/dramaturg/parser.rb, line 36
def add_anon_value(cmd, expression)
  cmd << Value::OrDefault.new(expression)
end
add_named_value(cmd, name, value) click to toggle source
# File lib/dramaturg/parser.rb, line 40
def add_named_value(cmd, name, value)
  value = Value::OrDefault.new(value)
  cmd[name] = value
  cmd << value
end
add_var_value(cmd, var) click to toggle source
# File lib/dramaturg/parser.rb, line 46
def add_var_value(cmd, var)
  exists = eval("defined? #{var}")
  key = var.to_sym

  if exists == 'global-variable'
    value = eval(var)
    value = Value::Fixed(value) unless value.is_a? Value::Base
    value.display = var if value.respond_to? :display=

    cmd << value
  else
    $stderr.puts "WARN: Reference to undefined global #{$1} at #{caller(7).join("\n\t")}"
  end
end
tokenize(s) click to toggle source
# File lib/dramaturg/parser.rb, line 32
def tokenize(s)
  s.split /(?=\{)|(?<=\})/
end