class Capybara::Selector::CSS::Splitter

def parse_block(start, final, strio)

def parse_block(start, final, strio)
  block = start
  while (char = strio.getc)
    case char
    when final
      return block + char
    when '\\'
      block += char + strio.getc
    when '"', "'"
      block += parse_string(char, strio)
    else
      block += char
    end
  end
  raise ArgumentError, "Invalid CSS Selector - Block end '#{final}' not found"
end

def parse_paren(strio)

def parse_paren(strio)
  parse_block('(', ')', strio)
end

def parse_square(strio)

def parse_square(strio)
  parse_block('[', ']', strio)
end

def parse_string(quote, strio)

def parse_string(quote, strio)
  string = quote
  while (char = strio.getc)
    string += char
    case char
    when quote
      return string
    when '\\'
      string += strio.getc
    end
  end
  raise ArgumentError, 'Invalid CSS Selector - string end not found'
end

def split(css)

def split(css)
  selectors = []
  StringIO.open(css.to_s) do |str|
    selector = +''
    while (char = str.getc)
      case char
      when '['
        selector << parse_square(str)
      when '('
        selector << parse_paren(str)
      when '"', "'"
        selector << parse_string(char, str)
      when '\\'
        selector << (char + str.getc)
      when ','
        selectors << selector.strip
        selector.clear
      else
        selector << char
      end
    end
    selectors << selector.strip
  end
  selectors
end