summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEevee (Lexy Munroe) <eevee.git@veekun.com>2016-06-08 17:59:57 -0700
committerEevee (Lexy Munroe) <eevee.git@veekun.com>2016-06-08 17:59:57 -0700
commitefcbde372e9d6ddfd429a463f31cf6f37fa22d9a (patch)
treea5b953a9a41775436c2d8e340a61c197b2f8584d
parent791b05d7727006cd5a1e23a87a335b342c68540a (diff)
downloadpyscss-efcbde372e9d6ddfd429a463f31cf6f37fa22d9a.tar.gz
Support trailing combinators in selectors. Fixes #351
-rw-r--r--scss/selector.py24
-rw-r--r--scss/tests/files/bugs/trailing-combinators.css11
-rw-r--r--scss/tests/files/bugs/trailing-combinators.scss18
3 files changed, 48 insertions, 5 deletions
diff --git a/scss/selector.py b/scss/selector.py
index e1f8994..8a6ecdf 100644
--- a/scss/selector.py
+++ b/scss/selector.py
@@ -91,6 +91,15 @@ class SimpleSelector(object):
For lack of a better name, each of the individual parts is merely called a
"token".
+
+ Note that it's possible to have zero tokens. This isn't legal CSS, but
+ it's perfectly legal Sass, since you might nest blocks like so:
+
+ body > {
+ div {
+ ...
+ }
+ }
"""
def __init__(self, combinator, tokens):
self.combinator = combinator
@@ -250,10 +259,12 @@ class SimpleSelector(object):
def render(self):
# TODO fail if there are no tokens, or if one is a placeholder?
rendered = ''.join(self.tokens)
- if self.combinator != ' ':
- rendered = ' '.join((self.combinator, rendered))
-
- return rendered
+ if self.combinator == ' ':
+ return rendered
+ elif rendered:
+ return self.combinator + ' ' + rendered
+ else:
+ return self.combinator
class Selector(object):
@@ -287,6 +298,10 @@ class Selector(object):
def promote_selector():
promote_simple()
+ if pending['combinator'] != ' ':
+ pending['simples'].append(
+ SimpleSelector(pending['combinator'], []))
+ pending['combinator'] = ' '
if pending['simples']:
ret.append(cls(pending['simples']))
pending['simples'] = []
@@ -310,7 +325,6 @@ class Selector(object):
if token == ',':
# End current selector
- # TODO what about "+ ,"? what do i even do with that
promote_selector()
elif token in ' +>~':
# End current simple selector
diff --git a/scss/tests/files/bugs/trailing-combinators.css b/scss/tests/files/bugs/trailing-combinators.css
new file mode 100644
index 0000000..ee1ddda
--- /dev/null
+++ b/scss/tests/files/bugs/trailing-combinators.css
@@ -0,0 +1,11 @@
+div ~ p, div ~ blockquote {
+ background-color: blue;
+}
+
+div > p, div > blockquote {
+ background-color: blue;
+}
+
+div + p, div + blockquote {
+ background-color: blue;
+}
diff --git a/scss/tests/files/bugs/trailing-combinators.scss b/scss/tests/files/bugs/trailing-combinators.scss
new file mode 100644
index 0000000..1e0b0d9
--- /dev/null
+++ b/scss/tests/files/bugs/trailing-combinators.scss
@@ -0,0 +1,18 @@
+div ~ {
+ p,
+ blockquote {
+ background-color: blue;
+ }
+}
+div > {
+ p,
+ blockquote {
+ background-color: blue;
+ }
+}
+div + {
+ p,
+ blockquote {
+ background-color: blue;
+ }
+}