File indexing completed on 2024-04-14 03:50:25

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)