1e5c31af7Sopenharmony_ci#!/usr/bin/python3
2e5c31af7Sopenharmony_ci#
3e5c31af7Sopenharmony_ci# Copyright 2017-2024 The Khronos Group Inc.
4e5c31af7Sopenharmony_ci#
5e5c31af7Sopenharmony_ci# SPDX-License-Identifier: Apache-2.0
6e5c31af7Sopenharmony_ci
7e5c31af7Sopenharmony_ci# Construct an HTML fragment indexing extension appendices in vkspec.html.
8e5c31af7Sopenharmony_ci# This is run only when publishing an update spec, to update the Vulkan
9e5c31af7Sopenharmony_ci# registry.
10e5c31af7Sopenharmony_ci
11e5c31af7Sopenharmony_ciimport argparse,io,os,re,string,sys,copy
12e5c31af7Sopenharmony_ciimport xml.etree.ElementTree as etree
13e5c31af7Sopenharmony_cifrom apiconventions import APIConventions
14e5c31af7Sopenharmony_ci
15e5c31af7Sopenharmony_cidef listExts(vendor, ext, tag):
16e5c31af7Sopenharmony_ci    prefix = '    <li> <b> '
17e5c31af7Sopenharmony_ci    suffix = ' </b> </li>'
18e5c31af7Sopenharmony_ci
19e5c31af7Sopenharmony_ci    if vendor in tag:
20e5c31af7Sopenharmony_ci        desc = vendor + ' Extensions (' + tag[vendor] + ')'
21e5c31af7Sopenharmony_ci    else:
22e5c31af7Sopenharmony_ci        desc = vendor + ' Extensions (full vendor description unavailable)'
23e5c31af7Sopenharmony_ci    print(prefix, desc, suffix)
24e5c31af7Sopenharmony_ci
25e5c31af7Sopenharmony_ci    # (OLD) Links to the extension appendix in the single-page HTML document.
26e5c31af7Sopenharmony_ci    # This is very slow to load.
27e5c31af7Sopenharmony_ci    # fmtString = '    <li> <a href="specs/1.3-extensions/html/vkspec.html#{0}"> {0} </a> </li>'
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_ci    # This links to the individual per-extension refpages, which are a
30e5c31af7Sopenharmony_ci    # slightly modified version of the extension appendices, and far faster
31e5c31af7Sopenharmony_ci    # to load.
32e5c31af7Sopenharmony_ci    if APIConventions().xml_api_name == 'vulkansc':
33e5c31af7Sopenharmony_ci        fmtString = '    <li> <a href="specs/1.0-extensions/man/html/{0}.html"> {0} </a> </li>'
34e5c31af7Sopenharmony_ci    else:
35e5c31af7Sopenharmony_ci        fmtString = '    <li> <a href="specs/1.3-extensions/man/html/{0}.html"> {0} </a> </li>'
36e5c31af7Sopenharmony_ci
37e5c31af7Sopenharmony_ci    for name in sorted(ext[vendor]):
38e5c31af7Sopenharmony_ci        print(fmtString.format(name))
39e5c31af7Sopenharmony_ci
40e5c31af7Sopenharmony_ci# -extension name - may be a single extension name, a a space-separated list
41e5c31af7Sopenharmony_ci# of names, or a regular expression.
42e5c31af7Sopenharmony_ciif __name__ == '__main__':
43e5c31af7Sopenharmony_ci    parser = argparse.ArgumentParser()
44e5c31af7Sopenharmony_ci
45e5c31af7Sopenharmony_ci    parser.add_argument('-registry', action='store',
46e5c31af7Sopenharmony_ci                        default='vk.xml',
47e5c31af7Sopenharmony_ci                        help='Use specified registry file instead of vk.xml')
48e5c31af7Sopenharmony_ci    parser.add_argument('-quiet', action='store_true', default=False,
49e5c31af7Sopenharmony_ci                        help='Suppress script output during normal execution.')
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_ci    args = parser.parse_args()
52e5c31af7Sopenharmony_ci
53e5c31af7Sopenharmony_ci    tree = etree.parse(args.registry)
54e5c31af7Sopenharmony_ci
55e5c31af7Sopenharmony_ci    # Dictionary of vendor tags -> author name mappings
56e5c31af7Sopenharmony_ci    tag = {}
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci    # Loop over all vendor tags, tracking the full corresponding author name
59e5c31af7Sopenharmony_ci    for elem in tree.findall('tags/tag'):
60e5c31af7Sopenharmony_ci        vendor = elem.get('name')
61e5c31af7Sopenharmony_ci        author = elem.get('author')
62e5c31af7Sopenharmony_ci
63e5c31af7Sopenharmony_ci        tag[vendor] = author
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_ci    # Dictionary of supported extensions, indexed by vendor prefix
66e5c31af7Sopenharmony_ci    ext = {}
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_ci    # Loop over all extensions, add supported names to the dictionary
69e5c31af7Sopenharmony_ci    for elem in tree.findall('extensions/extension'):
70e5c31af7Sopenharmony_ci        name = elem.get('name')
71e5c31af7Sopenharmony_ci        supported = elem.get('supported')
72e5c31af7Sopenharmony_ci
73e5c31af7Sopenharmony_ci        if APIConventions().xml_api_name in supported.split(','):
74e5c31af7Sopenharmony_ci            # Relies on name being in the form VK_<vendor>_stuff
75e5c31af7Sopenharmony_ci            (vk, vendor) = name.split('_')[0:2]
76e5c31af7Sopenharmony_ci
77e5c31af7Sopenharmony_ci            if not vendor in ext:
78e5c31af7Sopenharmony_ci                ext[vendor] = []
79e5c31af7Sopenharmony_ci            ext[vendor].append(name)
80e5c31af7Sopenharmony_ci
81e5c31af7Sopenharmony_ci    # Emit HTML fragment indexing the extensions
82e5c31af7Sopenharmony_ci
83e5c31af7Sopenharmony_ci    print('<ul>')
84e5c31af7Sopenharmony_ci
85e5c31af7Sopenharmony_ci    for vendor in ['KHR', 'EXT']:
86e5c31af7Sopenharmony_ci        if vendor in ext:
87e5c31af7Sopenharmony_ci            listExts(vendor, ext, tag)
88e5c31af7Sopenharmony_ci            del ext[vendor]
89e5c31af7Sopenharmony_ci
90e5c31af7Sopenharmony_ci    for vendor in sorted(ext.keys()):
91e5c31af7Sopenharmony_ci        listExts(vendor, ext, tag)
92e5c31af7Sopenharmony_ci        del ext[vendor]
93e5c31af7Sopenharmony_ci
94e5c31af7Sopenharmony_ci    print('</ul>')
95