mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
#65: Store depth information in PNG images themselves.
This commit is contained in:
parent
0d88e4b020
commit
b7a2491e21
21
CHANGES
21
CHANGES
@ -1,11 +1,14 @@
|
|||||||
Release 0.5.1 (in development)
|
Release 0.5.1 (in development)
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
|
* #65: Fix storage of depth information for PNGs generated by the
|
||||||
|
pngmath extension.
|
||||||
|
|
||||||
* Fix autodoc crash when automethod is used outside a class context.
|
* Fix autodoc crash when automethod is used outside a class context.
|
||||||
|
|
||||||
* Fix LaTeX writer output for images with specified height.
|
* #68: Fix LaTeX writer output for images with specified height.
|
||||||
|
|
||||||
* Fix wrong generated image path when including images in sources
|
* #60: Fix wrong generated image path when including images in sources
|
||||||
in subdirectories.
|
in subdirectories.
|
||||||
|
|
||||||
* Fix the JavaScript search when html_copy_source is off.
|
* Fix the JavaScript search when html_copy_source is off.
|
||||||
@ -182,33 +185,33 @@ New features added
|
|||||||
Bugs fixed
|
Bugs fixed
|
||||||
----------
|
----------
|
||||||
|
|
||||||
* Escape configuration values placed in HTML templates.
|
* #51: Escape configuration values placed in HTML templates.
|
||||||
|
|
||||||
* Fix small problems in HTML help index generation.
|
* #44: Fix small problems in HTML help index generation.
|
||||||
|
|
||||||
* Fix LaTeX output for line blocks in tables.
|
* Fix LaTeX output for line blocks in tables.
|
||||||
|
|
||||||
* Fix "illegal unit" error when using pixel image widths/heights.
|
* #38: Fix "illegal unit" error when using pixel image widths/heights.
|
||||||
|
|
||||||
* Support table captions in LaTeX output.
|
* Support table captions in LaTeX output.
|
||||||
|
|
||||||
* Work around a bug in Jinja that caused "<generator ...>" to be
|
* #39: Work around a bug in Jinja that caused "<generator ...>" to be
|
||||||
emitted in HTML output.
|
emitted in HTML output.
|
||||||
|
|
||||||
* Fix a problem with module links not being generated in LaTeX output.
|
* Fix a problem with module links not being generated in LaTeX output.
|
||||||
|
|
||||||
* Fix the handling of images in different directories.
|
* Fix the handling of images in different directories.
|
||||||
|
|
||||||
* Support option lists in the text writer. Make sure that dashes
|
* #29: Support option lists in the text writer. Make sure that dashes
|
||||||
introducing long option names are not contracted to en-dashes.
|
introducing long option names are not contracted to en-dashes.
|
||||||
|
|
||||||
* Support the "scale" option for images in HTML output.
|
* Support the "scale" option for images in HTML output.
|
||||||
|
|
||||||
* Properly escape quotes in HTML help attribute values.
|
* #25: Properly escape quotes in HTML help attribute values.
|
||||||
|
|
||||||
* Fix LaTeX build for some description environments with ``:noindex:``.
|
* Fix LaTeX build for some description environments with ``:noindex:``.
|
||||||
|
|
||||||
* Don't crash on weird casing of role names (like ``:Class:``).
|
* #24: Don't crash on uncommon casing of role names (like ``:Class:``).
|
||||||
|
|
||||||
* Only output ANSI colors on color terminals.
|
* Only output ANSI colors on color terminals.
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ except ImportError:
|
|||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
|
|
||||||
from sphinx.util import ensuredir
|
from sphinx.util import ensuredir
|
||||||
|
from sphinx.util.png import read_png_depth, write_png_depth
|
||||||
from sphinx.application import SphinxError
|
from sphinx.application import SphinxError
|
||||||
from sphinx.ext.mathbase import setup as mathbase_setup, wrap_displaymath
|
from sphinx.ext.mathbase import setup as mathbase_setup, wrap_displaymath
|
||||||
|
|
||||||
@ -79,7 +80,8 @@ def render_math(self, math):
|
|||||||
relfn = posixpath.join(self.builder.imgpath, 'math', shasum)
|
relfn = posixpath.join(self.builder.imgpath, 'math', shasum)
|
||||||
outfn = path.join(self.builder.outdir, '_images', 'math', shasum)
|
outfn = path.join(self.builder.outdir, '_images', 'math', shasum)
|
||||||
if path.isfile(outfn):
|
if path.isfile(outfn):
|
||||||
return relfn, self.builder.env._pngmath_depth.get(shasum, None)
|
depth = read_png_depth(outfn)
|
||||||
|
return relfn, depth
|
||||||
|
|
||||||
latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble
|
latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble
|
||||||
latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math
|
latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math
|
||||||
@ -158,15 +160,11 @@ def render_math(self, math):
|
|||||||
m = depth_re.match(line)
|
m = depth_re.match(line)
|
||||||
if m:
|
if m:
|
||||||
depth = int(m.group(1))
|
depth = int(m.group(1))
|
||||||
self.builder.env._pngmath_depth[shasum] = depth
|
write_png_depth(outfn, depth)
|
||||||
break
|
break
|
||||||
|
|
||||||
return relfn, depth
|
return relfn, depth
|
||||||
|
|
||||||
def ensure_depthcache(app, env):
|
|
||||||
if not hasattr(env, '_pngmath_depth'):
|
|
||||||
env._pngmath_depth = {}
|
|
||||||
|
|
||||||
def cleanup_tempdir(app, exc):
|
def cleanup_tempdir(app, exc):
|
||||||
if exc:
|
if exc:
|
||||||
return
|
return
|
||||||
@ -221,5 +219,4 @@ def setup(app):
|
|||||||
app.add_config_value('pngmath_use_preview', False, False)
|
app.add_config_value('pngmath_use_preview', False, False)
|
||||||
app.add_config_value('pngmath_dvipng_args', ['-gamma 1.5', '-D 110'], False)
|
app.add_config_value('pngmath_dvipng_args', ['-gamma 1.5', '-D 110'], False)
|
||||||
app.add_config_value('pngmath_latex_preamble', '', False)
|
app.add_config_value('pngmath_latex_preamble', '', False)
|
||||||
app.connect('env-updated', ensure_depthcache)
|
|
||||||
app.connect('build-finished', cleanup_tempdir)
|
app.connect('build-finished', cleanup_tempdir)
|
||||||
|
58
sphinx/util/png.py
Normal file
58
sphinx/util/png.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
sphinx.util.png
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
PNG image manipulation helpers.
|
||||||
|
|
||||||
|
:copyright: 2008 by Georg Brandl.
|
||||||
|
:license: BSD.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import struct
|
||||||
|
import binascii
|
||||||
|
|
||||||
|
LEN_IEND = 12
|
||||||
|
LEN_DEPTH = 22
|
||||||
|
|
||||||
|
DEPTH_CHUNK_LEN = struct.pack('!i', 10)
|
||||||
|
DEPTH_CHUNK_START = 'tEXtDepth\x00'
|
||||||
|
IEND_CHUNK = '\x00\x00\x00\x00IEND\xAE\x42\x60\x82'
|
||||||
|
|
||||||
|
|
||||||
|
def read_png_depth(filename):
|
||||||
|
"""
|
||||||
|
Read the special tEXt chunk indicating the depth from a PNG file.
|
||||||
|
"""
|
||||||
|
result = None
|
||||||
|
f = open(filename, 'rb')
|
||||||
|
try:
|
||||||
|
f.seek(- (LEN_IEND + LEN_DEPTH), 2)
|
||||||
|
depthchunk = f.read(LEN_DEPTH)
|
||||||
|
if not depthchunk.startswith(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START):
|
||||||
|
# either not a PNG file or not containing the depth chunk
|
||||||
|
return None
|
||||||
|
result = struct.unpack('!i', depthchunk[14:18])[0]
|
||||||
|
finally:
|
||||||
|
f.close()
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def write_png_depth(filename, depth):
|
||||||
|
"""
|
||||||
|
Write the special tEXt chunk indicating the depth to a PNG file.
|
||||||
|
The chunk is placed immediately before the special IEND chunk.
|
||||||
|
"""
|
||||||
|
data = struct.pack('!i', depth)
|
||||||
|
f = open(filename, 'r+b')
|
||||||
|
try:
|
||||||
|
# seek to the beginning of the IEND chunk
|
||||||
|
f.seek(-LEN_IEND, 2)
|
||||||
|
# overwrite it with the depth chunk
|
||||||
|
f.write(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START + data)
|
||||||
|
# calculate the checksum over chunk name and data
|
||||||
|
f.write(struct.pack('!i', binascii.crc32(DEPTH_CHUNK_START + data)))
|
||||||
|
# replace the IEND chunk
|
||||||
|
f.write(IEND_CHUNK)
|
||||||
|
finally:
|
||||||
|
f.close()
|
Loading…
Reference in New Issue
Block a user