~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to tools/rst2pdf.py

merge merge tweaks from aaron, which includes latest .dev

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
 
#