diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/build/scripts/core/css/make_css_property_names.py')
-rwxr-xr-x | chromium/third_party/blink/renderer/build/scripts/core/css/make_css_property_names.py | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/build/scripts/core/css/make_css_property_names.py b/chromium/third_party/blink/renderer/build/scripts/core/css/make_css_property_names.py new file mode 100755 index 00000000000..5cb3e205fff --- /dev/null +++ b/chromium/third_party/blink/renderer/build/scripts/core/css/make_css_property_names.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python + +import os +import sys +sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) + +from core.css import css_properties +import gperf +import json5_generator +import template_expander + + +class CSSPropertyNamesWriter(json5_generator.Writer): + class_name = "CSSPropertyNames" + file_basename = "css_property_names" + + def __init__(self, json5_file_path, output_dir): + super(CSSPropertyNamesWriter, self).__init__(json5_file_path, output_dir) + self._outputs = { + (self.file_basename + ".h"): self.generate_header, + (self.file_basename + ".cc"): self.generate_implementation, + } + self._css_properties = css_properties.CSSProperties(json5_file_path) + + def _enum_declaration(self, property_): + return " %(property_id)s = %(enum_value)s," % property_ + + def _array_item(self, property_): + return " static_cast<CSSPropertyID>(%(enum_value)s), " \ + "// %(property_id)s" % property_ + + @template_expander.use_jinja('core/css/templates/css_property_names.h.tmpl') + def generate_header(self): + return { + 'alias_offset': self._css_properties.alias_offset, + 'class_name': self.class_name, + 'property_enums': "\n".join(map( + self._enum_declaration, + self._css_properties.properties_including_aliases)), + 'property_aliases': "\n".join( + map(self._array_item, self._css_properties.aliases)), + 'first_property_id': self._css_properties.first_property_id, + 'properties_count': + len(self._css_properties.properties_including_aliases), + 'last_property_id': self._css_properties.last_property_id, + 'last_unresolved_property_id': + self._css_properties.last_unresolved_property_id, + 'max_name_length': + max(map(len, self._css_properties.properties_by_id)), + } + + @gperf.use_jinja_gperf_template('core/css/templates/css_property_names.cc.tmpl', + ['-Q', 'CSSPropStringPool']) + def generate_implementation(self): + enum_value_to_name = {} + for property_ in self._css_properties.properties_including_aliases: + enum_value_to_name[property_['enum_value']] = property_['name'].original + property_offsets = [] + property_names = [] + current_offset = 0 + for enum_value in range(self._css_properties.first_property_id, + max(enum_value_to_name) + 1): + property_offsets.append(current_offset) + if enum_value in enum_value_to_name: + name = enum_value_to_name[enum_value] + property_names.append(name) + current_offset += len(name) + 1 + + css_name_and_enum_pairs = [ + (property_['name'].original, property_['property_id']) + for property_ in self._css_properties.properties_including_aliases] + + return { + 'class_name': 'CSSPropertyNames', + 'file_basename': self.file_basename, + 'property_names': property_names, + 'property_offsets': property_offsets, + 'property_to_enum_map': + '\n'.join('%s, %s' % property_ + for property_ in css_name_and_enum_pairs), + 'gperf_path': self.gperf_path, + } + + +if __name__ == "__main__": + json5_generator.Maker(CSSPropertyNamesWriter).main() |