1#!/usr/bin/env python 2# Copyright 2014 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6import in_generator 7from name_utilities import lower_first 8 9 10class CSSProperties(in_generator.Writer): 11 defaults = { 12 'alias_for': None, 13 'runtime_flag': None, 14 'longhands': '', 15 'animatable': False, 16 'inherited': False, 17 'font': False, 18 'svg': False, 19 'name_for_methods': None, 20 'use_handlers_for': None, 21 'getter': None, 22 'setter': None, 23 'initial': None, 24 'type_name': None, 25 'converter': None, 26 'custom_all': False, 27 'custom_initial': False, 28 'custom_inherit': False, 29 'custom_value': False, 30 'builder_skip': False, 31 'direction_aware': False, 32 } 33 34 valid_values = { 35 'animatable': (True, False), 36 'inherited': (True, False), 37 'font': (True, False), 38 'svg': (True, False), 39 'custom_all': (True, False), 40 'custom_initial': (True, False), 41 'custom_inherit': (True, False), 42 'custom_value': (True, False), 43 'builder_skip': (True, False), 44 'direction_aware': (True, False), 45 } 46 47 def __init__(self, file_paths): 48 in_generator.Writer.__init__(self, file_paths) 49 50 properties = self.in_file.name_dictionaries 51 52 self._aliases = {property['name']: property['alias_for'] for property in properties if property['alias_for']} 53 properties = [property for property in properties if not property['alias_for']] 54 55 assert len(properties) <= 1024, 'There are more than 1024 CSS Properties, you need to update CSSProperty.h/StylePropertyMetadata m_propertyID accordingly.' 56 # We currently assign 0 to CSSPropertyInvalid 57 self._first_enum_value = 1 58 for offset, property in enumerate(properties): 59 property['property_id'] = css_name_to_enum(property['name']) 60 property['upper_camel_name'] = camelcase_css_name(property['name']) 61 property['lower_camel_name'] = lower_first(property['upper_camel_name']) 62 property['enum_value'] = self._first_enum_value + offset 63 property['is_internal'] = property['name'].startswith('-internal-') 64 65 self._properties_list = properties 66 self._properties = {property['property_id']: property for property in properties} 67 68 69def camelcase_css_name(css_name): 70 """Convert hyphen-separated-name to UpperCamelCase. 71 72 E.g., '-foo-bar' becomes 'FooBar'. 73 """ 74 return ''.join(word.capitalize() for word in css_name.split('-')) 75 76 77def css_name_to_enum(css_name): 78 return 'CSSProperty' + camelcase_css_name(css_name) 79