#!/usr/bin/env python ############################################################################ # # Copyright (C) 2019 The Qt Company Ltd. # Contact: https://www.qt.io/licensing/ # # This file is part of Qt Creator. # # Commercial License Usage # Licensees holding valid commercial Qt licenses may use this file in # accordance with the commercial license agreement provided with the # Software or, alternatively, in accordance with the terms contained in # a written agreement between you and The Qt Company. For licensing terms # and conditions see https://www.qt.io/terms-conditions. For further # information use the contact form at https://www.qt.io/contact-us. # # GNU General Public License Usage # Alternatively, this file may be used under the terms of the GNU # General Public License version 3 as published by the Free Software # Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT # included in the packaging of this file. Please review the following # information to ensure the GNU General Public License requirements will # be met: https://www.gnu.org/licenses/gpl-3.0.html. # ############################################################################ import argparse import json import os import docutils.nodes import docutils.parsers.rst import docutils.utils def full_ui_content(checks): return ''' ClangFormat::ClangFormatChecksWidget 480 16777215 ''' + checks + ''' ''' def parse_arguments(): parser = argparse.ArgumentParser(description='Clazy checks header file generator') parser.add_argument('--clang-format-options-rst', help='path to ClangFormatStyleOptions.rst', default=None, dest='options_rst') return parser.parse_args() def parse_rst(text): parser = docutils.parsers.rst.Parser() components = (docutils.parsers.rst.Parser,) settings = docutils.frontend.OptionParser(components=components).get_default_values() document = docutils.utils.new_document('', settings=settings) parser.parse(text, document) return document def createItem(key, value, index): label = ''' ''' + key + ''' ''' value_item = '' if value[0] == 'bool': value_item = ''' Qt::StrongFocus Default true false ''' elif value[0].startswith('std::string') or value[0] == 'unsigned' or value[0] == 'int': value_item = ''' 40 16777215 Set ''' elif value[0].startswith('std::vector'): value_item = ''' 16777215 50 40 16777215 Set ''' else: if ' ' in value[1]: value_item = '' for i, val in enumerate(value): if i == 0: continue index += 1 space_index = val.find(' ') val = val[space_index + 1:] value_item += ''' ''' + val + ''' ''' value_item += ''' Qt::StrongFocus Default true false ''' else: value_item = ''' Qt::StrongFocus ''' if key == 'Language': value_item += ''' false ''' if index > 0: value_item += ''' Default ''' for i, val in enumerate(value): if i == 0: continue underline_index = val.find('_') val = val[underline_index + 1:] value_item += ''' ''' + val + ''' ''' value_item += ''' ''' return label + value_item, index class MyVisitor(docutils.nodes.NodeVisitor): in_bullet_list = False in_bullet_list_paragraph = False tree = {} last_key = '' def visit_term(self, node): node_values = node.traverse(condition=docutils.nodes.Text) name = node_values[0].astext() self.last_key = name self.tree[name] = [node_values[2].astext()] def visit_bullet_list(self, node): self.in_bullet_list = True def depart_bullet_list(self, node): self.in_bullet_list = False def visit_paragraph(self, node): if self.in_bullet_list: self.in_bullet_list_paragraph = True def depart_paragraph(self, node): self.in_bullet_list_paragraph = False def visit_literal(self, node): if self.in_bullet_list_paragraph: value = node.traverse(condition=docutils.nodes.Text)[0].astext() self.tree[self.last_key].append(value) self.in_bullet_list_paragraph = False def unknown_visit(self, node): """Called for all other node types.""" #print(node) pass def unknown_departure(self, node): pass def main(): arguments = parse_arguments() content = file(arguments.options_rst).read() document = parse_rst(content) visitor = MyVisitor(document) document.walkabout(visitor) keys = visitor.tree.keys() basedOnStyleKey = 'BasedOnStyle' keys.remove(basedOnStyleKey) keys.sort() text = '' line, index = createItem(basedOnStyleKey, visitor.tree[basedOnStyleKey], 0) text += line index = 1 for key in keys: line, index = createItem(key, visitor.tree[key], index) text += line index += 1 current_path = os.path.dirname(os.path.abspath(__file__)) ui_path = os.path.abspath(os.path.join(current_path, '..', 'src', 'plugins', 'clangformat', 'clangformatchecks.ui')) with open(ui_path, 'w') as f: f.write(full_ui_content(text)) if __name__ == "__main__": main()