blob: 11bf7bcbf63ab04d2a66e2c3307fbbbe35bcd465 [file] [log] [blame]
#!/usr/bin/python2.6
#
# 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.
"""Generates CSSStyleDeclaration from css property definitions defined in WebKit."""
import tempfile, os
COMMENT_LINE_PREFIX = ' * '
SOURCE_PATH = 'Source/WebCore/css/CSSPropertyNames.in'
INPUT_URL = 'http://trac.webkit.org/export/latest/trunk/%s' % SOURCE_PATH
INTERFACE_FILE = '../../html/src/CSSStyleDeclaration.dart'
CLASS_FILE = '../../html/src/CSSStyleDeclarationWrappingImplementation.dart'
def main():
_, css_names_file = tempfile.mkstemp('.CSSPropertyNames.in')
try:
if os.system('wget %s -O %s' % (INPUT_URL, css_names_file)):
return 1
generate_code(css_names_file)
print 'Successfully generated %s and %s' % (INTERFACE_FILE, CLASS_FILE)
finally:
os.remove(css_names_file)
def camelCaseName(name):
"""Convert a CSS property name to a lowerCamelCase name."""
name = name.replace('-webkit-', '')
words = []
for word in name.split('-'):
if words:
words.append(word.title())
else:
words.append(word)
return ''.join(words)
def generate_code(input_path):
data = open(input_path).readlines()
# filter CSSPropertyNames.in to only the properties
data = [d[:-1] for d in data
if len(d) > 1
and not d.startswith('#')
and not d.startswith('//')
and not '=' in d]
interface_file = open(INTERFACE_FILE, 'w')
class_file = open(CLASS_FILE, 'w')
interface_file.write("""
// 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.
// WARNING: Do not edit.
// This file was generated by html/scripts/css_code_generator.py
// Source of CSS properties:
// %s
// TODO(jacobr): add versions that take numeric values in px, miliseconds, etc.
interface CSSStyleDeclaration {
String get cssText;
void set cssText(String value);
int get length;
CSSRule get parentRule;
CSSValue getPropertyCSSValue(String propertyName);
String getPropertyPriority(String propertyName);
String getPropertyShorthand(String propertyName);
String getPropertyValue(String propertyName);
bool isPropertyImplicit(String propertyName);
String item(int index);
String removeProperty(String propertyName);
void setProperty(String propertyName, String value, [String priority]);
""".lstrip() % SOURCE_PATH)
class_file.write("""
// 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.
// WARNING: Do not edit.
// This file was generated by html/scripts/css_code_generator.py
// Source of CSS properties:
// %s
// TODO(jacobr): add versions that take numeric values in px, miliseconds, etc.
class CSSStyleDeclarationWrappingImplementation extends DOMWrapperBase implements CSSStyleDeclaration {
static String _cachedBrowserPrefix;
CSSStyleDeclarationWrappingImplementation._wrap(ptr) : super._wrap(ptr) {}
static String get _browserPrefix {
if (_cachedBrowserPrefix == null) {
if (_Device.isFirefox) {
_cachedBrowserPrefix = '-moz-';
} else {
_cachedBrowserPrefix = '-webkit-';
}
// TODO(jacobr): support IE 9.0 and Opera as well.
}
return _cachedBrowserPrefix;
}
String get cssText { return _ptr.cssText; }
void set cssText(String value) { _ptr.cssText = value; }
int get length { return _ptr.length; }
CSSRule get parentRule { return LevelDom.wrapCSSRule(_ptr.parentRule); }
CSSValue getPropertyCSSValue(String propertyName) {
return LevelDom.wrapCSSValue(_ptr.getPropertyCSSValue(propertyName));
}
String getPropertyPriority(String propertyName) {
return _ptr.getPropertyPriority(propertyName);
}
String getPropertyShorthand(String propertyName) {
return _ptr.getPropertyShorthand(propertyName);
}
String getPropertyValue(String propertyName) {
return _ptr.getPropertyValue(propertyName);
}
bool isPropertyImplicit(String propertyName) {
return _ptr.isPropertyImplicit(propertyName);
}
String item(int index) {
return _ptr.item(index);
}
String removeProperty(String propertyName) {
return _ptr.removeProperty(propertyName);
}
void setProperty(String propertyName, String value, [String priority = '']) {
_ptr.setProperty(propertyName, value, priority);
}
String get typeName { return "CSSStyleDeclaration"; }
""".lstrip() % SOURCE_PATH)
interface_lines = [];
class_lines = [];
seen = set()
for prop in sorted(data, key=lambda p: camelCaseName(p)):
camel_case_name = camelCaseName(prop)
upper_camel_case_name = camel_case_name[0].upper() + camel_case_name[1:];
css_name = prop.replace('-webkit-', '${_browserPrefix}')
base_css_name = prop.replace('-webkit-', '')
if base_css_name in seen:
continue
seen.add(base_css_name)
comment = ' /** %s the value of "' + base_css_name + '" */'
interface_lines.append(comment % 'Gets')
interface_lines.append("""
String get %s;
""" % camel_case_name)
interface_lines.append(comment % 'Sets')
interface_lines.append("""
void set %s(String value);
""" % camel_case_name)
class_lines.append('\n');
class_lines.append(comment % 'Gets')
class_lines.append("""
String get %s =>
getPropertyValue('%s');
""" % (camel_case_name, css_name))
class_lines.append(comment % 'Sets')
class_lines.append("""
void set %s(String value) {
setProperty('%s', value, '');
}
""" % (camel_case_name, css_name))
interface_file.write(''.join(interface_lines));
interface_file.write('}\n')
interface_file.close()
class_file.write(''.join(class_lines));
class_file.write('}\n')
class_file.close()
if __name__ == '__main__':
main()