Add <target> to one more testcase (see r8206).
[docutils.git] / sandbox / rst2pdf / rst2pdf.py
blob12a8de6bb44b32d52dead7abef44ef7b22352f2f
1 #!/usr/bin/env python
2 # -*- coding: utf8 -*-
3 # $Id$
5 # rst2pdf.py
6 # ==========
7 # ::
9 """
10 A front end to the Docutils Publisher, producing PDF.
12 Produces a latex file with the "latex" writer and converts
13 it to PDF with the "rubber" building system for LaTeX documents.
14 """
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.
21 # It is implemented as a combination of docutils' ``rst2latex.py``
22 # by David Goodger and rubber_ by Emmanuel Beffara.
24 # Copyright: © 2008 Günter Milde
25 # Licensed under the `Apache License, Version 2.0`_
26 # Provided WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND
28 # Changelog
29 # ---------
31 # ===== ========== =======================================================
32 # 0.1 2008-05-20 first attempt
33 # ===== ========== =======================================================
35 # ::
37 _version = 0.1
40 # Imports
41 # =======
42 # ::
44 #from pprint import pprint # for debugging
45 import os
47 # Docutils::
49 try:
50 import locale
51 locale.setlocale(locale.LC_ALL, '')
52 except:
53 pass
55 from docutils.core import default_usage, default_description, Publisher
57 # Rubber (rubber is not installed in the PYTHONPATH)::
59 import sys
60 sys.path.append("/usr/share/rubber")
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)
69 # Generate the latex file
70 # =======================
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.
76 # Modeled on the publish_cmdline() function of docutils.core
78 # Default values::
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
95 # Argument values given to publish_cmdline() in rst2latex.py::
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'
102 # Set up the publisher::
104 pub = Publisher(reader, parser, writer, settings=settings)
105 pub.set_components(reader_name, parser_name, writer_name)
107 # Parse the command line args
108 # (Publisher.publish does this in a try statement)::
110 pub.process_command_line(argv, usage, description, settings_spec,
111 config_section, **(settings_overrides or {}))
112 # pprint(pub.settings.__dict__)
114 # Get source and destination path::
116 source = pub.settings._source
117 destination = pub.settings._destination
118 # print source, destination
120 # Generate names for the temporary files and set ``destination`` to temporary
121 # latex file:
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. ::
128 tmppath = rubber.cmd_pipe.make_name()
129 texpath = tmppath + ".tex"
130 pdfpath = tmppath + ".pdf"
132 pub.settings._destination = texpath
134 # Now do the rst -> latex conversion::
136 pub.publish(argv, usage, description, settings_spec, settings_overrides,
137 config_section=config_section, enable_exit_status=enable_exit_status)
140 # Generating the PDF document with rubber
141 # =======================================
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::
147 rubber_argv = ["--pdf", # use pdflatex to produce PDF
148 "--short", # Display LaTeX’s error messages one error per line.
149 texpath
152 # Get a TeX processing class instance and do the latex->pdf conversion::
154 tex_processor = rubber.cmdline.Main()
155 tex_processor(rubber_argv)
157 # Rename output to _destination or print to stdout::
159 if destination is None:
160 pdffile = file(pdfpath)
161 print pdffile.read()
162 pdffile.close()
163 else:
164 os.rename(pdfpath, destination)
166 # Clean up (remove intermediate files)
168 # ::
170 tex_processor(["--clean"] + rubber_argv)
171 os.remove(texpath)
174 # .. References
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