Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: third_party/pyscss/scss/control.py

Issue 9111023: Pyscss is obsolete with Dart CSS complier; remove all pyscss code. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove pyparsing from .gitignore Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « third_party/pyscss/scss/base.py ('k') | third_party/pyscss/scss/function.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 import sys, os
2 from os.path import abspath, dirname, join, normpath
3 from scss import OPRT
4 from scss.base import ParseNode, Empty, Node, IncludeNode
5 from scss.function import FUNCTION_LIST, unknown, warn
6 from scss.value import StringValue, Value, BooleanValue, NumberValue, QuotedStri ngValue
7
8 class Option(Empty):
9 """ Set parser option.
10 """
11 def parse(self, target):
12 opts = map(lambda (x, y): (x.value, BooleanValue(y).value),
13 zip(*[iter(self.data[1:])]*2))
14 for v in opts:
15 self.root.set_opt(*v)
16
17
18 class Variable(Value, ParseNode):
19
20 def_value = StringValue('none')
21
22 @classmethod
23 def _do_op(cls, self, other, op):
24 return self.value._do_op(self.value, other, op)
25
26 @classmethod
27 def _do_cmps(cls, self, other, op):
28 return self.value._do_cmps(self.value, other, op)
29
30 def __nonzero__(self):
31 return True
32
33 @property
34 def value(self):
35 name = self.data[0].strip('-$')
36 minus = self.data[0][0] == '-'
37 value = self.ctx.get(name) or self.root.ctx.get(name, self.def_value)
38 return (0 - value) if minus else value
39
40
41 class Variables(ParseNode, Empty):
42 pass
43
44
45 class Expression(Variable):
46
47 @property
48 def value(self):
49 it = iter(self.data)
50 try:
51 first = next(it)
52 while True:
53 res = next(it)
54 op = OPRT.get(res.strip(), None)
55 if op:
56 second = next(it)
57 first = op(first, second)
58
59 if op == OPRT['and'] and not first:
60 raise StopIteration
61
62 elif op == OPRT['or'] and first:
63 raise StopIteration
64
65 except StopIteration:
66 while isinstance(first, Variable):
67 first = first.value
68 return first
69
70
71 class SepValString(Expression):
72
73 @property
74 def value(self):
75 return ', '.join(str(e.value) for e in self.data)
76
77
78 class Function(Expression):
79
80 @property
81 def value(self):
82 name = self.data[0]
83 func_name_a = "%s:%d" % (name, len(self.data) - 1)
84 func_name_n = "%s:n" % name
85 func = FUNCTION_LIST.get(func_name_a, FUNCTION_LIST.get(func_name_n, unk nown))
86
87 params = map(lambda v: v.value, self.data[1:])
88 return func(*params, root=self.root, name=name)
89
90
91 class FunctionDefinition(Empty):
92
93 def parse(self, target):
94 name = self.data[1].value
95 params = self.data[2]
96 func_name = '%s:%s' % (name, len(params))
97 FUNCTION_LIST[func_name] = self.wrapper
98
99 def wrapper(self, *args, **kwargs):
100 self.ctx = Mixin.get_context(self.data[2], args)
101 for node in self.data[2:]:
102 if isinstance(node, FunctionReturn):
103 return node.value
104 elif isinstance(node, Node):
105 node.parse(self)
106
107
108 class FunctionReturn(Variable):
109
110 @property
111 def value(self):
112 return self.data[1]
113
114
115 class MixinParam(Empty):
116 def __init__(self, s, n, t):
117 super(MixinParam, self).__init__(s, n, t)
118 self.name = self.data[0].data[0][1:]
119 self.value = self.data[1] if len(self.data) > 1 else None
120
121
122 class Extend(Empty):
123
124 def parse(self, target):
125 for rule in self.root.cache['rset'][self.data[1]]:
126 rule.name.extend(target.name)
127
128
129 class Mixin(Empty):
130
131 def __init__(self, s, n, t):
132 super(Mixin, self).__init__(s, n, t)
133 self.name = str(self.data[1])
134 self.default = self.data[2]
135
136 def parse(self, target):
137 self.root.cache['mix'][self.name] = self
138
139 def include(self, target, params):
140 ctx = self.get_context(self.default, params)
141 if target.ctx:
142 ctx.update(target.ctx)
143
144 self.ctx = ctx
145 for n in params:
146 n.parse(self)
147
148 for node in self.data[3:]:
149 if isinstance(node, Node):
150 copy = node.copy()
151 copy.ctx = ctx
152 copy.parse(target)
153
154 @staticmethod
155 def get_context(default, params=''):
156 test = map(lambda x, y: (x, y), default, params)
157 return dict(( mp.name, v or mp.value ) for mp, v in test if mp)
158
159
160 class Include(IncludeNode):
161
162 def parse(self, target):
163 from scss import parser
164
165 includeValue = self.data[1]
166 if isinstance(target, ParseNode) and not(isinstance(includeValue,
167 QuotedStringValue)):
168 name = str(includeValue)
169 params = self.data[2:]
170 mixin = self.root.cache['mix'].get(name)
171 if mixin:
172 mixin.include(target, params)
173 else:
174 warn("Required mixin not found: %s:%d." % ( name, len(params)))
175 elif isinstance(target, parser.Stylesheet) and isinstance(includeValue,
176 QuotedStringValue):
177 # @include "scss file to include"
178 # Parse this file for more class names to emit in Dart class.
179 options = target.currentOptions
180 f = target.currentFile
181
182 s = parser.Stylesheet(options=target.currentOptions)
183 f = target.currentFile
184 path = dirname(abspath(f.name))
185 includePath = normpath('{0}/{1}'.format(path, self.data[1].value))
186 f = open(includePath, 'r')
187 nodes = s.loadReturnNodes(f)
188 target.addInclude(includeValue.value, nodes)
189
190 class If(IncludeNode):
191
192 def parse(self, target):
193 self.data[0].parse(self)
194 target.ctx.update(self.ctx)
195 if isinstance(target, ParseNode):
196 if self.data[0].value:
197 self.data[1].parse(target)
198 elif len(self.data) > 2:
199 self.data[2].parse(target)
200
201
202 class For(IncludeNode):
203 def parse(self, target):
204 if isinstance(target, ParseNode):
205 name = self.data[1].data[0][1:]
206 for i in xrange(int(float(self.data[2])), int(float(self.data[3]))+1 ):
207 body = self.data[4].copy()
208 body.ctx.update({name: NumberValue(i)})
209 body.parse(target)
210
211 class Stylet(Empty):
212 def __init__(self, s, n, t):
213 super(Stylet, self).__init__(s, n, t)
214 self.name = str(self.data[1])
OLDNEW
« no previous file with comments | « third_party/pyscss/scss/base.py ('k') | third_party/pyscss/scss/function.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698