| Index: dart/site/try/extract_theme.dart
 | 
| diff --git a/dart/site/try/extract_theme.dart b/dart/site/try/extract_theme.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..8a795161f071f298edf1b2c6c50167bf8548f74d
 | 
| --- /dev/null
 | 
| +++ b/dart/site/try/extract_theme.dart
 | 
| @@ -0,0 +1,83 @@
 | 
| +// Copyright (c) 2013, 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.
 | 
| +
 | 
| +import 'dart:io';
 | 
| +
 | 
| +StringBuffer themes = new StringBuffer();
 | 
| +
 | 
| +void main() {
 | 
| +  print('part of trydart.themes;\n');
 | 
| +  new Options().arguments.forEach(extractTheme);
 | 
| +  print('''
 | 
| +/// List of known themes. The default is the first theme.
 | 
| +const List<Theme> THEMES = const <Theme> [
 | 
| +    const Theme(),
 | 
| +$themes];''');
 | 
| +}
 | 
| +
 | 
| +final DECORATION_PATTERN = new RegExp(r'^ *<([a-z][^ ]+)[ ]');
 | 
| +
 | 
| +String attr(String name, String line) {
 | 
| +  var match = new RegExp('$name'r'="([^"]*)"').firstMatch(line);
 | 
| +  if (match == null) return null;
 | 
| +  return match[1];
 | 
| +}
 | 
| +
 | 
| +void extractTheme(String filename) {
 | 
| +  bool openedTheme = false;
 | 
| +  for (String line in new File(filename).readAsLinesSync()) {
 | 
| +    if (line.startsWith('<colorTheme')) {
 | 
| +      openTheme(line, filename);
 | 
| +      openedTheme = true;
 | 
| +    } else if (line.startsWith('</colorTheme>')) {
 | 
| +      if (!openedTheme) throw 'Theme not found in $filename';
 | 
| +      closeTheme();
 | 
| +      openedTheme = false;
 | 
| +    } else if (DECORATION_PATTERN.hasMatch(line)) {
 | 
| +      if (!openedTheme) throw 'Theme not found in $filename';
 | 
| +      printDecoration(line);
 | 
| +    }
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +openTheme(String line, String filename) {
 | 
| +  var name = attr('name', line);
 | 
| +  var author = attr('author', line);
 | 
| +  if (name == null) name = 'Untitled';
 | 
| +  if (name == 'Default') name = 'Dart Editor';
 | 
| +  var declaration = name.replaceAll(new RegExp('[^a-zA-Z0-9_]'), '_');
 | 
| +  themes.write('    const ${declaration}Theme(),\n');
 | 
| +  print('/// $name theme extracted from');
 | 
| +  print('/// $filename.');
 | 
| +  if (author != null) {
 | 
| +    print('/// Author: $author.');
 | 
| +  }
 | 
| +  print("""
 | 
| +class ${declaration}Theme extends Theme {
 | 
| +  const ${declaration}Theme();
 | 
| +
 | 
| +  String get name => '$name';
 | 
| +""");
 | 
| +}
 | 
| +
 | 
| +closeTheme() {
 | 
| +  print('}\n');
 | 
| +}
 | 
| +
 | 
| +printDecoration(String line) {
 | 
| +  String name = DECORATION_PATTERN.firstMatch(line)[1];
 | 
| +  if (name == 'class') name = 'className';
 | 
| +  if (name == 'enum') name = 'enumName';
 | 
| +  StringBuffer properties = new StringBuffer();
 | 
| +  var color = attr('color', line);
 | 
| +  if (color != null) {
 | 
| +    properties.write("color: '$color'");
 | 
| +  }
 | 
| +  var bold = attr('bold', line) == 'true';
 | 
| +  if (bold) {
 | 
| +    if (!properties.isEmpty) properties.write(', ');
 | 
| +    properties.write('bold: true');
 | 
| +  }
 | 
| +  print('  Decoration get $name => const Decoration($properties);');
 | 
| +}
 | 
| 
 |