blob: eabb6aeeaa5796fd3b559c9e308b86c6ed6e8651 [file] [log] [blame]
#!/usr/bin/env python
import subprocess
from name_utilities import enum_key_for_css_keyword
import json5_generator
import template_expander
import gperf
class CSSValueKeywordsWriter(json5_generator.Writer):
_FILE_BASENAME = 'css_value_keywords'
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_key_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
@template_expander.use_jinja(
'core/css/templates/css_value_keywords.h.tmpl')
def generate_header(self):
return {
'value_keywords':
self._value_keywords,
'value_keywords_count':
self._keyword_count,
'max_value_keyword_length':
max(
len(keyword['name'].original)
for keyword in self._value_keywords),
'header_guard':
self.make_header_guard(self._relative_output_dir +
self._FILE_BASENAME + '.h')
}
def _value_keywords_with_mode(self, mode):
return [
keyword for keyword in self._value_keywords
if keyword['mode'] == mode
]
@gperf.use_jinja_gperf_template(
'core/css/templates/css_value_keywords.cc.tmpl',
['-Q', 'CSSValueStringPool'])
def generate_implementation(self):
keyword_offsets = []
current_offset = 0
for keyword in self._value_keywords:
keyword_offsets.append(current_offset)
current_offset += len(keyword["name"].original) + 1
return {
'value_keywords':
self._value_keywords,
'value_keyword_offsets':
keyword_offsets,
'ua_sheet_mode_values_keywords':
self._value_keywords_with_mode('UASheet'),
'quirks_mode_or_ua_sheet_mode_values_keywords':
self._value_keywords_with_mode('QuirksOrUASheet'),
'gperf_path':
self.gperf_path,
}
if __name__ == "__main__":
json5_generator.Maker(CSSValueKeywordsWriter).main()