~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to tools/rst2pdf.py

  • Committer: Martin Pool
  • Date: 2010-02-23 07:43:11 UTC
  • mfrom: (4797.2.20 2.1)
  • mto: This revision was merged to the branch mainline in revision 5055.
  • Revision ID: mbp@sourcefrog.net-20100223074311-gnj55xdhrgz9l94e
Merge 2.1 back to trunk

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
#