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, }
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
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-".'
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, }