From 75f323c09b80b8ec24ad90e5533a25d67d78bad6 Mon Sep 17 00:00:00 2001 From: jtm Date: Wed, 7 Mar 2012 19:15:54 +0000 Subject: [PATCH] checkpoint media blocks --- lesscpy/plib/block.py | 17 ++++++++++++++--- lesscpy/plib/identifier.py | 33 +++++++++++++++++++-------------- lesscpy/test/css/media.css | 31 +++++++++++++++++++++++++++++++ lesscpy/test/css/media.min.css | 11 +++++++++++ lesscpy/test/testidentifier.py | 14 ++++++++++++++ 5 files changed, 89 insertions(+), 17 deletions(-) create mode 100644 lesscpy/test/css/media.css create mode 100644 lesscpy/test/css/media.min.css diff --git a/lesscpy/plib/block.py b/lesscpy/plib/block.py index 56c8273..404bc05 100644 --- a/lesscpy/plib/block.py +++ b/lesscpy/plib/block.py @@ -30,17 +30,28 @@ class Block(Node): def fmt(self, fills): """ """ + f = "%(identifier)s%(ws)s{%(nl)s%(proplist)s}%(eb)s" out = [] + name = self.name.fmt(fills) if self.parsed: - f = "%(identifier)s%(ws)s{%(nl)s%(proplist)s}%(eb)s" - name = self.name.fmt(fills) fills.update({ 'identifier': name, 'proplist': ''.join([p.fmt(fills) for p in self.parsed]), }) out.append(f % fills) if self.inner: - out.append(''.join([p.fmt(fills) for p in self.inner])) + if name.startswith('@media'): + inner = ''.join([p.fmt(fills) for p in self.inner]) + inner = inner.replace(fills['nl'], + fills['nl'] + fills['tab']).rstrip(fills['tab']) + fills.update({ + 'identifier': name, + 'proplist': fills['tab'] + inner, + }) + out.append(f % fills) + else: + out.append(''.join([p.fmt(fills) for p in self.inner])) + return ''.join(out) def copy(self, scope): diff --git a/lesscpy/plib/identifier.py b/lesscpy/plib/identifier.py index d9dbfdb..a456e4b 100644 --- a/lesscpy/plib/identifier.py +++ b/lesscpy/plib/identifier.py @@ -7,20 +7,23 @@ class Identifier(Node): def parse(self, scope): """ """ - names = [] - name = [] - for n in utility.flatten(self.tokens): - if n == '*': - name.append('* ') - elif n in '>+~': - if name and name[-1] == ' ': - name.pop() - name.append('?%s?' % n) - elif n == ',': - names.append(name) - name = [] - else: - name.append(n) + names = [] + name = [] + if self.tokens and self.tokens[0] == '@media': + name = list(utility.flatten(self.tokens)) + else: + for n in utility.flatten(self.tokens): + if n == '*': + name.append('* ') + elif n in '>+~': + if name and name[-1] == ' ': + name.pop() + name.append('?%s?' % n) + elif n == ',': + names.append(name) + name = [] + else: + name.append(n) names.append(name) parsed = self.root(scope, names) if scope else names self.parsed = [[i for i, j in utility.pairwise(part) @@ -35,6 +38,8 @@ class Identifier(Node): if parent: parent = parent[-1] return [self._pscn(part, n) + if part[0] != '@media' + else n for part in parent.parsed for n in names] return names diff --git a/lesscpy/test/css/media.css b/lesscpy/test/css/media.css new file mode 100644 index 0000000..9682bda --- /dev/null +++ b/lesscpy/test/css/media.css @@ -0,0 +1,31 @@ +@media screen,projection { + html { + background: #fffef0; + color: #330000; + } + body { + max-width: 35em; + margin: 0 auto; + } +} +@media print { + .class { + color: blue; + } + .class .sub { + width: 42; + } + .top, header > h1 { + color: #444444; + } +} +@media screen { + body { + max-width: 480; + } +} +@media all and (orientation:portrait) { + aside { + float: none; + } +} diff --git a/lesscpy/test/css/media.min.css b/lesscpy/test/css/media.min.css new file mode 100644 index 0000000..f7c9a83 --- /dev/null +++ b/lesscpy/test/css/media.min.css @@ -0,0 +1,11 @@ +@media screen,projection{html{background:#fffef0;color:#330000;} +body{max-width:35em;margin:0 auto;} +} +@media print{.class{color:blue;} +.class .sub{width:42;} +.top,header>h1{color:#444444;} +} +@media screen{body{max-width:480;} +} +@media all and (orientation:portrait){aside{float:none;} +} diff --git a/lesscpy/test/testidentifier.py b/lesscpy/test/testidentifier.py index 106da09..b95d6ca 100644 --- a/lesscpy/test/testidentifier.py +++ b/lesscpy/test/testidentifier.py @@ -82,6 +82,20 @@ class TestIdentifier(unittest.TestCase): self.assertEqual(id.raw(), '.a% %.next% %.c% %.deep%.a%' ' %.next% %.d% %.deep%.b% %.next%' ' %.c% %.deep%.b% %.next% %.d% %.deep') + + def test_media(self): + fl = {'ws': ' '} + sc = Scope() + sc.push() + sc.current = Identifier(['@media', ' ', 'screen', ',', 'projection'], 0).parse(sc) + self.assertEqual(sc.current.fmt(fl), '@media screen,projection') + for i in [ + (['html'], 'html'), + ]: + t, r = i + id = Identifier(t, 0) + self.assertEqual(id.parse(sc).fmt(fl), r, i) + if __name__ == '__main__': unittest.main()