blob: 3478d27245991022694b9c89512da5fd1767cb0f [file] [log] [blame]
#!/usr/bin/python2.4
#
# Copyright 2008 Google Inc. All Rights Reserved.
"""Generates StyleBase.java based on list of styles in styles.txt.
Usage: $0
(No args, just run it, with styles.txt in the same directory as the script)
"""
__author__ = 'danilatos@google.com (Daniel Danilatos)'
import os
import re
import string
import sys
CONST_PREFIX = ' public static final String '
def main(argv):
if len(argv) != 4:
print 'Usage: input_file interface.java.snippet implementation.java.snippet'
sys.exit(-1)
input_file = argv[1]
output_intf = argv[2]
output_impl = argv[3]
output_intf_stream = open(output_intf, 'w')
output_impl_stream = open(output_impl, 'w')
input_stream = open(input_file, 'r')
GenerateStyleBase(input_stream, output_intf_stream, output_impl_stream)
def GenerateStyleBase(input_stream, output_intf_stream, output_impl_stream):
"""Generate the StyleBase.java file.
Args:
input_stream: A stream containing the configuration input (usually
styles.txt)
output_stream: A stream to write the output to
"""
wintf = output_intf_stream.write
wimpl = output_impl_stream.write
# Write the generic setProperty() that's not in the IDL :-/
# Write Unit interface into the interface snippet
wintf("""
package $PACKAGE;
import elemental.dom.*;
import elemental.html.*;
/**
* $CLASS_JAVADOC
*/
public interface $ID$EXTENDS {
$!MEMBERS
""")
wimpl("""package $PACKAGE;
$IMPORTS
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import elemental.events.*;
import elemental.util.*;
import elemental.dom.*;
import elemental.html.*;
import elemental.css.*;
import elemental.js.stylesheets.*;
import elemental.js.events.*;
import elemental.js.util.*;
import elemental.js.dom.*;
import elemental.js.html.*;
import elemental.js.css.*;
import elemental.js.stylesheets.*;
import java.util.Date;
public class $ID$EXTENDS $IMPLEMENTS {
protected $ID() {}
$!MEMBERS
""")
wintf('public interface Unit {\n')
wintf(' public static final String PX = "px";\n')
wintf(' public static final String PCT = "%";\n')
wintf(' public static final String EM = "em";\n')
wintf(' public static final String EX = "ex";\n')
wintf(' public static final String PT = "pt";\n')
wintf(' public static final String PC = "pc";\n')
wintf(' public static final String IN = "in";\n')
wintf(' public static final String CM = "cm";\n')
wintf(' public static final String MM = "mm";\n')
wintf('}\n\n')
for line in input_stream:
line = re.sub('#.*$', '', line).strip()
if not line or line.startswith("//"): continue
# prop is the css property name
# value_type is the actual high-level type of the property
# output_mode is whether it is just a simple constant, or a dimension type,
# or an enum, etc.
# params are additional line parameters, currently used for enum values
(prop, output_mode, value_type, params) = ParseLine(line)
method_suffix = PropToCapsCase(prop)
js_prop = method_suffix[0].lower() + method_suffix[1:] # Camel case
if js_prop == 'float':
js_prop = "this['float']"
else:
js_prop = "this." + js_prop
if output_mode == 'enum':
wintf('\npublic interface %s {\n' % method_suffix)
for p in params:
wintf(CONST_PREFIX + PropToConstant(p) + ' = "' + p + '";\n')
wintf('}\n\n')
# getter
wintf('%s get%s();\n' % (value_type, method_suffix))
wimpl('public final native %s get%s() /*-{ return %s; }-*/;\n' % (value_type, method_suffix, js_prop))
# setter(s) & clearer(s)
wintf('void set%s(%s value);\n' % (method_suffix, value_type))
wintf('void clear%s();\n' % method_suffix)
wimpl('public final native void set%s(%s value) /*-{ %s = value; }-*/;\n' % (method_suffix, value_type, js_prop))
wimpl('public final native void clear%s() /*-{ %s = ""; }-*/;\n' % (method_suffix, js_prop))
if output_mode == 'dim':
wintf('void set%s(double value, String unit);\n' % (method_suffix))
wimpl('public final native void set%s(double value, String unit) /*-{ %s = value + unit; }-*/;\n' % (method_suffix, js_prop))
wintf('}')
wimpl('}')
output_intf_stream.close()
output_impl_stream.close()
def ParseLine(line):
"""Parses a line of the input file into useful parameters."""
bits = re.compile(r'\s+').split(line)
if len(bits) == 1:
output_mode = 'simple'
value_type = 'String'
elif bits[1] == 'enum':
output_mode = 'enum'
value_type = 'String' # PropToCapsCase(bits[0])
elif bits[1] == 'dim':
output_mode = 'dim'
value_type = 'String' # None # lots of different types for dim properties
else:
output_mode = 'simple'
value_type = bits[1]
css_prop_name = bits[0]
additional_params = bits[2:]
return (css_prop_name, output_mode, value_type, additional_params)
def PropToCapsCase(css_prop):
"""Converts abc-def to AbcDef."""
return re.sub(' ', '', string.capwords(re.sub('-', ' ', css_prop)))
def PropToConstant(css_prop):
"""Converts abc-def to ABC_DEF."""
return css_prop.upper().replace('-', '_')
if __name__ == '__main__':
sys.exit(main(sys.argv))