Commit 23351ddb by Aaron Leung

Un-jankifying image-url.

parent 5a145434
...@@ -81,15 +81,18 @@ namespace Sass { ...@@ -81,15 +81,18 @@ namespace Sass {
extern const char star_slash[] = "*/"; extern const char star_slash[] = "*/";
extern const char hash_lbrace[] = "#{"; extern const char hash_lbrace[] = "#{";
extern const char rbrace[] = "}"; extern const char rbrace[] = "}";
extern const char rparen[] = ")";
extern const char sign_chars[] = "-+"; extern const char sign_chars[] = "-+";
// type names // type names
extern const char numeric_name[] = "numeric value"; extern const char numeric_name[] = "numeric value";
extern const char number_name[] = "number"; extern const char number_name[] = "number";
extern const char string_name[] = "string"; extern const char percentage_name[] = "percentage";
extern const char bool_name[] = "bool"; extern const char dimension_name[] = "numeric dimension";
extern const char color_name[] = "color"; extern const char string_name[] = "string";
extern const char list_name[] = "list"; extern const char bool_name[] = "bool";
extern const char color_name[] = "color";
extern const char list_name[] = "list";
} }
} }
\ No newline at end of file
...@@ -81,15 +81,17 @@ namespace Sass { ...@@ -81,15 +81,17 @@ namespace Sass {
extern const char star_slash[]; extern const char star_slash[];
extern const char hash_lbrace[]; extern const char hash_lbrace[];
extern const char rbrace[]; extern const char rbrace[];
extern const char rparen[];
extern const char sign_chars[]; extern const char sign_chars[];
// type names // type names
extern const char numeric_name[]; extern const char numeric_name[];
extern const char number_name[]; extern const char number_name[];
extern const char percentage_name[];
extern const char dimension_name[];
extern const char string_name[]; extern const char string_name[];
extern const char bool_name[]; extern const char bool_name[];
extern const char color_name[]; extern const char color_name[];
extern const char list_name[]; extern const char list_name[];
} }
} }
\ No newline at end of file
...@@ -67,7 +67,9 @@ namespace Sass { ...@@ -67,7 +67,9 @@ namespace Sass {
path_string = "'" + path_string + "/'"; path_string = "'" + path_string + "/'";
image_path = new char[path_string.length() + 1]; image_path = new char[path_string.length() + 1];
std::strcpy(image_path, path_string.c_str()); std::strcpy(image_path, path_string.c_str());
global_env[Token::make(image_path_var)] = new_Node(Node::string_constant, "", 0, Token::make(image_path));
// stash this hidden variable for the image-url built-in to use
global_env[Token::make(image_path_var)] = new_Node(Node::string_constant, "[IMAGE PATH]", 0, Token::make(image_path));
} }
Context::~Context() Context::~Context()
...@@ -159,6 +161,8 @@ namespace Sass { ...@@ -159,6 +161,8 @@ namespace Sass {
// Boolean Functions // Boolean Functions
register_function(not_sig, not_impl); register_function(not_sig, not_impl);
register_function(if_sig, if_impl); register_function(if_sig, if_impl);
// Path Functions
register_function(image_url_sig, image_url);
} }
void Context::setup_color_map() void Context::setup_color_map()
......
...@@ -889,16 +889,6 @@ namespace Sass { ...@@ -889,16 +889,6 @@ namespace Sass {
return result; return result;
} }
if (lex< image_url_prefix >())
{
Node url(parse_value());
if (!lex< exactly<')'> >()) throw_syntax_error("call to image-url is missing ')'");
Node the_call(context.new_Node(Node::image_url, path, line, 1));
the_call << url;
the_call.should_eval() = true;
return the_call;
}
if (peek< functional >()) if (peek< functional >())
{ return parse_function_call(); } { return parse_function_call(); }
......
...@@ -304,16 +304,6 @@ namespace Sass { ...@@ -304,16 +304,6 @@ namespace Sass {
return expr; return expr;
} break; } break;
case Node::image_url: {
Node base(eval(expr[0], prefix, env, f_env, new_Node, ctx));
Node prefix(new_Node(Node::identifier, base.path(), base.line(), Token::make(ctx.image_path)));
Node fullpath(new_Node(Node::concatenation, base.path(), base.line(), 2));
fullpath << prefix << base;
expr.pop_back();
expr << fullpath;
return expr;
} break;
case Node::function_call: { case Node::function_call: {
// TO DO: default-constructed Function should be a generic callback (maybe) // TO DO: default-constructed Function should be a generic callback (maybe)
......
...@@ -62,12 +62,18 @@ namespace Sass { ...@@ -62,12 +62,18 @@ namespace Sass {
return numeric_name; return numeric_name;
} break; } break;
case Node::number: case Node::number: {
case Node::numeric_percentage:
case Node::numeric_dimension: {
return number_name; return number_name;
} break; } break;
case Node::numeric_percentage: {
return percentage_name;
} break;
case Node::numeric_dimension: {
return dimension_name;
} break;
case Node::string_t: case Node::string_t:
case Node::identifier: case Node::identifier:
case Node::value_schema: case Node::value_schema:
...@@ -1163,5 +1169,22 @@ namespace Sass { ...@@ -1163,5 +1169,22 @@ namespace Sass {
return consequent; return consequent;
} }
////////////////////////////////////////////////////////////////////////
// Path Functions //////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
extern Signature image_url_sig = "image-url($path, $only-path: false, $cache-buster: false)";
Node image_url(const Node parameter_names, Environment& bindings, Node_Factory& new_Node, string& path, size_t line) {
Node base_path(bindings[parameter_names[0].token()]);
bool only_path = !bindings[parameter_names[1].token()].is_false();
Node image_path_val(bindings[Token::make(image_path_var)]);
Node result(new_Node(Node::concatenation, path, line, 2));
result << image_path_val;
result << base_path;
if (!only_path) result = (new_Node(Node::uri, path, line, 1) << result);
return result;
}
} }
} }
...@@ -218,6 +218,9 @@ namespace Sass { ...@@ -218,6 +218,9 @@ namespace Sass {
extern Signature if_sig; extern Signature if_sig;
Node if_impl(const Node, Environment&, Node_Factory&, string& path, size_t line); Node if_impl(const Node, Environment&, Node_Factory&, string& path, size_t line);
// Path Functions //////////////////////////////////////////////////////
extern Signature image_url_sig;
Node image_url(const Node, Environment&, Node_Factory&, string& path, size_t line);
} }
} }
...@@ -134,7 +134,6 @@ namespace Sass { ...@@ -134,7 +134,6 @@ namespace Sass {
value, value,
identifier, identifier,
uri, uri,
image_url,
textual_percentage, textual_percentage,
textual_dimension, textual_dimension,
textual_number, textual_number,
......
...@@ -279,15 +279,6 @@ namespace Sass { ...@@ -279,15 +279,6 @@ namespace Sass {
return result; return result;
} break; } break;
case image_url: {
Node fullpath(at(0));
string result("url(\"");
result += fullpath[0].unquote();
result += fullpath[1].unquote();
result += "\")";
return result;
} break;
case expansion: { case expansion: {
// ignore it // ignore it
return ""; return "";
......
...@@ -283,10 +283,6 @@ namespace Sass { ...@@ -283,10 +283,6 @@ namespace Sass {
return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol
filename_schema >(src); // optional trailing slash filename_schema >(src); // optional trailing slash
} }
// Match SCSS image-url function
const char* image_url_prefix(const char* src) {
return exactly<image_url_kwd>(src);
}
// Match CSS "!important" keyword. // Match CSS "!important" keyword.
const char* important(const char* src) { const char* important(const char* src) {
return sequence< exactly<'!'>, return sequence< exactly<'!'>,
......
...@@ -359,8 +359,6 @@ namespace Sass { ...@@ -359,8 +359,6 @@ namespace Sass {
const char* uri_prefix(const char* src); const char* uri_prefix(const char* src);
const char* uri(const char* src); const char* uri(const char* src);
const char* url(const char* src); const char* url(const char* src);
// Match SCSS image-url function.
const char* image_url_prefix(const char* src);
// Match CSS "!important" keyword. // Match CSS "!important" keyword.
const char* important(const char* src); const char* important(const char* src);
// Match Sass "!default" keyword. // Match Sass "!default" keyword.
......
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