Skip to content

Commit bc59b31

Browse files
author
Aaron Leung
committed
Got mixin content working.
1 parent 2b81527 commit bc59b31

File tree

2 files changed

+48
-47
lines changed

2 files changed

+48
-47
lines changed

eval_apply.cpp

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace Sass {
3131
{
3232
case Node::root: {
3333
for (size_t i = 0, S = expr.size(); i < S; ++i) {
34-
expand(expr[i], prefix, env, f_env, new_Node, ctx, bt);
34+
expand(expr[i], prefix, env, f_env, new_Node, ctx, bt, false, content);
3535
}
3636
} break;
3737

@@ -47,7 +47,7 @@ namespace Sass {
4747
Token name(expr[0].token());
4848
Node args(expr[1]);
4949
Node this_content = expr.size() == 3 ? expr[2] : Node();
50-
if (!this_content.is_null()) expand(this_content, prefix, env, f_env, new_Node, ctx, bt);
50+
if (!this_content.is_null()) expand(this_content, prefix, env, f_env, new_Node, ctx, bt, false, content);
5151
if (!env.query(name)) throw_eval_error(bt, "mixin " + name.to_string() + " is undefined", expr.path(), expr.line());
5252
Node mixin(env[name]);
5353
Backtrace here(&bt, expr.path(), expr.line(), ", in mixin '" + name.to_string() + "'");
@@ -57,14 +57,15 @@ namespace Sass {
5757
} break;
5858

5959
case Node::mixin_content: {
60-
cerr << "HEY" << endl;
6160
expr += content;
62-
cerr << "HO" << endl;
61+
for (size_t i = 0, S = expr.size(); i < S; ++i) {
62+
re_expand(expr[i], prefix, env, f_env, new_Node, ctx, bt, false, content);
63+
}
6364
} break;
6465

6566
case Node::propset: {
6667
// TO DO: perform the property expansion here, rather than in the emitter (also requires the parser to allow interpolants in the property names)
67-
expand(expr[1], prefix, env, f_env, new_Node, ctx, bt);
68+
expand(expr[1], prefix, env, f_env, new_Node, ctx, bt, false, content);
6869
} break;
6970

7071
case Node::ruleset: {
@@ -90,54 +91,22 @@ namespace Sass {
9091
expr[0] = needs_reparsing.parse_selector_group();
9192
}
9293

93-
// expand the selector with the prefix and save it in expr[2]
94+
// Expand the selector with the prefix and save it in expr[2].
9495
expr << expand_selector(expr[0], prefix, new_Node);
9596

96-
// // gather selector extensions into a pending queue
97-
// if (ctx.has_extensions) {
98-
// // check single selector
99-
// if (expr.back().type() != Node::selector_group) {
100-
// Node sel(selector_base(expr.back()));
101-
// if (ctx.extensions.count(sel)) {
102-
// for (multimap<Node, Node>::iterator i = ctx.extensions.lower_bound(sel); i != ctx.extensions.upper_bound(sel); ++i) {
103-
// ctx.pending_extensions.push_back(pair<Node, Node>(expr, i->second));
104-
// }
105-
// }
106-
// }
107-
// // individually check each selector in a group
108-
// else {
109-
// Node group(expr.back());
110-
// for (size_t i = 0, S = group.size(); i < S; ++i) {
111-
// Node sel(selector_base(group[i]));
112-
// if (ctx.extensions.count(sel)) {
113-
// for (multimap<Node, Node>::iterator j = ctx.extensions.lower_bound(sel); j != ctx.extensions.upper_bound(sel); ++j) {
114-
// ctx.pending_extensions.push_back(pair<Node, Node>(expr, j->second));
115-
// }
116-
// }
117-
// }
118-
// }
119-
// }
120-
121-
// expand the body with the newly expanded selector as the prefix
122-
// cerr << "ORIGINAL SELECTOR:\t" << expr[2].to_string() << endl;
123-
// cerr << "NORMALIZED SELECTOR:\t" << normalize_selector(expr[2], new_Node).to_string() << endl << endl;
124-
expand(expr[1], expr.back(), env, f_env, new_Node, ctx, bt);
97+
expand(expr[1], expr.back(), env, f_env, new_Node, ctx, bt, false, content);
12598
} break;
12699

127100
case Node::media_query: {
128-
// Node block(expr[1]);
129-
// Node new_ruleset(new_Node(Node::ruleset, expr.path(), expr.line(), 3));
130-
// expr[1] = new_ruleset << prefix << block << prefix;
131-
// expand(expr[1], new_Node(Node::none, expr.path(), expr.line(), 0), env, f_env, new_Node, ctx, bt);
132-
expand(expr[1], prefix, env, f_env, new_Node, ctx, bt);
101+
expand(expr[1], prefix, env, f_env, new_Node, ctx, bt, false, content);
133102
expr << prefix;
134103
} break;
135104

136105
case Node::block: {
137106
Environment new_frame;
138107
new_frame.link(env);
139108
for (size_t i = 0, S = expr.size(); i < S; ++i) {
140-
expand(expr[i], prefix, new_frame, f_env, new_Node, ctx, bt);
109+
expand(expr[i], prefix, new_frame, f_env, new_Node, ctx, bt, false, content);
141110
}
142111
} break;
143112

@@ -241,12 +210,12 @@ namespace Sass {
241210
if (expr[i].type() != Node::block) {
242211
Node predicate_val(eval(expr[i], prefix, env, f_env, new_Node, ctx, bt));
243212
if (!predicate_val.is_false()) {
244-
expand(expansion = expr[i+1], prefix, env, f_env, new_Node, ctx, bt);
213+
expand(expansion = expr[i+1], prefix, env, f_env, new_Node, ctx, bt, false, content);
245214
break;
246215
}
247216
}
248217
else {
249-
expand(expansion = expr[i], prefix, env, f_env, new_Node, ctx, bt);
218+
expand(expansion = expr[i], prefix, env, f_env, new_Node, ctx, bt, false, content);
250219
break;
251220
}
252221
}
@@ -274,7 +243,7 @@ namespace Sass {
274243
Node i_node(new_Node(expr.path(), expr.line(), i));
275244
Node fake_arg(new_Node(Node::arguments, expr.path(), expr.line(), 1));
276245
fake_arg << i_node;
277-
expr += apply_mixin(fake_mixin, fake_arg, Node(), prefix, env, f_env, new_Node, ctx, bt, true);
246+
expr += apply_mixin(fake_mixin, fake_arg, content, prefix, env, f_env, new_Node, ctx, bt, true);
278247
}
279248
} break;
280249

@@ -294,7 +263,7 @@ namespace Sass {
294263
Node fake_arg(new_Node(Node::arguments, expr.path(), expr.line(), 1));
295264
list[i].should_eval() = true;
296265
fake_arg << eval(list[i], prefix, env, f_env, new_Node, ctx, bt);
297-
expr += apply_mixin(fake_mixin, fake_arg, Node(), prefix, env, f_env, new_Node, ctx, bt, true);
266+
expr += apply_mixin(fake_mixin, fake_arg, content, prefix, env, f_env, new_Node, ctx, bt, true);
298267
}
299268
} break;
300269

@@ -310,14 +279,14 @@ namespace Sass {
310279
expr.pop_back();
311280
Node ev_pred(eval(pred, prefix, env, f_env, new_Node, ctx, bt));
312281
while (!ev_pred.is_false()) {
313-
expr += apply_mixin(fake_mixin, fake_arg, Node(), prefix, env, f_env, new_Node, ctx, bt, true);
282+
expr += apply_mixin(fake_mixin, fake_arg, content, prefix, env, f_env, new_Node, ctx, bt, true);
314283
ev_pred = eval(pred, prefix, env, f_env, new_Node, ctx, bt);
315284
}
316285
} break;
317286

318287
case Node::block_directive: {
319288
// TO DO: eval the directive name for interpolants
320-
expand(expr[1], new_Node(Node::none, expr.path(), expr.line(), 0), env, f_env, new_Node, ctx, bt);
289+
expand(expr[1], new_Node(Node::none, expr.path(), expr.line(), 0), env, f_env, new_Node, ctx, bt, false, content);
321290
} break;
322291

323292
case Node::warning: {
@@ -342,6 +311,37 @@ namespace Sass {
342311
}
343312
}
344313

314+
void re_expand(Node expr, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool function_name, const Node content)
315+
{
316+
switch (expr.type())
317+
{
318+
case Node::ruleset: {
319+
expr[2] = expand_selector(expr[0], prefix, new_Node);
320+
re_expand(expr[1], expr[2], env, f_env, new_Node, ctx, bt, false, content);
321+
} break;
322+
323+
case Node::block: {
324+
for (size_t i = 0, S = expr.size(); i < S; ++i) {
325+
re_expand(expr[i], prefix, env, f_env, new_Node, ctx, bt, false, content);
326+
}
327+
} break;
328+
329+
case Node::media_query: {
330+
expr[2] = prefix;
331+
re_expand(expr[1], prefix, env, f_env, new_Node, ctx, bt, false, content);
332+
} break;
333+
334+
case Node::block_directive: {
335+
re_expand(expr[1], prefix, env, f_env, new_Node, ctx, bt, false, content);
336+
} break;
337+
338+
default: {
339+
return;
340+
} break;
341+
}
342+
return;
343+
}
344+
345345
void expand_list(Node list, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt)
346346
{
347347
for (size_t i = 0, S = list.size(); i < S; ++i) {

eval_apply.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace Sass {
1818
using std::map;
1919

2020
void expand(Node expr, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool function_name = false, const Node content = Node());
21+
void re_expand(Node expr, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool function_name, const Node content);
2122
Node eval(Node expr, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool function_name = false);
2223
Node eval_arguments(Node args, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt);
2324
Node eval_function(string name, Node stm, Environment& bindings, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool toplevel = false);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy