text: #!/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, @viewport, 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()
  