class Crass::Parser

def consume_declarations(input = @tokens, options = {})

5.4.4. http://dev.w3.org/csswg/css-syntax/#consume-a-list-of-declarations

`:semicolon`, and `:whitespace` nodes.
* **:strict** - Set to `true` to exclude non-standard `:comment`,

Options:

`:whitespace` nodes, which is non-standard.
By default, the returned list may include `:comment`, `:semicolon`, and

Consumes a list of declarations and returns them.
def consume_declarations(input = @tokens, options = {})
  declarations = []
  while token = input.consume
    case token[:node]
    # Non-standard: Preserve comments, semicolons, and whitespace.
    when :comment, :semicolon, :whitespace
      declarations << token unless options[:strict]
    when :at_keyword
      # When parsing a style rule, this is a parse error. Otherwise it's
      # not.
      input.reconsume
      declarations << consume_at_rule(input)
    when :ident
      decl_tokens = [token]
      while next_token = input.peek
        break if next_token[:node] == :semicolon
        decl_tokens << consume_component_value(input)
      end
      if decl = consume_declaration(TokenScanner.new(decl_tokens))
        declarations << decl
      end
    else
      # Parse error (invalid property name, etc.).
      #
      # Note: The spec doesn't say we should append anything to the list of
      # declarations here, but Simon Sapin's CSS parsing tests expect an
      # error node.
      declarations << create_node(:error, :value => 'invalid')
      input.reconsume
      while next_token = input.peek
        break if next_token[:node] == :semicolon
        consume_component_value(input)
      end
    end
  end
  declarations
end