Index: packages/polymer/bin/new_element.dart |
diff --git a/packages/polymer/bin/new_element.dart b/packages/polymer/bin/new_element.dart |
deleted file mode 100644 |
index fe6c0f87874422da5812234c4d0029062bca7d46..0000000000000000000000000000000000000000 |
--- a/packages/polymer/bin/new_element.dart |
+++ /dev/null |
@@ -1,249 +0,0 @@ |
-// Copyright (c) 2014, 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. |
- |
-/// Script to create boilerplate for a Polymer element. |
-/// Produces .dart and .html files for the element. |
-/// |
-/// Run this script with pub run: |
-/// |
-/// pub run polymer:new_element element-name [-o output_dir] |
-/// |
-library polymer.bin.new_element; |
- |
-import 'dart:io'; |
-import 'package:args/args.dart'; |
-import 'package:path/path.dart' as path show absolute, dirname, join, split; |
-import 'package:polymer/html_element_names.dart'; |
- |
-void printUsage(ArgParser parser) { |
- print('pub run polymer:new_element [-o output_dir] [-e super-element] ' |
- 'element-name'); |
- print(parser.getUsage()); |
-} |
- |
-void main(List<String> args) { |
- var parser = new ArgParser(allowTrailingOptions: true); |
- |
- parser.addOption('output-dir', abbr: 'o', help: 'Output directory'); |
- parser.addOption('extends', |
- abbr: 'e', |
- help: 'Extends polymer-element or DOM element (e.g., div, span)'); |
- parser.addFlag('help', abbr: 'h'); |
- |
- var options, element; |
- try { |
- options = parser.parse(args); |
- if (options['help']) { |
- printUsage(parser); |
- return; |
- } |
- if (options.rest == null || options.rest.isEmpty) { |
- throw new FormatException('No element specified'); |
- } |
- element = options.rest[0]; |
- if (!_isPolymerElement(element)) { |
- throw new FormatException('Must specify polymer-element to create.\n' |
- 'polymer-element must be all lowercase with at least 1 hyphen.'); |
- } |
- } catch (e) { |
- print('$e\n'); |
- printUsage(parser); |
- exitCode = 1; |
- return; |
- } |
- |
- var outputDir, startDir; |
- |
- var outputPath = options['output-dir']; |
- |
- if (outputPath == null) { |
- if ((new File('pubspec.yaml')).existsSync()) { |
- print('When creating elements in root directory of package, ' |
- '-o <dir> must be specified'); |
- exitCode = 1; |
- return; |
- } |
- outputDir = (new Directory('.')).resolveSymbolicLinksSync(); |
- } else { |
- var outputDirLocation = new Directory(outputPath); |
- if (!outputDirLocation.existsSync()) { |
- outputDirLocation.createSync(recursive: true); |
- } |
- outputDir = (new Directory(outputPath)).resolveSymbolicLinksSync(); |
- } |
- |
- var pubspecDir = _findDirWithFile(outputDir, 'pubspec.yaml'); |
- |
- if (pubspecDir == null) { |
- print('Could not find pubspec.yaml when walking up from $outputDir'); |
- exitCode = 1; |
- return; |
- } |
- |
- var length = path.split(pubspecDir).length; |
- var distanceToPackageRoot = path.split(outputDir).length - length; |
- |
- // See dartbug.com/20076 for the algorithm used here. |
- if (distanceToPackageRoot > 0) { |
- if (path.split(outputDir)[length] == 'lib') { |
- distanceToPackageRoot++; |
- } else { |
- distanceToPackageRoot--; |
- } |
- } |
- |
- var superElement = options['extends']; |
- |
- if ((superElement == null) || |
- _isDOMElement(superElement) || |
- _isPolymerElement(superElement)) { |
- try { |
- _createBoilerPlate( |
- element, options['extends'], outputDir, distanceToPackageRoot); |
- } on Exception catch (e, t) { |
- print('Error creating files in $outputDir'); |
- print('$e $t'); |
- exitCode = 1; |
- return; |
- } |
- } else { |
- if (superElement.contains('-')) { |
- print('Extending invalid element "$superElement". Polymer elements ' |
- 'may contain only lowercase letters at least one hyphen.'); |
- } else { |
- print('Extending invalid element "$superElement". $superElement is not ' |
- ' a builtin DOM type.'); |
- } |
- exitCode = 1; |
- return; |
- } |
- |
- return; |
-} |
- |
-String _findDirWithFile(String dir, String filename) { |
- while (!new File(path.join(dir, filename)).existsSync()) { |
- var parentDir = path.dirname(dir); |
- // If we reached root and failed to find it, bail. |
- if (parentDir == dir) return null; |
- dir = parentDir; |
- } |
- return dir; |
-} |
- |
-bool _isDOMElement(String element) => (HTML_ELEMENT_NAMES[element] != null); |
- |
-bool _isPolymerElement(String element) { |
- return element.contains('-') && (element.toLowerCase() == element); |
-} |
- |
-String _toCamelCase(String s) { |
- return s[0].toUpperCase() + s.substring(1); |
-} |
- |
-void _createBoilerPlate(String element, String superClass, String directory, |
- int distanceToPackageRoot) { |
- var segments = element.split('-'); |
- var capitalizedName = segments.map((e) => _toCamelCase(e)).join(''); |
- var underscoreName = element.replaceAll('-', '_'); |
- var pathToPackages = '../' * distanceToPackageRoot; |
- |
- bool superClassIsPolymer = |
- (superClass == null ? false : _isPolymerElement(superClass)); |
- |
- var classDeclaration = ''; |
- var importDartHtml = ''; |
- var polymerCreatedString = ''; |
- var extendsElementString = ''; |
- var shadowString = ''; |
- |
- if (superClass == null) { |
- classDeclaration = '\nclass $capitalizedName extends PolymerElement {'; |
- } else if (superClassIsPolymer) { |
- // The element being extended is a PolymerElement. |
- var camelSuperClass = |
- superClass.split('-').map((e) => _toCamelCase(e)).join(''); |
- classDeclaration = 'class $capitalizedName extends $camelSuperClass {'; |
- extendsElementString = ' extends="$superClass"'; |
- shadowString = '\n <!-- Render extended element\'s Shadow DOM here -->\n' |
- ' <shadow>\n </shadow>'; |
- } else { |
- // The element being extended is a DOM Class. |
- importDartHtml = "import 'dart:html';\n"; |
- classDeclaration = |
- 'class $capitalizedName extends ${HTML_ELEMENT_NAMES[superClass]} ' |
- 'with Polymer, Observable {'; |
- polymerCreatedString = '\n polymerCreated();'; |
- extendsElementString = ' extends="$superClass"'; |
- } |
- |
- String html = ''' |
-<!-- import polymer-element's definition --> |
-<link rel="import" href="${pathToPackages}packages/polymer/polymer.html"> |
- |
-<polymer-element name="$element"$extendsElementString> |
- <template> |
- <style> |
- :host { |
- display: block; |
- } |
- </style>$shadowString |
- <!-- Template content here --> |
- </template> |
- <script type="application/dart" src="${underscoreName}.dart"></script> |
-</polymer-element> |
-'''; |
- |
- String htmlFile = path.join(directory, underscoreName + '.html'); |
- new File(htmlFile).writeAsStringSync(html); |
- |
- String dart = ''' |
-${importDartHtml}import 'package:polymer/polymer.dart'; |
- |
-/** |
- * A Polymer $element element. |
- */ |
-@CustomTag('$element') |
-$classDeclaration |
- |
- /// Constructor used to create instance of ${capitalizedName}. |
- ${capitalizedName}.created() : super.created() {$polymerCreatedString |
- } |
- |
- /* |
- * Optional lifecycle methods - uncomment if needed. |
- * |
- |
- /// Called when an instance of $element is inserted into the DOM. |
- attached() { |
- super.attached(); |
- } |
- |
- /// Called when an instance of $element is removed from the DOM. |
- detached() { |
- super.detached(); |
- } |
- |
- /// Called when an attribute (such as a class) of an instance of |
- /// $element is added, changed, or removed. |
- attributeChanged(String name, String oldValue, String newValue) { |
- } |
- |
- /// Called when $element has been fully prepared (Shadow DOM created, |
- /// property observers set up, event listeners attached). |
- ready() { |
- } |
- |
- */ |
- |
-} |
-'''; |
- |
- String dartFile = path.join(directory, underscoreName + '.dart'); |
- new File(dartFile).writeAsStringSync(dart); |
- |
- print('Successfully created:'); |
- print(' ' + path.absolute(path.join(directory, underscoreName + '.dart'))); |
- print(' ' + path.absolute(path.join(directory, underscoreName + '.html'))); |
-} |