| // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| class Generate { |
| |
| // Build up list of all known class selectors in all CSS files. |
| static List<String> computeClassSelectors(RuleSet ruleset, classes) { |
| for (final selector in ruleset.selectorGroup.selectors) { |
| var selSeqs = selector.simpleSelectorSequences; |
| for (final selSeq in selSeqs) { |
| var simpleSelector = selSeq.simpleSelector; |
| if (simpleSelector is ClassSelector) { |
| String className = simpleSelector.name; |
| if (classes.indexOf(className) == -1) { // Class name already known? |
| // No, expose it. |
| classes.add(className); |
| } |
| } |
| } |
| } |
| |
| return classes; |
| } |
| |
| static dartClass(var files, String outPath, Stylesheet stylesheet, |
| String filename) { |
| |
| List<String> knownClasses = []; |
| |
| StringBuffer buff = new StringBuffer( |
| '// File generated by Dart CSS from source file ${filename}\n' + |
| '// Do not edit.\n\n'); |
| |
| // Emit class for any @stylet directive. |
| for (final production in stylesheet._topLevels) { |
| if (production is Directive) { |
| if (production is StyletDirective) { |
| // TODO(terry): Need safer mechanism for stylets in different files |
| // and stylets with colliding names. |
| buff.write('class ${production.dartClassName} {\n'); |
| buff.write(' // selector, properties<propertyName, value>\n'); |
| buff.write(' static const selectors = const {\n'); |
| |
| for (final ruleset in production.rulesets) { |
| for (final selector in ruleset.selectorGroup.selectors) { |
| var selSeq = selector.simpleSelectorSquences; |
| if (selSeq.length == 1) { |
| buff.write(' \'${selSeq.toString()}\' : const {\n'); |
| } |
| } |
| |
| for (final decl in ruleset.declarationGroup.declarations) { |
| buff.write(' \'${decl.property}\' : ' + |
| '\'${decl.expression.toString()}\',\n'); |
| } |
| buff.write(' },\n'); // End of declarations for stylet class. |
| } |
| buff.write(' };\n'); // End of static selectors constant. |
| buff.write('}\n\n'); // End of stylet class |
| } else if (production is IncludeDirective) { |
| for (final topLevel in production.styleSheet._topLevels) { |
| if (topLevel is RuleSet) { |
| knownClasses = computeClassSelectors(topLevel, knownClasses); |
| } |
| } |
| } |
| } else if (production is RuleSet) { |
| knownClasses = computeClassSelectors(production, knownClasses); |
| } |
| } |
| |
| // Generate all known classes encountered in all processed CSS files. |
| StringBuffer classSelectors = new StringBuffer( |
| 'class CSS {\n' + |
| ' // CSS class selectors:\n'); |
| for (final className in knownClasses) { |
| String classAsDart = className.replaceAll('-', '_').toUpperCase(); |
| classSelectors.write(' static const String ${classAsDart} = ' + |
| '\'${className}\';\n'); |
| } |
| classSelectors.write('}\n'); // End of class selectors. |
| buff.write(classSelectors.toString()); |
| |
| // Write Dart file. |
| String outFile = '${outPath}CSS.dart'; |
| files.writeString(outFile, buff.toString()); |
| |
| return outFile; |
| } |
| } |
| |