Commit f156aeeb by Aaron Leung

Properly emitting back-references. This should conclude selector parsing and…

Properly emitting back-references. This should conclude selector parsing and emission until we're ready to tackle interpolation.
parent f0945040
/*hey, ho { hey, ho {
& > boo, foo &.goo { & > boo, foo &.goo {
bloo: bloo; bloo: bloo;
} }
blah: blah; blah: blah;
} }
\ No newline at end of file
*/
div {
a: a;
p {
b: b;
&* {
c: c;
}
}
}
\ No newline at end of file
...@@ -56,36 +56,16 @@ namespace Sass { ...@@ -56,36 +56,16 @@ namespace Sass {
Node s(parse_simple_selector_sequence()); Node s(parse_simple_selector_sequence());
if (s.has_backref) selector.has_backref = true; if (s.has_backref) selector.has_backref = true;
selector << s; selector << s;
// if (s.terminal_backref) return selector;
while (lex< exactly<'+'> >() || while (lex< exactly<'+'> >() ||
lex< exactly<'~'> >() || lex< exactly<'~'> >() ||
lex< exactly<'>'> >() || lex< exactly<'>'> >() ||
lex< ancestor_of >() || lex< ancestor_of >() /*||
s.terminal_backref && lex< no_spaces >()) { s.terminal_backref && lex< no_spaces >()*/) {
selector << Node(line_number, Node::selector_combinator, lexed); selector << Node(line_number, Node::selector_combinator, lexed);
s = parse_simple_selector_sequence(); s = parse_simple_selector_sequence();
if (s.has_backref) selector.has_backref = true; if (s.has_backref) selector.has_backref = true;
selector << s; selector << s;
// if (s.terminal_backref) break;
} }
// while (1) {
// if (lex< exactly<'+'> >() || lex< exactly<'~'> >() ||
// lex< exactly<'>'> >() || lex< ancestor_of >()) {
// selector << Node(line_number, Node::selector_combinator, lexed);
// Node s(parse_simple_selector_sequence());
// if (s.has_backref) selector.has_backref = true;
// selector << s;
// }
// else if (selector.children->back().has_backref &&
// selector.children->back().children->size() == 1 &&
// lex< alternatives < type_selector, universal > >()) {
// Node s(parse_simple_selector_sequence());
// if (s.has_backref) selector.has_backref = true;
// selector << s;
// }
// else break;
// }
return selector; return selector;
} }
...@@ -98,11 +78,10 @@ namespace Sass { ...@@ -98,11 +78,10 @@ namespace Sass {
else if (lex< exactly<'&'> >()) { else if (lex< exactly<'&'> >()) {
seq << Node(line_number, Node::backref, lexed); seq << Node(line_number, Node::backref, lexed);
seq.has_backref = true; seq.has_backref = true;
if (peek< sequence< no_spaces, alternatives< type_selector, universal > > >(position)) { // if (peek< sequence< no_spaces, alternatives< type_selector, universal > > >(position)) {
cerr << "Terminal backref!" << endl; // seq.terminal_backref = true;
seq.terminal_backref = true; // return seq;
return seq; // }
}
} }
else { else {
seq << parse_simple_selector(); seq << parse_simple_selector();
......
...@@ -42,7 +42,7 @@ namespace Sass { ...@@ -42,7 +42,7 @@ namespace Sass {
break; break;
case simple_selector_sequence: case simple_selector_sequence:
for (int i = 0; i < children->size(); ++i) { for (int i = 0; i < children->size(); ++i) {
buf << string(children->at(i)); buf << children->at(i).to_string(string());
} }
break; break;
case simple_selector: case simple_selector:
...@@ -85,16 +85,17 @@ namespace Sass { ...@@ -85,16 +85,17 @@ namespace Sass {
if (prefixes.empty()) { if (prefixes.empty()) {
new_prefixes.reserve(sel_group.children->size()); new_prefixes.reserve(sel_group.children->size());
for (int i = 0; i < sel_group.children->size(); ++i) { for (int i = 0; i < sel_group.children->size(); ++i) {
new_prefixes.push_back(string(sel_group.children->at(i))); new_prefixes.push_back(sel_group.children->at(i).to_string(string()));
} }
} }
else { else {
new_prefixes.reserve(prefixes.size() * sel_group.children->size()); new_prefixes.reserve(prefixes.size() * sel_group.children->size());
for (int i = 0; i < prefixes.size(); ++i) { for (int i = 0; i < prefixes.size(); ++i) {
for (int j = 0; j < sel_group.children->size(); ++j) { for (int j = 0; j < sel_group.children->size(); ++j) {
new_prefixes.push_back(prefixes[i] + new_prefixes.push_back(sel_group.children->at(j).to_string(prefixes[i]));
' ' + // new_prefixes.push_back(prefixes[i] +
string(sel_group.children->at(j))); // ' ' +
// string(sel_group.children->at(j)));
} }
} }
} }
...@@ -143,7 +144,7 @@ namespace Sass { ...@@ -143,7 +144,7 @@ namespace Sass {
break; break;
case values: case values:
for (int i = 0; i < children->size(); ++i) { for (int i = 0; i < children->size(); ++i) {
buf << " " << string((*children)[i].token); buf << " " << string(children->at(i).token);
} }
break; break;
case comment: case comment:
......
...@@ -136,17 +136,19 @@ namespace Sass { ...@@ -136,17 +136,19 @@ namespace Sass {
return *this; return *this;
} }
operator string() { string to_string(const string& prefix)
{
if (type == selector) { if (type == selector) {
string result; string result;
if (!has_backref && !prefix.empty()) result += prefix + ' ';
if (children->at(0).type == selector_combinator) { if (children->at(0).type == selector_combinator) {
result += string(children->at(0).token) + ' '; result += string(children->at(0).token) + ' ';
} }
else { else {
result += string(children->at(0)); result += children->at(0).to_string(prefix);
} }
for (int i = 1; i < children->size(); ++i) { for (int i = 1; i < children->size(); ++i) {
result += string(children->at(i)); result += children->at(i).to_string(prefix);
} }
return result; return result;
} }
...@@ -157,31 +159,80 @@ namespace Sass { ...@@ -157,31 +159,80 @@ namespace Sass {
else if (type == simple_selector_sequence) { else if (type == simple_selector_sequence) {
string result; string result;
for (int i = 0; i < children->size(); ++i) { for (int i = 0; i < children->size(); ++i) {
result += string(children->at(i)); result += children->at(i).to_string(prefix);
} }
return result; return result;
} }
else if (type == functional_pseudo) { else if (type == functional_pseudo) {
string result(string(children->at(0))); string result(children->at(0).to_string(prefix));
for (int i = 1; i < children->size(); ++i) { for (int i = 1; i < children->size(); ++i) {
result += string(children->at(i)); result += children->at(i).to_string(prefix);
} }
result += ')'; result += ')';
return result; return result;
} }
else if (type == attribute_selector) { else if (type == attribute_selector) {
string result("["); string result("[");
result += string(children->at(0)); result += children->at(0).to_string(prefix);
result += string(children->at(1)); result += children->at(1).to_string(prefix);
result += string(children->at(2)); result += children->at(2).to_string(prefix);
result += ']'; result += ']';
return result; return result;
} }
else if (type == backref) {
return prefix;
}
else { else {
return string(token); return string(token);
} }
} }
// operator string() {
// if (type == selector) {
// string result;
// if (children->at(0).type == selector_combinator) {
// result += string(children->at(0).token) + ' ';
// }
// else {
// result += string(children->at(0));
// }
// for (int i = 1; i < children->size(); ++i) {
// result += string(children->at(i));
// }
// return result;
// }
// else if (type == selector_combinator) {
// if (std::isspace(token.begin[0])) return string(" ");
// else return string(" ") += string(token) += string(" ");
// }
// else if (type == simple_selector_sequence) {
// string result;
// for (int i = 0; i < children->size(); ++i) {
// result += string(children->at(i));
// }
// return result;
// }
// else if (type == functional_pseudo) {
// string result(string(children->at(0)));
// for (int i = 1; i < children->size(); ++i) {
// result += string(children->at(i));
// }
// result += ')';
// return result;
// }
// else if (type == attribute_selector) {
// string result("[");
// result += string(children->at(0));
// result += string(children->at(1));
// result += string(children->at(2));
// result += ']';
// return result;
// }
// else {
// return string(token);
// }
// }
void release() const { children = 0; } void release() const { children = 0; }
void echo(stringstream& buf, size_t depth = 0); void echo(stringstream& buf, size_t depth = 0);
......
hey, ho {
& > boo, foo &.goo {
bloo: bloo;
}
blah: blah;
}
\ No newline at end of file
hey, ho {
blah: blah; }
hey > boo, foo hey.goo, ho > boo, foo ho.goo {
bloo: bloo; }
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