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