Ejemplo n.º 1
0
    def generate_css_value_mappings(self):
        mappings = {}
        include_paths = set()
        css_values_dictionary = json5_generator.Json5File.load_from_files(
            [self.css_values_dictionary_file],
            default_parameters=self.default_parameters
        ).name_dictionaries
        name_to_position_dictionary = dict(zip([x['name'].original for x in css_values_dictionary],
                                               range(len(css_values_dictionary))))

        for property_ in self.css_properties.properties_including_aliases:
            include_paths.update(property_['include_paths'])
            if property_['field_template'] == 'multi_keyword':
                mappings[property_['type_name']] = {
                    'default_value': property_['default_value'],
                    'mapping': [(enum_value_name(k), enum_for_css_keyword(k)) for k in property_['keywords']],
                }
            elif property_['field_template'] == 'keyword':
                enum_pair_list, enum_segment, p_segment = _find_enum_longest_continuous_segment(
                    property_, name_to_position_dictionary)
                mappings[property_['type_name']] = {
                    'default_value': property_['default_value'],
                    'mapping': enum_pair_list,
                    'segment': enum_segment,
                    'longest_segment_length': p_segment[1] - p_segment[0],
                    'start_segment': enum_pair_list[p_segment[0]],
                    'end_segment': enum_pair_list[p_segment[1] - 1],
                }

        return {
            'include_paths': list(sorted(include_paths)),
            'input_files': self._input_files,
            'mappings': mappings,
        }
Ejemplo n.º 2
0
def _find_enum_longest_continuous_segment(property_, name_to_position_dictionary):
    """Find the longest continuous segment in the list of keywords
    Finding the continuous segment will allows us to do the subtraction
    between keywords so that the distance between 2 keywords in this
    enum is equal to the distance of corresponding keywords in another
    enum.

    Step 1:
        Convert keyword enums into number.
        Sort and find all continuous segment in the list of enums.

    Step 2:
        Get the longest segment.

    Step 3:
        Compose a list of keyword enums and their respective numbers
        in the sorted order.

    Step 4:
        Build the switch case statements of other enums not in the
        segment. Enums in the segment will be computed in default clause.
    """
    property_enum_order = range(len(property_['keywords']))
    css_enum_order = [name_to_position_dictionary[x] for x in property_['keywords']]
    enum_pair_list = zip(css_enum_order, property_enum_order)
    enum_segment, enum_pair_list = _find_continuous_segment(enum_pair_list)
    longest_segment = _find_largest_segment(enum_segment)

    enum_pair_list = [
        (enum_value_name(property_['keywords'][x[1]]), x[1],
         enum_for_css_keyword(property_['keywords'][x[1]]), x[0]) for x in enum_pair_list
    ]
    return enum_pair_list, enum_segment, longest_segment
Ejemplo n.º 3
0
    def generate_css_value_mappings(self):
        mappings = {}

        for property_ in self._properties.values():
            if property_['field_template'] == 'keyword':
                mappings[property_['type_name']] = {
                    'default_value': 'k' + camel_case(property_['initial_keyword']),
                    'mapping': [('k' + camel_case(k), enum_for_css_keyword(k)) for k in property_['keywords']],
                }

        return {
            'include_paths': self._include_paths,
            'mappings': mappings,
        }
    def __init__(self, file_paths):
        json5_generator.Writer.__init__(self, file_paths)
        self._outputs = {(self.class_name + ".h"): self.generate_header,
                         (self.class_name + ".cpp"): self.generate_implementation}

        self._value_keywords = self.json5_file.name_dictionaries
        first_keyword_id = 1
        for offset, keyword in enumerate(self._value_keywords):
            keyword['lower_name'] = keyword['name'].lower()
            keyword['enum_name'] = enum_for_css_keyword(keyword['name'])
            keyword['enum_value'] = first_keyword_id + offset
            if keyword['name'].startswith('-internal-'):
                assert keyword['mode'] is None, 'Can\'t specify mode for value keywords with the prefix "-internal-".'
                keyword['mode'] = 'UASheet'
            else:
                assert keyword['mode'] != 'UASheet', 'UASheet mode only value keywords should have the prefix "-internal-".'
    def __init__(self, file_paths):
        in_generator.Writer.__init__(self, file_paths)
        self._outputs = {(self.class_name + ".h"): self.generate_header,
                         (self.class_name + ".cpp"): self.generate_implementation,
                        }

        self._value_keywords = self.in_file.name_dictionaries
        first_keyword_id = 1
        for offset, keyword in enumerate(self._value_keywords):
            keyword['lower_name'] = keyword['name'].lower()
            keyword['enum_name'] = enum_for_css_keyword(keyword['name'])
            keyword['enum_value'] = first_keyword_id + offset
            if keyword['name'].startswith('-internal-'):
                assert keyword['mode'] is None, 'Can\'t specify mode for value keywords with the prefix "-internal-".'
                keyword['mode'] = 'UASheet'
            else:
                assert keyword['mode'] != 'UASheet', 'UASheet mode only value keywords should have the prefix "-internal-".'
Ejemplo n.º 6
0
    def __init__(self, file_paths, output_dir):
        json5_generator.Writer.__init__(self, file_paths, output_dir)
        self._outputs = {
            (self._FILE_BASENAME + '.h'): self.generate_header,
            (self._FILE_BASENAME + '.cc'): self.generate_implementation,
        }

        self._value_keywords = self.json5_file.name_dictionaries
        first_keyword_id = 1
        for offset, keyword in enumerate(self._value_keywords):
            keyword['lower_name'] = keyword['name'].original.lower()
            keyword['enum_name'] = enum_for_css_keyword(keyword['name'])
            keyword['enum_value'] = first_keyword_id + offset
            if keyword['name'].original.startswith('-internal-'):
                assert keyword['mode'] is None, 'Can\'t specify mode for ' \
                    'value keywords with the prefix "-internal-".'
                keyword['mode'] = 'UASheet'
            else:
                assert keyword['mode'] != 'UASheet', 'UASheet mode only ' \
                    'value keywords should have the prefix "-internal-".'
        self._keyword_count = len(self._value_keywords) + first_keyword_id
    def generate_css_value_mappings(self):
        mappings = {}
        include_paths = []
        for property_ in self._properties.values():
            if property_['field_template'] == 'keyword':
                if property_['field_type_path']:
                    type_name = property_['field_type_path'].split('/')[-1]
                    include_paths.append(property_['field_type_path'] + '.h')
                else:
                    type_name = property_['type_name']

                mappings[type_name] = {
                    'default_value':
                    enum_value_name(property_['default_value']),
                    'mapping': [(enum_value_name(k), enum_for_css_keyword(k))
                                for k in property_['keywords']],
                }

        return {
            'include_paths': list(sorted(include_paths)),
            'mappings': mappings,
        }