help.py
136 lines
| 4.3 KiB
| text/x-python
|
PythonLexer
/ mercurial / help.py
Matt Mackall
|
r3795 | # help.py - help data for mercurial | ||
# | ||||
# Copyright 2006 Matt Mackall <mpm@selenic.com> | ||||
# | ||||
Martin Geisler
|
r8225 | # This software may be used and distributed according to the terms of the | ||
Matt Mackall
|
r10263 | # GNU General Public License version 2 or any later version. | ||
Matt Mackall
|
r3795 | |||
Martin Geisler
|
r9539 | from i18n import gettext, _ | ||
import sys, os | ||||
Benoit Boissinot
|
r9678 | import extensions | ||
Dan Villiom Podlaski Christiansen
|
r14168 | import util | ||
Cédric Duval
|
r8863 | |||
def moduledoc(file): | ||||
Cédric Duval
|
r8879 | '''return the top-level python documentation for the given file | ||
Matt Mackall
|
r10282 | Loosely inspired by pydoc.source_synopsis(), but rewritten to | ||
handle triple quotes and to return the whole text instead of just | ||||
the synopsis''' | ||||
Cédric Duval
|
r8863 | result = [] | ||
line = file.readline() | ||||
while line[:1] == '#' or not line.strip(): | ||||
line = file.readline() | ||||
Matt Mackall
|
r10282 | if not line: | ||
break | ||||
Cédric Duval
|
r8863 | |||
start = line[:3] | ||||
Matt Mackall
|
r12401 | if start == '"""' or start == "'''": | ||
Cédric Duval
|
r8863 | line = line[3:] | ||
while line: | ||||
if line.rstrip().endswith(start): | ||||
line = line.split(start)[0] | ||||
if line: | ||||
result.append(line) | ||||
break | ||||
elif not line: | ||||
return None # unmatched delimiter | ||||
result.append(line) | ||||
line = file.readline() | ||||
else: | ||||
return None | ||||
return ''.join(result) | ||||
Brodie Rao
|
r10364 | def listexts(header, exts, maxlength, indent=1): | ||
Cédric Duval
|
r8879 | '''return a text listing of the given extensions''' | ||
if not exts: | ||||
return '' | ||||
result = '\n%s\n\n' % header | ||||
for name, desc in sorted(exts.iteritems()): | ||||
Brodie Rao
|
r10364 | result += '%s%-*s %s\n' % (' ' * indent, maxlength + 2, | ||
':%s:' % name, desc) | ||||
Cédric Duval
|
r8864 | return result | ||
Cédric Duval
|
r8879 | def extshelp(): | ||
Martin Geisler
|
r9539 | doc = loaddoc('extensions')() | ||
Cédric Duval
|
r8863 | |||
Cédric Duval
|
r8871 | exts, maxlength = extensions.enabled() | ||
Cédric Duval
|
r8879 | doc += listexts(_('enabled extensions:'), exts, maxlength) | ||
Cédric Duval
|
r8864 | |||
Cédric Duval
|
r8871 | exts, maxlength = extensions.disabled() | ||
Cédric Duval
|
r8879 | doc += listexts(_('disabled extensions:'), exts, maxlength) | ||
Cédric Duval
|
r8863 | |||
return doc | ||||
Martin Geisler
|
r7013 | |||
Martin Geisler
|
r9539 | def loaddoc(topic): | ||
"""Return a delayed loader for help/topic.txt.""" | ||||
Matt Mackall
|
r3798 | |||
Martin Geisler
|
r9539 | def loader(): | ||
if hasattr(sys, 'frozen'): | ||||
module = sys.executable | ||||
else: | ||||
module = __file__ | ||||
base = os.path.dirname(module) | ||||
Dirkjan Ochtman
|
r7293 | |||
Martin Geisler
|
r9539 | for dir in ('.', '..'): | ||
docdir = os.path.join(base, dir, 'help') | ||||
if os.path.isdir(docdir): | ||||
break | ||||
Alexander Solovyov
|
r7677 | |||
Martin Geisler
|
r9539 | path = os.path.join(docdir, topic + ".txt") | ||
Dan Villiom Podlaski Christiansen
|
r14168 | doc = gettext(util.readfile(path)) | ||
Patrick Mezard
|
r12820 | for rewriter in helphooks.get(topic, []): | ||
doc = rewriter(topic, doc) | ||||
return doc | ||||
Martin Geisler
|
r9539 | return loader | ||
Alexander Solovyov
|
r7677 | |||
Yun Lee
|
r13888 | helptable = sorted([ | ||
Martin Geisler
|
r12145 | (["config", "hgrc"], _("Configuration Files"), loaddoc('config')), | ||
Martin Geisler
|
r9539 | (["dates"], _("Date Formats"), loaddoc('dates')), | ||
(["patterns"], _("File Name Patterns"), loaddoc('patterns')), | ||||
Matt Mackall
|
r10282 | (['environment', 'env'], _('Environment Variables'), | ||
loaddoc('environment')), | ||||
(['revs', 'revisions'], _('Specifying Single Revisions'), | ||||
loaddoc('revisions')), | ||||
(['mrevs', 'multirevs'], _('Specifying Multiple Revisions'), | ||||
loaddoc('multirevs')), | ||||
Martin Geisler
|
r12818 | (['revset', 'revsets'], _("Specifying Revision Sets"), loaddoc('revsets')), | ||
Martin Geisler
|
r9539 | (['diffs'], _('Diff Formats'), loaddoc('diffs')), | ||
Erik Zielke
|
r12771 | (['merge-tools'], _('Merge Tools'), loaddoc('merge-tools')), | ||
Matt Mackall
|
r10282 | (['templating', 'templates'], _('Template Usage'), | ||
loaddoc('templates')), | ||||
Martin Geisler
|
r9539 | (['urls'], _('URL Paths'), loaddoc('urls')), | ||
Cédric Duval
|
r8879 | (["extensions"], _("Using additional features"), extshelp), | ||
Yun Lee
|
r14044 | (["subrepo", "subrepos"], _("Subrepositories"), loaddoc('subrepos')), | ||
(["hgweb"], _("Configuring hgweb"), loaddoc('hgweb')), | ||||
(["glossary"], _("Glossary"), loaddoc('glossary')), | ||||
(["hgignore", "ignore"], _("syntax for Mercurial ignore files"), | ||||
loaddoc('hgignore')), | ||||
Yun Lee
|
r13888 | ]) | ||
Patrick Mezard
|
r12820 | |||
# Map topics to lists of callable taking the current topic help and | ||||
# returning the updated version | ||||
helphooks = { | ||||
} | ||||
def addtopichook(topic, rewriter): | ||||
helphooks.setdefault(topic, []).append(rewriter) | ||||
Patrick Mezard
|
r13593 | |||
def makeitemsdoc(topic, doc, marker, items): | ||||
"""Extract docstring from the items key to function mapping, build a | ||||
.single documentation block and use it to overwrite the marker in doc | ||||
""" | ||||
entries = [] | ||||
for name in sorted(items): | ||||
text = (items[name].__doc__ or '').rstrip() | ||||
if not text: | ||||
continue | ||||
text = gettext(text) | ||||
lines = text.splitlines() | ||||
lines[1:] = [(' ' + l.strip()) for l in lines[1:]] | ||||
entries.append('\n'.join(lines)) | ||||
entries = '\n\n'.join(entries) | ||||
return doc.replace(marker, entries) | ||||