/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py
https://github.com/chromium/chromium · Python · 93 lines · 61 code · 16 blank · 16 comment · 3 complexity · 90b74babbfb19f5516d345eaa05996bf MD5 · raw file
- #!/usr/bin/env python
- # Copyright 2016 The Chromium Authors. All rights reserved.
- # Use of this source code is governed by a BSD-style license that can be
- # found in the LICENSE file.
- import json5_generator
- import template_expander
- from collections import namedtuple
- from core.css import css_properties
- class PropertyClassData(
- namedtuple(
- 'PropertyClassData',
- 'enum_key,enum_value,property_id,classname,namespace_group,filename'
- )):
- pass
- class CSSPropertyInstancesWriter(json5_generator.Writer):
- def __init__(self, json5_file_paths, output_dir):
- super(CSSPropertyInstancesWriter, self).__init__([], output_dir)
- self._input_files = json5_file_paths
- self._outputs = {
- 'css_property_instances.h':
- self.generate_property_instances_header,
- 'css_property_instances.cc':
- self.generate_property_instances_implementation
- }
- # These files are no longer generated. If the files are present from
- # a previous build, we remove them. This avoids accidentally #including
- # a stale generated header.
- self._cleanup = set([
- 'css_property.cc', 'css_property.h', 'css_unresolved_property.cc',
- 'css_unresolved_property.h'
- ])
- self._css_properties = css_properties.CSSProperties(json5_file_paths)
- properties = self._css_properties.longhands + self._css_properties.shorthands
- aliases = self._css_properties.aliases
- # Lists of PropertyClassData.
- self._property_classes_by_id = list(map(self.get_class, properties))
- self._alias_classes_by_id = list(map(self.get_class, aliases))
- # Sort by enum value.
- self._property_classes_by_id.sort(key=lambda t: t.enum_value)
- self._alias_classes_by_id.sort(key=lambda t: t.enum_value)
- def get_class(self, property_):
- """Gets the automatically
- generated class name for a property.
- Args:
- property_: A single property from CSSProperties.properties()
- Returns:
- The name to use for the property class.
- """
- namespace_group = 'Shorthand' if property_['longhands'] else 'Longhand'
- return PropertyClassData(
- enum_key=property_['enum_key'],
- enum_value=property_['enum_value'],
- property_id=property_['property_id'],
- classname=property_['name'].to_upper_camel_case(),
- namespace_group=namespace_group,
- filename=property_['name'].to_snake_case())
- @property
- def css_properties(self):
- return self._css_properties
- @template_expander.use_jinja(
- 'core/css/properties/templates/css_property_instances.h.tmpl')
- def generate_property_instances_header(self):
- return {
- 'input_files': self._input_files,
- 'property_classes_by_property_id': self._property_classes_by_id,
- 'alias_classes_by_property_id': self._alias_classes_by_id,
- }
- @template_expander.use_jinja(
- 'core/css/properties/templates/css_property_instances.cc.tmpl')
- def generate_property_instances_implementation(self):
- return {
- 'input_files': self._input_files,
- 'property_classes_by_property_id': self._property_classes_by_id,
- 'alias_classes_by_property_id': self._alias_classes_by_id,
- }
- if __name__ == '__main__':
- json5_generator.Maker(CSSPropertyInstancesWriter).main()