Commit 23351ddb by Aaron Leung

Un-jankifying image-url.

parent 5a145434
......@@ -81,11 +81,14 @@ namespace Sass {
extern const char star_slash[] = "*/";
extern const char hash_lbrace[] = "#{";
extern const char rbrace[] = "}";
extern const char rparen[] = ")";
extern const char sign_chars[] = "-+";
// type names
extern const char numeric_name[] = "numeric value";
extern const char number_name[] = "number";
extern const char percentage_name[] = "percentage";
extern const char dimension_name[] = "numeric dimension";
extern const char string_name[] = "string";
extern const char bool_name[] = "bool";
extern const char color_name[] = "color";
......
......@@ -81,15 +81,17 @@ namespace Sass {
extern const char star_slash[];
extern const char hash_lbrace[];
extern const char rbrace[];
extern const char rparen[];
extern const char sign_chars[];
// type names
extern const char numeric_name[];
extern const char number_name[];
extern const char percentage_name[];
extern const char dimension_name[];
extern const char string_name[];
extern const char bool_name[];
extern const char color_name[];
extern const char list_name[];
}
}
\ No newline at end of file
......@@ -67,7 +67,9 @@ namespace Sass {
path_string = "'" + path_string + "/'";
image_path = new char[path_string.length() + 1];
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()
......@@ -159,6 +161,8 @@ namespace Sass {
// Boolean Functions
register_function(not_sig, not_impl);
register_function(if_sig, if_impl);
// Path Functions
register_function(image_url_sig, image_url);
}
void Context::setup_color_map()
......
......@@ -889,16 +889,6 @@ namespace Sass {
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 >())
{ return parse_function_call(); }
......
......@@ -304,16 +304,6 @@ namespace Sass {
return expr;
} 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: {
// TO DO: default-constructed Function should be a generic callback (maybe)
......
......@@ -62,12 +62,18 @@ namespace Sass {
return numeric_name;
} break;
case Node::number:
case Node::numeric_percentage:
case Node::numeric_dimension: {
case Node::number: {
return number_name;
} break;
case Node::numeric_percentage: {
return percentage_name;
} break;
case Node::numeric_dimension: {
return dimension_name;
} break;
case Node::string_t:
case Node::identifier:
case Node::value_schema:
......@@ -1163,5 +1169,22 @@ namespace Sass {
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 {
extern Signature if_sig;
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 {
value,
identifier,
uri,
image_url,
textual_percentage,
textual_dimension,
textual_number,
......
......@@ -279,15 +279,6 @@ namespace Sass {
return result;
} 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: {
// ignore it
return "";
......
......@@ -283,10 +283,6 @@ namespace Sass {
return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol
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.
const char* important(const char* src) {
return sequence< exactly<'!'>,
......
......@@ -359,8 +359,6 @@ namespace Sass {
const char* uri_prefix(const char* src);
const char* uri(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.
const char* important(const char* src);
// 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