| // 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. |
| |
| library templatetool; |
| |
| import 'dart:io'; |
| import 'template.dart'; |
| import '../lib/file_system.dart'; |
| import '../lib/file_system_vm.dart'; |
| |
| |
| FileSystem files; |
| |
| /** Invokes [callback] and returns how long it took to execute in ms. */ |
| num time(callback()) { |
| final watch = new Stopwatch(); |
| watch.start(); |
| callback(); |
| watch.stop(); |
| return watch.elapsedMilliseconds; |
| } |
| |
| String GREEN_COLOR = '\u001b[32m'; |
| String NO_COLOR = '\u001b[0m'; |
| |
| printStats(String phase, num elapsed, [String filename = '']) { |
| print('${phase} ${GREEN_COLOR}${filename}${NO_COLOR} in ${elapsed} msec.'); |
| } |
| |
| /** |
| * Run from the `utils/css` directory. |
| */ |
| void main() { |
| // argument 0 - sourcefile full path |
| // argument 1 - outputfile full path |
| var optionArgs = new Options().arguments; |
| |
| String sourceFullFn = optionArgs[0]; |
| String outputFullFn = optionArgs[1]; |
| |
| String sourcePath; |
| String sourceFilename; |
| int idxBeforeFilename = sourceFullFn.lastIndexOf('/'); |
| if (idxBeforeFilename >= 0) { |
| sourcePath = sourceFullFn.substring(0, idxBeforeFilename + 1); |
| sourceFilename = sourceFullFn.substring(idxBeforeFilename + 1); |
| } |
| |
| String outPath; |
| String outFilename; |
| idxBeforeFilename = outputFullFn.lastIndexOf('/'); |
| if (idxBeforeFilename >= 0) { |
| outPath = outputFullFn.substring(0, idxBeforeFilename + 1); |
| outFilename = outputFullFn.substring(idxBeforeFilename + 1); |
| } |
| |
| if (sourceFilename.length == 0 || outFilename.length == 0) { |
| print("Unknown command:\r"); |
| print(" Format: sourcefile outputfile [--options]"); |
| print(" outputfile - template file filename.tmpl"); |
| print(" outputfile - generated dart source file filename.dart"); |
| return; |
| } |
| |
| // files = new NodeFileSystem(); |
| files = new VMFileSystem(); |
| |
| // TODO(terry): Cleanup options handling need common options between template |
| // and CSS parsers also cleanup above cruft. |
| |
| // TODO(terry): Pass on switches. |
| var args = []; |
| parseOptions(args, files); |
| |
| initHtmlWorld(false); |
| |
| if (!files.fileExists(sourceFullFn)) { |
| // Display colored error message if file is missing. |
| print(world.fatal("CSS source file missing - ${sourceFullFn}")); |
| } else { |
| |
| String source = files.readAll(sourceFullFn); |
| |
| List<Template> templates; |
| final parsedElapsed = time(() { |
| templates = templateParseAndValidate(source); |
| }); |
| |
| StringBuffer code = new StringBuffer(); |
| |
| num codegenElapsed; |
| if (world.errors == 0) { |
| // Generate the Dart class(es) for all template(s). |
| codegenElapsed = time(() { |
| code.write(Codegen.generate(templates, outFilename)); |
| }); |
| } |
| |
| printStats("Parsed", parsedElapsed, sourceFullFn); |
| printStats("Codegen", codegenElapsed, sourceFullFn); |
| |
| final outputElapsed = time(() { |
| files.writeString(outputFullFn, code.toString()); |
| }); |
| |
| printStats("Wrote file", codegenElapsed, outputFullFn); |
| } |
| } |