Commit b1580330 by Aaron Leung

Still working on interpolation. Don't try it yet.

parent 260bdb9c
......@@ -142,6 +142,7 @@ namespace Sass {
Node parse_identifier();
Node parse_variable();
Node parse_function_call();
Node parse_value_schema();
const char* look_for_rule(const char* start = 0);
const char* look_for_values(const char* start = 0);
......
......@@ -734,30 +734,65 @@ namespace Sass {
syntax_error("error reading values after " + lexed.to_string());
}
// Node Document::parse_value_schema()
// {
// // just an interpolant
// if (lex< interpolant >()) {
// Token insides(Token::make(lexed.begin + 2, lexed.end - 1));
// Document interp_doc(path, line_number, insides, context);
// Node interp_node(interp_doc.parse_list());
// if (peek< alternatives< spaces, block_comment, line_comment
// exactly<';'>, exactly<','>,
// exactly<'('>, exactly<')'> > >()) {
// return interp_node;
// }
//
//
// Node schema(Node::value_schema, context.registry, 2);
//
// while (true) {
// if (lex< interpolant
//
//
//
//
//
// }
Node Document::parse_value_schema()
{
Node schema;
// just an interpolant
if (lex< interpolant >()) {
Token insides(Token::make(lexed.begin + 2, lexed.end - 1));
Document interp_doc(path, line_number, insides, context);
Node interp_node(interp_doc.parse_list());
if (peek< alternatives< spaces, comment,
exactly<';'>, exactly<','>,
exactly<'('>, exactly<')'> > >()) {
return interp_node;
}
// interpolant with stuff immediately behind it
else {
schema = Node(Node::value_schema, context.registry, line_number, 2);
schema << interp_node;
}
}
while (true) {
if (lex< interpolant >()) {
Token insides(Token::make(lexed.begin + 2, lexed.end - 1));
Document interp_doc(path, line_number, insides, context);
Node interp_node(interp_doc.parse_list());
schema << interp_node;
}
else if (lex< identifier >()) {
schema << Node(Node::identifier, line_number, lexed);
}
else if (lex< percentage >()) {
schema << Node(Node::textual_percentage, line_number, lexed);
}
else if (lex< dimension >()) {
schema << Node(Node::textual_dimension, line_number, lexed);
}
else if (lex< number >()) {
schema << Node(Node::textual_number, line_number, lexed);
}
else if (lex< hex >()) {
schema << Node(Node::textual_hex, line_number, lexed);
}
else if (lex< string_constant >()) {
schema << Node(Node::string_constant, line_number, lexed);
}
else if (lex< variable >()) {
schema << Node(Node::variable, line_number, lexed);
}
else {
syntax_error("error parsing interpolated value");
}
if (peek< alternatives< spaces, comment,
exactly<';'>, exactly<','>,
exactly<'('>, exactly<')'> > >()) {
break;
}
}
return schema;
}
Node Document::parse_function_call()
{
......
......@@ -220,6 +220,13 @@ namespace Sass {
return apply_function(f_env[sig], expr[1], env, f_env, registry);
} break;
case Node::value_schema: {
for (int i = 0; i < expr.size(); ++i) {
expr[i] = eval(expr[i], env, f_env, registry);
}
return expr;
} break;
default: {
return expr;
}
......
$x: bar;
$blux: inside blux;
div {
a: blah foo#{$x};
......@@ -10,4 +11,6 @@ div {
e: 12fa#{lse}345;
f: 12+#{3}, 12(#{3});
g: (12)34, 12(34);
h: #fff#{f};
j: $bl#{ux};
}
\ No newline at end of file
......@@ -272,6 +272,12 @@ namespace Sass {
return "!important";
} break;
case value_schema: {
string result;
for (int i = 0; i < size(); ++i) result += at(i).to_string("");
return result;
} break;
default: {
// return content.token.to_string();
if (!has_children && type != flags) return content.token.to_string();
......
......@@ -76,6 +76,8 @@ namespace Sass {
boolean,
important,
value_schema,
function_call,
mixin,
parameters,
......
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