OLD | NEW |
| (Empty) |
1 #!/usr/bin/python2.6 | |
2 # | |
3 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
4 # for details. All rights reserved. Use of this source code is governed by a | |
5 # BSD-style license that can be found in the LICENSE file. | |
6 | |
7 """Generates CSSStyleDeclaration from css property definitions defined in WebKit
.""" | |
8 | |
9 import tempfile, os | |
10 | |
11 COMMENT_LINE_PREFIX = ' * ' | |
12 SOURCE_PATH = 'Source/WebCore/css/CSSPropertyNames.in' | |
13 INPUT_URL = 'http://trac.webkit.org/export/latest/trunk/%s' % SOURCE_PATH | |
14 INTERFACE_FILE = '../../html/src/CSSStyleDeclaration.dart' | |
15 CLASS_FILE = '../../html/src/CSSStyleDeclarationWrappingImplementation.dart' | |
16 | |
17 def main(): | |
18 _, css_names_file = tempfile.mkstemp('.CSSPropertyNames.in') | |
19 try: | |
20 if os.system('wget %s -O %s' % (INPUT_URL, css_names_file)): | |
21 return 1 | |
22 generate_code(css_names_file) | |
23 print 'Successfully generated %s and %s' % (INTERFACE_FILE, CLASS_FILE) | |
24 finally: | |
25 os.remove(css_names_file) | |
26 | |
27 def camelCaseName(name): | |
28 """Convert a CSS property name to a lowerCamelCase name.""" | |
29 name = name.replace('-webkit-', '') | |
30 words = [] | |
31 for word in name.split('-'): | |
32 if words: | |
33 words.append(word.title()) | |
34 else: | |
35 words.append(word) | |
36 return ''.join(words) | |
37 | |
38 def generate_code(input_path): | |
39 data = open(input_path).readlines() | |
40 | |
41 # filter CSSPropertyNames.in to only the properties | |
42 data = [d[:-1] for d in data | |
43 if len(d) > 1 | |
44 and not d.startswith('#') | |
45 and not d.startswith('//') | |
46 and not '=' in d] | |
47 | |
48 interface_file = open(INTERFACE_FILE, 'w') | |
49 class_file = open(CLASS_FILE, 'w') | |
50 | |
51 interface_file.write(""" | |
52 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
53 // for details. All rights reserved. Use of this source code is governed by a | |
54 // BSD-style license that can be found in the LICENSE file. | |
55 | |
56 // WARNING: Do not edit. | |
57 // This file was generated by html/scripts/css_code_generator.py | |
58 | |
59 // Source of CSS properties: | |
60 // %s | |
61 | |
62 // TODO(jacobr): add versions that take numeric values in px, miliseconds, etc. | |
63 | |
64 interface CSSStyleDeclaration { | |
65 | |
66 String get cssText(); | |
67 | |
68 void set cssText(String value); | |
69 | |
70 int get length(); | |
71 | |
72 CSSRule get parentRule(); | |
73 | |
74 CSSValue getPropertyCSSValue(String propertyName); | |
75 | |
76 String getPropertyPriority(String propertyName); | |
77 | |
78 String getPropertyShorthand(String propertyName); | |
79 | |
80 String getPropertyValue(String propertyName); | |
81 | |
82 bool isPropertyImplicit(String propertyName); | |
83 | |
84 String item(int index); | |
85 | |
86 String removeProperty(String propertyName); | |
87 | |
88 void setProperty(String propertyName, String value, [String priority]); | |
89 | |
90 """.lstrip() % SOURCE_PATH) | |
91 | |
92 | |
93 class_file.write(""" | |
94 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
95 // for details. All rights reserved. Use of this source code is governed by a | |
96 // BSD-style license that can be found in the LICENSE file. | |
97 | |
98 // WARNING: Do not edit. | |
99 // This file was generated by html/scripts/css_code_generator.py | |
100 | |
101 // Source of CSS properties: | |
102 // %s | |
103 | |
104 // TODO(jacobr): add versions that take numeric values in px, miliseconds, etc. | |
105 | |
106 class CSSStyleDeclarationWrappingImplementation extends DOMWrapperBase implement
s CSSStyleDeclaration { | |
107 static String _cachedBrowserPrefix; | |
108 | |
109 CSSStyleDeclarationWrappingImplementation._wrap(ptr) : super._wrap(ptr) {} | |
110 | |
111 static String get _browserPrefix() { | |
112 if (_cachedBrowserPrefix === null) { | |
113 if (_Device.isFirefox) { | |
114 _cachedBrowserPrefix = '-moz-'; | |
115 } else { | |
116 _cachedBrowserPrefix = '-webkit-'; | |
117 } | |
118 // TODO(jacobr): support IE 9.0 and Opera as well. | |
119 } | |
120 return _cachedBrowserPrefix; | |
121 } | |
122 | |
123 String get cssText() { return _ptr.cssText; } | |
124 | |
125 void set cssText(String value) { _ptr.cssText = value; } | |
126 | |
127 int get length() { return _ptr.length; } | |
128 | |
129 CSSRule get parentRule() { return LevelDom.wrapCSSRule(_ptr.parentRule); } | |
130 | |
131 CSSValue getPropertyCSSValue(String propertyName) { | |
132 return LevelDom.wrapCSSValue(_ptr.getPropertyCSSValue(propertyName)); | |
133 } | |
134 | |
135 String getPropertyPriority(String propertyName) { | |
136 return _ptr.getPropertyPriority(propertyName); | |
137 } | |
138 | |
139 String getPropertyShorthand(String propertyName) { | |
140 return _ptr.getPropertyShorthand(propertyName); | |
141 } | |
142 | |
143 String getPropertyValue(String propertyName) { | |
144 return _ptr.getPropertyValue(propertyName); | |
145 } | |
146 | |
147 bool isPropertyImplicit(String propertyName) { | |
148 return _ptr.isPropertyImplicit(propertyName); | |
149 } | |
150 | |
151 String item(int index) { | |
152 return _ptr.item(index); | |
153 } | |
154 | |
155 String removeProperty(String propertyName) { | |
156 return _ptr.removeProperty(propertyName); | |
157 } | |
158 | |
159 void setProperty(String propertyName, String value, [String priority = '']) { | |
160 _ptr.setProperty(propertyName, value, priority); | |
161 } | |
162 | |
163 String get typeName() { return "CSSStyleDeclaration"; } | |
164 | |
165 """.lstrip() % SOURCE_PATH) | |
166 | |
167 interface_lines = []; | |
168 class_lines = []; | |
169 | |
170 seen = set() | |
171 for prop in sorted(data, key=lambda p: camelCaseName(p)): | |
172 camel_case_name = camelCaseName(prop) | |
173 upper_camel_case_name = camel_case_name[0].upper() + camel_case_name[1:]; | |
174 css_name = prop.replace('-webkit-', '${_browserPrefix}') | |
175 base_css_name = prop.replace('-webkit-', '') | |
176 | |
177 if base_css_name in seen: | |
178 continue | |
179 seen.add(base_css_name) | |
180 | |
181 comment = ' /** %s the value of "' + base_css_name + '" */' | |
182 | |
183 interface_lines.append(comment % 'Gets') | |
184 interface_lines.append(""" | |
185 String get %s(); | |
186 | |
187 """ % camel_case_name) | |
188 | |
189 interface_lines.append(comment % 'Sets') | |
190 interface_lines.append(""" | |
191 void set %s(String value); | |
192 | |
193 """ % camel_case_name) | |
194 | |
195 class_lines.append('\n'); | |
196 class_lines.append(comment % 'Gets') | |
197 class_lines.append(""" | |
198 String get %s() => | |
199 getPropertyValue('%s'); | |
200 | |
201 """ % (camel_case_name, css_name)) | |
202 | |
203 class_lines.append(comment % 'Sets') | |
204 class_lines.append(""" | |
205 void set %s(String value) { | |
206 setProperty('%s', value, ''); | |
207 } | |
208 """ % (camel_case_name, css_name)) | |
209 | |
210 interface_file.write(''.join(interface_lines)); | |
211 interface_file.write('}\n') | |
212 interface_file.close() | |
213 | |
214 class_file.write(''.join(class_lines)); | |
215 class_file.write('}\n') | |
216 class_file.close() | |
217 | |
218 if __name__ == '__main__': | |
219 main() | |
OLD | NEW |