Allow multiple conf files to be processed for cross-references

This commit is contained in:
Kovid Goyal
2018-06-04 11:08:11 +05:30
parent fd731feacc
commit f7fe59dfbe

View File

@@ -7,12 +7,14 @@
# http://www.sphinx-doc.org/en/master/config # http://www.sphinx-doc.org/en/master/config
import os import os
import re
import subprocess import subprocess
from collections import defaultdict from collections import defaultdict
from functools import partial from functools import partial
from docutils import nodes from docutils import nodes
from docutils.parsers.rst.roles import set_classes from docutils.parsers.rst.roles import set_classes
from sphinx import addnodes
def create_shortcut_defs(): def create_shortcut_defs():
@@ -313,7 +315,41 @@ def render_group(a, group):
a('') a('')
def render_conf(ref_prefix, all_options): def expand_opt_references(conf_name, text):
conf_name += '.'
def expand(m):
ref = m.group(1)
if '<' not in ref and '.' not in ref:
full_ref = conf_name + ref
return ':opt:`{} <{}>`'.format(ref, full_ref)
return m.group()
return re.sub(r':opt:`(.+?)`', expand, text)
def parse_opt_node(env, sig, signode):
"""Transform an option description into RST nodes."""
count = 0
firstname = ''
for potential_option in sig.split(', '):
optname = potential_option.strip()
if count:
signode += addnodes.desc_addname(', ', ', ')
text = optname.split('.', 1)[-1]
signode += addnodes.desc_name(text, text)
if not count:
firstname = optname
signode['allnames'] = [optname]
else:
signode['allnames'].append(optname)
count += 1
if not firstname:
raise ValueError('{} is not a valid opt'.format(sig))
return firstname
def render_conf(conf_name, all_options):
from kitty.conf.definition import merged_opts from kitty.conf.definition import merged_opts
ans = ['.. default-domain:: conf', ''] ans = ['.. default-domain:: conf', '']
a = ans.append a = ans.append
@@ -328,7 +364,7 @@ def render_conf(ref_prefix, all_options):
current_group = opt.group current_group = opt.group
render_group(a, current_group) render_group(a, current_group)
mopts = list(merged_opts(all_options, opt, i)) mopts = list(merged_opts(all_options, opt, i))
a('.. opt:: ' + ', '.join(mo.name for mo in mopts)) a('.. opt:: ' + ', '.join(conf_name + '.' + mo.name for mo in mopts))
a('.. code-block:: ini') a('.. code-block:: ini')
a('') a('')
sz = max(len(x.name) for x in mopts) sz = max(len(x.name) for x in mopts)
@@ -336,13 +372,30 @@ def render_conf(ref_prefix, all_options):
a((' {:%ds} {}' % sz).format(mo.name, mo.defval_as_string)) a((' {:%ds} {}' % sz).format(mo.name, mo.defval_as_string))
a('') a('')
if opt.long_text: if opt.long_text:
a(opt.long_text) a(expand_opt_references(conf_name, opt.long_text))
a('') a('')
return '\n'.join(ans) return '\n'.join(ans)
def write_conf_docs(): def process_opt_link(env, refnode, has_explicit_title, title, target):
conf_name, opt = target.partition('.')[::2]
if not opt:
conf_name, opt = 'kitty', conf_name
return title, conf_name + '.' + opt
def write_conf_docs(app):
app.add_object_type(
'opt', 'opt',
indextemplate="pair: %s; Config Setting",
parse_node=parse_opt_node,
)
# Warn about opt references that could not be resolved
opt_role = app.registry.domain_roles['std']['opt']
opt_role.warn_dangling = True
opt_role.process_link = process_opt_link
from kitty.config_data import all_options from kitty.config_data import all_options
with open('generated/conf-kitty.rst', 'w', encoding='utf-8') as f: with open('generated/conf-kitty.rst', 'w', encoding='utf-8') as f:
print('.. highlight:: ini\n', file=f) print('.. highlight:: ini\n', file=f)
@@ -358,15 +411,8 @@ def setup(app):
except FileExistsError: except FileExistsError:
pass pass
write_cli_docs() write_cli_docs()
write_conf_docs() write_conf_docs(app)
app.add_role('iss', partial(num_role, 'issues')) app.add_role('iss', partial(num_role, 'issues'))
app.add_role('pull', partial(num_role, 'pull')) app.add_role('pull', partial(num_role, 'pull'))
app.add_role('commit', commit_role) app.add_role('commit', commit_role)
app.connect('html-page-context', add_html_context) app.connect('html-page-context', add_html_context)
app.add_object_type(
'opt', 'opt',
indextemplate="pair: %s; Config Setting"
)
# Warn about opt references that could not be resolved
app.registry.domain_roles['std']['opt'].warn_dangling = True