From: Radek Czajka
Date: Thu, 19 Jan 2012 15:45:15 +0000 (+0100)
Subject: Merge branch 'master' into commerce
X-Git-Url: https://git.mdrn.pl/librarian.git/commitdiff_plain/d622345fba2a557f409b148913a15cbf66ebc68c?hp=05843e29b4fffcc676da0e67b7a840a24d7b91d4
Merge branch 'master' into commerce
---
diff --git a/librarian/cover.py b/librarian/cover.py
index 63e4aa0..e7a8e1b 100644
--- a/librarian/cover.py
+++ b/librarian/cover.py
@@ -34,22 +34,29 @@ class TextBox(object):
self.height += height
def text(self, text, color='#000', font=None, line_height=20,
- shadow_color=None):
+ shadow_color=None, shortener=None):
"""Writes some centered text."""
if shadow_color:
if not self.shadow_img:
self.shadow_img = Image.new('RGBA', self.img.size)
self.shadow_draw = ImageDraw.Draw(self.shadow_img)
while text:
- line = text
- line_width = self.draw.textsize(line, font=font)[0]
- while line_width > self.max_text_width:
- parts = line.rsplit(' ', 1)
- if len(parts) == 1:
- line_width = self.max_text_width
- break
- line = parts[0]
+ if shortener:
+ for line in shortener(text):
+ if text_draw.textsize(line, font=font)[0] <= self.max_text_width:
+ break
+ text = ''
+ else:
+ line = text
line_width = self.draw.textsize(line, font=font)[0]
+ while line_width > self.max_text_width:
+ parts = line.rsplit(' ', 1)
+ if len(parts) == 1:
+ line_width = self.max_text_width
+ break
+ line = parts[0]
+ line_width = self.draw.textsize(line, font=font)[0]
+
line = line.strip() + ' '
pos_x = (self.max_width - line_width) / 2
@@ -65,6 +72,30 @@ class TextBox(object):
# go to next line
text = text[len(line):]
+ @staticmethod
+ def person_shortener(text):
+ yield text
+ chunks = text.split()
+ n_chunks = len(chunks)
+ # make initials from given names, starting from last
+ for i in range(n_chunks - 2, -1, -1):
+ chunks[i] = chunks[i][0] + '.'
+ yield " ".join(chunks)
+ # remove given names initials, starting from last
+ while len(chunks) > 2:
+ del chunks[1]
+ yield " ".join(chunks)
+
+ @staticmethod
+ def title_shortener(text):
+ yield text
+ chunks = text.split()
+ n_chunks = len(chunks)
+ # remove words, starting from last one
+ while len(chunks) > 1:
+ del chunks[-1]
+ yield " ".join(chunks) + u'â¦'
+
def image(self):
"""Creates the actual Image object."""
image = Image.new('RGBA', (self.max_width,
@@ -85,6 +116,7 @@ class Cover(object):
background_color = '#fff'
background_img = None
+ author_align = 'c'
author_top = 100
author_margin_left = 20
author_margin_right = 20
@@ -92,7 +124,9 @@ class Cover(object):
author_color = '#000'
author_shadow = None
author_font = None
+ author_wrap = True
+ title_align = 'c'
title_top = 100
title_margin_left = 20
title_margin_right = 20
@@ -100,6 +134,7 @@ class Cover(object):
title_color = '#000'
title_shadow = None
title_font = None
+ title_wrap = True
logo_bottom = None
logo_width = None
@@ -134,7 +169,10 @@ class Cover(object):
if self.background_img:
background = Image.open(self.background_img)
- img.paste(background, None, background)
+ try:
+ img.paste(background, None, background)
+ except ValueError, e:
+ img.paste(background)
del background
# WL logo
@@ -150,8 +188,9 @@ class Cover(object):
)
author_font = self.author_font or ImageFont.truetype(
get_resource('fonts/DejaVuSerif.ttf'), 30)
+ author_shortener = None if self.author_wrap else TextBox.person_shortener
tbox.text(self.pretty_author(), self.author_color, author_font,
- self.author_lineskip, self.author_shadow)
+ self.author_lineskip, self.author_shadow, author_shortener)
text_img = tbox.image()
img.paste(text_img, (self.author_margin_left, top), text_img)
@@ -162,8 +201,9 @@ class Cover(object):
)
title_font = self.author_font or ImageFont.truetype(
get_resource('fonts/DejaVuSerif.ttf'), 40)
+ title_shortener = None if self.title_wrap else TextBox.title_shortener
tbox.text(self.pretty_title(), self.title_color, title_font,
- self.title_lineskip, self.title_shadow)
+ self.title_lineskip, self.title_shadow, title_shortener)
text_img = tbox.image()
img.paste(text_img, (self.title_margin_left, top), text_img)
@@ -364,3 +404,42 @@ class GandalfCover(Cover):
logo_bottom = 25
logo_width = 250
format = 'PNG'
+
+
+class ArtaTechCover(Cover):
+ width = 600
+ height = 800
+ background_img = get_resource('res/cover-arta-tech.jpg')
+ author_top = 132
+ author_margin_left = 235
+ author_margin_right = 23
+ author_align = 'r'
+ author_font = ImageFont.truetype(get_resource('fonts/DroidSans.ttf'), 32)
+ author_color = '#555555'
+ author_wrap = False
+ title_top = 17
+ title_margin_right = 21
+ title_margin_left = 60
+ title_align = 'r'
+ title_font = ImageFont.truetype(get_resource('fonts/EBGaramond-Regular.ttf'), 42)
+ title_color = '#222222'
+ title_wrap = False
+ format = 'JPEG'
+
+ def pretty_author(self):
+ return self.author.upper()
+
+
+def ImageCover(img):
+ """ a class factory for simple image covers """
+ img = Image.open(img)
+
+ class ImgCover(Cover):
+ def image(self):
+ return img
+
+ @property
+ def format(self):
+ return self.image().format
+
+ return ImgCover
diff --git a/librarian/epub.py b/librarian/epub.py
index 80941eb..48bb2f2 100644
--- a/librarian/epub.py
+++ b/librarian/epub.py
@@ -5,6 +5,7 @@
#
from __future__ import with_statement
+from copy import deepcopy
import os
import os.path
import subprocess
@@ -292,7 +293,7 @@ def transform(wldoc, verbose=False,
sample=n: generate sample e-book (with at least n paragraphs)
cover: a cover.Cover object or True for default
- flags: less-advertising, without-fonts
+ flags: less-advertising, without-fonts, images, not-wl
"""
def transform_file(wldoc, chunk_counter=1, first=True, sample=None):
@@ -374,6 +375,7 @@ def transform(wldoc, verbose=False,
spine = opf.find('.//' + OPFNS('spine'))
output_file = NamedTemporaryFile(prefix='librarian', suffix='.epub', delete=False)
+
zip = zipfile.ZipFile(output_file, 'w', zipfile.ZIP_DEFLATED)
# write static elements
@@ -387,8 +389,14 @@ def transform(wldoc, verbose=False,
'' \
'')
- zip.write(get_resource('res/wl-logo-small.png'), os.path.join('OPS', 'logo_wolnelektury.png'))
- zip.write(get_resource('res/jedenprocent.png'), os.path.join('OPS', 'jedenprocent.png'))
+ if not flags or 'not-wl' not in flags:
+ manifest.append(etree.fromstring(
+ ' '))
+ manifest.append(etree.fromstring(
+ ' '))
+ zip.write(get_resource('res/wl-logo-small.png'), os.path.join('OPS', 'logo_wolnelektury.png'))
+ zip.write(get_resource('res/jedenprocent.png'), os.path.join('OPS', 'jedenprocent.png'))
+
if not style:
style = get_resource('epub/style.css')
zip.write(style, os.path.join('OPS', 'style.css'))
@@ -422,6 +430,26 @@ def transform(wldoc, verbose=False,
opf.getroot()[0].append(etree.fromstring(''))
guide.append(etree.fromstring(''))
+ if flags and 'images' in flags:
+ for ilustr in document.edoc.findall('//ilustr'):
+ src = ilustr.get('src')
+ mime = ImageCover(src)().mime_type()
+ zip.write(src, os.path.join('OPS', src))
+ manifest.append(etree.fromstring(
+ ' ' % (src, src, mime)))
+ # get it up to master
+ after = ilustr
+ while after.getparent().tag not in ['powiesc', 'opowiadanie', 'liryka_l', 'liryka_lp', 'dramat_wierszowany_l', 'dramat_wierszowany_lp', 'dramat_wspolczesny']:
+ after = after.getparent()
+ if not(after is ilustr):
+ moved = deepcopy(ilustr)
+ ilustr.tag = 'extra'
+ ilustr.text = None
+ moved.tail = None
+ after.addnext(moved)
+ else:
+ for ilustr in document.edoc.findall('//ilustr'):
+ ilustr.tag = 'extra'
annotations = etree.Element('annotations')
@@ -462,7 +490,13 @@ def transform(wldoc, verbose=False,
' '))
spine.append(etree.fromstring(
''))
- html_tree = xslt(document.edoc, get_resource('epub/xsltLast.xsl'))
+ stopka = document.edoc.find('//stopka')
+ if stopka is not None:
+ stopka.tag = 'stopka_'
+ replace_by_verse(stopka)
+ html_tree = xslt(stopka, get_resource('epub/xsltScheme.xsl'))
+ else:
+ html_tree = xslt(document.edoc, get_resource('epub/xsltLast.xsl'))
chars.update(used_chars(html_tree.getroot()))
zip.writestr('OPS/last.html', etree.tostring(
html_tree, method="html", pretty_print=True))
diff --git a/librarian/epub/style.css b/librarian/epub/style.css
index 622c8da..a4c61c8 100644
--- a/librarian/epub/style.css
+++ b/librarian/epub/style.css
@@ -46,7 +46,8 @@ a img {
#book-text
{
- margin: 2em;
+ /*margin: 2em;*/
+ margin: 5px;
/*margin-right: 9em;*/
}
@@ -370,3 +371,12 @@ p.minor {
p.footer {
margin-top: 2em;
}
+
+.ilustr {
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.ilustr img {
+ max-width: 100%;
+}
diff --git a/librarian/epub/xsltContent.xsl b/librarian/epub/xsltContent.xsl
index 83eb376..ef7ae74 100644
--- a/librarian/epub/xsltContent.xsl
+++ b/librarian/epub/xsltContent.xsl
@@ -29,8 +29,6 @@
-
-
diff --git a/librarian/epub/xsltLast.xsl b/librarian/epub/xsltLast.xsl
index 751f97a..4c66bb9 100644
--- a/librarian/epub/xsltLast.xsl
+++ b/librarian/epub/xsltLast.xsl
@@ -43,7 +43,8 @@
- ŹródÅo:
+
+ ŹródÅo:
@@ -51,7 +52,10 @@
,
-
+
+
+
+
Tekst opracowany na podstawie:
@@ -81,12 +85,14 @@
-
-

-
Przekaż 1% podatku na rozwój Wolnych Lektur.
-
Nazwa organizacji: Fundacja Nowoczesna Polska
-
KRS 0000070056
-
+
+
+

+
Przekaż 1% podatku na rozwój Wolnych Lektur.
+
Nazwa organizacji: Fundacja Nowoczesna Polska
+
KRS 0000070056
+
+
diff --git a/librarian/epub/xsltScheme.xsl b/librarian/epub/xsltScheme.xsl
index 3ddcf97..395e950 100644
--- a/librarian/epub/xsltScheme.xsl
+++ b/librarian/epub/xsltScheme.xsl
@@ -278,6 +278,18 @@
+
+
+
![ilustracja]()
+
+
+
+
+
+
+
+
+
diff --git a/librarian/epub/xsltTitle.xsl b/librarian/epub/xsltTitle.xsl
index 74ef64a..0b926e2 100644
--- a/librarian/epub/xsltTitle.xsl
+++ b/librarian/epub/xsltTitle.xsl
@@ -36,6 +36,7 @@
+
@@ -55,6 +56,12 @@
+
+