| #!/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)) |