checkpoint
This commit is contained in:
@@ -31,7 +31,7 @@ class Formatter(object):
|
||||
'ws': ' ',
|
||||
'eb': eb
|
||||
})
|
||||
self.out = [u.format(self.items)
|
||||
self.out = [u.fmt(self.items)
|
||||
for u in parse.result
|
||||
if u]
|
||||
return ''.join(self.out).strip()
|
||||
|
||||
@@ -127,7 +127,7 @@ class LessLexer:
|
||||
(r'data:[^\)]+'
|
||||
'|(([a-z]+://)?'
|
||||
'('
|
||||
'([\.\w:]+[\\/])+'
|
||||
'([\.\w:]+[\\/][\\/]?)+'
|
||||
'|([a-z][\w\.\-]+(\.[a-z0-9]+))'
|
||||
'(\#[a-z]+)?)'
|
||||
')+')
|
||||
|
||||
@@ -532,7 +532,7 @@ class LessParser(object):
|
||||
def p_interpolated_str(self, p):
|
||||
""" istring : less_string
|
||||
"""
|
||||
p[0] = String(p)
|
||||
p[0] = String(p[1], p.lineno(1))
|
||||
|
||||
def p_variable_neg(self, p):
|
||||
""" variable : '-' variable
|
||||
|
||||
@@ -26,10 +26,11 @@ def pairwise(lst):
|
||||
(lst[0], lst[1]), (lst[1], lst[2]), ..., (lst[-1], None)
|
||||
"""
|
||||
if not lst: return
|
||||
for i in range(len(lst)-1):
|
||||
l = len(lst)
|
||||
for i in range(l-1):
|
||||
yield lst[i], lst[i+1]
|
||||
yield lst[-1], None
|
||||
|
||||
|
||||
def rename(ll, fr, scope):
|
||||
""" Rename all sub-blocks moved under another
|
||||
block. (mixins)
|
||||
@@ -116,7 +117,7 @@ def is_variable(v):
|
||||
return False
|
||||
|
||||
def is_int(v):
|
||||
"""
|
||||
""" Is value integer
|
||||
"""
|
||||
try:
|
||||
int(str(v))
|
||||
@@ -126,7 +127,7 @@ def is_int(v):
|
||||
return False
|
||||
|
||||
def is_float(v):
|
||||
"""
|
||||
""" Is value float
|
||||
"""
|
||||
if not is_int(v):
|
||||
try:
|
||||
@@ -137,7 +138,7 @@ def is_float(v):
|
||||
return False
|
||||
|
||||
def split_unit(v):
|
||||
"""
|
||||
""" Split a number from its unit
|
||||
"""
|
||||
r = re.search('^(\-?[\d\.]+)(.*)$', str(v))
|
||||
return r.groups() if r else ('','')
|
||||
|
||||
@@ -27,20 +27,20 @@ class Block(Node):
|
||||
def raw(self):
|
||||
return self.name.raw()
|
||||
|
||||
def format(self, fills):
|
||||
def fmt(self, fills):
|
||||
"""
|
||||
"""
|
||||
out = []
|
||||
if self.parsed:
|
||||
f = "%(identifier)s%(ws)s{%(nl)s%(proplist)s}%(eb)s"
|
||||
name = self.name.format(fills)
|
||||
name = self.name.fmt(fills)
|
||||
fills.update({
|
||||
'identifier': name,
|
||||
'proplist': ''.join([p.format(fills) for p in self.parsed]),
|
||||
'proplist': ''.join([p.fmt(fills) for p in self.parsed]),
|
||||
})
|
||||
out.append(f % fills)
|
||||
if self.inner:
|
||||
out.append(''.join([p.format(fills) for p in self.inner]))
|
||||
out.append(''.join([p.fmt(fills) for p in self.inner]))
|
||||
return ''.join(out)
|
||||
|
||||
def copy(self, scope):
|
||||
|
||||
@@ -64,7 +64,7 @@ class Identifier(Node):
|
||||
return '%'.join('%'.join(p) for p in self.parsed).strip().strip('%')
|
||||
|
||||
|
||||
def format(self, fills):
|
||||
def fmt(self, fills):
|
||||
"""
|
||||
"""
|
||||
name = ',$$'.join(''.join(p).strip()
|
||||
|
||||
@@ -36,5 +36,5 @@ class Node(object):
|
||||
else t
|
||||
for t in tokens]
|
||||
|
||||
def format(self, fills):
|
||||
def fmt(self, fills):
|
||||
raise ValueError('No defined format')
|
||||
|
||||
@@ -37,7 +37,7 @@ class Property(Node):
|
||||
for u in style]
|
||||
return style
|
||||
|
||||
def format(self, fills):
|
||||
def fmt(self, fills):
|
||||
"""
|
||||
"""
|
||||
f = "%(tab)s%(property)s:%(ws)s%(style)s%(important)s;%(nl)s"
|
||||
@@ -47,8 +47,9 @@ class Property(Node):
|
||||
if p == ','
|
||||
else p
|
||||
for p in self.parsed]
|
||||
style = ''.join([p.format(fills)
|
||||
if hasattr(p, 'format')
|
||||
|
||||
style = ''.join([p.fmt(fills)
|
||||
if hasattr(p, 'fmt')
|
||||
else str(p)
|
||||
for p in self.parsed])
|
||||
fills.update({
|
||||
|
||||
@@ -13,7 +13,7 @@ class Statement(Node):
|
||||
# Media @import
|
||||
self.parsed.insert(3, ' ')
|
||||
|
||||
def format(self, fills):
|
||||
def fmt(self, fills):
|
||||
"""
|
||||
"""
|
||||
return ''.join(self.parsed) + fills['eb']
|
||||
@@ -1,5 +1,21 @@
|
||||
"""
|
||||
"""
|
||||
import re
|
||||
from .node import Node
|
||||
from lesscpy.lessc import utility
|
||||
|
||||
class String(Node):
|
||||
pass
|
||||
def parse(self, scope):
|
||||
"""
|
||||
"""
|
||||
self.scope = scope
|
||||
return re.sub(r'@\{([^\}]+)\}', lambda m: self.swap(m.group(1)), self.tokens)
|
||||
|
||||
def swap(self, var):
|
||||
""" Replace variable
|
||||
@param string: var
|
||||
@return: string
|
||||
"""
|
||||
var = '@' + var
|
||||
var = ''.join(utility.flatten(self.scope.swap(var)))
|
||||
return var.strip("\"'")
|
||||
@@ -17,4 +17,6 @@
|
||||
background-image: url(https://some.server.com:9696/path/img.jpeg);
|
||||
behavior: url(border-radius.htc);
|
||||
background-image: url(fonts.svg#MyGeometricModern);
|
||||
image: url(http://), "}", url("http://}");
|
||||
image: url(http://tooks.com);
|
||||
}
|
||||
|
||||
2
lesscpy/test/css/properties-uri.min.css
vendored
2
lesscpy/test/css/properties-uri.min.css
vendored
@@ -3,4 +3,4 @@
|
||||
k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U
|
||||
kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);background-image:url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);}
|
||||
#svg-data-uri{background:transparent url('data:image/svg+xml, <svg version="1.1"><g></g></svg>');}
|
||||
.uri_test{background-image:url(images/image.jpg);background-image:url(../some/path);background-image:url(./../some/path);background-image:url(./images/image.jpg);background-image:url(http://some/path/img.jpeg);background-image:url(https://some.server.com:9696/path/img.jpeg);behavior:url(border-radius.htc);background-image:url(fonts.svg#MyGeometricModern);}
|
||||
.uri_test{background-image:url(images/image.jpg);background-image:url(../some/path);background-image:url(./../some/path);background-image:url(./images/image.jpg);background-image:url(http://some/path/img.jpeg);background-image:url(https://some.server.com:9696/path/img.jpeg);behavior:url(border-radius.htc);background-image:url(fonts.svg#MyGeometricModern);image:url(http://),"}",url("http://}");image:url(http://tooks.com);}
|
||||
|
||||
11
lesscpy/test/css/properties-vendor.css
Normal file
11
lesscpy/test/css/properties-vendor.css
Normal file
@@ -0,0 +1,11 @@
|
||||
div.vendor {
|
||||
-moz-transform: translate(0,11em)rotate(-90deg);
|
||||
-webkit-animation: anim2 7s infinite ease-in-out;
|
||||
}
|
||||
div.long {
|
||||
-moz-box-shadow: 0pt 0pt 2px rgba(255,255,255,0.4)inset, 0pt 4px 6px rgba(255,255,255,0.4)inset;
|
||||
}
|
||||
div.styles {
|
||||
display: -moz-inline-stack;
|
||||
background: -webkit-gradient(linear,left top,left bottom,from(red),to(blue));
|
||||
}
|
||||
3
lesscpy/test/css/properties-vendor.min.css
vendored
Normal file
3
lesscpy/test/css/properties-vendor.min.css
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
div.vendor{-moz-transform:translate(0,11em)rotate(-90deg);-webkit-animation:anim2 7s infinite ease-in-out;}
|
||||
div.long{-moz-box-shadow:0pt 0pt 2px rgba(255,255,255,0.4)inset,0pt 4px 6px rgba(255,255,255,0.4)inset;}
|
||||
div.styles{display:-moz-inline-stack;background:-webkit-gradient(linear,left top,left bottom,from(red),to(blue));}
|
||||
46
lesscpy/test/css/properties.css
Normal file
46
lesscpy/test/css/properties.css
Normal file
@@ -0,0 +1,46 @@
|
||||
div.properties {
|
||||
color: red;
|
||||
}
|
||||
div.empty {
|
||||
margin: ;
|
||||
}
|
||||
div.important {
|
||||
color: red !important;
|
||||
width: 100% !important;
|
||||
height: 20px !important;
|
||||
}
|
||||
div.annoying_font_property {
|
||||
font: 12px/16px Arial;
|
||||
font: 100%/16px Arial;
|
||||
font: normal small/20px 'Trebuchet MS', Verdana, sans-serif;
|
||||
}
|
||||
div.shorthands {
|
||||
border: 1px solid #000000;
|
||||
margin: 1px 0;
|
||||
padding: 0 auto;
|
||||
padding: 1px 0 2px 0;
|
||||
margin: 0;
|
||||
padding: -1px -0 -2px -0;
|
||||
}
|
||||
table {
|
||||
counter-reset: group;
|
||||
}
|
||||
tbody {
|
||||
counter-increment: group;
|
||||
counter-reset: row;
|
||||
}
|
||||
tbody tr {
|
||||
counter-increment: row;
|
||||
}
|
||||
tbody td:first-child:before {
|
||||
content: counter(group,upper-latin)"."counter(row);
|
||||
}
|
||||
.escape\|random\|char {
|
||||
color: red;
|
||||
}
|
||||
.mixin\!tUp {
|
||||
font-weight: bold;
|
||||
}
|
||||
.trailingTest\+ {
|
||||
color: red;
|
||||
}
|
||||
12
lesscpy/test/css/properties.min.css
vendored
Normal file
12
lesscpy/test/css/properties.min.css
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
div.properties{color:red;}
|
||||
div.empty{margin:;}
|
||||
div.important{color:red !important;width:100% !important;height:20px !important;}
|
||||
div.annoying_font_property{font:12px/16px Arial;font:100%/16px Arial;font:normal small/20px 'Trebuchet MS',Verdana,sans-serif;}
|
||||
div.shorthands{border:1px solid #000000;margin:1px 0;padding:0 auto;padding:1px 0 2px 0;margin:0;padding:-1px -0 -2px -0;}
|
||||
table{counter-reset:group;}
|
||||
tbody{counter-increment:group;counter-reset:row;}
|
||||
tbody tr{counter-increment:row;}
|
||||
tbody td:first-child:before{content:counter(group,upper-latin)"."counter(row);}
|
||||
.escape\|random\|char{color:red;}
|
||||
.mixin\!tUp{font-weight:bold;}
|
||||
.trailingTest\+{color:red;}
|
||||
26
lesscpy/test/css/strings.css
Normal file
26
lesscpy/test/css/strings.css
Normal file
@@ -0,0 +1,26 @@
|
||||
#strings {
|
||||
quotes: "~""~";
|
||||
content: "#*%:&^,)!.(~*})";
|
||||
empty: "";
|
||||
brackets: "{""}";
|
||||
}
|
||||
#comments {
|
||||
content: "/* hello */ // not-so-secret";
|
||||
}
|
||||
#quotes {
|
||||
quotes: "'""'";
|
||||
quotes: '"''"';
|
||||
content: '""#!&""';
|
||||
empty: '';
|
||||
semi-colon: ';';
|
||||
}
|
||||
#escaped {
|
||||
filter: DX.Transform.MS.BS.filter(opacity=50);
|
||||
}
|
||||
#interpolation {
|
||||
url: "http://lesscss.org/dev/image.jpg";
|
||||
url2: "http://lesscss.org/image-256.jpg";
|
||||
url3: "http://lesscss.org#445566";
|
||||
url4: "http://lesscss.org/hello";
|
||||
url5: "http://lesscss.org/54.4px";
|
||||
}
|
||||
5
lesscpy/test/css/strings.min.css
vendored
Normal file
5
lesscpy/test/css/strings.min.css
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
#strings{quotes:"~""~";content:"#*%:&^,)!.(~*})";empty:"";brackets:"{""}";}
|
||||
#comments{content:"/* hello */ // not-so-secret";}
|
||||
#quotes{quotes:"'""'";quotes:'"''"';content:'""#!&""';empty:'';semi-colon:';';}
|
||||
#escaped{filter:DX.Transform.MS.BS.filter(opacity=50);}
|
||||
#interpolation{url:"http://lesscss.org/dev/image.jpg";url2:"http://lesscss.org/image-256.jpg";url3:"http://lesscss.org#445566";url4:"http://lesscss.org/hello";url5:"http://lesscss.org/54.4px";}
|
||||
@@ -20,4 +20,6 @@
|
||||
background-image: url(https://some.server.com:9696/path/img.jpeg);
|
||||
behavior:url(border-radius.htc);
|
||||
background-image: url(fonts.svg#MyGeometricModern);
|
||||
image: url(http://), "}", url("http://}");
|
||||
image: url(http://tooks.com);
|
||||
}
|
||||
12
lesscpy/test/less/properties-vendor.less
Normal file
12
lesscpy/test/less/properties-vendor.less
Normal file
@@ -0,0 +1,12 @@
|
||||
div.vendor {
|
||||
-moz-transform: translate(0, 11em) rotate(-90deg);
|
||||
-webkit-animation: anim2 7s infinite ease-in-out;
|
||||
}
|
||||
div.long {
|
||||
-moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset,
|
||||
0pt 4px 6px rgba(255, 255, 255, 0.4) inset;
|
||||
}
|
||||
div.styles {
|
||||
display: -moz-inline-stack;
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue));
|
||||
}
|
||||
@@ -23,6 +23,7 @@ div.shorthands {
|
||||
padding: 0 auto;
|
||||
padding: 1px 0 2px 0;
|
||||
margin: 0;
|
||||
padding: -1px -0 -2px -0;
|
||||
}
|
||||
/*
|
||||
|
||||
@@ -39,4 +40,16 @@ tbody tr {
|
||||
}
|
||||
tbody td:first-child:before {
|
||||
content: counter(group, upper-latin) "." counter(row);
|
||||
}
|
||||
/*
|
||||
Escapes
|
||||
*/
|
||||
.escape\|random\|char {
|
||||
color: red;
|
||||
}
|
||||
.mixin\!tUp {
|
||||
font-weight: bold;
|
||||
}
|
||||
.trailingTest\+ {
|
||||
color: red;
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
div.vendor {
|
||||
display: -moz-inline-stack;
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue));
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
#strings {
|
||||
quotes: "~" "~";
|
||||
content: "#*%:&^,)!.(~*})";
|
||||
empty: "";
|
||||
brackets: "{" "}";
|
||||
}
|
||||
#comments {
|
||||
content: "/* hello */ // not-so-secret";
|
||||
}
|
||||
#quotes {
|
||||
quotes: "'" "'";
|
||||
quotes: '"' '"';
|
||||
content: '""#!&""';
|
||||
empty: '';
|
||||
semi-colon: ';';
|
||||
}
|
||||
#escaped {
|
||||
filter: ~"DX.Transform.MS.BS.filter(opacity=50)";
|
||||
}
|
||||
#interpolation {
|
||||
@var: '/dev';
|
||||
url: "http://lesscss.org@{var}/image.jpg";
|
||||
|
||||
@var2: 256;
|
||||
url2: "http://lesscss.org/image-@{var2}.jpg";
|
||||
|
||||
@var3: #456;
|
||||
url3: "http://lesscss.org@{var3}";
|
||||
|
||||
@var4: hello;
|
||||
url4: "http://lesscss.org/@{var4}";
|
||||
|
||||
@var5: 54.4px;
|
||||
url5: "http://lesscss.org/@{var5}";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user