runrst
123 lines
| 3.5 KiB
| text/plain
|
TextLexer
/ doc / runrst
Gregory Szorc
|
r46434 | #!/usr/bin/env python3 | ||
Martin Geisler
|
r10971 | # | ||
# runrst - register custom roles and run correct writer | ||||
# | ||||
Raphaël Gomès
|
r47575 | # Copyright 2010 Olivia Mackall <olivia@selenic.com> and others | ||
Martin Geisler
|
r10971 | # | ||
# 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' | ||||
""" | ||||
Yuya Nishihara
|
r39508 | |||
Ludovic Chabant
|
r52914 | import re | ||
Martin Geisler
|
r10971 | import sys | ||
Gregory Szorc
|
r44089 | |||
Nicolas Dumazet
|
r11707 | try: | ||
Yuya Nishihara
|
r39508 | import docutils.core as core | ||
import docutils.nodes as nodes | ||||
import docutils.utils as utils | ||||
import docutils.parsers.rst.roles as roles | ||||
Nicolas Dumazet
|
r11707 | except ImportError: | ||
Gregory Szorc
|
r44089 | 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" | ||||
) | ||||
Nicolas Dumazet
|
r11707 | sys.exit(-1) | ||
Martin Geisler
|
r10972 | |||
Ludovic Chabant
|
r52914 | # 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 | ||||
Gregory Szorc
|
r44089 | |||
Gregory Szorc
|
r44088 | def role_hg(name, rawtext, text, lineno, inliner, options=None, content=None): | ||
Martin Geisler
|
r10974 | text = "hg " + utils.unescape(text) | ||
linktext = nodes.literal(rawtext, text) | ||||
parts = text.split() | ||||
cmd, args = parts[1], parts[2:] | ||||
Ludovic Chabant
|
r52914 | refuri = make_cmd_ref_uri(cmd) | ||
Martin Geisler
|
r10974 | if cmd == 'help' and args: | ||
FUJIWARA Katsunori
|
r28075 | if args[0] == 'config': | ||
# :hg:`help config` | ||||
refuri = "hgrc.5.html" | ||||
FUJIWARA Katsunori
|
r28076 | elif args[0].startswith('config.'): | ||
# :hg:`help config.SECTION...` | ||||
refuri = "hgrc.5.html#%s" % args[0].split('.', 2)[1] | ||||
FUJIWARA Katsunori
|
r28075 | elif len(args) >= 2 and args[0] == '-c': | ||
# :hg:`help -c COMMAND ...` is equivalent to :hg:`COMMAND` | ||||
# (mainly for :hg:`help -c config`) | ||||
Ludovic Chabant
|
r52914 | refuri = make_cmd_ref_uri(args[1]) | ||
FUJIWARA Katsunori
|
r28075 | else: | ||
Ludovic Chabant
|
r52914 | refuri = make_any_ref_uri(args[0]) | ||
Gregory Szorc
|
r44089 | node = nodes.reference(rawtext, '', linktext, refuri=refuri) | ||
Martin Geisler
|
r10972 | return [node], [] | ||
Gregory Szorc
|
r44089 | |||
Martin Geisler
|
r10972 | roles.register_local_role("hg", role_hg) | ||
Martin Geisler
|
r10971 | |||
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] | ||||
Ludovic Chabant
|
r52914 | if sys.argv[1] == '--hg-individual-pages': | ||
is_individual_pages_mode = True | ||||
del sys.argv[1] | ||||
Yuya Nishihara
|
r39508 | core.publish_cmdline(writer_name=writer) | ||