checkpoint media blocks

This commit is contained in:
jtm
2012-03-07 19:15:54 +00:00
parent 268857c93e
commit 75f323c09b
5 changed files with 89 additions and 17 deletions

View File

@@ -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):

View File

@@ -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

View File

@@ -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;
}
}

11
lesscpy/test/css/media.min.css vendored Normal file
View File

@@ -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;}
}

View File

@@ -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()