| #!/usr/bin/python3 |
| # |
| # Copyright 2017-2023 The Khronos Group Inc. |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| # Construct an HTML fragment indexing extension appendices in vkspec.html. |
| # This is run only when publishing an update spec, to update the Vulkan |
| # registry. |
| |
| import argparse,io,os,re,string,sys,copy |
| import xml.etree.ElementTree as etree |
| from apiconventions import APIConventions |
| |
| def listExts(vendor, ext, tag): |
| prefix = ' <li> <b> ' |
| suffix = ' </b> </li>' |
| |
| if vendor in tag: |
| desc = vendor + ' Extensions (' + tag[vendor] + ')' |
| else: |
| desc = vendor + ' Extensions (full vendor description unavailable)' |
| print(prefix, desc, suffix) |
| |
| # (OLD) Links to the extension appendix in the single-page HTML document. |
| # This is very slow to load. |
| # fmtString = ' <li> <a href="specs/1.3-extensions/html/vkspec.html#{0}"> {0} </a> </li>' |
| |
| # This links to the individual per-extension refpages, which are a |
| # slightly modified version of the extension appendices, and far faster |
| # to load. |
| if APIConventions().xml_api_name == 'vulkansc': |
| fmtString = ' <li> <a href="specs/1.0-extensions/man/html/{0}.html"> {0} </a> </li>' |
| else: |
| fmtString = ' <li> <a href="specs/1.3-extensions/man/html/{0}.html"> {0} </a> </li>' |
| |
| for name in sorted(ext[vendor]): |
| print(fmtString.format(name)) |
| |
| # -extension name - may be a single extension name, a a space-separated list |
| # of names, or a regular expression. |
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser() |
| |
| parser.add_argument('-registry', action='store', |
| default='vk.xml', |
| help='Use specified registry file instead of vk.xml') |
| parser.add_argument('-quiet', action='store_true', default=False, |
| help='Suppress script output during normal execution.') |
| |
| args = parser.parse_args() |
| |
| tree = etree.parse(args.registry) |
| |
| # Dictionary of vendor tags -> author name mappings |
| tag = {} |
| |
| # Loop over all vendor tags, tracking the full corresponding author name |
| for elem in tree.findall('tags/tag'): |
| vendor = elem.get('name') |
| author = elem.get('author') |
| |
| tag[vendor] = author |
| |
| # Dictionary of supported extensions, indexed by vendor prefix |
| ext = {} |
| |
| # Loop over all extensions, add supported names to the dictionary |
| for elem in tree.findall('extensions/extension'): |
| name = elem.get('name') |
| supported = elem.get('supported') |
| |
| if APIConventions().xml_api_name in supported.split(','): |
| # Relies on name being in the form VK_<vendor>_stuff |
| (vk, vendor) = name.split('_')[0:2] |
| |
| if not vendor in ext: |
| ext[vendor] = [] |
| ext[vendor].append(name) |
| |
| # Emit HTML fragment indexing the extensions |
| |
| print('<ul>') |
| |
| for vendor in ['KHR', 'EXT']: |
| if vendor in ext: |
| listExts(vendor, ext, tag) |
| del ext[vendor] |
| |
| for vendor in sorted(ext.keys()): |
| listExts(vendor, ext, tag) |
| del ext[vendor] |
| |
| print('</ul>') |