diff options
author | Lorry <lorry@roadtrain.codethink.co.uk> | 2012-08-22 15:47:16 +0100 |
---|---|---|
committer | Lorry <lorry@roadtrain.codethink.co.uk> | 2012-08-22 15:47:16 +0100 |
commit | 25335618bf8755ce6b116ee14f47f5a1f2c821e9 (patch) | |
tree | d889d7ab3f9f985d0c54c534cb8052bd2e6d7163 /tools/rst2pdf.py | |
download | bzr-tarball-25335618bf8755ce6b116ee14f47f5a1f2c821e9.tar.gz |
Tarball conversion
Diffstat (limited to 'tools/rst2pdf.py')
-rwxr-xr-x | tools/rst2pdf.py | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/tools/rst2pdf.py b/tools/rst2pdf.py new file mode 100755 index 0000000..87bb389 --- /dev/null +++ b/tools/rst2pdf.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python +# -*- coding: utf8 -*- +# $Id: rst2pdf.py 5560 2008-05-20 13:00:31Z milde $ + +# rst2pdf.py +# ========== +# :: + +""" +A front end to the Docutils Publisher, producing PDF. + +Produces a latex file with the "latex" writer and converts +it to PDF with the "rubber" building system for LaTeX documents. +""" + +# ``rst2pdf.py`` is a PDF front-end for docutils that is compatible +# with the ``rst2*.py`` front ends of the docutils_ suite. +# It enables the generation of PDF documents from a reStructuredText source in +# one step. +# +# It is implemented as a combination of docutils' ``rst2latex.py`` +# by David Goodger and rubber_ by Emmanuel Beffara. +# +# Copyright: © 2008 Günter Milde +# Licensed under the `Apache License, Version 2.0`_ +# Provided WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND +# +# Changelog +# --------- +# +# ===== ========== ======================================================= +# 0.1 2008-05-20 first attempt +# ===== ========== ======================================================= +# +# :: + +_version = 0.1 + + +# Imports +# ======= +# :: + +#from pprint import pprint # for debugging +import os + +# Docutils:: + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import default_usage, default_description, Publisher + +# Rubber (rubber is not installed in the PYTHONPATH):: + +import sys +sys.path.append("/usr/share/rubber") + +try: + import rubber.cmdline + import rubber.cmd_pipe +except ImportError: + print "Cannot find the rubber modules, rubber not installed correctly." + sys.exit(1) + +# Generate the latex file +# ======================= +# +# We need to replace the <destination> by a intermediate latex file path. +# The most reliable way to get the value of <destination> is to +# call the Publisher "by hand", and query its settings. +# +# Modeled on the publish_cmdline() function of docutils.core +# +# Default values:: + +reader=None +reader_name='standalone' +parser=None +parser_name='restructuredtext' +writer=None +writer_name='pseudoxml' +settings=None +settings_spec=None +settings_overrides=None +config_section=None +enable_exit_status=1 +argv=None +usage=default_usage +description=default_description + +# Argument values given to publish_cmdline() in rst2latex.py:: + +description = ('Generates PDF documents from standalone reStructuredText ' + 'sources using the "latex" Writer and the "rubber" ' + 'building system for LaTeX documents. ' + default_description) +writer_name = 'latex' + +# Set up the publisher:: + +pub = Publisher(reader, parser, writer, settings=settings) +pub.set_components(reader_name, parser_name, writer_name) + +# Parse the command line args +# (Publisher.publish does this in a try statement):: + +pub.process_command_line(argv, usage, description, settings_spec, + config_section, **(settings_overrides or {})) +# pprint(pub.settings.__dict__) + +# Get source and destination path:: + +source = pub.settings._source +destination = pub.settings._destination +# print source, destination + +# Generate names for the temporary files and set ``destination`` to temporary +# latex file: +# +# make_name() from rubber.cmd_pipe checks that no existing file is +# overwritten. If we are going to support rubbers ``--inplace`` and ``--into`` +# options, the chdir() must occure before this point to have the check in the +# right directory. :: + +tmppath = rubber.cmd_pipe.make_name() +texpath = tmppath + ".tex" +pdfpath = tmppath + ".pdf" + +pub.settings._destination = texpath + +# Now do the rst -> latex conversion:: + +pub.publish(argv, usage, description, settings_spec, settings_overrides, + config_section=config_section, enable_exit_status=enable_exit_status) + + +# Generating the PDF document with rubber +# ======================================= +# +# +# rubber_ has no documentet API for programmatic use. We simualate a command +# line call and pass command line arguments (see man: rubber-pipe) in an array:: + +rubber_argv = ["--pdf", # use pdflatex to produce PDF + "--short", # Display LaTeX’s error messages one error per line. + texpath + ] + +# Get a TeX processing class instance and do the latex->pdf conversion:: + +tex_processor = rubber.cmdline.Main() +tex_processor(rubber_argv) + +# Rename output to _destination or print to stdout:: + +if destination is None: + pdffile = file(pdfpath) + print pdffile.read() + pdffile.close() +else: + os.rename(pdfpath, destination) + +# Clean up (remove intermediate files) +# +# :: + +tex_processor(["--clean"] + rubber_argv) +os.remove(texpath) + + +# .. References +# +# .. _docutils: http://docutils.sourceforge.net/ +# .. _rubber: http://www.pps.jussieu.fr/~beffara/soft/rubber/ +# .. _Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 +# |