| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (C) 2013 Google Inc. All rights reserved. | 2 # Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 # | 3 # |
| 4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without |
| 5 # modification, are permitted provided that the following conditions are | 5 # modification, are permitted provided that the following conditions are |
| 6 # met: | 6 # met: |
| 7 # | 7 # |
| 8 # * Redistributions of source code must retain the above copyright | 8 # * Redistributions of source code must retain the above copyright |
| 9 # notice, this list of conditions and the following disclaimer. | 9 # notice, this list of conditions and the following disclaimer. |
| 10 # * Redistributions in binary form must reproduce the above | 10 # * Redistributions in binary form must reproduce the above |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 | 29 |
| 30 import sys | 30 import sys |
| 31 | 31 |
| 32 import in_generator | 32 import in_generator |
| 33 import template_expander | 33 import template_expander |
| 34 import name_utilities | 34 import name_utilities |
| 35 | 35 |
| 36 from make_qualified_names import MakeQualifiedNamesWriter | 36 from make_qualified_names import MakeQualifiedNamesWriter |
| 37 | 37 |
| 38 | 38 |
| 39 def _interface(tag): | |
| 40 if tag['interfaceName']: | |
| 41 return tag['interfaceName'] | |
| 42 name = name_utilities.upper_first(tag['name']) | |
| 43 # FIXME: We shouldn't hard-code HTML here. | |
| 44 if name == 'HTML': | |
| 45 name = 'Html' | |
| 46 return 'HTML%sElement' % name | |
| 47 | |
| 48 | |
| 49 def _js_interface(tag): | |
| 50 if tag['JSInterfaceName']: | |
| 51 return tag['JSInterfaceName'] | |
| 52 return _interface(tag) | |
| 53 | |
| 54 | |
| 55 def _has_js_interface(tag): | |
| 56 return not tag['mapToTagName'] and not tag['noConstructor'] and _js_interfac
e(tag) != 'HTMLElement' | |
| 57 | |
| 58 | |
| 59 class MakeElementFactoryWriter(MakeQualifiedNamesWriter): | 39 class MakeElementFactoryWriter(MakeQualifiedNamesWriter): |
| 60 defaults = dict(MakeQualifiedNamesWriter.default_parameters, **{ | 40 defaults = dict(MakeQualifiedNamesWriter.default_parameters, **{ |
| 61 'JSInterfaceName': None, | 41 'JSInterfaceName': None, |
| 62 'constructorNeedsCreatedByParser': None, | 42 'constructorNeedsCreatedByParser': None, |
| 63 'constructorNeedsFormElement': None, | 43 'constructorNeedsFormElement': None, |
| 64 'contextConditional': None, | 44 'contextConditional': None, |
| 65 'interfaceName': None, | 45 'interfaceName': None, |
| 66 'mapToTagName': None, | 46 'mapToTagName': None, |
| 67 'noConstructor': None, | 47 'noConstructor': None, |
| 68 'wrapperOnlyIfMediaIsAvailable': None, | 48 'wrapperOnlyIfMediaIsAvailable': None, |
| 69 }) | 49 }) |
| 70 default_parameters = dict(MakeQualifiedNamesWriter.default_parameters, **{ | 50 default_parameters = dict(MakeQualifiedNamesWriter.default_parameters, **{ |
| 71 'fallbackInterfaceName': None, | 51 'fallbackInterfaceName': '', |
| 52 'fallbackJSInterfaceName': '', |
| 72 }) | 53 }) |
| 73 filters = dict(MakeQualifiedNamesWriter.filters, **{ | 54 filters = MakeQualifiedNamesWriter.filters |
| 74 'interface': _interface, | |
| 75 'js_interface': _js_interface, | |
| 76 'has_js_interface': _has_js_interface, | |
| 77 }) | |
| 78 | 55 |
| 79 def __init__(self, in_file_paths, enabled_conditions): | 56 def __init__(self, in_file_paths, enabled_conditions): |
| 80 super(MakeElementFactoryWriter, self).__init__(in_file_paths, enabled_co
nditions) | 57 super(MakeElementFactoryWriter, self).__init__(in_file_paths, enabled_co
nditions) |
| 81 | 58 |
| 82 # FIXME: When we start using these element factories, we'll want to | 59 # FIXME: When we start using these element factories, we'll want to |
| 83 # remove the "new" prefix and also have our base class generate | 60 # remove the "new" prefix and also have our base class generate |
| 84 # *Names.h and *Names.cpp. | 61 # *Names.h and *Names.cpp. |
| 85 self._outputs.update({ | 62 self._outputs.update({ |
| 86 (self.namespace + 'ElementFactory.h'): self.generate_factory_header, | 63 (self.namespace + 'ElementFactory.h'): self.generate_factory_header, |
| 87 (self.namespace + 'ElementFactory.cpp'): self.generate_factory_imple
mentation, | 64 (self.namespace + 'ElementFactory.cpp'): self.generate_factory_imple
mentation, |
| 88 ('V8' + self.namespace + 'ElementWrapperFactory.h'): self.generate_w
rapper_factory_header, | 65 ('V8' + self.namespace + 'ElementWrapperFactory.h'): self.generate_w
rapper_factory_header, |
| 89 ('V8' + self.namespace + 'ElementWrapperFactory.cpp'): self.generate
_wrapper_factory_implementation, | 66 ('V8' + self.namespace + 'ElementWrapperFactory.cpp'): self.generate
_wrapper_factory_implementation, |
| 90 }) | 67 }) |
| 91 | 68 |
| 69 fallback_interface = self.tags_in_file.parameters['fallbackInterfaceName
'].strip('"') |
| 70 fallback_js_interface = self.tags_in_file.parameters['fallbackJSInterfac
eName'].strip('"') or fallback_interface |
| 71 |
| 92 for tag in self._template_context['tags']: | 72 for tag in self._template_context['tags']: |
| 93 tag['js_interface'] = _js_interface(tag) if _has_js_interface(tag) e
lse None | 73 tag['has_js_interface'] = self._has_js_interface(tag) |
| 74 tag['js_interface'] = self._js_interface(tag) |
| 75 tag['interface'] = self._interface(tag) |
| 94 | 76 |
| 95 self._template_context.update({ | 77 self._template_context.update({ |
| 96 'fallback_interface': self.tags_in_file.parameters['fallbackInterfac
eName'].strip('"'), | 78 'fallback_interface': fallback_interface, |
| 79 'fallback_js_interface': fallback_js_interface, |
| 97 }) | 80 }) |
| 98 | 81 |
| 99 @template_expander.use_jinja('ElementFactory.h.tmpl', filters=filters) | 82 @template_expander.use_jinja('ElementFactory.h.tmpl', filters=filters) |
| 100 def generate_factory_header(self): | 83 def generate_factory_header(self): |
| 101 return self._template_context | 84 return self._template_context |
| 102 | 85 |
| 103 @template_expander.use_jinja('ElementFactory.cpp.tmpl', filters=filters) | 86 @template_expander.use_jinja('ElementFactory.cpp.tmpl', filters=filters) |
| 104 def generate_factory_implementation(self): | 87 def generate_factory_implementation(self): |
| 105 return self._template_context | 88 return self._template_context |
| 106 | 89 |
| 107 @template_expander.use_jinja('ElementWrapperFactory.h.tmpl', filters=filters
) | 90 @template_expander.use_jinja('ElementWrapperFactory.h.tmpl', filters=filters
) |
| 108 def generate_wrapper_factory_header(self): | 91 def generate_wrapper_factory_header(self): |
| 109 return self._template_context | 92 return self._template_context |
| 110 | 93 |
| 111 @template_expander.use_jinja('ElementWrapperFactory.cpp.tmpl', filters=filte
rs) | 94 @template_expander.use_jinja('ElementWrapperFactory.cpp.tmpl', filters=filte
rs) |
| 112 def generate_wrapper_factory_implementation(self): | 95 def generate_wrapper_factory_implementation(self): |
| 113 return self._template_context | 96 return self._template_context |
| 114 | 97 |
| 98 def _interface(self, tag): |
| 99 if tag['interfaceName']: |
| 100 return tag['interfaceName'] |
| 101 name = name_utilities.upper_first(tag['name']) |
| 102 # FIXME: We shouldn't hard-code HTML here. |
| 103 if name == 'HTML': |
| 104 name = 'Html' |
| 105 dash = name.find('-') |
| 106 while dash != -1: |
| 107 name = name[:dash] + name[dash + 1].upper() + name[dash + 2:] |
| 108 dash = name.find('-') |
| 109 return '%s%sElement' % (self.namespace, name) |
| 110 |
| 111 def _js_interface(self, tag): |
| 112 if tag['JSInterfaceName']: |
| 113 return tag['JSInterfaceName'] |
| 114 return self._interface(tag) |
| 115 |
| 116 def _has_js_interface(self, tag): |
| 117 return not tag['mapToTagName'] and not tag['noConstructor'] and self._js
_interface(tag) != ('%sElement' % self.namespace) |
| 118 |
| 115 | 119 |
| 116 if __name__ == "__main__": | 120 if __name__ == "__main__": |
| 117 in_generator.Maker(MakeElementFactoryWriter).main(sys.argv) | 121 in_generator.Maker(MakeElementFactoryWriter).main(sys.argv) |
| OLD | NEW |