@@ -36,6 +36,9 @@ namespace Sass {
36
36
root << parse_mixin_call ();
37
37
if (!lex< exactly<' ;' > >()) throw_syntax_error (" top-level @include directive must be terminated by ';'" );
38
38
}
39
+ else if (peek< if_directive >()) {
40
+ root << parse_if_directive (Node ());
41
+ }
39
42
else {
40
43
lex< spaces_and_comments >();
41
44
throw_syntax_error (" invalid top-level expression" );
@@ -477,13 +480,16 @@ namespace Sass {
477
480
semicolon = true ;
478
481
}
479
482
else if (lex< extend >()) {
483
+ if (surrounding_ruleset.is_null_ptr ()) throw_syntax_error (" @extend directive may only be used within rules" );
480
484
Node extendee (parse_simple_selector_sequence ());
481
- // context.extensions[extendee] = surrounding_ruleset;
482
485
context.extensions .insert (pair<Node, Node>(extendee, surrounding_ruleset));
483
486
cerr << " PARSED EXTENSION REQUEST: " << surrounding_ruleset[0 ].to_string () << " EXTENDS " << extendee.to_string () << endl;
484
487
context.has_extensions = true ;
485
488
semicolon = true ;
486
489
}
490
+ else if (peek< if_directive >()) {
491
+ block << parse_if_directive (surrounding_ruleset);
492
+ }
487
493
else if (!peek< exactly<' ;' > >()) {
488
494
Node rule (parse_rule ());
489
495
// check for lbrace; if it's there, we have a namespace property with a value
@@ -871,8 +877,28 @@ namespace Sass {
871
877
call.should_eval () = true ;
872
878
return call;
873
879
}
880
+
881
+ Node Document::parse_if_directive (Node surrounding_ruleset)
882
+ {
883
+ lex< if_directive >();
884
+ Node conditional (context.new_Node (Node::if_directive, path, line, 2 ));
885
+ conditional << parse_list (); // the predicate
886
+ if (!lex< exactly<' {' > >()) throw_syntax_error (" expected '{' after the predicate for @if" );
887
+ conditional << parse_block (surrounding_ruleset); // the consequent
888
+ // collect all "@else if"s
889
+ while (lex< elseif_directive >()) {
890
+ conditional << parse_list (); // the next predicate
891
+ if (!lex< exactly<' {' > >()) throw_syntax_error (" expected '{' after the predicate for @else if" );
892
+ conditional << parse_block (surrounding_ruleset); // the next consequent
893
+ }
894
+ // parse the "@else" if present
895
+ if (lex< else_directive >()) {
896
+ if (!lex< exactly<' {' > >()) throw_syntax_error (" expected '{' after @else" );
897
+ conditional << parse_block (surrounding_ruleset); // the alternative
898
+ }
899
+ return conditional;
900
+ }
874
901
875
- // const char* Document::lookahead_for_selector(const char* start)
876
902
Selector_Lookahead Document::lookahead_for_selector (const char * start)
877
903
{
878
904
const char * p = start ? start : position;
0 commit comments