Implement image handling for Texinfo builder

This commit is contained in:
Jonathan Waltman
2010-11-07 00:41:47 -05:00
parent 6aba1ba781
commit 58e8e49111
3 changed files with 58 additions and 6 deletions

View File

@@ -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')

View File

@@ -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

View File

@@ -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}