diff options
author | Eevee (Alex Munroe) <eevee.git@veekun.com> | 2013-08-30 12:33:47 -0700 |
---|---|---|
committer | Eevee (Alex Munroe) <eevee.git@veekun.com> | 2013-08-30 12:33:47 -0700 |
commit | 1f20820e543c851eb620f12aaa461173f6587fbb (patch) | |
tree | 16597890f582b23aa2b1fc6a61224f62ceb5be74 | |
parent | 0c1563329ef88c3b8e5050dd87140002c1624923 (diff) | |
download | pyscss-1f20820e543c851eb620f12aaa461173f6587fbb.tar.gz |
Split up _nest_rules; fix interpolation in @media/@keyframes/etc.
-rw-r--r-- | scss/__init__.py | 74 | ||||
-rw-r--r-- | scss/tests/files/bugs/at-rules-interpolation.css | 13 | ||||
-rw-r--r-- | scss/tests/files/bugs/at-rules-interpolation.scss | 23 |
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); + } +} |