/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to tools/rst2pdf.py

  • Committer: Vincent Ladeuil
  • Date: 2010-01-25 15:55:48 UTC
  • mto: (4985.1.4 add-attr-cleanup)
  • mto: This revision was merged to the branch mainline in revision 4988.
  • Revision ID: v.ladeuil+lp@free.fr-20100125155548-0l352pujvt5bzl5e
Deploy addAttrCleanup on the whole test suite.

Several use case worth mentioning:

- setting a module or any other object attribute is the majority
by far. In some cases the setting itself is deferred but most of
the time we want to set at the same time we add the cleanup.

- there multiple occurrences of protecting hooks or ui factory
which are now useless (the test framework takes care of that now),

- there was some lambda uses that can now be avoided.

That first cleanup already simplifies things a lot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
# -*- coding: utf8 -*-
 
3
# $Id: rst2pdf.py 5560 2008-05-20 13:00:31Z milde $
 
4
 
 
5
# rst2pdf.py
 
6
# ==========
 
7
# ::
 
8
 
 
9
"""
 
10
A front end to the Docutils Publisher, producing PDF.
 
11
 
 
12
Produces a latex file with the "latex" writer and converts
 
13
it to PDF with the "rubber" building system for LaTeX documents. 
 
14
"""
 
15
 
 
16
# ``rst2pdf.py`` is a PDF front-end for docutils that is compatible
 
17
# with the ``rst2*.py`` front ends of the docutils_ suite.
 
18
# It enables the generation of PDF documents from a reStructuredText source in
 
19
# one step.
 
20
 
21
# It is implemented as a combination of docutils' ``rst2latex.py`` 
 
22
# by David Goodger and rubber_ by Emmanuel Beffara.
 
23
 
24
# Copyright: © 2008 Günter Milde
 
25
#            Licensed under the `Apache License, Version 2.0`_
 
26
#            Provided WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND
 
27
 
28
# Changelog
 
29
# ---------
 
30
 
31
# =====  ==========  =======================================================
 
32
# 0.1    2008-05-20  first attempt
 
33
# =====  ==========  =======================================================
 
34
 
35
# :: 
 
36
 
 
37
_version = 0.1
 
38
 
 
39
 
 
40
# Imports
 
41
# =======
 
42
# ::
 
43
 
 
44
#from pprint import pprint # for debugging
 
45
import os
 
46
 
 
47
# Docutils::
 
48
 
 
49
try:
 
50
    import locale
 
51
    locale.setlocale(locale.LC_ALL, '')
 
52
except:
 
53
    pass
 
54
 
 
55
from docutils.core import default_usage, default_description, Publisher
 
56
 
 
57
# Rubber (rubber is not installed in the PYTHONPATH)::
 
58
 
 
59
import sys
 
60
sys.path.append("/usr/share/rubber")
 
61
 
 
62
try:
 
63
    import rubber.cmdline
 
64
    import rubber.cmd_pipe
 
65
except ImportError:
 
66
    print "Cannot find the rubber modules, rubber not installed correctly."
 
67
    sys.exit(1)
 
68
 
 
69
# Generate the latex file
 
70
# =======================
 
71
 
72
# We need to replace the <destination> by a intermediate latex file path.
 
73
# The most reliable way to get the value of <destination> is to 
 
74
# call the Publisher "by hand", and query its settings. 
 
75
 
76
# Modeled on the publish_cmdline() function of docutils.core
 
77
 
78
# Default values::
 
79
 
 
80
reader=None
 
81
reader_name='standalone'
 
82
parser=None
 
83
parser_name='restructuredtext'
 
84
writer=None
 
85
writer_name='pseudoxml'
 
86
settings=None
 
87
settings_spec=None
 
88
settings_overrides=None
 
89
config_section=None
 
90
enable_exit_status=1
 
91
argv=None
 
92
usage=default_usage
 
93
description=default_description
 
94
 
 
95
# Argument values given to publish_cmdline() in rst2latex.py::
 
96
 
 
97
description = ('Generates PDF documents from standalone reStructuredText '
 
98
               'sources using the "latex" Writer and the "rubber" '
 
99
               'building system for LaTeX documents.  ' + default_description)
 
100
writer_name = 'latex'
 
101
 
 
102
# Set up the publisher::
 
103
 
 
104
pub = Publisher(reader, parser, writer, settings=settings)
 
105
pub.set_components(reader_name, parser_name, writer_name)
 
106
 
 
107
# Parse the command line args 
 
108
# (Publisher.publish does this in a try statement)::
 
109
 
 
110
pub.process_command_line(argv, usage, description, settings_spec, 
 
111
                         config_section, **(settings_overrides or {}))
 
112
# pprint(pub.settings.__dict__)
 
113
 
 
114
# Get source and destination path::
 
115
 
 
116
source = pub.settings._source
 
117
destination = pub.settings._destination
 
118
# print source, destination
 
119
 
 
120
# Generate names for the temporary files and set ``destination`` to temporary
 
121
# latex file:
 
122
 
123
# make_name() from rubber.cmd_pipe checks that no existing file is
 
124
# overwritten. If we are going to support rubbers ``--inplace`` and ``--into``
 
125
# options, the chdir() must occure before this point to have the check in the
 
126
# right directory. ::
 
127
 
 
128
tmppath = rubber.cmd_pipe.make_name()
 
129
texpath = tmppath + ".tex"
 
130
pdfpath = tmppath + ".pdf"
 
131
 
 
132
pub.settings._destination = texpath
 
133
 
 
134
# Now do the rst -> latex conversion::
 
135
 
 
136
pub.publish(argv, usage, description, settings_spec, settings_overrides, 
 
137
            config_section=config_section, enable_exit_status=enable_exit_status)
 
138
 
 
139
 
 
140
# Generating the PDF document with rubber
 
141
# =======================================
 
142
 
143
 
144
# rubber_ has no documentet API for programmatic use. We simualate a command
 
145
# line call and pass command line arguments (see man: rubber-pipe) in an array::
 
146
 
 
147
rubber_argv = ["--pdf",    # use pdflatex to produce PDF
 
148
               "--short",   # Display LaTeX’s error messages one error per line.
 
149
               texpath
 
150
              ]
 
151
 
 
152
# Get a TeX processing class instance and do the latex->pdf conversion::
 
153
 
 
154
tex_processor = rubber.cmdline.Main()
 
155
tex_processor(rubber_argv)
 
156
 
 
157
# Rename output to _destination or print to stdout::
 
158
 
 
159
if destination is None:
 
160
    pdffile = file(pdfpath)
 
161
    print  pdffile.read()
 
162
    pdffile.close()
 
163
else:
 
164
    os.rename(pdfpath, destination)
 
165
 
 
166
# Clean up (remove intermediate files)
 
167
 
168
# ::
 
169
 
 
170
tex_processor(["--clean"] + rubber_argv)
 
171
os.remove(texpath)
 
172
 
 
173
 
 
174
# .. References
 
175
 
176
# .. _docutils: http://docutils.sourceforge.net/
 
177
# .. _rubber: http://www.pps.jussieu.fr/~beffara/soft/rubber/
 
178
# .. _Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
 
179
#