OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of csslib.visitor; | 5 part of csslib.visitor; |
6 | 6 |
7 /** | 7 /** |
8 * Visitor that produces a formatted string representation of the CSS tree. | 8 * Visitor that produces a formatted string representation of the CSS tree. |
9 */ | 9 */ |
10 class CssPrinter extends Visitor { | 10 class CssPrinter extends Visitor { |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 } | 180 } |
181 } | 181 } |
182 emit(';'); | 182 emit(';'); |
183 } | 183 } |
184 | 184 |
185 void visitVarDefinitionDirective(VarDefinitionDirective node) { | 185 void visitVarDefinitionDirective(VarDefinitionDirective node) { |
186 visitVarDefinition(node.def); | 186 visitVarDefinition(node.def); |
187 emit(';$_newLine'); | 187 emit(';$_newLine'); |
188 } | 188 } |
189 | 189 |
| 190 void visitMixinRulesetDirective(MixinRulesetDirective node) { |
| 191 emit('@mixin ${node.name} {'); |
| 192 for (var ruleset in node.rulesets) { |
| 193 ruleset.visit(this); |
| 194 } |
| 195 emit('}'); |
| 196 } |
| 197 |
| 198 void visitMixinDeclarationDirective(MixinDeclarationDirective node) { |
| 199 emit('@mixin ${node.name} {\n'); |
| 200 visitDeclarationGroup(node.declarations); |
| 201 emit('}'); |
| 202 } |
| 203 |
| 204 /** |
| 205 * Added optional newLine for handling @include at top-level vs/ inside of |
| 206 * a declaration group. |
| 207 */ |
| 208 void visitIncludeDirective(IncludeDirective node, [bool topLevel = true]) { |
| 209 if (topLevel) emit(_newLine); |
| 210 emit('@include ${node.name}'); |
| 211 emit(';'); |
| 212 } |
| 213 |
| 214 void visitContentDirective(ContentDirective node) { |
| 215 // TODO(terry): TBD |
| 216 } |
| 217 |
190 void visitRuleSet(RuleSet node) { | 218 void visitRuleSet(RuleSet node) { |
191 emit("$_newLine"); | 219 emit("$_newLine"); |
192 node._selectorGroup.visit(this); | 220 node._selectorGroup.visit(this); |
193 emit(" {$_newLine"); | 221 emit(" {$_newLine"); |
194 node._declarationGroup.visit(this); | 222 node._declarationGroup.visit(this); |
195 emit("}"); | 223 emit("}"); |
196 } | 224 } |
197 | 225 |
198 void visitDeclarationGroup(DeclarationGroup node) { | 226 void visitDeclarationGroup(DeclarationGroup node) { |
199 var declarations = node._declarations; | 227 var declarations = node._declarations; |
(...skipping 25 matching lines...) Expand all Loading... |
225 node._expression.visit(this); | 253 node._expression.visit(this); |
226 | 254 |
227 emit("${importantAsString()}"); | 255 emit("${importantAsString()}"); |
228 } | 256 } |
229 | 257 |
230 void visitVarDefinition(VarDefinition node) { | 258 void visitVarDefinition(VarDefinition node) { |
231 emit("var-${node.definedName}: "); | 259 emit("var-${node.definedName}: "); |
232 node._expression.visit(this); | 260 node._expression.visit(this); |
233 } | 261 } |
234 | 262 |
| 263 void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { |
| 264 // Don't emit a new line we're inside of a declaration group. |
| 265 visitIncludeDirective(node.include, false); |
| 266 } |
| 267 |
| 268 void visitExtendDeclaration(ExtendDeclaration node) { |
| 269 emit("@extend "); |
| 270 for (var selector in node.selectors) { |
| 271 selector.visit(this); |
| 272 } |
| 273 } |
| 274 |
| 275 |
235 void visitSelectorGroup(SelectorGroup node) { | 276 void visitSelectorGroup(SelectorGroup node) { |
236 var selectors = node._selectors; | 277 var selectors = node._selectors; |
237 var selectorsLength = selectors.length; | 278 var selectorsLength = selectors.length; |
238 for (var i = 0; i < selectorsLength; i++) { | 279 for (var i = 0; i < selectorsLength; i++) { |
239 if (i > 0) emit(',$_sp'); | 280 if (i > 0) emit(',$_sp'); |
240 selectors[i].visit(this); | 281 selectors[i].visit(this); |
241 } | 282 } |
242 } | 283 } |
243 | 284 |
244 void visitSimpleSelectorSequence(SimpleSelectorSequence node) { | 285 void visitSimpleSelectorSequence(SimpleSelectorSequence node) { |
245 emit('${node._combinatorToString}'); | 286 emit('${node._combinatorToString}'); |
246 node._selector.visit(this); | 287 node._selector.visit(this); |
247 } | 288 } |
248 | 289 |
249 void visitSimpleSelector(SimpleSelector node) { | 290 void visitSimpleSelector(SimpleSelector node) { |
250 emit(node.name); | 291 emit(node.name); |
251 } | 292 } |
252 | 293 |
253 void visitNamespaceSelector(NamespaceSelector node) { | 294 void visitNamespaceSelector(NamespaceSelector node) { |
254 emit("${node.namespace}|${node.nameAsSimpleSelector.name}"); | 295 emit(node.toString()); |
255 } | 296 } |
256 | 297 |
257 void visitElementSelector(ElementSelector node) { | 298 void visitElementSelector(ElementSelector node) { |
258 emit("${node.name}"); | 299 emit(node.toString()); |
259 } | 300 } |
260 | 301 |
261 void visitAttributeSelector(AttributeSelector node) { | 302 void visitAttributeSelector(AttributeSelector node) { |
262 emit("[${node.name}${node.matchOperator()}${node.valueToString()}]"); | 303 emit(node.toString()); |
263 } | 304 } |
264 | 305 |
265 void visitIdSelector(IdSelector node) { | 306 void visitIdSelector(IdSelector node) { |
266 emit("#${node.name}"); | 307 emit(node.toString()); |
267 } | 308 } |
268 | 309 |
269 void visitClassSelector(ClassSelector node) { | 310 void visitClassSelector(ClassSelector node) { |
270 emit(".${node.name}"); | 311 emit(node.toString()); |
271 } | 312 } |
272 | 313 |
273 void visitPseudoClassSelector(PseudoClassSelector node) { | 314 void visitPseudoClassSelector(PseudoClassSelector node) { |
274 emit(":${node.name}"); | 315 emit(node.toString()); |
275 } | 316 } |
276 | 317 |
277 void visitPseudoElementSelector(PseudoElementSelector node) { | 318 void visitPseudoElementSelector(PseudoElementSelector node) { |
278 emit("::${node.name}"); | 319 emit(node.toString()); |
279 } | 320 } |
280 | 321 |
281 void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { | 322 void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { |
282 emit(":${node.name}("); | 323 emit(":${node.name}("); |
283 node.expression.visit(this); | 324 node.expression.visit(this); |
284 emit(')'); | 325 emit(')'); |
285 } | 326 } |
286 | 327 |
287 void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) { | 328 void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) { |
288 emit("::${node.name}("); | 329 emit("::${node.name}("); |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 | 508 |
468 void visitWildcard(Wildcard node) { | 509 void visitWildcard(Wildcard node) { |
469 emit('*'); | 510 emit('*'); |
470 } | 511 } |
471 | 512 |
472 void visitDartStyleExpression(DartStyleExpression node) { | 513 void visitDartStyleExpression(DartStyleExpression node) { |
473 // TODO(terry): TBD | 514 // TODO(terry): TBD |
474 throw UnimplementedError; | 515 throw UnimplementedError; |
475 } | 516 } |
476 } | 517 } |
OLD | NEW |