Add sponsor logos. sponsor-logo
authorRadek Czajka <radekczajka@nowoczesnapolska.org.pl>
Thu, 19 Sep 2013 11:13:36 +0000 (13:13 +0200)
committerRadek Czajka <radekczajka@nowoczesnapolska.org.pl>
Thu, 19 Sep 2013 11:13:36 +0000 (13:13 +0200)
librarian/__init__.py
librarian/book2anything.py
librarian/dcparser.py
librarian/parser.py
librarian/pdf.py
librarian/pdf/wl.cls
librarian/pdf/wl2tex.xslt
scripts/book2pdf

index c46d5d1..9b05fb5 100644 (file)
@@ -39,6 +39,10 @@ class NoProvider(UnicodeException):
     """There's no DocProvider specified, and it's needed."""
     pass
 
+class NoSponsorProvider(UnicodeException):
+    """There's no DocProvider specified, and it's needed."""
+    pass
+
 class XMLNamespace(object):
     '''A handy structure to repsent names in an XML namespace.'''
 
@@ -144,6 +148,26 @@ class DirDocProvider(DocProvider):
         fname = slug + '.xml'
         return open(os.path.join(self.dir, fname))
 
+class SponsorProvider(object):
+    class NoLogo(UnicodeException): pass
+
+    def by_name(self, name):
+        raise NotImplementedError
+
+class DirSponsorProvider(SponsorProvider):
+    exts = ["png", "jpg", "jpeg", "gif"]
+
+    def __init__(self, dir_):
+        self.dir = dir_
+
+    def by_name(self, name):
+        base = name.replace("/", "_")
+        fnames = ["%s.%s" % (base, ext) for ext in self.exts]
+        for fname in fnames:
+            fpath = os.path.join(self.dir, fname)
+            if os.path.exists(fpath):
+                return OutputFile.from_filename(fpath)
+        raise self.NoLogo('Missing sponsor logo: "%s.[%s]"' % (base, ",".join(self.exts)))
 
 import lxml.etree as etree
 import dcparser
index b8b8d27..a0f0932 100755 (executable)
@@ -8,7 +8,7 @@ from collections import namedtuple
 import os.path
 import optparse
 
-from librarian import DirDocProvider, ParseError
+from librarian import DirDocProvider, DirSponsorProvider, ParseError
 from librarian.parser import WLDocument
 from librarian.cover import WLCover
 
@@ -38,7 +38,6 @@ class Book2Anything(object):
     ext = None # Set file extension, like "pdf".
     uses_cover = False # Can it add a cover?
     cover_optional = True # Only relevant if uses_cover
-    uses_provider = False # Does it need a DocProvider?
     transform = None # Transform method. Uses WLDocument.as_{ext} by default.
     parser_options = [] # List of Option objects for additional parser args.
     transform_options = [] # List of Option objects for additional transform args.
@@ -112,12 +111,10 @@ class Book2Anything(object):
                 if options.verbose:
                     print main_input
 
+            path, fname = os.path.realpath(main_input).rsplit('/', 1)
             # Where to find input?
-            if cls.uses_provider:
-                path, fname = os.path.realpath(main_input).rsplit('/', 1)
-                provider = DirDocProvider(path)
-            else:
-                provider = None
+            provider = DirDocProvider(path)
+            sponsor_provider = DirSponsorProvider(path)
 
             # Where to write output?
             if not (options.output_file or options.output_dir):
@@ -126,7 +123,8 @@ class Book2Anything(object):
                 output_file = None
 
             # Do the transformation.
-            doc = WLDocument.from_file(main_input, provider=provider, **parser_args)
+            doc = WLDocument.from_file(main_input, provider=provider,
+                sponsor_provider=sponsor_provider, **parser_args)
             transform = cls.transform
             if transform is None:
                 transform = getattr(WLDocument, 'as_%s' % cls.ext)
index abee11b..7c8b7af 100644 (file)
@@ -174,6 +174,8 @@ class WorkInfo(object):
         Field( DCNS('contributor.funding'), 'funders',
             salias='funder', multiple=True, default=[]),
 
+        Field( DCNS('digitisationSponsor'), 'sponsors', multiple=True, default=[]),
+
         Field( DCNS('date'), 'created_at', as_date),
         Field( DCNS('date.pd'), 'released_to_public_domain_at', as_date, required=False),
         Field( DCNS('publisher'), 'publisher'),
index a9e8c65..41f4308 100644 (file)
@@ -4,6 +4,7 @@
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 from librarian import ValidationError, NoDublinCore,  ParseError, NoProvider
+from librarian import NoSponsorProvider, DirSponsorProvider
 from librarian import RDFNS
 from librarian.cover import WLCover
 from librarian import dcparser
@@ -21,9 +22,11 @@ class WLDocument(object):
     provider = None
 
     def __init__(self, edoc, parse_dublincore=True, provider=None, 
+                    sponsor_provider=None,
                     strict=False, meta_fallbacks=None):
         self.edoc = edoc
         self.provider = provider
+        self.sponsor_provider = sponsor_provider
 
         root_elem = edoc.getroot()
 
@@ -180,6 +183,11 @@ class WLDocument(object):
             persons.remove(None)
         return persons
 
+    def sponsor_by_name(self, name):
+        if self.sponsor_provider is None:
+            raise NoSponsorProvider
+        return self.sponsor_provider.by_name(name)
+
     # Converters
 
     def as_html(self, *args, **kwargs):
index 90e4dc2..2d49b61 100644 (file)
@@ -245,11 +245,19 @@ def transform(wldoc, verbose=False, save_tex=None, morefloats=None,
         style_filename = get_stylesheet("wl2tex")
         style = etree.parse(style_filename)
 
-        texml = document.transform(style)
-
         # TeXML -> LaTeX
         temp = mkdtemp('-wl2pdf')
 
+        for i, sponsor in enumerate(book_info.sponsors):
+            sponsor_logo = wldoc.sponsor_by_name(sponsor)
+            fname = 'sponsor%d.png' % i
+            with open(os.path.join(temp, fname), 'w') as f:
+                f.write(sponsor_logo.get_string())
+                ins = etree.Element("data-sponsor", src=fname)
+                root.insert(0, ins)
+
+        texml = document.transform(style)
+
         if cover:
             with open(os.path.join(temp, 'cover.png'), 'w') as f:
                 bound_cover.save(f)
index 0de767c..50c4652 100644 (file)
@@ -126,6 +126,7 @@ Letters={SmallCaps,UppercaseSmallCaps}
 
 \pagestyle{plain}
 \usepackage{fancyhdr}
+\usepackage{marginnote}
 
 \makeatletter
 
@@ -233,6 +234,13 @@ Letters={SmallCaps,UppercaseSmallCaps}
     \color{theme}
     \noindent \rule{\linewidth}{0.4pt}
 
+    \ifdefined\sponsors
+        \marginnote{%
+            \centering%
+            \sponsors%
+        }
+    \fi
+
     \rightsinfo
     \vspace{.6em}
 
@@ -269,14 +277,14 @@ Letters={SmallCaps,UppercaseSmallCaps}
     \vspace{.6em}
     \emph{Jak możesz pomóc?}
 
-    Przekaż 1\% podatku na rozwój Wolnych Lektur:
-    Fundacja Nowoczesna Polska, KRS 0000070056.
+    Przekaż 1\% podatku na rozwój Wolnych~Lektur:
+    Fundacja~Nowoczesna~Polska, KRS~0000070056.
 
-    Pomóż uwolnić konkretną książkę, wspierając
-    \href{http://www.wolnelektury.pl/wesprzyj/}{zbiórkę na stronie wolnelektury.pl}.
+    Pomóż uwolnić konkretną książkę, wspierając zbiórkę na stronie:
+    \href{http://wolnelektury.pl/wesprzyj/}{http://wolnelektury.pl/wesprzyj/}
 
-    Przekaż darowiznę na konto:
-    \href{http://nowoczesnapolska.org.pl/pomoz-nam/wesprzyj-nas/}{szczegóły na stronie Fundacji}.
+    Przekaż darowiznę na konto, szczegóły na stronie:
+    \href{http://nowoczesnapolska.org.pl/wesprzyj/}{http://nowoczesnapolska.org.pl/wesprzyj/}
 
     \color{black}
   }
index 353ecf9..9ccd272 100644 (file)
                     \def\funders{Publikację ufundowali i ufundowały:
                         <TeXML escape="1"><xsl:value-of select="@funders" /></TeXML>.}
                 </xsl:if>
+
+                <xsl:if test="data-sponsor">
+                    \def\sponsors{
+                        \scriptsize Sfinansowano ze~środków:\\
+                        <xsl:for-each select="data-sponsor">
+                            \includegraphics[height=0.25\textwidth,width=0.25\textwidth,keepaspectratio]{<xsl:value-of select="@src" />}
+                        </xsl:for-each>
+                    }
+                </xsl:if>
             </TeXML>
 
             <cmd name="editorialsection" />
index 68e2d08..fb6f703 100755 (executable)
@@ -11,7 +11,6 @@ class Book2Pdf(Book2Anything):
     format_name = "PDF"
     ext = "pdf"
     uses_cover = True
-    uses_provider = True
     transform_args = [
         Option('-t', '--save-tex', dest='save_tex', metavar='FILE',
                 help='path to save the intermediary LaTeX file to'),