Commit f032b652 by Aaron Leung

Implemented the @if directive.

parent f000fd19
...@@ -94,7 +94,7 @@ namespace Sass { ...@@ -94,7 +94,7 @@ namespace Sass {
case Node::root: { case Node::root: {
for (size_t i = 0, S = expr.size(); i < S; ++i) { for (size_t i = 0, S = expr.size(); i < S; ++i) {
eval(expr[i], prefix, env, f_env, new_Node, ctx); expr[i] = eval(expr[i], prefix, env, f_env, new_Node, ctx);
} }
return expr; return expr;
} break; } break;
...@@ -103,7 +103,7 @@ namespace Sass { ...@@ -103,7 +103,7 @@ namespace Sass {
Environment new_frame; Environment new_frame;
new_frame.link(env); new_frame.link(env);
for (size_t i = 0, S = expr.size(); i < S; ++i) { for (size_t i = 0, S = expr.size(); i < S; ++i) {
eval(expr[i], prefix, new_frame, f_env, new_Node, ctx); expr[i] = eval(expr[i], prefix, new_frame, f_env, new_Node, ctx);
} }
return expr; return expr;
} break; } break;
...@@ -297,7 +297,24 @@ namespace Sass { ...@@ -297,7 +297,24 @@ namespace Sass {
case Node::css_import: { case Node::css_import: {
expr[0] = eval(expr[0], prefix, env, f_env, new_Node, ctx); expr[0] = eval(expr[0], prefix, env, f_env, new_Node, ctx);
return expr; return expr;
} break; } break;
case Node::if_directive: {
for (size_t i = 0, S = expr.size(); i < S; i += 2) {
if (expr[i].type() != Node::block) {
// cerr << "EVALUATING PREDICATE " << (i/2+1) << endl;
Node predicate_val(eval(expr[i], prefix, env, f_env, new_Node, ctx));
if ((predicate_val.type() != Node::boolean) || predicate_val.boolean_value()) {
// cerr << "EVALUATING CONSEQUENT " << (i/2+1) << endl;
return eval(expr[i+1], prefix, env, f_env, new_Node, ctx);
}
}
else {
// cerr << "EVALUATING ALTERNATIVE" << endl;
return eval(expr[i], prefix, env, f_env, new_Node, ctx);
}
}
} break;
default: { default: {
return expr; return expr;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include <algorithm> #include <algorithm>
#include "node.hpp" #include "node.hpp"
#include "error.hpp" #include "error.hpp"
#include <iostream>
namespace Sass { namespace Sass {
using namespace std; using namespace std;
...@@ -15,7 +16,7 @@ namespace Sass { ...@@ -15,7 +16,7 @@ namespace Sass {
if (type() != block && type() != expansion && type() != root) return; if (type() != block && type() != expansion && type() != root) return;
// size can change during flattening, so we need to call size() on each pass // size can change during flattening, so we need to call size() on each pass
for (size_t i = 0; i < size(); ++i) { for (size_t i = 0; i < size(); ++i) {
if (at(i).type() == expansion) { if ((at(i).type() == expansion) || (at(i).type() == block)) {
Node expn(at(i)); Node expn(at(i));
if (expn.has_expansions()) expn.flatten(); if (expn.has_expansions()) expn.flatten();
ip_->has_statements |= expn.has_statements(); ip_->has_statements |= expn.has_statements();
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <cstring> #include <cstring>
#include <string> #include <string>
#include <vector> #include <vector>
#include <iostream>
namespace Sass { namespace Sass {
using namespace std; using namespace std;
...@@ -146,6 +147,11 @@ namespace Sass { ...@@ -146,6 +147,11 @@ namespace Sass {
expansion, expansion,
arguments, arguments,
if_directive,
for_directive,
each_directive,
while_directive,
variable, variable,
assignment assignment
}; };
...@@ -189,6 +195,8 @@ namespace Sass { ...@@ -189,6 +195,8 @@ namespace Sass {
Token token() const; Token token() const;
Token unit() const; Token unit() const;
bool is_null_ptr() const;
void flatten(); void flatten();
bool operator==(Node rhs) const; bool operator==(Node rhs) const;
...@@ -273,6 +281,7 @@ namespace Sass { ...@@ -273,6 +281,7 @@ namespace Sass {
case Node::rule: case Node::rule:
case Node::propset: has_statements = true; break; case Node::propset: has_statements = true; break;
case Node::ruleset: has_blocks = true; break; case Node::ruleset: has_blocks = true; break;
case Node::if_directive:
case Node::expansion: has_expansions = true; break; case Node::expansion: has_expansions = true; break;
case Node::backref: has_backref = true; break; case Node::backref: has_backref = true; break;
default: break; default: break;
...@@ -369,4 +378,6 @@ namespace Sass { ...@@ -369,4 +378,6 @@ namespace Sass {
inline Token Node::token() const { return ip_->value.token; } inline Token Node::token() const { return ip_->value.token; }
inline Token Node::unit() const { return ip_->unit(); } inline Token Node::unit() const { return ip_->unit(); }
inline bool Node::is_null_ptr() const { return !ip_; }
} }
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