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);'); |
+} |