Support for dropcaps in html2lrf

This commit is contained in:
Kovid Goyal 2007-07-04 21:11:07 +00:00
parent 2166441cc2
commit aaf21faf2a
4 changed files with 50 additions and 8 deletions

View File

@ -13,7 +13,7 @@
## with this program; if not, write to the Free Software Foundation, Inc.,
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
''' E-book management software'''
__version__ = "0.3.65"
__version__ = "0.3.66"
__docformat__ = "epytext"
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
__appname__ = 'libprs500'

View File

@ -17,7 +17,7 @@
"""
Code to convert HTML ebooks into LRF ebooks.
I am indebted to esperanc for the initial CSS->Xylog Style conversion routines
I am indebted to esperanc for the initial CSS->Xylog Style conversion code
and to Falstaff for pylrs.
"""
import os, re, sys, shutil, traceback, copy, glob
@ -36,7 +36,7 @@ from libprs500.ebooks.BeautifulSoup import BeautifulSoup, BeautifulStoneSoup, \
Comment, Tag, NavigableString, Declaration, ProcessingInstruction
from libprs500.ebooks.lrf.pylrs.pylrs import Paragraph, CR, Italic, ImageStream, \
TextBlock, ImageBlock, JumpButton, CharButton, Bold, Space, \
Plot, Image, BlockSpace, RuledLine, BookSetting, Canvas
Plot, Image, BlockSpace, RuledLine, BookSetting, Canvas, DropCaps
from libprs500.ebooks.lrf.pylrs.pylrs import Span as _Span
from libprs500.ebooks.lrf import option_parser, Book, PRS500_PROFILE
from libprs500.ebooks import ConversionError
@ -304,11 +304,13 @@ class HTMLConverter(object):
em = {"font-style" : "italic"},
small = {'font-size' : 'small'},
pre = {'font-family' : 'monospace' },
code = {'font-family' : 'monospace' },
tt = {'font-family' : 'monospace'},
center = {'text-align' : 'center'},
th = {'font-size' : 'large', 'font-weight':'bold'},
big = {'font-size' : 'large', 'font-weight':'bold'},
)
)
self.css['.libprs500_dropcaps'] = {'font-size': 'xx-large'}
self.fonts = fonts #: dict specifting font families to use
self.profile = profile #: Defines the geometry of the display device
self.chapter_detection = chapter_detection #: Flag to toggle chapter detection
@ -764,7 +766,7 @@ class HTMLConverter(object):
self.current_block = self.book.create_text_block(textStyle=self.current_block.textStyle,
blockStyle=self.current_block.blockStyle)
def process_image(self, path, tag_css, width=None, height=None):
def process_image(self, path, tag_css, width=None, height=None, dropcaps=False):
if self.rotated_images.has_key(path):
path = self.rotated_images[path].name
if self.scaled_images.has_key(path):
@ -779,6 +781,8 @@ class HTMLConverter(object):
if width == None or height == None:
width, height = im.size
factor = 720./self.profile.dpi
def scale_image(width, height):
pt = PersistentTemporaryFile(suffix='.jpeg')
@ -790,6 +794,29 @@ class HTMLConverter(object):
pheight = int(self.current_page.pageStyle.attrs['textheight'])
pwidth = int(self.current_page.pageStyle.attrs['textwidth'])
if dropcaps:
scale = False
if width > 0.75*pwidth:
width = int(0.75*pwidth)
scale = True
if height > 0.75*pheight:
height = int(0.75*pheight)
scale = True
if scale:
path = scale_image(width, height)
if not self.images.has_key(path):
self.images[path] = ImageStream(path)
im = Image(self.images[path], x0=0, y0=0, x1=width, y1=height,\
xsize=width, ysize=height)
line_height = (int(self.current_block.textStyle.attrs['baselineskip']) +
int(self.current_block.textStyle.attrs['linespace']))//10
line_height *= self.profile.dpi/72.
lines = int(ceil(float(height)/line_height))
dc = DropCaps(lines)
dc.append(Plot(im, xsize=ceil(width*factor), ysize=ceil(height*factor)))
self.current_para.append(dc)
return
if not self.disable_autorotation and width > pwidth and width > height:
pt = PersistentTemporaryFile(suffix='.jpeg')
im = im.rotate(90)
@ -821,7 +848,7 @@ class HTMLConverter(object):
im = Image(self.images[path], x0=0, y0=0, x1=width, y1=height,\
xsize=width, ysize=height)
factor = 720./self.profile.dpi
self.process_alignment(tag_css)
@ -954,8 +981,8 @@ class HTMLConverter(object):
height = int(tag['height'])
except:
pass
self.process_image(path, tag_css, width, height)
dropcaps = tag.has_key('class') and tag['class'] == 'libprs500_dropcaps'
self.process_image(path, tag_css, width, height, dropcaps=dropcaps)
else:
print >>sys.stderr, "Failed to process:", tag
elif tagname in ['style', 'link']:

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -18,6 +18,7 @@
<li><a href='#text'>Text formatting and ruled lines</a></li>
<li><a href='#images'>Inline images</a></li>
<li><a href='#fonts'>Embedded Fonts</a></li>
<li><a href='#dropcaps'>Dropcaps</a></li>
<li><a href='#recursive'>Recursive link following</a></li>
<li><a href='demo_ext.html'>The HTML used to create this file</a>
</ul>
@ -149,6 +150,20 @@
<a href='#toc'>Table of Contents</a>
</p>
<h2><a name='dropcaps'>Dropcaps</a></h2>
<br/>
<p><img class='libprs500_dropcaps' src='a.png' /> beautiful image based dropcaps to emphasize this
paragraph. Image based dropcaps are specified by adding the <code>class = 'libprs500_dropcaps'</code>
attribute to an <code>&lt;img&gt;</code> tag.<p/>
<br/>
<br/>
<p><big class='libprs500_dropcaps'>T</big>his is a plain text based dropcaps. It
is not nearly as dramatic, but easier to code ;-)
</p>
<p class='toc'>
<hr />
<a href='#toc'>Table of Contents</a>
</p>
<h2><a name='recursive'>Recursive link following</a></h2>
<p>