~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to tools/rst2pdf.py

  • Committer: wang
  • Date: 2006-10-29 13:41:32 UTC
  • mto: (2104.4.1 wang_65714)
  • mto: This revision was merged to the branch mainline in revision 2109.
  • Revision ID: wang@ubuntu-20061029134132-3d7f4216f20c4aef
Replace python's difflib by patiencediff because the worst case 
performance is cubic for difflib and people commiting large data 
files are often hurt by this. The worst case performance of patience is 
quadratic. Fix bug 65714.

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
 
#