summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEevee (Alex Munroe) <eevee.git@veekun.com>2013-08-30 12:33:47 -0700
committerEevee (Alex Munroe) <eevee.git@veekun.com>2013-08-30 12:33:47 -0700
commit1f20820e543c851eb620f12aaa461173f6587fbb (patch)
tree16597890f582b23aa2b1fc6a61224f62ceb5be74
parent0c1563329ef88c3b8e5050dd87140002c1624923 (diff)
downloadpyscss-1f20820e543c851eb620f12aaa461173f6587fbb.tar.gz
Split up _nest_rules; fix interpolation in @media/@keyframes/etc.
-rw-r--r--scss/__init__.py74
-rw-r--r--scss/tests/files/bugs/at-rules-interpolation.css13
-rw-r--r--scss/tests/files/bugs/at-rules-interpolation.scss23
3 files changed, 77 insertions, 33 deletions
diff --git a/scss/__init__.py b/scss/__init__.py
index 0384ee5..685057f 100644
--- a/scss/__init__.py
+++ b/scss/__init__.py
@@ -590,7 +590,7 @@ class Scss(object):
elif block.unparsed_contents is None:
rule.properties.append((block.prop, None))
elif scope is None: # needs to have no scope to crawl down the nested rules
- self._nest_rules(rule, p_children, scope, block)
+ self._nest_at_rules(rule, p_children, scope, block)
####################################################################
# Properties
elif block.unparsed_contents is None:
@@ -1207,47 +1207,55 @@ class Scss(object):
rule.properties.append((_prop, value))
@print_timing(10)
- def _nest_rules(self, rule, p_children, scope, block):
+ def _nest_at_rules(self, rule, p_children, scope, block):
"""
- Implements Nested CSS rules
+ Implements @-blocks
"""
- if block.is_atrule:
- new_ancestry = list(rule.ancestry)
- if block.directive == '@media' and rule.ancestry:
- for i, header in reversed(list(enumerate(new_ancestry))):
- if header.is_selector:
- continue
- elif header.directive == '@media':
- from scss.rule import BlockAtRuleHeader
- new_ancestry[i] = BlockAtRuleHeader(
- '@media',
- "%s and %s" % (header.argument, block.argument))
- break
- else:
- new_ancestry.insert(i, block.header)
+ # Interpolate the current block
+ # TODO this seems like it should be done in the block header. and more
+ # generally?
+ calculator = Calculator(rule.namespace)
+ block.header.argument = calculator.apply_vars(block.header.argument)
+
+ new_ancestry = list(rule.ancestry)
+ if block.directive == '@media' and rule.ancestry:
+ for i, header in reversed(list(enumerate(new_ancestry))):
+ if header.is_selector:
+ continue
+ elif header.directive == '@media':
+ from scss.rule import BlockAtRuleHeader
+ new_ancestry[i] = BlockAtRuleHeader(
+ '@media',
+ "%s and %s" % (header.argument, block.argument))
+ break
else:
- new_ancestry.insert(0, block.header)
+ new_ancestry.insert(i, block.header)
else:
- new_ancestry.append(block.header)
-
- new_rule = SassRule(
- source_file=rule.source_file,
- lineno=block.lineno,
- unparsed_contents=block.unparsed_contents,
+ new_ancestry.insert(0, block.header)
+ else:
+ new_ancestry.append(block.header)
- #dependent_rules
- options=rule.options.copy(),
- #properties
- #extends_selectors
- ancestry=new_ancestry,
+ new_rule = SassRule(
+ source_file=rule.source_file,
+ lineno=block.lineno,
+ unparsed_contents=block.unparsed_contents,
- namespace=rule.namespace.derive(),
- )
+ #dependent_rules
+ options=rule.options.copy(),
+ #properties
+ #extends_selectors
+ ancestry=new_ancestry,
- p_children.appendleft(new_rule)
+ namespace=rule.namespace.derive(),
+ )
- return
+ p_children.appendleft(new_rule)
+ @print_timing(10)
+ def _nest_rules(self, rule, p_children, scope, block):
+ """
+ Implements Nested CSS rules
+ """
calculator = Calculator(rule.namespace)
raw_selectors = calculator.apply_vars(block.prop)
c_selectors, c_parents = self.parse_selectors(raw_selectors)
diff --git a/scss/tests/files/bugs/at-rules-interpolation.css b/scss/tests/files/bugs/at-rules-interpolation.css
new file mode 100644
index 0000000..4c3b513
--- /dev/null
+++ b/scss/tests/files/bugs/at-rules-interpolation.css
@@ -0,0 +1,13 @@
+@media (max-width: 900px) {
+ div {
+ color: red;
+ }
+}
+@keyframes spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(-359deg);
+ }
+}
diff --git a/scss/tests/files/bugs/at-rules-interpolation.scss b/scss/tests/files/bugs/at-rules-interpolation.scss
new file mode 100644
index 0000000..6cf78ef
--- /dev/null
+++ b/scss/tests/files/bugs/at-rules-interpolation.scss
@@ -0,0 +1,23 @@
+$width: 900px;
+
+@media (max-width: $width) {
+ div {
+ color: red;
+ }
+}
+
+
+@mixin keyframes($name) {
+ @keyframes #{$name} {
+ @content;
+ }
+}
+
+@include keyframes(spin) {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(-359deg);
+ }
+}