Commit d47e4cd9 by Aaron Leung

Making the 'url' css function take more dynamic arguments.

parent fac67038
...@@ -164,6 +164,7 @@ namespace Sass { ...@@ -164,6 +164,7 @@ namespace Sass {
Node parse_string(); Node parse_string();
Node parse_value_schema(); Node parse_value_schema();
Node parse_identifier_schema(); Node parse_identifier_schema();
Node parse_url_schema();
Node parse_if_directive(Node surrounding_ruleset, Node::Type inside_of = Node::none); Node parse_if_directive(Node surrounding_ruleset, Node::Type inside_of = Node::none);
Node parse_for_directive(Node surrounding_ruleset, Node::Type inside_of = Node::none); Node parse_for_directive(Node surrounding_ruleset, Node::Type inside_of = Node::none);
Node parse_each_directive(Node surrounding_ruleset, Node::Type inside_of = Node::none); Node parse_each_directive(Node surrounding_ruleset, Node::Type inside_of = Node::none);
......
...@@ -858,20 +858,19 @@ namespace Sass { ...@@ -858,20 +858,19 @@ namespace Sass {
Node result(context.new_Node(Node::uri, path, line, 1)); Node result(context.new_Node(Node::uri, path, line, 1));
if (lex< variable >()) { if (lex< variable >()) {
result << context.new_Node(Node::variable, path, line, lexed); result << context.new_Node(Node::variable, path, line, lexed);
if (!lex< exactly<')'> >()) throw_syntax_error("URI is missing ')'");
result.should_eval() = true; result.should_eval() = true;
} }
else if (lex< string_constant >()) { else if (lex< string_constant >()) {
result << parse_string(); result << parse_string();
if (!lex< exactly<')'> >()) throw_syntax_error("URI is missing ')'");
result.should_eval() = true; result.should_eval() = true;
} }
// else if (lex< value_schema >()) { else if (lex< url_schema >()) {
// cerr << lexed.to_string() << endl; result << Document::make_from_token(context, lexed, path, line).parse_url_schema();
// result << Document::make_from_token(context, lexed, path, line).parse_value_schema(); result.should_eval() = true;
// if (!lex< exactly<')'> >()) throw_syntax_error("URI is missing ')'"); }
// result.should_eval() = true; else if (lex< url_value >()) {
// } result << context.new_Node(Node::identifier, path, line, lexed);
}
else { else {
const char* value = position; const char* value = position;
const char* rparen = find_first< exactly<')'> >(position); const char* rparen = find_first< exactly<')'> >(position);
...@@ -881,8 +880,8 @@ namespace Sass { ...@@ -881,8 +880,8 @@ namespace Sass {
// lex< string_constant >(); // lex< string_constant >();
result << content_node; result << content_node;
position = rparen; position = rparen;
lex< exactly<')'> >();
} }
if (!lex< exactly<')'> >()) throw_syntax_error("URI is missing ')'");
return result; return result;
} }
...@@ -1021,6 +1020,35 @@ namespace Sass { ...@@ -1021,6 +1020,35 @@ namespace Sass {
return schema; return schema;
} }
Node Document::parse_url_schema()
{
Node schema(context.new_Node(Node::value_schema, path, line, 1));
while (position < end) {
if (position[0] == '/') {
lexed = Token::make(position, position+1);
schema << context.new_Node(Node::identifier, path, line, lexed);
++position;
}
else if (lex< interpolant >()) {
Token insides(Token::make(lexed.begin + 2, lexed.end - 1));
Node interp_node(Document::make_from_token(context, insides, path, line).parse_list());
schema << interp_node;
}
else if (lex< sequence< identifier, exactly<':'> > >()) {
schema << context.new_Node(Node::identifier, path, line, lexed);
}
else if (lex< filename >()) {
schema << context.new_Node(Node::identifier, path, line, lexed);
}
else {
throw_syntax_error("error parsing interpolated url");
}
}
schema.should_eval() = true;
return schema;
}
Node Document::parse_identifier_schema() Node Document::parse_identifier_schema()
{ {
lex< sequence< optional< exactly<'*'> >, identifier_schema > >(); lex< sequence< optional< exactly<'*'> >, identifier_schema > >();
......
#include <cctype> #include <cctype>
#include "prelexer.hpp" #include "prelexer.hpp"
#include <iostream>
namespace Sass { namespace Sass {
namespace Prelexer { namespace Prelexer {
using std::cerr; using std::endl;
// Matches zero characters (always succeeds without consuming input). // Matches zero characters (always succeeds without consuming input).
const char* epsilon(char *src) { const char* epsilon(char *src) {
return src; return src;
...@@ -94,6 +95,15 @@ namespace Sass { ...@@ -94,6 +95,15 @@ namespace Sass {
interpolant, interpolant,
zero_plus< alternatives< identifier, percentage, dimension, hex, number, string_constant > > > >(src); zero_plus< alternatives< identifier, percentage, dimension, hex, number, string_constant > > > >(src);
} }
const char* filename_schema(const char* src) {
return one_plus< sequence< zero_plus< alternatives< identifier, number, exactly<'.'>, exactly<'/'> > >,
interpolant,
zero_plus< alternatives< identifier, number, exactly<'.'>, exactly<'/'> > > > >(src);
}
const char* filename(const char* src) {
return one_plus< alternatives< identifier, number, exactly<'.'> > >(src);
}
// Match CSS '@' keywords. // Match CSS '@' keywords.
const char* at_keyword(const char* src) { const char* at_keyword(const char* src) {
...@@ -279,11 +289,14 @@ namespace Sass { ...@@ -279,11 +289,14 @@ namespace Sass {
optional<spaces>, optional<spaces>,
exactly<')'> >(src); exactly<')'> >(src);
} }
const char* url(const char* src) { const char* url_value(const char* src) {
return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol
one_plus< sequence< zero_plus< exactly<'/'> >, filename > >, // one or more folders and/or trailing filename
optional< exactly<'/'> > >(src);
}
const char* url_schema(const char* src) {
return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol return sequence< optional< sequence< identifier, exactly<':'> > >, // optional protocol
optional< exactly<':'> >, // extra slash filename_schema >(src); // optional trailing slash
one_plus< sequence< exactly<'/'>, value_schema > >, // one or more folders and/or trailing filename
optional< exactly<'/'> > >(src); // optional trailing slash
} }
// Match SCSS image-url function // Match SCSS image-url function
extern const char image_url_kwd[] = "image-url("; extern const char image_url_kwd[] = "image-url(";
......
...@@ -305,6 +305,10 @@ namespace Sass { ...@@ -305,6 +305,10 @@ namespace Sass {
// Match interpolant schemas // Match interpolant schemas
const char* identifier_schema(const char* src); const char* identifier_schema(const char* src);
const char* value_schema(const char* src); const char* value_schema(const char* src);
const char* filename(const char* src);
const char* filename_schema(const char* src);
const char* url_schema(const char* src);
const char* url_value(const char* src);
// Match CSS '@' keywords. // Match CSS '@' keywords.
const char* at_keyword(const char* src); const char* at_keyword(const char* src);
const char* import(const char* src); const char* import(const char* src);
......
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