#!/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)
