File indexing completed on 2024-04-28 11:33:41
0001 # -*- coding: utf-8 -*- 0002 # 0003 # SPDX-FileCopyrightText: 2014 Alex Merry <alex.merry@kdemail.net> 0004 # SPDX-FileCopyrightText: 2014 Aurélien Gâteau <agateau@kde.org> 0005 # SPDX-FileCopyrightText: 2014 Alex Turbov <i.zaufi@gmail.com> 0006 # SPDX-FileCopyrightText: 2016 Olivier Churlaud <olivier@churlaud.com> 0007 # 0008 # SPDX-License-Identifier: BSD-2-Clause 0009 0010 import logging 0011 import os 0012 import shutil 0013 import sys 0014 import tempfile 0015 import json 0016 0017 from urllib.request import urlretrieve 0018 0019 from . import generator, utils, argparserutils, preprocessing 0020 0021 try: 0022 from kapidox import depdiagram 0023 0024 DEPDIAGRAM_AVAILABLE = True 0025 except ImportError: 0026 DEPDIAGRAM_AVAILABLE = False 0027 0028 0029 def do_it(maintainers_fct, copyright, searchpaths=None): 0030 utils.setup_logging() 0031 if searchpaths is None: 0032 searchpaths = searchpaths = ['/usr/share/doc/qt5', '/usr/share/doc/qt'] 0033 args = argparserutils.parse_args(DEPDIAGRAM_AVAILABLE) 0034 0035 if len(os.listdir(os.getcwd())) > 0: 0036 logging.error("Run this command from an empty directory.") 0037 exit(2) 0038 0039 if not DEPDIAGRAM_AVAILABLE: 0040 logging.warning("Missing Graphviz dependency: diagrams will not be generated.") 0041 0042 tagfiles = generator.search_for_tagfiles( 0043 suggestion=args.qtdoc_dir, 0044 doclink=args.qtdoc_link, 0045 flattenlinks=args.qtdoc_flatten_links, 0046 searchpaths=searchpaths) 0047 0048 rootdir = args.sourcesdir 0049 maintainers = maintainers_fct() 0050 0051 metalist = preprocessing.parse_tree(rootdir) 0052 products, groups, libraries, available_platforms = preprocessing.sort_metainfo(metalist, maintainers) 0053 0054 dirsrc = os.path.join(args.doxdatadir, 'htmlresource') 0055 dirdest = 'resources' 0056 if os.path.isdir(dirdest): 0057 shutil.rmtree(dirdest) 0058 shutil.copytree(dirsrc, dirdest) 0059 os.rename(dirdest + '/favicon.ico', './favicon.ico') 0060 os.rename(dirdest + '/worker.js', './worker.js') 0061 0062 generator.process_toplevel_html_file('index.html', 0063 args.doxdatadir, 0064 title=args.title, 0065 products=products, 0066 qch_enabled=args.qhp 0067 ) 0068 generator.process_subgroup_html_files('index.html', 0069 args.doxdatadir, 0070 title=args.title, 0071 groups=groups, 0072 available_platforms=available_platforms, 0073 qch_enabled=args.qhp 0074 ) 0075 tmp_dir = tempfile.mkdtemp(prefix='kapidox-') 0076 0077 try: 0078 if args.depdiagram_dot_dir: 0079 dot_files = utils.find_dot_files(args.depdiagram_dot_dir) 0080 assert dot_files 0081 for lib in libraries: 0082 logging.info(f'# Generating doc for {lib.fancyname}') 0083 if args.depdiagram_dot_dir: 0084 png_path = os.path.join(tmp_dir, lib.name) + '.png' 0085 ok = generator.generate_diagram(png_path, lib.fancyname, 0086 dot_files, tmp_dir) 0087 if ok: 0088 lib.dependency_diagram = png_path 0089 0090 # store this as we won't use that every time 0091 create_qhp = args.qhp 0092 args.qhp = False 0093 ctx = generator.create_fw_context(args, lib, tagfiles) 0094 # set it back 0095 args.qhp = create_qhp 0096 0097 generator.gen_fw_apidocs(ctx, tmp_dir) 0098 tagfiles.insert(0, generator.create_fw_tagfile_tuple(lib)) 0099 0100 # Rebuild for interdependencies 0101 for lib in libraries: 0102 logging.info(f'# Rebuilding {lib.fancyname} for interdependencies') 0103 shutil.rmtree(lib.outputdir) 0104 ctx = generator.create_fw_context(args, lib, tagfiles, copyright) 0105 generator.gen_fw_apidocs(ctx, tmp_dir) 0106 generator.finish_fw_apidocs(ctx) 0107 if not ctx.is_qdoc: 0108 logging.info('# Generate indexing files') 0109 generator.indexer(lib) 0110 for product in products: 0111 if not product.metainfo['qdoc']: 0112 generator.create_product_index(product) 0113 0114 if product.logo_url is not None: 0115 logodir = os.path.dirname(product.logo_url) 0116 if not os.path.isdir(logodir): 0117 os.mkdir(logodir) 0118 shutil.copy(product.logo_url_src, product.logo_url) 0119 generator.create_global_index(products) 0120 if args.qhp: 0121 logging.info('# Merge qch files') 0122 generator.create_qch(products, tagfiles) 0123 logging.info("# Writing metadata...") 0124 with open('metadata.json', 'w') as file: 0125 json.dump(metalist, file) 0126 libs = [] 0127 for lib in libraries: 0128 libs.append({"name": lib.name, "outputdir": lib.outputdir}) 0129 with open('outputs.json', 'w') as file: 0130 json.dump(libs, file) 0131 logging.info('# Done') 0132 finally: 0133 if args.keep_temp_dirs: 0134 logging.info(f'Kept temp dir at {tmp_dir}') 0135 else: 0136 shutil.rmtree(tmp_dir)