doc/gendoc.py
author Martin Geisler <mg@daimi.au.dk>
Tue, 09 Sep 2008 21:32:39 +0200
changeset 7012 78341ea65d16
parent 6654 2713e42dcf4e
child 7014 46456a51e247
permissions -rw-r--r--
restructure helptable When looking up a help topic, the key is now only matched against the short names for each topic, and not the header. So hg help 'Environment Variables' must be replaced with hg help env

import sys, textwrap
# import from the live mercurial repo
sys.path.insert(0, "..")
from mercurial import demandimport; demandimport.enable()
from mercurial.commands import table, globalopts
from mercurial.i18n import gettext as _
from mercurial.help import helptable

def get_desc(docstr):
    if not docstr:
        return "", ""
    # sanitize
    docstr = docstr.strip("\n")
    docstr = docstr.rstrip()
    shortdesc = docstr.splitlines()[0].strip()

    i = docstr.find("\n")
    if i != -1:
        desc = docstr[i+2:]
    else:
        desc = "    %s" % shortdesc
    return (shortdesc, desc)

def get_opts(opts):
    for shortopt, longopt, default, desc in opts:
        allopts = []
        if shortopt:
            allopts.append("-%s" % shortopt)
        if longopt:
            allopts.append("--%s" % longopt)
        desc += default and _(" (default: %s)") % default or ""
        yield(", ".join(allopts), desc)

def get_cmd(cmd):
    d = {}
    attr = table[cmd]
    cmds = cmd.lstrip("^").split("|")

    d['synopsis'] = attr[2]
    d['cmd'] = cmds[0]
    d['aliases'] = cmd.split("|")[1:]
    d['desc'] = get_desc(attr[0].__doc__)
    d['opts'] = list(get_opts(attr[1]))
    return d


def show_doc(ui):
    def bold(s, text=""):
        ui.write("%s\n%s\n%s\n" % (s, "="*len(s), text))
    def underlined(s, text=""):
        ui.write("%s\n%s\n%s\n" % (s, "-"*len(s), text))

    # print options
    underlined(_("OPTIONS"))
    for optstr, desc in get_opts(globalopts):
        ui.write("%s::\n    %s\n\n" % (optstr, desc))

    # print cmds
    underlined(_("COMMANDS"))
    h = {}
    for c, attr in table.items():
        f = c.split("|")[0]
        f = f.lstrip("^")
        h[f] = c
    cmds = h.keys()
    cmds.sort()

    for f in cmds:
        if f.startswith("debug"): continue
        d = get_cmd(h[f])
        # synopsis
        ui.write("[[%s]]\n" % d['cmd'])
        ui.write("%s::\n" % d['synopsis'].replace("hg ","", 1))
        # description
        ui.write("%s\n\n" % d['desc'][1])
        # options
        opt_output = list(d['opts'])
        if opt_output:
            opts_len = max([len(line[0]) for line in opt_output])
            ui.write(_("    options:\n"))
            for optstr, desc in opt_output:
                if desc:
                    s = "%-*s  %s" % (opts_len, optstr, desc)
                else:
                    s = optstr
                s = textwrap.fill(s, initial_indent=4 * " ",
                                  subsequent_indent=(6 + opts_len) * " ")
                ui.write("%s\n" % s)
            ui.write("\n")
        # aliases
        if d['aliases']:
            ui.write(_("    aliases: %s\n\n") % " ".join(d['aliases']))

    # print topics
    for names, section, doc in helptable:
        underlined(_(section).upper())
        if callable(doc):
            doc = doc()
        ui.write(_(doc))
        ui.write("\n")

if __name__ == "__main__":
    show_doc(sys.stdout)