From 58e8e4911131103bceafd9e24b00fff9720cd3e6 Mon Sep 17 00:00:00 2001 From: Jonathan Waltman Date: Sun, 7 Nov 2010 00:41:47 -0500 Subject: [PATCH] Implement image handling for Texinfo builder --- sphinx/builders/texinfo.py | 15 +++++++++++-- sphinx/writers/texinfo.py | 42 ++++++++++++++++++++++++++++++++++--- tests/test_build_texinfo.py | 7 ++++++- 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/sphinx/builders/texinfo.py b/sphinx/builders/texinfo.py index b08c0cd6b..e12a35665 100644 --- a/sphinx/builders/texinfo.py +++ b/sphinx/builders/texinfo.py @@ -21,7 +21,7 @@ from sphinx.locale import _ from sphinx.builders import Builder from sphinx.environment import NoUri from sphinx.util.nodes import inline_all_toctrees -from sphinx.util.osutil import SEP +from sphinx.util.osutil import SEP, copyfile from sphinx.util.console import bold, darkgreen from sphinx.writers.texinfo import TexinfoWriter @@ -86,7 +86,8 @@ class TexinfoBuilder(Builder): """ name = 'texinfo' format = 'texinfo' - supported_image_types = [] + supported_image_types = ['application/pdf', 'image/png', + 'image/gif', 'image/jpeg'] def init(self): self.docnames = [] @@ -154,6 +155,7 @@ class TexinfoBuilder(Builder): nodes.Text('@printindex ge\n', '@printindex ge\n'), format="texinfo"))) + self.post_process_images(doctree) docwriter = TexinfoWriter(self) settings = OptionParser( defaults=self.env.settings, @@ -213,6 +215,15 @@ class TexinfoBuilder(Builder): return largetree def finish(self): + # copy image files + if self.images: + self.info(bold('copying images...'), nonl=1) + for src, dest in self.images.iteritems(): + self.info(' '+src, nonl=1) + copyfile(path.join(self.srcdir, src), + path.join(self.outdir, dest)) + self.info() + self.info(bold('copying Texinfo support files... '), nonl=True) # copy Makefile fn = path.join(self.outdir, 'Makefile') diff --git a/sphinx/writers/texinfo.py b/sphinx/writers/texinfo.py index 83dbe7248..8768c4867 100644 --- a/sphinx/writers/texinfo.py +++ b/sphinx/writers/texinfo.py @@ -9,6 +9,9 @@ :license: BSD, see LICENSE for details. """ +import re +from os import path + from docutils import nodes, writers from sphinx import addnodes @@ -27,6 +30,7 @@ Generated by Sphinx @defindex ge @paragraphindent %(paragraphindent)s @exampleindent %(exampleindent)s +@afourlatex %(direntry)s @c %%**end of header @@ -96,7 +100,6 @@ def escape_id(s): s = ' '.join(s.split()).strip() return s - class TexinfoWriter(writers.Writer): """Texinfo writer for generating Texinfo documents.""" supported = ('texinfo', 'texi') @@ -147,6 +150,8 @@ class TexinfoWriter(writers.Writer): class TexinfoTranslator(nodes.NodeVisitor): + ignore_missing_images = False + default_elements = { 'filename': '', 'title': '', @@ -359,6 +364,21 @@ class TexinfoTranslator(nodes.NodeVisitor): self.add_text('\n@end menu\n\n') + def tex_image_length(self, width_str): + match = re.match('(\d*\.?\d*)\s*(\S*)', width_str) + if not match: + # fallback + return width_str + res = width_str + amount, unit = match.groups()[:2] + if not unit or unit == "px": + # pixels: let TeX alone + return '' + elif unit == "%": + # a4paper: textwidth=418.25368pt + res = "%d.0pt" % (float(amount) * 4.1825368) + return res + ## xref handling def get_short_id(self, id): @@ -928,8 +948,24 @@ class TexinfoTranslator(nodes.NodeVisitor): self.add_text('}\n') def visit_image(self, node): - self.add_text('@w{[image]}') - raise nodes.SkipNode + if node['uri'] in self.builder.images: + uri = self.builder.images[node['uri']] + else: + # missing image! + if self.ignore_missing_images: + return + uri = node['uri'] + if uri.find('://') != -1: + # ignore remote images + return + name, ext = path.splitext(uri) + attrs = node.attributes + # ignored in non-tex output + width = self.tex_image_length(attrs.get('width', '')) + height = self.tex_image_length(attrs.get('height', '')) + alt = escape_arg(attrs.get('alt', '')) + self.add_text('\n\n@image{%s,%s,%s,%s,%s}\n\n' % + (name, width, height, alt, ext[1:])) def depart_image(self, node): pass diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py index 2b2c8efdf..4785abebd 100644 --- a/tests/test_build_texinfo.py +++ b/tests/test_build_texinfo.py @@ -15,6 +15,8 @@ import sys from StringIO import StringIO from subprocess import Popen, PIPE +from sphinx.writers.texinfo import TexinfoTranslator + from util import * from test_build_html import ENV_WARNINGS @@ -25,7 +27,9 @@ def teardown_module(): texinfo_warnfile = StringIO() -TEXINFO_WARNINGS = ENV_WARNINGS +TEXINFO_WARNINGS = ENV_WARNINGS + """\ +None:None: WARNING: no matching candidate for image URI u'foo.\\*' +""" if sys.version_info >= (3, 0): TEXINFO_WARNINGS = remove_unicode_literals(TEXINFO_WARNINGS) @@ -33,6 +37,7 @@ if sys.version_info >= (3, 0): @with_app(buildername='texinfo', warning=texinfo_warnfile, cleanenv=True) def test_texinfo(app): + TexinfoTranslator.ignore_missing_images = True app.builder.build_all() texinfo_warnings = texinfo_warnfile.getvalue().replace(os.sep, '/') texinfo_warnings_exp = TEXINFO_WARNINGS % {'root': app.srcdir}