Commit ba11a13c by Aaron Leung

Parsing @if directives.

parent f1f1d456
...@@ -160,6 +160,8 @@ namespace Sass { ...@@ -160,6 +160,8 @@ namespace Sass {
Node parse_function_call(); Node parse_function_call();
Node parse_string(); Node parse_string();
Node parse_value_schema(); Node parse_value_schema();
Node parse_if_directive(Node surrounding_ruleset);
Selector_Lookahead lookahead_for_selector(const char* start = 0); Selector_Lookahead lookahead_for_selector(const char* start = 0);
......
...@@ -36,6 +36,9 @@ namespace Sass { ...@@ -36,6 +36,9 @@ namespace Sass {
root << parse_mixin_call(); root << parse_mixin_call();
if (!lex< exactly<';'> >()) throw_syntax_error("top-level @include directive must be terminated by ';'"); if (!lex< exactly<';'> >()) throw_syntax_error("top-level @include directive must be terminated by ';'");
} }
else if (peek< if_directive >()) {
root << parse_if_directive(Node());
}
else { else {
lex< spaces_and_comments >(); lex< spaces_and_comments >();
throw_syntax_error("invalid top-level expression"); throw_syntax_error("invalid top-level expression");
...@@ -477,13 +480,16 @@ namespace Sass { ...@@ -477,13 +480,16 @@ namespace Sass {
semicolon = true; semicolon = true;
} }
else if (lex< extend >()) { else if (lex< extend >()) {
if (surrounding_ruleset.is_null_ptr()) throw_syntax_error("@extend directive may only be used within rules");
Node extendee(parse_simple_selector_sequence()); Node extendee(parse_simple_selector_sequence());
// context.extensions[extendee] = surrounding_ruleset;
context.extensions.insert(pair<Node, Node>(extendee, surrounding_ruleset)); context.extensions.insert(pair<Node, Node>(extendee, surrounding_ruleset));
cerr << "PARSED EXTENSION REQUEST: " << surrounding_ruleset[0].to_string() << " EXTENDS " << extendee.to_string() << endl; cerr << "PARSED EXTENSION REQUEST: " << surrounding_ruleset[0].to_string() << " EXTENDS " << extendee.to_string() << endl;
context.has_extensions = true; context.has_extensions = true;
semicolon = true; semicolon = true;
} }
else if (peek< if_directive >()) {
block << parse_if_directive(surrounding_ruleset);
}
else if (!peek< exactly<';'> >()) { else if (!peek< exactly<';'> >()) {
Node rule(parse_rule()); Node rule(parse_rule());
// check for lbrace; if it's there, we have a namespace property with a value // check for lbrace; if it's there, we have a namespace property with a value
...@@ -871,8 +877,28 @@ namespace Sass { ...@@ -871,8 +877,28 @@ namespace Sass {
call.should_eval() = true; call.should_eval() = true;
return call; return call;
} }
Node Document::parse_if_directive(Node surrounding_ruleset)
{
lex< if_directive >();
Node conditional(context.new_Node(Node::if_directive, path, line, 2));
conditional << parse_list(); // the predicate
if (!lex< exactly<'{'> >()) throw_syntax_error("expected '{' after the predicate for @if");
conditional << parse_block(surrounding_ruleset); // the consequent
// collect all "@else if"s
while (lex< elseif_directive >()) {
conditional << parse_list(); // the next predicate
if (!lex< exactly<'{'> >()) throw_syntax_error("expected '{' after the predicate for @else if");
conditional << parse_block(surrounding_ruleset); // the next consequent
}
// parse the "@else" if present
if (lex< else_directive >()) {
if (!lex< exactly<'{'> >()) throw_syntax_error("expected '{' after @else");
conditional << parse_block(surrounding_ruleset); // the alternative
}
return conditional;
}
// const char* Document::lookahead_for_selector(const char* start)
Selector_Lookahead Document::lookahead_for_selector(const char* start) Selector_Lookahead Document::lookahead_for_selector(const char* start)
{ {
const char* p = start ? start : position; const char* p = start ? start : position;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment