|
|
#!/usr/bin/env python3
|
|
|
#
|
|
|
# runrst - register custom roles and run correct writer
|
|
|
#
|
|
|
# Copyright 2010 Olivia Mackall <olivia@selenic.com> and others
|
|
|
#
|
|
|
# This software may be used and distributed according to the terms of the
|
|
|
# GNU General Public License version 2 or any later version.
|
|
|
|
|
|
"""usage: %s WRITER args...
|
|
|
|
|
|
where WRITER is the name of a Docutils writer such as 'html' or 'manpage'
|
|
|
"""
|
|
|
|
|
|
|
|
|
import re
|
|
|
import sys
|
|
|
|
|
|
try:
|
|
|
import docutils.core as core
|
|
|
import docutils.nodes as nodes
|
|
|
import docutils.utils as utils
|
|
|
import docutils.parsers.rst.roles as roles
|
|
|
except ImportError:
|
|
|
sys.stderr.write(
|
|
|
"abort: couldn't generate documentation: docutils "
|
|
|
"module is missing\n"
|
|
|
)
|
|
|
sys.stderr.write(
|
|
|
"please install python-docutils or see "
|
|
|
"http://docutils.sourceforge.net/\n"
|
|
|
)
|
|
|
sys.exit(-1)
|
|
|
|
|
|
# Whether we are rendering a help page for a single topic.
|
|
|
# If false, we are rendering a monolithic page with all topics together.
|
|
|
is_individual_pages_mode = False
|
|
|
|
|
|
|
|
|
def make_cmd_ref_uri(cmd):
|
|
|
if is_individual_pages_mode:
|
|
|
return "hg-%s.html" % cmd
|
|
|
else:
|
|
|
return "hg.1.html#%s" % cmd
|
|
|
|
|
|
|
|
|
known_refs = None
|
|
|
|
|
|
|
|
|
def load_known_refs(fname):
|
|
|
try:
|
|
|
with open(fname, 'r') as fp:
|
|
|
text = fp.read()
|
|
|
return re.split(r'[ \n]+', text)
|
|
|
except OSError:
|
|
|
sys.stderr.write(
|
|
|
"abort: couldn't find '%', please run documentation generation "
|
|
|
"through the Makefile, or run 'make knownrefs'\n"
|
|
|
)
|
|
|
sys.exit(-1)
|
|
|
|
|
|
|
|
|
def find_known_ref(ref):
|
|
|
global known_refs
|
|
|
if known_refs is None:
|
|
|
cmds = load_known_refs('commandlist.txt')
|
|
|
topics = load_known_refs('topiclist.txt')
|
|
|
exts = load_known_refs('extensionlist.txt')
|
|
|
known_refs = {'hg': cmds, 'topic': topics, 'ext': exts}
|
|
|
for reftype, refnames in known_refs.items():
|
|
|
if ref in refnames:
|
|
|
return reftype
|
|
|
return None
|
|
|
|
|
|
|
|
|
def make_any_ref_uri(ref):
|
|
|
if is_individual_pages_mode:
|
|
|
# Try to find if ref is a command, topic, or extension. If not,
|
|
|
# reference the anchor in the main hg.1 help page.
|
|
|
reftype = find_known_ref(ref)
|
|
|
if reftype:
|
|
|
return '%s-%s.html' % (reftype, ref)
|
|
|
return "hg.1.html#%s" % ref
|
|
|
|
|
|
|
|
|
def role_hg(name, rawtext, text, lineno, inliner, options=None, content=None):
|
|
|
text = "hg " + utils.unescape(text)
|
|
|
linktext = nodes.literal(rawtext, text)
|
|
|
parts = text.split()
|
|
|
cmd, args = parts[1], parts[2:]
|
|
|
refuri = make_cmd_ref_uri(cmd)
|
|
|
if cmd == 'help' and args:
|
|
|
if args[0] == 'config':
|
|
|
# :hg:`help config`
|
|
|
refuri = "hgrc.5.html"
|
|
|
elif args[0].startswith('config.'):
|
|
|
# :hg:`help config.SECTION...`
|
|
|
refuri = "hgrc.5.html#%s" % args[0].split('.', 2)[1]
|
|
|
elif len(args) >= 2 and args[0] == '-c':
|
|
|
# :hg:`help -c COMMAND ...` is equivalent to :hg:`COMMAND`
|
|
|
# (mainly for :hg:`help -c config`)
|
|
|
refuri = make_cmd_ref_uri(args[1])
|
|
|
else:
|
|
|
refuri = make_any_ref_uri(args[0])
|
|
|
node = nodes.reference(rawtext, '', linktext, refuri=refuri)
|
|
|
return [node], []
|
|
|
|
|
|
|
|
|
roles.register_local_role("hg", role_hg)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
if len(sys.argv) < 2:
|
|
|
sys.stderr.write(__doc__ % sys.argv[0])
|
|
|
sys.exit(1)
|
|
|
|
|
|
writer = sys.argv[1]
|
|
|
del sys.argv[1]
|
|
|
|
|
|
if sys.argv[1] == '--hg-individual-pages':
|
|
|
is_individual_pages_mode = True
|
|
|
del sys.argv[1]
|
|
|
|
|
|
core.publish_cmdline(writer_name=writer)
|
|
|
|