~bzr-pqm/bzr/bzr.dev

4070.11.16 by Martin Pool
Fix copyrights and remove assert statement from doc_generate
1
# Copyright (C) 2006-2007 Canonical Ltd
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
16
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
17
"""Generate ReStructuredText source for the User Reference Manual.
18
Loosely based on the manpage generator autodoc_man.py.
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
19
2677.1.4 by Alexander Belchenko
fixes after John's review
20
Written by the Bazaar community.
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
21
"""
22
23
import os
24
import sys
25
import time
26
27
import bzrlib
28
import bzrlib.help
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
29
import bzrlib.help_topics
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
30
import bzrlib.commands
3089.3.16 by Ian Clatworthy
Dump help topics into text files in doc/en/user-reference
31
import bzrlib.osutils
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
32
33
34
def get_filename(options):
35
    """Provides name of manual"""
36
    return "%s_man.txt" % (options.bzr_name)
37
38
39
def infogen(options, outfile):
40
    """Create manual in RSTX format"""
41
    t = time.time()
42
    tt = time.gmtime(t)
43
    params = \
44
           { "bzrcmd": options.bzr_name,
45
             "datestamp": time.strftime("%Y-%m-%d",tt),
46
             "timestamp": time.strftime("%Y-%m-%d %H:%M:%S +0000",tt),
47
             "version": bzrlib.__version__,
48
             }
3089.3.17 by Ian Clatworthy
Fix case where filename not given
49
    nominated_filename = getattr(options, 'filename', None)
3089.3.16 by Ian Clatworthy
Dump help topics into text files in doc/en/user-reference
50
    if nominated_filename is None:
51
        topic_dir = None
52
    else:
53
        topic_dir = bzrlib.osutils.dirname(nominated_filename)
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
54
    outfile.write(rstx_preamble % params)
55
    outfile.write(rstx_head % params)
3089.3.16 by Ian Clatworthy
Dump help topics into text files in doc/en/user-reference
56
    outfile.write(_get_body(params, topic_dir))
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
57
    outfile.write(rstx_foot % params)
58
59
3089.3.16 by Ian Clatworthy
Dump help topics into text files in doc/en/user-reference
60
def _get_body(params, topic_dir):
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
61
    """Build the manual content."""
62
    from bzrlib.help_topics import SECT_CONCEPT, SECT_LIST, SECT_PLUGIN
63
    registry = bzrlib.help_topics.topic_registry
64
    result = []
3089.3.16 by Ian Clatworthy
Dump help topics into text files in doc/en/user-reference
65
    result.append(_get_section(registry, SECT_CONCEPT, "Concepts",
66
        output_dir=topic_dir))
67
    result.append(_get_section(registry, SECT_LIST, "Lists",
68
        output_dir=topic_dir))
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
69
    result.append(_get_commands_section(registry))
3089.3.16 by Ian Clatworthy
Dump help topics into text files in doc/en/user-reference
70
    #result.append(_get_section(registry, SECT_PLUGIN, "Standard Plug-ins"))
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
71
    return "\n".join(result)
72
73
3089.3.16 by Ian Clatworthy
Dump help topics into text files in doc/en/user-reference
74
def _get_section(registry, section, title, hdg_level1="#", hdg_level2="=",
75
        output_dir=None):
76
    """Build the manual part from topics matching that section.
77
    
78
    If output_dir is not None, topics are dumped into text files there
79
    during processing, as well as being included in the return result.
80
    """
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
81
    topics = sorted(registry.get_topics_for_section(section))
82
    lines = [title, hdg_level1 * len(title), ""]
2677.1.4 by Alexander Belchenko
fixes after John's review
83
84
    # docutils treats section heading as implicit link target.
85
    # But in some cases topic and heading are different, e.g.:
86
    #
87
    # `bugs' vs. `Bug Trackers'
88
    # `working-tree' vs. `Working Trees'
89
    #
90
    # So for building proper cross-reference between topic names
91
    # and corresponding sections in document, we need provide
92
    # simple glue in the form:
93
    #
94
    # .. _topic: `heading`_
95
    links_glue = []
96
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
97
    for topic in topics:
98
        help = registry.get_detail(topic)
99
        heading,text = help.split("\n", 1)
100
        lines.append(heading)
3089.3.1 by Ian Clatworthy
move reference material out of User Guide into User Reference
101
        if not text.startswith(hdg_level2):
102
            lines.append(hdg_level2 * len(heading))
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
103
        lines.append(text)
104
        lines.append('')
2677.1.4 by Alexander Belchenko
fixes after John's review
105
        # check that topic match heading
2677.1.2 by Alexander Belchenko
bzr_man: see also topics as cross-reference links
106
        if topic != heading.lower():
2677.1.4 by Alexander Belchenko
fixes after John's review
107
            links_glue.append((topic, heading))
3089.3.16 by Ian Clatworthy
Dump help topics into text files in doc/en/user-reference
108
        # dump the text if requested
109
        if output_dir is not None:
110
            out_file = bzrlib.osutils.pathjoin(output_dir, topic + ".txt")
111
            _dump_text(out_file, help)
2677.1.4 by Alexander Belchenko
fixes after John's review
112
113
    # provide links glue for topics that don't match headings
114
    lines.extend([".. _%s: `%s`_" % i for i in links_glue])
115
    lines.append('')
116
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
117
    return "\n" + "\n".join(lines) + "\n"
118
119
3089.3.16 by Ian Clatworthy
Dump help topics into text files in doc/en/user-reference
120
def _dump_text(filename, text):
121
    """Dump text to filename."""
122
    f =  open(filename, "w")
123
    f.writelines(text)
124
    f.close()
125
126
3089.3.1 by Ian Clatworthy
move reference material out of User Guide into User Reference
127
def _get_commands_section(registry, title="Commands", hdg_level1="#",
128
                          hdg_level2="="):
3565.2.1 by Christophe Troestler
(trivial) Corrected typos.
129
    """Build the commands reference section of the manual."""
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
130
    lines = [title, hdg_level1 * len(title), ""]
131
    cmds = sorted(bzrlib.commands.builtin_command_names())
132
    for cmd_name in cmds:
133
        cmd_object = bzrlib.commands.get_cmd_object(cmd_name)
134
        if cmd_object.hidden:
135
            continue
136
        heading = cmd_name
2677.1.2 by Alexander Belchenko
bzr_man: see also topics as cross-reference links
137
        text = cmd_object.get_help_text(plain=False, see_also_as_links=True)
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
138
        lines.append(heading)
139
        lines.append(hdg_level2 * len(heading))
140
        lines.append(text)
141
        lines.append('')
142
    return "\n" + "\n".join(lines) + "\n"
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
143
144
145
##
146
# TEMPLATES
147
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
148
rstx_preamble = """.. This file is autogenerated from the output of
149
..     %(bzrcmd)s help topics
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
150
..     %(bzrcmd)s help commands
151
..     %(bzrcmd)s help <cmd>
152
..
153
.. Generation time: %(timestamp)s
154
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
155
"""
156
157
158
rstx_head = """\
3089.3.1 by Ian Clatworthy
move reference material out of User Guide into User Reference
159
#####################
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
160
Bazaar User Reference
3089.3.1 by Ian Clatworthy
move reference material out of User Guide into User Reference
161
#####################
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
162
163
:Version:   %(version)s
164
:Generated: %(datestamp)s
165
3089.3.1 by Ian Clatworthy
move reference material out of User Guide into User Reference
166
.. contents:: :depth: 2
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
167
168
-----
169
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
170
About This Manual
3089.3.1 by Ian Clatworthy
move reference material out of User Guide into User Reference
171
#################
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
172
173
This manual is generated from Bazaar's online help. To use
174
the online help system, try the following commands.
175
176
    Introduction including a list of commonly used commands::
177
178
        bzr help
179
180
    List of topics and a summary of each::
181
182
        bzr help topics
183
184
    List of commands and a summary of each::
185
186
        bzr help commands
187
188
    More information about a particular topic or command::
189
190
        bzr help topic-or-command-name
191
192
The following web sites provide further information on Bazaar:
193
194
:Home page:                     http://www.bazaar-vcs.org/
195
:Official docs:                 http://doc.bazaar-vcs.org/
196
:Launchpad:                     https://launchpad.net/bzr/
1662.1.17 by Martin Pool
[patch] html manual generator (Alexander Belchenko)
197
"""
198
199
200
rstx_foot = """
201
"""