docs: add ext-role for spec extension links
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Wed, 9 Nov 2022 10:05:18 +0000 (11:05 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 9 Nov 2022 16:10:55 +0000 (16:10 +0000)
This is a custom Sphinx role that generates links to GL and VK
extensions.

Reviewed-by: Eric Engestrom <eric@igalia.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19594>

docs/_exts/formatting.py

index cc6c471..c7322d4 100644 (file)
@@ -6,6 +6,9 @@
 import docutils.nodes
 import sphinx.addnodes
 
+from sphinx.util.nodes import split_explicit_title
+from docutils import nodes, utils
+
 def parse_envvar(env, sig, signode):
     envvar, t, default = sig.split(" ", 2)
     envvar = envvar.strip().upper()
@@ -26,8 +29,25 @@ def parse_opcode(env, sig, signode):
     signode += sphinx.addnodes.desc_annotation(desc, desc)
     return opcode
 
+
+def ext_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
+    text = utils.unescape(text)
+    has_explicit_title, title, ext = split_explicit_title(text)
+
+    parts = ext.split('_', 2)
+    if parts[0] == 'VK':
+        full_url = f'https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/{ext}.html'
+    elif parts[0] == 'GL':
+        full_url = f'https://registry.khronos.org/OpenGL/extensions/{parts[1]}/{parts[1]}_{parts[2]}.txt'
+    else:
+        raise Exception(f'Unexpected API: {parts[0]}')
+
+    pnode = nodes.reference(title, title, internal=False, refuri=full_url)
+    return [pnode], []
+
 def setup(app):
     app.add_object_type("envvar", "envvar", "%s (environment variable)",
         parse_envvar)
     app.add_object_type("opcode", "opcode", "%s (TGSI opcode)",
         parse_opcode)
+    app.add_role('ext', ext_role)