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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 void visitCssComment(CssComment node) { | 47 void visitCssComment(CssComment node) { |
48 emit('/* ${node.comment} */'); | 48 emit('/* ${node.comment} */'); |
49 } | 49 } |
50 | 50 |
51 void visitCommentDefinition(CommentDefinition node) { | 51 void visitCommentDefinition(CommentDefinition node) { |
52 emit('<!-- ${node.comment} -->'); | 52 emit('<!-- ${node.comment} -->'); |
53 } | 53 } |
54 | 54 |
55 void visitMediaExpression(MediaExpression node) { | 55 void visitMediaExpression(MediaExpression node) { |
56 emit(node.andOperator ? ' AND ' : ' '); | 56 emit(node.andOperator ? ' AND ' : ' '); |
57 emit('(${node.mediaFeature}:'); | 57 emit('(${node.mediaFeature}'); |
58 visitExpressions(node.exprs); | 58 if (node.exprs.expressions.isNotEmpty) { |
| 59 emit(':'); |
| 60 visitExpressions(node.exprs); |
| 61 } |
59 emit(')'); | 62 emit(')'); |
60 } | 63 } |
61 | 64 |
62 void visitMediaQuery(MediaQuery query) { | 65 void visitMediaQuery(MediaQuery query) { |
63 var unary = query.hasUnary ? ' ${query.unary}' : ''; | 66 var unary = query.hasUnary ? ' ${query.unary}' : ''; |
64 var mediaType = query.hasMediaType ? ' ${query.mediaType}' : ''; | 67 var mediaType = query.hasMediaType ? ' ${query.mediaType}' : ''; |
65 emit('$unary$mediaType'); | 68 emit('$unary$mediaType'); |
66 for (var expression in query.expressions) { | 69 for (var expression in query.expressions) { |
67 visitMediaExpression(expression); | 70 visitMediaExpression(expression); |
68 } | 71 } |
69 } | 72 } |
70 | 73 |
71 void emitMediaQueries(queries) { | 74 void emitMediaQueries(List<MediaQuery> queries) { |
72 var queriesLen = queries.length; | 75 var queriesLen = queries.length; |
73 for (var i = 0; i < queriesLen; i++) { | 76 for (var i = 0; i < queriesLen; i++) { |
74 var query = queries[i]; | 77 var query = queries[i]; |
75 if (query.hasMediaType && i > 0) emit(','); | 78 if (i > 0) emit(','); |
76 visitMediaQuery(query); | 79 visitMediaQuery(query); |
77 } | 80 } |
78 } | 81 } |
79 | 82 |
| 83 void visitDocumentDirective(DocumentDirective node) { |
| 84 emit('$_newLine@-moz-document '); |
| 85 node.functions.first.visit(this); |
| 86 for (var function in node.functions.skip(1)) { |
| 87 emit(',$_sp'); |
| 88 function.visit(this); |
| 89 } |
| 90 emit('$_sp{'); |
| 91 for (var ruleSet in node.groupRuleBody) { |
| 92 ruleSet.visit(this); |
| 93 } |
| 94 emit('$_newLine}'); |
| 95 } |
| 96 |
| 97 void visitSupportsDirective(SupportsDirective node) { |
| 98 emit('$_newLine@supports '); |
| 99 node.condition.visit(this); |
| 100 emit('$_sp{'); |
| 101 for (var rule in node.groupRuleBody) { |
| 102 rule.visit(this); |
| 103 } |
| 104 emit('$_newLine}'); |
| 105 } |
| 106 |
| 107 void visitSupportsConditionInParens(SupportsConditionInParens node) { |
| 108 emit('('); |
| 109 node.condition.visit(this); |
| 110 emit(')'); |
| 111 } |
| 112 |
| 113 void visitSupportsNegation(SupportsNegation node) { |
| 114 emit('not$_sp'); |
| 115 node.condition.visit(this); |
| 116 } |
| 117 |
| 118 void visitSupportsConjunction(SupportsConjunction node) { |
| 119 node.conditions.first.visit(this); |
| 120 for (var condition in node.conditions.skip(1)) { |
| 121 emit('${_sp}and$_sp'); |
| 122 condition.visit(this); |
| 123 } |
| 124 } |
| 125 |
| 126 void visitSupportsDisjunction(SupportsDisjunction node) { |
| 127 node.conditions.first.visit(this); |
| 128 for (var condition in node.conditions.skip(1)) { |
| 129 emit('${_sp}or$_sp'); |
| 130 condition.visit(this); |
| 131 } |
| 132 } |
| 133 |
| 134 void visitViewportDirective(ViewportDirective node) { |
| 135 emit('@${node.name}$_sp{$_newLine'); |
| 136 node.declarations.visit(this); |
| 137 emit('}'); |
| 138 } |
| 139 |
80 void visitMediaDirective(MediaDirective node) { | 140 void visitMediaDirective(MediaDirective node) { |
81 emit(' @media'); | 141 emit('$_newLine@media'); |
82 emitMediaQueries(node.mediaQueries); | 142 emitMediaQueries(node.mediaQueries); |
83 emit(' {'); | 143 emit('$_sp{'); |
84 for (var ruleset in node.rulesets) { | 144 for (var ruleset in node.rulesets) { |
85 ruleset.visit(this); | 145 ruleset.visit(this); |
86 } | 146 } |
87 emit('$_newLine\}'); | 147 emit('$_newLine}'); |
88 } | 148 } |
89 | 149 |
90 void visitHostDirective(HostDirective node) { | 150 void visitHostDirective(HostDirective node) { |
91 emit('\n@host {'); | 151 emit('$_newLine@host$_sp{'); |
92 for (var ruleset in node.rulesets) { | 152 for (var ruleset in node.rulesets) { |
93 ruleset.visit(this); | 153 ruleset.visit(this); |
94 } | 154 } |
95 emit('$_newLine\}'); | 155 emit('$_newLine}'); |
96 } | 156 } |
97 | 157 |
98 /** | 158 /** |
99 * @page : pseudoPage { | 159 * @page : pseudoPage { |
100 * decls | 160 * decls |
101 * } | 161 * } |
102 */ | 162 */ |
103 void visitPageDirective(PageDirective node) { | 163 void visitPageDirective(PageDirective node) { |
104 emit('$_newLine@page'); | 164 emit('$_newLine@page'); |
105 if (node.hasIdent || node.hasPseudoPage) { | 165 if (node.hasIdent || node.hasPseudoPage) { |
106 if (node.hasIdent) emit(' '); | 166 if (node.hasIdent) emit(' '); |
107 emit(node._ident); | 167 emit(node._ident); |
108 emit(node.hasPseudoPage ? ':${node._pseudoPage}' : ''); | 168 emit(node.hasPseudoPage ? ':${node._pseudoPage}' : ''); |
109 } | 169 } |
110 emit(' '); | |
111 | 170 |
112 var declsMargin = node._declsMargin; | 171 var declsMargin = node._declsMargin; |
113 var declsMarginLength = declsMargin.length; | 172 var declsMarginLength = declsMargin.length; |
| 173 emit(' {$_newLine'); |
114 for (var i = 0; i < declsMarginLength; i++) { | 174 for (var i = 0; i < declsMarginLength; i++) { |
115 if (i > 0) emit(_newLine); | |
116 emit('{$_newLine'); | |
117 declsMargin[i].visit(this); | 175 declsMargin[i].visit(this); |
118 emit('}'); | |
119 } | 176 } |
| 177 emit('}'); |
120 } | 178 } |
121 | 179 |
122 /** @charset "charset encoding" */ | 180 /** @charset "charset encoding" */ |
123 void visitCharsetDirective(CharsetDirective node) { | 181 void visitCharsetDirective(CharsetDirective node) { |
124 emit('$_newLine@charset "${node.charEncoding}";'); | 182 emit('$_newLine@charset "${node.charEncoding}";'); |
125 } | 183 } |
126 | 184 |
127 void visitImportDirective(ImportDirective node) { | 185 void visitImportDirective(ImportDirective node) { |
128 bool isStartingQuote(String ch) => ('\'"'.indexOf(ch[0]) >= 0); | 186 bool isStartingQuote(String ch) => ('\'"'.indexOf(ch[0]) >= 0); |
129 | 187 |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 TokenKind.idToValue(TokenKind.MARGIN_DIRECTIVES, node.margin_sym); | 304 TokenKind.idToValue(TokenKind.MARGIN_DIRECTIVES, node.margin_sym); |
247 | 305 |
248 emit("@$margin_sym_name {$_newLine"); | 306 emit("@$margin_sym_name {$_newLine"); |
249 | 307 |
250 visitDeclarationGroup(node); | 308 visitDeclarationGroup(node); |
251 | 309 |
252 emit("}$_newLine"); | 310 emit("}$_newLine"); |
253 } | 311 } |
254 | 312 |
255 void visitDeclaration(Declaration node) { | 313 void visitDeclaration(Declaration node) { |
256 String importantAsString() => node.important ? '$_sp!important' : ''; | 314 emit('${node.property}:$_sp'); |
257 | |
258 emit("${node.property}: "); | |
259 node._expression.visit(this); | 315 node._expression.visit(this); |
260 | 316 if (node.important) { |
261 emit("${importantAsString()}"); | 317 emit('$_sp!important'); |
| 318 } |
262 } | 319 } |
263 | 320 |
264 void visitVarDefinition(VarDefinition node) { | 321 void visitVarDefinition(VarDefinition node) { |
265 emit("var-${node.definedName}: "); | 322 emit("var-${node.definedName}: "); |
266 node._expression.visit(this); | 323 node._expression.visit(this); |
267 } | 324 } |
268 | 325 |
269 void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { | 326 void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { |
270 // Don't emit a new line we're inside of a declaration group. | 327 // Don't emit a new line we're inside of a declaration group. |
271 visitIncludeDirective(node.include, false); | 328 visitIncludeDirective(node.include, false); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 void visitPseudoClassSelector(PseudoClassSelector node) { | 376 void visitPseudoClassSelector(PseudoClassSelector node) { |
320 emit(node.toString()); | 377 emit(node.toString()); |
321 } | 378 } |
322 | 379 |
323 void visitPseudoElementSelector(PseudoElementSelector node) { | 380 void visitPseudoElementSelector(PseudoElementSelector node) { |
324 emit(node.toString()); | 381 emit(node.toString()); |
325 } | 382 } |
326 | 383 |
327 void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { | 384 void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) { |
328 emit(":${node.name}("); | 385 emit(":${node.name}("); |
329 node.expression.visit(this); | 386 node.argument.visit(this); |
330 emit(')'); | 387 emit(')'); |
331 } | 388 } |
332 | 389 |
333 void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) { | 390 void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) { |
334 emit("::${node.name}("); | 391 emit("::${node.name}("); |
335 node.expression.visit(this); | 392 node.expression.visit(this); |
336 emit(')'); | 393 emit(')'); |
337 } | 394 } |
338 | 395 |
339 void visitNegationSelector(NegationSelector node) { | 396 void visitNegationSelector(NegationSelector node) { |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 | 570 |
514 void visitWildcard(Wildcard node) { | 571 void visitWildcard(Wildcard node) { |
515 emit('*'); | 572 emit('*'); |
516 } | 573 } |
517 | 574 |
518 void visitDartStyleExpression(DartStyleExpression node) { | 575 void visitDartStyleExpression(DartStyleExpression node) { |
519 // TODO(terry): TBD | 576 // TODO(terry): TBD |
520 throw UnimplementedError; | 577 throw UnimplementedError; |
521 } | 578 } |
522 } | 579 } |
OLD | NEW |