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