blob: 8ef52399d006dde02b306963a7fac006c4c04e0f [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import gperf
import json5_generator
import template_expander
class AtRuleNamesWriter(json5_generator.Writer):
"""
Generates AtRuleNames. This class provides utility methods for parsing
@rules (e.g. @font-face, @keyframes, etc)
"""
def __init__(self, json5_file_paths, output_dir):
super(AtRuleNamesWriter, self).__init__(json5_file_paths, output_dir)
self._outputs = {
'at_rule_descriptors.h': self.generate_header,
'at_rule_descriptors.cc': self.generate_implementation
}
self._descriptors = self.json5_file.name_dictionaries
self._character_offsets = []
# AtRuleDescriptorID::Invalid is 0.
first_descriptor_id = 1
# Aliases are resolved immediately at parse time, and thus don't appear
# in the enum.
self._descriptors_count = len(self._descriptors) + first_descriptor_id
chars_used = 0
self._longest_name_length = 0
for offset, descriptor in enumerate(self._descriptors):
descriptor['enum_value'] = first_descriptor_id + offset
self._character_offsets.append(chars_used)
chars_used += len(descriptor['name'].original)
self._longest_name_length = max(
len(descriptor['name'].original), len(descriptor['alias']),
self._longest_name_length)
@template_expander.use_jinja(
'core/css/parser/templates/at_rule_descriptors.h.tmpl')
def generate_header(self):
return {
'descriptors': self._descriptors,
'descriptors_count': self._descriptors_count
}
@gperf.use_jinja_gperf_template(
'core/css/parser/templates/at_rule_descriptors.cc.tmpl')
def generate_implementation(self):
return {
'descriptors': self._descriptors,
'descriptor_offsets': self._character_offsets,
'descriptors_count': len(self._descriptors),
'longest_name_length': self._longest_name_length,
'gperf_path': self.gperf_path
}
if __name__ == '__main__':
json5_generator.Maker(AtRuleNamesWriter).main()