class Prawn::SVG::CSS::ValuesParser

Public Class Methods

parse(values) click to toggle source
# File lib/prawn/svg/css/values_parser.rb, line 4
def parse(values)
  result = []

  while values
    value, remainder = parse_next(values)
    break unless value

    result << value
    values = remainder
  end

  result
end

Private Class Methods

parse_function_call(name, rest) click to toggle source

Note this does not support space-separated arguments. I don’t think CSS 2 has any, but in case it does here is the place to add them.

# File lib/prawn/svg/css/values_parser.rb, line 33
def parse_function_call(name, rest)
  arguments = []
  in_quote = nil
  in_escape = false
  current = +''

  rest.each_char.with_index do |char, index|
    if in_escape
      current << char
      in_escape = false
    elsif %w[" '].include?(char)
      if in_quote == char
        in_quote = nil
      elsif in_quote.nil?
        in_quote = char
      else
        current << char
      end
    elsif char == '\\'
      in_escape = true
    elsif in_quote.nil? && char == ','
      arguments << current.strip
      current = +''
    elsif in_quote.nil? && char == ')'
      arguments << current.strip
      return [[name, arguments], rest[index + 1..]]
    else
      current << char
    end
  end

  [rest, nil]
end
parse_next(values) click to toggle source
# File lib/prawn/svg/css/values_parser.rb, line 20
def parse_next(values)
  values = values.strip
  return if values.empty?

  if (matches = values.match(/\A([a-z-]+)\(\s*(.+)/i))
    parse_function_call(matches[1].downcase, matches[2])
  else
    values.split(/\s+/, 2)
  end
end