doc/runrst
author Raphaël Gomès <rgomes@octobus.net>
Mon, 30 Sep 2024 17:46:24 +0200
changeset 52035 babfa9ddca0e
parent 52021 2a875530a023
permissions -rwxr-xr-x
rust-repo: add a method to get a `Node` from a `Revision` to the `Repo` This is going to be more and more useful as we start writing higher-level code
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45830
c102b704edb5 global: use python3 in shebangs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43691
diff changeset
     1
#!/usr/bin/env python3
10971
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
     2
#
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
     3
# runrst - register custom roles and run correct writer
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
     4
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 45830
diff changeset
     5
# Copyright 2010 Olivia Mackall <olivia@selenic.com> and others
10971
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
     6
#
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
     7
# This software may be used and distributed according to the terms of the
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
     8
# GNU General Public License version 2 or any later version.
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
     9
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
    10
"""usage: %s WRITER args...
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
    11
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
    12
where WRITER is the name of a Docutils writer such as 'html' or 'manpage'
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
    13
"""
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
    14
39472
4e4fae1dda5c doc: use modern import style in runrst
Yuya Nishihara <yuya@tcha.org>
parents: 28076
diff changeset
    15
52021
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    16
import re
10971
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
    17
import sys
43691
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
    18
11707
13d79a7bf5b7 runrst: try to be more helpful if docutils is not installed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10974
diff changeset
    19
try:
39472
4e4fae1dda5c doc: use modern import style in runrst
Yuya Nishihara <yuya@tcha.org>
parents: 28076
diff changeset
    20
    import docutils.core as core
4e4fae1dda5c doc: use modern import style in runrst
Yuya Nishihara <yuya@tcha.org>
parents: 28076
diff changeset
    21
    import docutils.nodes as nodes
4e4fae1dda5c doc: use modern import style in runrst
Yuya Nishihara <yuya@tcha.org>
parents: 28076
diff changeset
    22
    import docutils.utils as utils
4e4fae1dda5c doc: use modern import style in runrst
Yuya Nishihara <yuya@tcha.org>
parents: 28076
diff changeset
    23
    import docutils.parsers.rst.roles as roles
11707
13d79a7bf5b7 runrst: try to be more helpful if docutils is not installed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10974
diff changeset
    24
except ImportError:
43691
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
    25
    sys.stderr.write(
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
    26
        "abort: couldn't generate documentation: docutils "
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
    27
        "module is missing\n"
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
    28
    )
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
    29
    sys.stderr.write(
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
    30
        "please install python-docutils or see "
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
    31
        "http://docutils.sourceforge.net/\n"
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
    32
    )
11707
13d79a7bf5b7 runrst: try to be more helpful if docutils is not installed
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10974
diff changeset
    33
    sys.exit(-1)
10972
0a2c6948f5f4 doc, minirst: support hg interpreted text role
Martin Geisler <mg@aragost.com>
parents: 10971
diff changeset
    34
52021
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    35
# Whether we are rendering a help page for a single topic.
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    36
# If false, we are rendering a monolithic page with all topics together.
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    37
is_individual_pages_mode = False
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    38
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    39
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    40
def make_cmd_ref_uri(cmd):
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    41
    if is_individual_pages_mode:
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    42
        return "hg-%s.html" % cmd
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    43
    else:
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    44
        return "hg.1.html#%s" % cmd
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    45
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    46
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    47
known_refs = None
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    48
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    49
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    50
def load_known_refs(fname):
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    51
    try:
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    52
        with open(fname, 'r') as fp:
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    53
            text = fp.read()
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    54
            return re.split(r'[ \n]+', text)
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    55
    except OSError:
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    56
        sys.stderr.write(
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    57
            "abort: couldn't find '%', please run documentation generation "
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    58
            "through the Makefile, or run 'make knownrefs'\n"
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    59
        )
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    60
        sys.exit(-1)
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    61
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    62
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    63
def find_known_ref(ref):
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    64
    global known_refs
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    65
    if known_refs is None:
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    66
        cmds = load_known_refs('commandlist.txt')
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    67
        topics = load_known_refs('topiclist.txt')
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    68
        exts = load_known_refs('extensionlist.txt')
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    69
        known_refs = {'hg': cmds, 'topic': topics, 'ext': exts}
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    70
    for reftype, refnames in known_refs.items():
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    71
        if ref in refnames:
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    72
            return reftype
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    73
    return None
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    74
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    75
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    76
def make_any_ref_uri(ref):
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    77
    if is_individual_pages_mode:
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    78
        # Try to find if ref is a command, topic, or extension. If not,
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    79
        # reference the anchor in the main hg.1 help page.
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    80
        reftype = find_known_ref(ref)
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    81
        if reftype:
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    82
            return '%s-%s.html' % (reftype, ref)
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    83
    return "hg.1.html#%s" % ref
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    84
43691
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
    85
43690
15cccbacd5ce doc: don't use mutable default arguments
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39472
diff changeset
    86
def role_hg(name, rawtext, text, lineno, inliner, options=None, content=None):
10974
854ac04d712c doc: make links for hg role
Martin Geisler <mg@aragost.com>
parents: 10972
diff changeset
    87
    text = "hg " + utils.unescape(text)
854ac04d712c doc: make links for hg role
Martin Geisler <mg@aragost.com>
parents: 10972
diff changeset
    88
    linktext = nodes.literal(rawtext, text)
854ac04d712c doc: make links for hg role
Martin Geisler <mg@aragost.com>
parents: 10972
diff changeset
    89
    parts = text.split()
854ac04d712c doc: make links for hg role
Martin Geisler <mg@aragost.com>
parents: 10972
diff changeset
    90
    cmd, args = parts[1], parts[2:]
52021
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
    91
    refuri = make_cmd_ref_uri(cmd)
10974
854ac04d712c doc: make links for hg role
Martin Geisler <mg@aragost.com>
parents: 10972
diff changeset
    92
    if cmd == 'help' and args:
28075
63eae465095e doc: translate from :hg:`help config` to a valid link to hgrc.5.html
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15314
diff changeset
    93
        if args[0] == 'config':
63eae465095e doc: translate from :hg:`help config` to a valid link to hgrc.5.html
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15314
diff changeset
    94
            # :hg:`help config`
63eae465095e doc: translate from :hg:`help config` to a valid link to hgrc.5.html
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15314
diff changeset
    95
            refuri = "hgrc.5.html"
28076
18c6b271579b doc: translate from :hg:`help config.SECTION` to a valid link to hgrc.5.html
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28075
diff changeset
    96
        elif args[0].startswith('config.'):
18c6b271579b doc: translate from :hg:`help config.SECTION` to a valid link to hgrc.5.html
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28075
diff changeset
    97
            # :hg:`help config.SECTION...`
18c6b271579b doc: translate from :hg:`help config.SECTION` to a valid link to hgrc.5.html
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28075
diff changeset
    98
            refuri = "hgrc.5.html#%s" % args[0].split('.', 2)[1]
28075
63eae465095e doc: translate from :hg:`help config` to a valid link to hgrc.5.html
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15314
diff changeset
    99
        elif len(args) >= 2 and args[0] == '-c':
63eae465095e doc: translate from :hg:`help config` to a valid link to hgrc.5.html
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15314
diff changeset
   100
            # :hg:`help -c COMMAND ...` is equivalent to :hg:`COMMAND`
63eae465095e doc: translate from :hg:`help config` to a valid link to hgrc.5.html
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15314
diff changeset
   101
            # (mainly for :hg:`help -c config`)
52021
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
   102
            refuri = make_cmd_ref_uri(args[1])
28075
63eae465095e doc: translate from :hg:`help config` to a valid link to hgrc.5.html
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15314
diff changeset
   103
        else:
52021
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
   104
            refuri = make_any_ref_uri(args[0])
43691
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
   105
    node = nodes.reference(rawtext, '', linktext, refuri=refuri)
10972
0a2c6948f5f4 doc, minirst: support hg interpreted text role
Martin Geisler <mg@aragost.com>
parents: 10971
diff changeset
   106
    return [node], []
0a2c6948f5f4 doc, minirst: support hg interpreted text role
Martin Geisler <mg@aragost.com>
parents: 10971
diff changeset
   107
43691
47ef023d0165 black: blacken scripts
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43690
diff changeset
   108
10972
0a2c6948f5f4 doc, minirst: support hg interpreted text role
Martin Geisler <mg@aragost.com>
parents: 10971
diff changeset
   109
roles.register_local_role("hg", role_hg)
10971
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
   110
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
   111
if __name__ == "__main__":
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
   112
    if len(sys.argv) < 2:
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
   113
        sys.stderr.write(__doc__ % sys.argv[0])
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
   114
        sys.exit(1)
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
   115
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
   116
    writer = sys.argv[1]
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
   117
    del sys.argv[1]
cbe400a8e217 doc: add generic frontend to rst2man and rst2html
Martin Geisler <mg@aragost.com>
parents:
diff changeset
   118
52021
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
   119
    if sys.argv[1] == '--hg-individual-pages':
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
   120
        is_individual_pages_mode = True
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
   121
        del sys.argv[1]
2a875530a023 doc: generate separate commands/topics/extension pages
Ludovic Chabant <ludovic@chabant.com>
parents: 48875
diff changeset
   122
39472
4e4fae1dda5c doc: use modern import style in runrst
Yuya Nishihara <yuya@tcha.org>
parents: 28076
diff changeset
   123
    core.publish_cmdline(writer_name=writer)