pep8 and other code-style changes
authorJan Szejko <j-sz@o2.pl>
Tue, 12 Jan 2016 09:15:59 +0000 (10:15 +0100)
committerJan Szejko <j-sz@o2.pl>
Tue, 12 Jan 2016 09:15:59 +0000 (10:15 +0100)
25 files changed:
librarian/__init__.py
librarian/book2anything.py
librarian/cover.py
librarian/dcparser.py
librarian/embeds/latex.py
librarian/embeds/mathml.py
librarian/epub.py
librarian/fb2.py
librarian/functions.py
librarian/html.py
librarian/packagers.py
librarian/parser.py
librarian/partners.py
librarian/pdf.py
librarian/picture.py
librarian/sponsor.py
librarian/text.py
tests/test_dcparser.py
tests/test_epub.py
tests/test_html.py
tests/test_html_annotations.py
tests/test_html_fragments.py
tests/test_pdf.py
tests/test_picture.py
tests/utils.py

index b257b79..d307def 100644 (file)
@@ -10,6 +10,8 @@ import re
 import shutil
 import urllib
 
 import shutil
 import urllib
 
+from wolnelektury.utils import makedirs
+
 
 class UnicodeException(Exception):
     def __str__(self):
 
 class UnicodeException(Exception):
     def __str__(self):
@@ -273,8 +275,7 @@ class OutputFile(object):
         """Save file to a path. Create directories, if necessary."""
 
         dirname = os.path.dirname(os.path.abspath(path))
         """Save file to a path. Create directories, if necessary."""
 
         dirname = os.path.dirname(os.path.abspath(path))
-        if not os.path.isdir(dirname):
-            os.makedirs(dirname)
+        makedirs(dirname)
         shutil.copy(self.get_filename(), path)
 
 
         shutil.copy(self.get_filename(), path)
 
 
index 55ab599..0dcfd33 100755 (executable)
@@ -4,7 +4,6 @@
 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
-from collections import namedtuple
 import os.path
 import optparse
 
 import os.path
 import optparse
 
@@ -34,16 +33,15 @@ class Book2Anything(object):
     
     Subclass it for any format you want to convert to.
     """
     
     Subclass it for any format you want to convert to.
     """
-    format_name = None # Set format name, like "PDF".
-    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.
-    transform_flags = [] # List of Option objects for supported transform flags.
-
+    format_name = None  # Set format name, like "PDF".
+    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.
+    transform_flags = []  # List of Option objects for supported transform flags.
 
     @classmethod
     def run(cls):
 
     @classmethod
     def run(cls):
@@ -53,27 +51,21 @@ class Book2Anything(object):
 
         parser = optparse.OptionParser(usage=usage)
 
 
         parser = optparse.OptionParser(usage=usage)
 
-        parser.add_option('-v', '--verbose', 
-                action='store_true', dest='verbose', default=False,
-                help='print status messages to stdout')
-        parser.add_option('-d', '--make-dir',
-                action='store_true', dest='make_dir', default=False,
-                help='create a directory for author and put the output file in it')
-        parser.add_option('-o', '--output-file',
-                dest='output_file', metavar='FILE',
-                help='specifies the output file')
-        parser.add_option('-O', '--output-dir',
-                dest='output_dir', metavar='DIR',
-                help='specifies the directory for output')
+        parser.add_option('-v', '--verbose', action='store_true', dest='verbose', default=False,
+                          help='print status messages to stdout')
+        parser.add_option('-d', '--make-dir', action='store_true', dest='make_dir', default=False,
+                          help='create a directory for author and put the output file in it')
+        parser.add_option('-o', '--output-file', dest='output_file', metavar='FILE',
+                          help='specifies the output file')
+        parser.add_option('-O', '--output-dir', dest='output_dir', metavar='DIR',
+                          help='specifies the directory for output')
         if cls.uses_cover:
             if cls.cover_optional:
         if cls.uses_cover:
             if cls.cover_optional:
-                parser.add_option('-c', '--with-cover', 
-                        action='store_true', dest='with_cover', default=False,
-                        help='create default cover')
-            parser.add_option('-C', '--image-cache',
-                    dest='image_cache', metavar='URL',
-                    help='prefix for image download cache' +
-                        (' (implies --with-cover)' if cls.cover_optional else ''))
+                parser.add_option('-c', '--with-cover', action='store_true', dest='with_cover', default=False,
+                                  help='create default cover')
+            parser.add_option('-C', '--image-cache', dest='image_cache', metavar='URL',
+                              help='prefix for image download cache' +
+                              (' (implies --with-cover)' if cls.cover_optional else ''))
         for option in cls.parser_options + cls.transform_options + cls.transform_flags:
             option.add(parser)
 
         for option in cls.parser_options + cls.transform_options + cls.transform_flags:
             option.add(parser)
 
@@ -81,7 +73,7 @@ class Book2Anything(object):
 
         if len(input_filenames) < 1:
             parser.print_help()
 
         if len(input_filenames) < 1:
             parser.print_help()
-            return(1)
+            return 1
 
         # Prepare additional args for parser.
         parser_args = {}
 
         # Prepare additional args for parser.
         parser_args = {}
@@ -92,8 +84,7 @@ class Book2Anything(object):
         for option in cls.transform_options:
             transform_args[option.name()] = option.value(options)
         # Add flags to transform_args, if any.
         for option in cls.transform_options:
             transform_args[option.name()] = option.value(options)
         # Add flags to transform_args, if any.
-        transform_flags = [flag.name() for flag in cls.transform_flags
-                    if flag.value(options)]
+        transform_flags = [flag.name() for flag in cls.transform_flags if flag.value(options)]
         if transform_flags:
             transform_args['flags'] = transform_flags
         if options.verbose:
         if transform_flags:
             transform_args['flags'] = transform_flags
         if options.verbose:
@@ -107,7 +98,6 @@ class Book2Anything(object):
             elif not cls.cover_optional or options.with_cover:
                 transform_args['cover'] = DefaultEbookCover
 
             elif not cls.cover_optional or options.with_cover:
                 transform_args['cover'] = DefaultEbookCover
 
-
         # Do some real work
         try:
             for main_input in input_filenames:
         # Do some real work
         try:
             for main_input in input_filenames:
@@ -134,8 +124,7 @@ class Book2Anything(object):
                 transform = getattr(WLDocument, 'as_%s' % cls.ext)
             output = transform(doc, **transform_args)
 
                 transform = getattr(WLDocument, 'as_%s' % cls.ext)
             output = transform(doc, **transform_args)
 
-            doc.save_output_file(output,
-                output_file, options.output_dir, options.make_dir, cls.ext)
+            doc.save_output_file(output, output_file, options.output_dir, options.make_dir, cls.ext)
 
         except ParseError, e:
             print '%(file)s:%(name)s:%(message)s' % {
 
         except ParseError, e:
             print '%(file)s:%(name)s:%(message)s' % {
index 0266b4e..0b7a176 100644 (file)
@@ -4,7 +4,7 @@
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 import re
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 import re
-from PIL import Image, ImageFont, ImageDraw, ImageFilter, ImageEnhance
+from PIL import Image, ImageFont, ImageDraw, ImageFilter
 from StringIO import StringIO
 from librarian import get_resource, OutputFile, URLOpener
 
 from StringIO import StringIO
 from librarian import get_resource, OutputFile, URLOpener
 
@@ -181,8 +181,7 @@ class Cover(object):
             
         author_font = ImageFont.truetype(
             self.author_font_ttf, metr.author_font_size)
             
         author_font = ImageFont.truetype(
             self.author_font_ttf, metr.author_font_size)
-        tbox.text(self.pretty_author(), self.author_color, author_font,
-            metr.author_lineskip, self.author_shadow)
+        tbox.text(self.pretty_author(), self.author_color, author_font, metr.author_lineskip, self.author_shadow)
         text_img = tbox.image()
         img.paste(text_img, (metr.author_margin_left, top), text_img)
 
         text_img = tbox.image()
         img.paste(text_img, (metr.author_margin_left, top), text_img)
 
@@ -193,8 +192,7 @@ class Cover(object):
             )
         title_font = ImageFont.truetype(
             self.title_font_ttf, metr.title_font_size)
             )
         title_font = ImageFont.truetype(
             self.title_font_ttf, metr.title_font_size)
-        tbox.text(self.pretty_title(), self.title_color, title_font,
-            metr.title_lineskip, self.title_shadow)
+        tbox.text(self.pretty_title(), self.title_color, title_font, metr.title_lineskip, self.title_shadow)
         text_img = tbox.image()
         img.paste(text_img, (metr.title_margin_left, top), text_img)
 
         text_img = tbox.image()
         img.paste(text_img, (metr.title_margin_left, top), text_img)
 
@@ -319,12 +317,11 @@ class WLCover(Cover):
                  font=author_font,
                  line_height=metr.author_lineskip,
                  color=self.author_color,
                  font=author_font,
                  line_height=metr.author_lineskip,
                  color=self.author_color,
-                 shadow_color=self.author_shadow,
-                )
+                 shadow_color=self.author_shadow)
 
         box.skip(metr.box_above_line)
         box.draw.line((metr.box_line_left, box.height, metr.box_line_right, box.height),
 
         box.skip(metr.box_above_line)
         box.draw.line((metr.box_line_left, box.height, metr.box_line_right, box.height),
-                fill=self.author_color, width=metr.box_line_width)
+                      fill=self.author_color, width=metr.box_line_width)
         box.skip(metr.box_below_line)
 
         # Write title.
         box.skip(metr.box_below_line)
 
         # Write title.
@@ -334,8 +331,7 @@ class WLCover(Cover):
                  line_height=metr.title_lineskip,
                  font=title_font,
                  color=self.title_color,
                  line_height=metr.title_lineskip,
                  font=title_font,
                  color=self.title_color,
-                 shadow_color=self.title_shadow,
-                )
+                 shadow_color=self.title_shadow)
 
         box_img = box.image()
 
 
         box_img = box.image()
 
@@ -347,13 +343,11 @@ class WLCover(Cover):
         else:   # Middle.
             box_top = (metr.height - box_img.size[1]) / 2
 
         else:   # Middle.
             box_top = (metr.height - box_img.size[1]) / 2
 
-        box_left = metr.bar_width + (metr.width - metr.bar_width -
-                        box_img.size[0]) / 2
+        box_left = metr.bar_width + (metr.width - metr.bar_width - box_img.size[0]) / 2
 
         # Draw the white box.
 
         # Draw the white box.
-        ImageDraw.Draw(img).rectangle((box_left, box_top,
-            box_left + box_img.size[0], box_top + box_img.size[1]),
-            fill='#fff')
+        ImageDraw.Draw(img).rectangle(
+            (box_left, box_top, box_left + box_img.size[0], box_top + box_img.size[1]), fill='#fff')
         # Paste the contents into the white box.
         img.paste(box_img, (box_left, box_top), box_img)
         return img
         # Paste the contents into the white box.
         img.paste(box_img, (box_left, box_top), box_img)
         return img
@@ -412,12 +406,13 @@ class LogoWLCover(WLCover):
         gradient_mask = Image.new('L', (metr.width - metr.bar_width, metr.gradient_height))
         draw = ImageDraw.Draw(gradient_mask)
         for line in range(0, metr.gradient_height):
         gradient_mask = Image.new('L', (metr.width - metr.bar_width, metr.gradient_height))
         draw = ImageDraw.Draw(gradient_mask)
         for line in range(0, metr.gradient_height):
-            draw.line((0, line, metr.width - metr.bar_width, line), fill=int(255 * self.gradient_opacity * line / metr.gradient_height))
-        img.paste(gradient, 
-            (metr.bar_width, metr.height - metr.gradient_height), mask=gradient_mask)
+            draw.line(
+                (0, line, metr.width - metr.bar_width, line),
+                fill=int(255 * self.gradient_opacity * line / metr.gradient_height))
+        img.paste(gradient, (metr.bar_width, metr.height - metr.gradient_height), mask=gradient_mask)
 
         cursor = metr.width - metr.gradient_logo_margin_right
 
         cursor = metr.width - metr.gradient_logo_margin_right
-        logo_top = metr.height - metr.gradient_height / 2  - metr.gradient_logo_height / 2
+        logo_top = metr.height - metr.gradient_height / 2 - metr.gradient_logo_height / 2
         for logo_path in self.gradient_logos[::-1]:
             logo = Image.open(get_resource(logo_path))
             logo = logo.resize(
         for logo_path in self.gradient_logos[::-1]:
             logo = Image.open(get_resource(logo_path))
             logo = logo.resize(
@@ -514,4 +509,3 @@ class GandalfCover(Cover):
 
 
 DefaultEbookCover = LogoWLCover
 
 
 DefaultEbookCover = LogoWLCover
-
index f413fac..fd3eec5 100644 (file)
@@ -12,13 +12,14 @@ from librarian.util import roman_to_int
 from librarian import (ValidationError, NoDublinCore, ParseError, DCNS, RDFNS,
                        XMLNS, WLURI, WLNS, PLMETNS)
 
 from librarian import (ValidationError, NoDublinCore, ParseError, DCNS, RDFNS,
                        XMLNS, WLURI, WLNS, PLMETNS)
 
-import lxml.etree as etree # ElementTree API using libxml2
+import lxml.etree as etree  # ElementTree API using libxml2
 from lxml.etree import XMLSyntaxError
 
 
 class TextPlus(unicode):
     pass
 
 from lxml.etree import XMLSyntaxError
 
 
 class TextPlus(unicode):
     pass
 
+
 class DatePlus(date):
     pass
 
 class DatePlus(date):
     pass
 
@@ -34,7 +35,7 @@ class Person(object):
 
     @classmethod
     def from_text(cls, text):
 
     @classmethod
     def from_text(cls, text):
-        parts = [ token.strip() for token in text.split(',') ]
+        parts = [token.strip() for token in text.split(',')]
         if len(parts) == 1:
             surname = parts[0]
             names = []
         if len(parts) == 1:
             surname = parts[0]
             names = []
@@ -45,7 +46,7 @@ class Person(object):
             if len(parts[1]) == 0:
                 # there is no non-whitespace data after the comma
                 raise ValueError("Found a comma, but no names given: \"%s\" -> %r." % (text, parts))
             if len(parts[1]) == 0:
                 # there is no non-whitespace data after the comma
                 raise ValueError("Found a comma, but no names given: \"%s\" -> %r." % (text, parts))
-            names = [ name for name in parts[1].split() if len(name) ] # all non-whitespace tokens
+            names = [name for name in parts[1].split() if len(name)]  # all non-whitespace tokens
         return cls(surname, *names)
 
     def readable(self):
         return cls(surname, *names)
 
     def readable(self):
@@ -69,6 +70,7 @@ class Person(object):
     def __repr__(self):
         return 'Person(last_name=%r, first_names=*%r)' % (self.last_name, self.first_names)
 
     def __repr__(self):
         return 'Person(last_name=%r, first_names=*%r)' % (self.last_name, self.first_names)
 
+
 def as_date(text):
     """Dates for digitization of pictures. It seems we need the following:
 ranges:                '1350-1450',
 def as_date(text):
     """Dates for digitization of pictures. It seems we need the following:
 ranges:                '1350-1450',
@@ -81,7 +83,8 @@ for now we will translate this to some single date losing information of course.
     """
     try:
         # check out the "N. poł X w." syntax
     """
     try:
         # check out the "N. poł X w." syntax
-        if isinstance(text, str): text = text.decode("utf-8")
+        if isinstance(text, str):
+            text = text.decode("utf-8")
 
         century_format = u"(?:([12]) *poł[.]? +)?([MCDXVI]+) *w[.,]*(?: *l[.]? *([0-9]+))?"
         vague_format = u"(?:po *|ok. *)?([0-9]{4})(-[0-9]{2}-[0-9]{2})?"
 
         century_format = u"(?:([12]) *poł[.]? +)?([MCDXVI]+) *w[.,]*(?: *l[.]? *([0-9]+))?"
         vague_format = u"(?:po *|ok. *)?([0-9]{4})(-[0-9]{2}-[0-9]{2})?"
@@ -114,18 +117,22 @@ for now we will translate this to some single date losing information of course.
     except ValueError, e:
         raise ValueError("Unrecognized date format. Try YYYY-MM-DD or YYYY.")
 
     except ValueError, e:
         raise ValueError("Unrecognized date format. Try YYYY-MM-DD or YYYY.")
 
+
 def as_person(text):
     return Person.from_text(text)
 
 def as_person(text):
     return Person.from_text(text)
 
+
 def as_unicode(text):
     if isinstance(text, unicode):
         return text
     else:
         return TextPlus(text.decode('utf-8'))
 
 def as_unicode(text):
     if isinstance(text, unicode):
         return text
     else:
         return TextPlus(text.decode('utf-8'))
 
+
 def as_wluri_strict(text):
     return WLURI.strict(text)
 
 def as_wluri_strict(text):
     return WLURI.strict(text)
 
+
 class Field(object):
     def __init__(self, uri, attr_name, validator=as_unicode, strict=None, multiple=False, salias=None, **kwargs):
         self.uri = uri
 class Field(object):
     def __init__(self, uri, attr_name, validator=as_unicode, strict=None, multiple=False, salias=None, **kwargs):
         self.uri = uri
@@ -135,7 +142,7 @@ class Field(object):
         self.multiple = multiple
         self.salias = salias
 
         self.multiple = multiple
         self.salias = salias
 
-        self.required = kwargs.get('required', True) and not kwargs.has_key('default')
+        self.required = kwargs.get('required', True) and 'default' not in kwargs
         self.default = kwargs.get('default', [] if multiple else [None])
 
     def validate_value(self, val, strict=False):
         self.default = kwargs.get('default', [] if multiple else [None])
 
     def validate_value(self, val, strict=False):
@@ -173,7 +180,7 @@ class Field(object):
     def validate(self, fdict, fallbacks=None, strict=False):
         if fallbacks is None:
             fallbacks = {}
     def validate(self, fdict, fallbacks=None, strict=False):
         if fallbacks is None:
             fallbacks = {}
-        if not fdict.has_key(self.uri):
+        if self.uri not in fdict:
             if not self.required:
                 # Accept single value for single fields and saliases.
                 if self.name in fallbacks:
             if not self.required:
                 # Accept single value for single fields and saliases.
                 if self.name in fallbacks:
@@ -199,7 +206,7 @@ class Field(object):
 
 
 class DCInfo(type):
 
 
 class DCInfo(type):
-    def __new__(meta, classname, bases, class_dict):
+    def __new__(mcs, classname, bases, class_dict):
         fields = list(class_dict['FIELDS'])
 
         for base in bases[::-1]:
         fields = list(class_dict['FIELDS'])
 
         for base in bases[::-1]:
@@ -211,41 +218,40 @@ class DCInfo(type):
                         fields.insert(0, field)
 
         class_dict['FIELDS'] = tuple(fields)
                         fields.insert(0, field)
 
         class_dict['FIELDS'] = tuple(fields)
-        return super(DCInfo, meta).__new__(meta, classname, bases, class_dict)
+        return super(DCInfo, mcs).__new__(mcs, classname, bases, class_dict)
 
 
 class WorkInfo(object):
     __metaclass__ = DCInfo
 
     FIELDS = (
 
 
 class WorkInfo(object):
     __metaclass__ = DCInfo
 
     FIELDS = (
-        Field( DCNS('creator'), 'authors', as_person, salias='author', multiple=True),
-        Field( DCNS('title'), 'title'),
-        Field( DCNS('type'), 'type', required=False, multiple=True),
-
-        Field( DCNS('contributor.editor'), 'editors', \
-            as_person, salias='editor', multiple=True, default=[]),
-        Field( DCNS('contributor.technical_editor'), 'technical_editors',
-            as_person, salias='technical_editor', multiple=True, default=[]),
-        Field( DCNS('contributor.funding'), 'funders',
-            salias='funder', multiple=True, default=[]),
-        Field( DCNS('contributor.thanks'), 'thanks', required=False),
-
-        Field( DCNS('date'), 'created_at'),
-        Field( DCNS('date.pd'), 'released_to_public_domain_at', as_date, required=False),
-        Field( DCNS('publisher'), 'publisher'),
-
-        Field( DCNS('language'), 'language'),
-        Field( DCNS('description'), 'description', required=False),
-
-        Field( DCNS('source'), 'source_name', required=False),
-        Field( DCNS('source.URL'), 'source_url', required=False),
-        Field( DCNS('identifier.url'), 'url', WLURI, strict=as_wluri_strict),
-        Field( DCNS('rights.license'), 'license', required=False),
-        Field( DCNS('rights'), 'license_description'),
-
-        Field( PLMETNS('digitisationSponsor'), 'sponsors', multiple=True, default=[]),
-        Field( WLNS('digitisationSponsorNote'), 'sponsor_note', required=False),
-        Field( WLNS('developmentStage'), 'stage', required=False),
+        Field(DCNS('creator'), 'authors', as_person, salias='author', multiple=True),
+        Field(DCNS('title'), 'title'),
+        Field(DCNS('type'), 'type', required=False, multiple=True),
+
+        Field(DCNS('contributor.editor'), 'editors',
+              as_person, salias='editor', multiple=True, default=[]),
+        Field(DCNS('contributor.technical_editor'), 'technical_editors',
+              as_person, salias='technical_editor', multiple=True, default=[]),
+        Field(DCNS('contributor.funding'), 'funders', salias='funder', multiple=True, default=[]),
+        Field(DCNS('contributor.thanks'), 'thanks', required=False),
+
+        Field(DCNS('date'), 'created_at'),
+        Field(DCNS('date.pd'), 'released_to_public_domain_at', as_date, required=False),
+        Field(DCNS('publisher'), 'publisher'),
+
+        Field(DCNS('language'), 'language'),
+        Field(DCNS('description'), 'description', required=False),
+
+        Field(DCNS('source'), 'source_name', required=False),
+        Field(DCNS('source.URL'), 'source_url', required=False),
+        Field(DCNS('identifier.url'), 'url', WLURI, strict=as_wluri_strict),
+        Field(DCNS('rights.license'), 'license', required=False),
+        Field(DCNS('rights'), 'license_description'),
+
+        Field(PLMETNS('digitisationSponsor'), 'sponsors', multiple=True, default=[]),
+        Field(WLNS('digitisationSponsorNote'), 'sponsor_note', required=False),
+        Field(WLNS('developmentStage'), 'stage', required=False),
     )
 
     @classmethod
     )
 
     @classmethod
@@ -320,11 +326,11 @@ class WorkInfo(object):
         self.fmap = {}
 
         for field in self.FIELDS:
         self.fmap = {}
 
         for field in self.FIELDS:
-            value = field.validate(dc_fields, fallbacks=fallbacks,
-                            strict=strict)
+            value = field.validate(dc_fields, fallbacks=fallbacks, strict=strict)
             setattr(self, 'prop_' + field.name, value)
             self.fmap[field.name] = field
             setattr(self, 'prop_' + field.name, value)
             self.fmap[field.name] = field
-            if field.salias: self.fmap[field.salias] = field
+            if field.salias:
+                self.fmap[field.salias] = field
 
     def __getattribute__(self, name):
         try:
 
     def __getattribute__(self, name):
         try:
@@ -332,7 +338,7 @@ class WorkInfo(object):
             value = object.__getattribute__(self, 'prop_'+field.name)
             if field.name == name:
                 return value
             value = object.__getattribute__(self, 'prop_'+field.name)
             if field.name == name:
                 return value
-            else: # singular alias
+            else:  # singular alias
                 if not field.multiple:
                     raise "OUCH!! for field %s" % name
 
                 if not field.multiple:
                     raise "OUCH!! for field %s" % name
 
@@ -345,7 +351,7 @@ class WorkInfo(object):
             field = object.__getattribute__(self, 'fmap')[name]
             if field.name == name:
                 object.__setattr__(self, 'prop_'+field.name, newvalue)
             field = object.__getattribute__(self, 'fmap')[name]
             if field.name == name:
                 object.__setattr__(self, 'prop_'+field.name, newvalue)
-            else: # singular alias
+            else:  # singular alias
                 if not field.multiple:
                     raise "OUCH! while setting field %s" % name
 
                 if not field.multiple:
                     raise "OUCH! while setting field %s" % name
 
@@ -357,13 +363,13 @@ class WorkInfo(object):
         """Update using field_dict. Verify correctness, but don't check if all
         required fields are present."""
         for field in self.FIELDS:
         """Update using field_dict. Verify correctness, but don't check if all
         required fields are present."""
         for field in self.FIELDS:
-            if field_dict.has_key(field.name):
+            if field.name in field_dict:
                 setattr(self, field.name, field_dict[field.name])
 
                 setattr(self, field.name, field_dict[field.name])
 
-    def to_etree(self, parent = None):
+    def to_etree(self, parent=None):
         """XML representation of this object."""
         """XML representation of this object."""
-        #etree._namespace_map[str(self.RDF)] = 'rdf'
-        #etree._namespace_map[str(self.DC)] = 'dc'
+        # etree._namespace_map[str(self.RDF)] = 'rdf'
+        # etree._namespace_map[str(self.DC)] = 'dc'
 
         if parent is None:
             root = etree.Element(RDFNS('RDF'))
 
         if parent is None:
             root = etree.Element(RDFNS('RDF'))
@@ -379,7 +385,8 @@ class WorkInfo(object):
             v = getattr(self, field.name, None)
             if v is not None:
                 if field.multiple:
             v = getattr(self, field.name, None)
             if v is not None:
                 if field.multiple:
-                    if len(v) == 0: continue
+                    if len(v) == 0:
+                        continue
                     for x in v:
                         e = etree.Element(field.uri)
                         if x is not None:
                     for x in v:
                         e = etree.Element(field.uri)
                         if x is not None:
@@ -393,16 +400,16 @@ class WorkInfo(object):
         return root
 
     def serialize(self):
         return root
 
     def serialize(self):
-        rdf = {}
-        rdf['about'] = { 'uri': RDFNS('about'), 'value': self.about }
+        rdf = {'about': {'uri': RDFNS('about'), 'value': self.about}}
 
         dc = {}
         for field in self.FIELDS:
             v = getattr(self, field.name, None)
             if v is not None:
                 if field.multiple:
 
         dc = {}
         for field in self.FIELDS:
             v = getattr(self, field.name, None)
             if v is not None:
                 if field.multiple:
-                    if len(v) == 0: continue
-                    v = [ unicode(x) for x in v if x is not None ]
+                    if len(v) == 0:
+                        continue
+                    v = [unicode(x) for x in v if x is not None]
                 else:
                     v = unicode(v)
 
                 else:
                     v = unicode(v)
 
@@ -417,44 +424,40 @@ class WorkInfo(object):
 
             if v is not None:
                 if field.multiple:
 
             if v is not None:
                 if field.multiple:
-                    if len(v) == 0: continue
-                    v = [ unicode(x) for x in v if x is not None ]
+                    if len(v) == 0:
+                        continue
+                    v = [unicode(x) for x in v if x is not None]
                 else:
                     v = unicode(v)
                 result[field.name] = v
 
             if field.salias:
                 v = getattr(self, field.salias)
                 else:
                     v = unicode(v)
                 result[field.name] = v
 
             if field.salias:
                 v = getattr(self, field.salias)
-                if v is not None: result[field.salias] = unicode(v)
+                if v is not None:
+                    result[field.salias] = unicode(v)
 
         return result
 
 
 class BookInfo(WorkInfo):
     FIELDS = (
 
         return result
 
 
 class BookInfo(WorkInfo):
     FIELDS = (
-        Field( DCNS('audience'), 'audiences', salias='audience', multiple=True,
-                required=False),
-
-        Field( DCNS('subject.period'), 'epochs', salias='epoch', multiple=True,
-                required=False),
-        Field( DCNS('subject.type'), 'kinds', salias='kind', multiple=True,
-                required=False),
-        Field( DCNS('subject.genre'), 'genres', salias='genre', multiple=True,
-                required=False),
+        Field(DCNS('audience'), 'audiences', salias='audience', multiple=True, required=False),
+
+        Field(DCNS('subject.period'), 'epochs', salias='epoch', multiple=True, required=False),
+        Field(DCNS('subject.type'), 'kinds', salias='kind', multiple=True, required=False),
+        Field(DCNS('subject.genre'), 'genres', salias='genre', multiple=True, required=False),
                 
                 
-        Field( DCNS('contributor.translator'), 'translators', \
-            as_person,  salias='translator', multiple=True, default=[]),
-        Field( DCNS('relation.hasPart'), 'parts', 
-            WLURI, strict=as_wluri_strict, multiple=True, required=False),
-        Field( DCNS('relation.isVariantOf'), 'variant_of', 
-            WLURI, strict=as_wluri_strict, required=False),
-
-        Field( DCNS('relation.coverImage.url'), 'cover_url', required=False),
-        Field( DCNS('relation.coverImage.attribution'), 'cover_by', required=False),
-        Field( DCNS('relation.coverImage.source'), 'cover_source', required=False),
+        Field(DCNS('contributor.translator'), 'translators',
+              as_person,  salias='translator', multiple=True, default=[]),
+        Field(DCNS('relation.hasPart'), 'parts', WLURI, strict=as_wluri_strict, multiple=True, required=False),
+        Field(DCNS('relation.isVariantOf'), 'variant_of', WLURI, strict=as_wluri_strict, required=False),
+
+        Field(DCNS('relation.coverImage.url'), 'cover_url', required=False),
+        Field(DCNS('relation.coverImage.attribution'), 'cover_by', required=False),
+        Field(DCNS('relation.coverImage.source'), 'cover_source', required=False),
         # WLCover-specific.
         # WLCover-specific.
-        Field( WLNS('coverBarColor'), 'cover_bar_color', required=False),
-        Field( WLNS('coverBoxPosition'), 'cover_box_position', required=False),
+        Field(WLNS('coverBarColor'), 'cover_bar_color', required=False),
+        Field(WLNS('coverBoxPosition'), 'cover_box_position', required=False),
     )
 
 
     )
 
 
index e10d165..0201d08 100644 (file)
@@ -1,9 +1,11 @@
+# -*- coding: utf-8 -*-
 import os
 import shutil
 from subprocess import call, PIPE
 from tempfile import mkdtemp
 from librarian import get_resource
 import os
 import shutil
 from subprocess import call, PIPE
 from tempfile import mkdtemp
 from librarian import get_resource
-from . import DataEmbed, create_embed, downgrades_to, converts_to
+from . import DataEmbed, create_embed, downgrades_to
+
 
 class LaTeX(DataEmbed):
     @downgrades_to('image/png')
 
 class LaTeX(DataEmbed):
     @downgrades_to('image/png')
@@ -15,7 +17,7 @@ class LaTeX(DataEmbed):
             f.write((tmpl % {'code': self.data}).encode('utf-8'))
         call(['xelatex', '-interaction=batchmode', '-output-directory', tempdir, fpath], stdout=PIPE, stderr=PIPE)
         call(['convert', '-density', '150', os.path.join(tempdir, 'doc.pdf'), '-trim',
             f.write((tmpl % {'code': self.data}).encode('utf-8'))
         call(['xelatex', '-interaction=batchmode', '-output-directory', tempdir, fpath], stdout=PIPE, stderr=PIPE)
         call(['convert', '-density', '150', os.path.join(tempdir, 'doc.pdf'), '-trim',
-                os.path.join(tempdir, 'doc.png')])
+             os.path.join(tempdir, 'doc.png')])
         pngdata = open(os.path.join(tempdir, 'doc.png')).read()
         shutil.rmtree(tempdir)
         return create_embed('image/png', data=pngdata)
         pngdata = open(os.path.join(tempdir, 'doc.png')).read()
         shutil.rmtree(tempdir)
         return create_embed('image/png', data=pngdata)
index f99f979..dd78f05 100644 (file)
@@ -1,6 +1,8 @@
+# -*- coding: utf-8 -*-
 from lxml import etree
 from librarian import get_resource
 from lxml import etree
 from librarian import get_resource
-from . import TreeEmbed, create_embed, downgrades_to, converts_to
+from . import TreeEmbed, create_embed, downgrades_to
+
 
 class MathML(TreeEmbed):
     @downgrades_to('application/x-latex')
 
 class MathML(TreeEmbed):
     @downgrades_to('application/x-latex')
index 6a1b2ce..bf2d4d9 100644 (file)
@@ -646,7 +646,7 @@ def transform(wldoc, verbose=False,
                 '"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'
     ))
 
                 '"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'
     ))
 
-    if not flags or not 'without-fonts' in flags:
+    if not flags or 'without-fonts' not in flags:
         # strip fonts
         tmpdir = mkdtemp('-librarian-epub')
         try:
         # strip fonts
         tmpdir = mkdtemp('-librarian-epub')
         try:
index a1cece4..25a4c1f 100644 (file)
@@ -17,10 +17,11 @@ functions.reg_person_name()
 
 def sectionify(tree):
     """Finds section headers and adds a tree of _section tags."""
 
 def sectionify(tree):
     """Finds section headers and adds a tree of _section tags."""
-    sections = ['naglowek_czesc',
-            'naglowek_akt', 'naglowek_rozdzial', 'naglowek_scena',
-            'naglowek_podrozdzial']
-    section_level = dict((v,k) for (k,v) in enumerate(sections))
+    sections = [
+        'naglowek_czesc',
+        'naglowek_akt', 'naglowek_rozdzial', 'naglowek_scena',
+        'naglowek_podrozdzial']
+    section_level = dict((v, k) for (k, v) in enumerate(sections))
 
     # We can assume there are just subelements an no text at section level.
     for level, section_name in reversed(list(enumerate(sections))):
 
     # We can assume there are just subelements an no text at section level.
     for level, section_name in reversed(list(enumerate(sections))):
index 659bb94..75e2911 100644 (file)
@@ -9,6 +9,7 @@ import re
 from librarian.dcparser import Person
 from librarian import get_resource
 
 from librarian.dcparser import Person
 from librarian import get_resource
 
+
 def _register_function(f):
     """ Register extension function with lxml """
     ns = etree.FunctionNamespace('http://wolnelektury.pl/functions')
 def _register_function(f):
     """ Register extension function with lxml """
     ns = etree.FunctionNamespace('http://wolnelektury.pl/functions')
@@ -16,7 +17,7 @@ def _register_function(f):
 
 
 def reg_substitute_entities():
 
 
 def reg_substitute_entities():
-    ENTITY_SUBSTITUTIONS = [
+    entity_substitutions = [
         (u'---', u'—'),
         (u'--', u'–'),
         (u'...', u'…'),
         (u'---', u'—'),
         (u'--', u'–'),
         (u'...', u'…'),
@@ -28,7 +29,7 @@ def reg_substitute_entities():
         """XPath extension function converting all entites in passed text."""
         if isinstance(text, list):
             text = ''.join(text)
         """XPath extension function converting all entites in passed text."""
         if isinstance(text, list):
             text = ''.join(text)
-        for entity, substitutution in ENTITY_SUBSTITUTIONS:
+        for entity, substitutution in entity_substitutions:
             text = text.replace(entity, substitutution)
         return text
 
             text = text.replace(entity, substitutution)
         return text
 
@@ -103,22 +104,23 @@ def reg_texcommand():
             text = ''.join(text)
         return re.sub(r'[^a-zA-Z]', '', text).strip()
     _register_function(texcommand)
             text = ''.join(text)
         return re.sub(r'[^a-zA-Z]', '', text).strip()
     _register_function(texcommand)
-    
+
+
 def reg_lang_code_3to2():
 def reg_lang_code_3to2():
-       def lang_code_3to2(context, text):
-               """Convert 3-letter language code to 2-letter code"""
-               result = ''
-               text = ''.join(text)
-               with open(get_resource('res/ISO-639-2_8859-1.txt'), 'rb') as f:
-                       for line in f:
-                               list = line.strip().split('|')
-                               if list[0] == text:
-                                       result=list[2]
-               if result == '':
-                       return text
-               else:
-                       return result
-       _register_function(lang_code_3to2)
+    def lang_code_3to2(context, text):
+        """Convert 3-letter language code to 2-letter code"""
+        result = ''
+        text = ''.join(text)
+        with open(get_resource('res/ISO-639-2_8859-1.txt'), 'rb') as f:
+            for line in f:
+                list = line.strip().split('|')
+                if list[0] == text:
+                    result = list[2]
+        if result == '':
+            return text
+        else:
+            return result
+    _register_function(lang_code_3to2)
 
 
 def mathml_latex(context, trees):
 
 
 def mathml_latex(context, trees):
@@ -128,11 +130,14 @@ def mathml_latex(context, trees):
     text = text.replace(u'\u2062', '')
     return text
 
     text = text.replace(u'\u2062', '')
     return text
 
+
 def reg_mathml_latex():
     _register_function(mathml_latex)
 
 def reg_mathml_latex():
     _register_function(mathml_latex)
 
+
 def reg_mathml_epub(zipf):
     from librarian.embeds.mathml import MathML
 def reg_mathml_epub(zipf):
     from librarian.embeds.mathml import MathML
+
     def mathml(context, trees):
         data = MathML(trees[0]).to_latex().to_png().data
         name = "math%d.png" % mathml.count
     def mathml(context, trees):
         data = MathML(trees[0]).to_latex().to_png().data
         name = "math%d.png" % mathml.count
@@ -141,4 +146,3 @@ def reg_mathml_epub(zipf):
         return name
     mathml.count = 0
     _register_function(mathml)
         return name
     mathml.count = 0
     _register_function(mathml)
-
index 24d506f..6a6e3db 100644 (file)
@@ -23,12 +23,15 @@ STYLESHEETS = {
     'partial': 'xslt/wl2html_partial.xslt'
 }
 
     'partial': 'xslt/wl2html_partial.xslt'
 }
 
+
 def get_stylesheet(name):
     return os.path.join(os.path.dirname(__file__), STYLESHEETS[name])
 
 def get_stylesheet(name):
     return os.path.join(os.path.dirname(__file__), STYLESHEETS[name])
 
+
 def html_has_content(text):
     return etree.ETXPath('//p|//{%(ns)s}p|//h1|//{%(ns)s}h1' % {'ns': str(XHTMLNS)})(text)
 
 def html_has_content(text):
     return etree.ETXPath('//p|//{%(ns)s}p|//h1|//{%(ns)s}h1' % {'ns': str(XHTMLNS)})(text)
 
+
 def transform(wldoc, stylesheet='legacy', options=None, flags=None):
     """Transforms the WL document to XHTML.
 
 def transform(wldoc, stylesheet='legacy', options=None, flags=None):
     """Transforms the WL document to XHTML.
 
@@ -55,15 +58,15 @@ def transform(wldoc, stylesheet='legacy', options=None, flags=None):
         if not options:
             options = {}
         result = document.transform(style, **options)
         if not options:
             options = {}
         result = document.transform(style, **options)
-        del document # no longer needed large object :)
+        del document  # no longer needed large object :)
 
         if html_has_content(result):
             add_anchors(result.getroot())
             add_table_of_themes(result.getroot())
             add_table_of_contents(result.getroot())
 
 
         if html_has_content(result):
             add_anchors(result.getroot())
             add_table_of_themes(result.getroot())
             add_table_of_contents(result.getroot())
 
-            return OutputFile.from_string(etree.tostring(result, method='html',
-                xml_declaration=False, pretty_print=True, encoding='utf-8'))
+            return OutputFile.from_string(etree.tostring(
+                result, method='html', xml_declaration=False, pretty_print=True, encoding='utf-8'))
         else:
             return None
     except KeyError:
         else:
             return None
     except KeyError:
@@ -71,6 +74,7 @@ def transform(wldoc, stylesheet='legacy', options=None, flags=None):
     except (XMLSyntaxError, XSLTApplyError), e:
         raise ParseError(e)
 
     except (XMLSyntaxError, XSLTApplyError), e:
         raise ParseError(e)
 
+
 class Fragment(object):
     def __init__(self, id, themes):
         super(Fragment, self).__init__()
 class Fragment(object):
     def __init__(self, id, themes):
         super(Fragment, self).__init__()
@@ -99,7 +103,8 @@ class Fragment(object):
         result = []
         for event, element in self.closed_events():
             if event == 'start':
         result = []
         for event, element in self.closed_events():
             if event == 'start':
-                result.append(u'<%s %s>' % (element.tag, ' '.join('%s="%s"' % (k, v) for k, v in element.attrib.items())))
+                result.append(u'<%s %s>' % (
+                    element.tag, ' '.join('%s="%s"' % (k, v) for k, v in element.attrib.items())))
                 if element.text:
                     result.append(element.text)
             elif event == 'end':
                 if element.text:
                     result.append(element.text)
             elif event == 'end':
@@ -129,7 +134,8 @@ def extract_fragments(input_filename):
     for event, element in etree.iterparse(buf, events=('start', 'end')):
         # Process begin and end elements
         if element.get('class', '') in ('theme-begin', 'theme-end'):
     for event, element in etree.iterparse(buf, events=('start', 'end')):
         # Process begin and end elements
         if element.get('class', '') in ('theme-begin', 'theme-end'):
-            if not event == 'end': continue # Process elements only once, on end event
+            if not event == 'end':
+                continue  # Process elements only once, on end event
 
             # Open new fragment
             if element.get('class', '') == 'theme-begin':
 
             # Open new fragment
             if element.get('class', '') == 'theme-begin':
@@ -165,7 +171,6 @@ def extract_fragments(input_filename):
                 for fragment_id in open_fragments:
                     open_fragments[fragment_id].append('text', element.tail)
 
                 for fragment_id in open_fragments:
                     open_fragments[fragment_id].append('text', element.tail)
 
-
         # Process all elements except begin and end
         else:
             # Omit annotation tags
         # Process all elements except begin and end
         else:
             # Omit annotation tags
@@ -210,9 +215,10 @@ def any_ancestor(element, test):
 def add_anchors(root):
     counter = 1
     for element in root.iterdescendants():
 def add_anchors(root):
     counter = 1
     for element in root.iterdescendants():
-        if any_ancestor(element, lambda e: e.get('class') in ('note', 'motto', 'motto_podpis', 'dedication')
-        or e.get('id') == 'nota_red'
-        or e.tag == 'blockquote'):
+        def f(e):
+            return e.get('class') in ('note', 'motto', 'motto_podpis', 'dedication') or \
+                e.get('id') == 'nota_red' or e.tag == 'blockquote'
+        if any_ancestor(element, f):
             continue
 
         if element.tag == 'p' and 'verse' in element.get('class', ''):
             continue
 
         if element.tag == 'p' and 'verse' in element.get('class', ''):
@@ -237,7 +243,8 @@ def add_table_of_contents(root):
     counter = 1
     for element in root.iterdescendants():
         if element.tag in ('h2', 'h3'):
     counter = 1
     for element in root.iterdescendants():
         if element.tag in ('h2', 'h3'):
-            if any_ancestor(element, lambda e: e.get('id') in ('footnotes', 'nota_red') or e.get('class') in ('person-list',)):
+            if any_ancestor(element,
+                            lambda e: e.get('id') in ('footnotes', 'nota_red') or e.get('class') in ('person-list',)):
                 continue
 
             element_text = raw_printable_text(element)
                 continue
 
             element_text = raw_printable_text(element)
@@ -260,9 +267,9 @@ def add_table_of_contents(root):
 
         if len(subsections):
             subsection_list = etree.SubElement(section_element, 'ol')
 
         if len(subsections):
             subsection_list = etree.SubElement(section_element, 'ol')
-            for n, subsection, text, _ in subsections:
+            for n1, subsection, subtext, _ in subsections:
                 subsection_element = etree.SubElement(subsection_list, 'li')
                 subsection_element = etree.SubElement(subsection_list, 'li')
-                add_anchor(subsection_element, "s%d" % n, with_target=False, link_text=text)
+                add_anchor(subsection_element, "s%d" % n1, with_target=False, link_text=subtext)
 
     root.insert(0, toc)
 
 
     root.insert(0, toc)
 
@@ -271,7 +278,8 @@ def add_table_of_themes(root):
     try:
         from sortify import sortify
     except ImportError:
     try:
         from sortify import sortify
     except ImportError:
-        sortify = lambda x: x
+        def sortify(x):
+            return x
 
     book_themes = {}
     for fragment in root.findall('.//a[@class="theme-begin"]'):
 
     book_themes = {}
     for fragment in root.findall('.//a[@class="theme-begin"]'):
@@ -334,4 +342,3 @@ def extract_annotations(html_path):
                 qualifiers = []
 
             yield anchor, fn_type, qualifiers, text_str, html_str
                 qualifiers = []
 
             yield anchor, fn_type, qualifiers, text_str, html_str
-
index a32a2a0..b3ae955 100644 (file)
@@ -4,9 +4,11 @@
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 import os
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 import os
-from librarian import pdf, epub, mobi, DirDocProvider, ParseError, cover
+from librarian import pdf, epub, mobi, DirDocProvider, ParseError
 from librarian.parser import WLDocument
 
 from librarian.parser import WLDocument
 
+from wolnelektury.utils import makedirs
+
 
 class Packager(object):
     cover = None
 
 class Packager(object):
     cover = None
@@ -23,20 +25,15 @@ class Packager(object):
         slug, ext = os.path.splitext(fname)
 
         if output_dir != '':
         slug, ext = os.path.splitext(fname)
 
         if output_dir != '':
-            try:
-                os.makedirs(output_dir)
-            except:
-                pass
+            makedirs(output_dir)
         outfile = os.path.join(output_dir, slug + '.' + cls.ext)
         if os.path.exists(outfile) and not overwrite:
             return
 
         doc = WLDocument.from_file(main_input, provider=provider)
         outfile = os.path.join(output_dir, slug + '.' + cls.ext)
         if os.path.exists(outfile) and not overwrite:
             return
 
         doc = WLDocument.from_file(main_input, provider=provider)
-        output_file = cls.transform(doc,
-                cover=cls.cover, flags=cls.flags)
+        output_file = cls.transform(doc, cover=cls.cover, flags=cls.flags)
         doc.save_output_file(output_file, output_path=outfile)
 
         doc.save_output_file(output_file, output_path=outfile)
 
-
     @classmethod
     def prepare(cls, input_filenames, output_dir='', verbose=False, overwrite=False):
         try:
     @classmethod
     def prepare(cls, input_filenames, output_dir='', verbose=False, overwrite=False):
         try:
@@ -56,10 +53,12 @@ class EpubPackager(Packager):
     converter = epub
     ext = 'epub'
 
     converter = epub
     ext = 'epub'
 
+
 class MobiPackager(Packager):
     converter = mobi
     ext = 'mobi'
 
 class MobiPackager(Packager):
     converter = mobi
     ext = 'mobi'
 
+
 class PdfPackager(Packager):
     converter = pdf
     ext = 'pdf'
 class PdfPackager(Packager):
     converter = pdf
     ext = 'pdf'
index 19ec32d..502192f 100644 (file)
@@ -16,12 +16,13 @@ import os
 import re
 from StringIO import StringIO
 
 import re
 from StringIO import StringIO
 
+
 class WLDocument(object):
     LINE_SWAP_EXPR = re.compile(r'/\s', re.MULTILINE | re.UNICODE)
     provider = None
 
     def __init__(self, edoc, parse_dublincore=True, provider=None, 
 class WLDocument(object):
     LINE_SWAP_EXPR = re.compile(r'/\s', re.MULTILINE | re.UNICODE)
     provider = None
 
     def __init__(self, edoc, parse_dublincore=True, provider=None, 
-                    strict=False, meta_fallbacks=None):
+                 strict=False, meta_fallbacks=None):
         self.edoc = edoc
         self.provider = provider
 
         self.edoc = edoc
         self.provider = provider
 
@@ -100,8 +101,7 @@ class WLDocument(object):
         if self.book_info is None:
             raise NoDublinCore('No Dublin Core in document.')
         for part_uri in self.book_info.parts:
         if self.book_info is None:
             raise NoDublinCore('No Dublin Core in document.')
         for part_uri in self.book_info.parts:
-            yield self.from_file(self.provider.by_uri(part_uri),
-                    provider=self.provider)
+            yield self.from_file(self.provider.by_uri(part_uri), provider=self.provider)
 
     def chunk(self, path):
         # convert the path to XPath
 
     def chunk(self, path):
         # convert the path to XPath
@@ -122,7 +122,7 @@ class WLDocument(object):
                 parts.append(part)
             else:
                 tag, n = match.groups()
                 parts.append(part)
             else:
                 tag, n = match.groups()
-                parts.append("*[%d][name() = '%s']" % (int(n)+1, tag) )
+                parts.append("*[%d][name() = '%s']" % (int(n)+1, tag))
 
         if parts[0] == '.':
             parts[0] = ''
 
         if parts[0] == '.':
             parts[0] = ''
@@ -135,7 +135,7 @@ class WLDocument(object):
     def update_dc(self):
         if self.book_info:
             parent = self.rdf_elem.getparent()
     def update_dc(self):
         if self.book_info:
             parent = self.rdf_elem.getparent()
-            parent.replace( self.rdf_elem, self.book_info.to_etree(parent) )
+            parent.replace(self.rdf_elem, self.book_info.to_etree(parent))
 
     def serialize(self):
         self.update_dc()
 
     def serialize(self):
         self.update_dc()
@@ -148,10 +148,10 @@ class WLDocument(object):
             try:
                 xpath = self.path_to_xpath(key)
                 node = self.edoc.xpath(xpath)[0]
             try:
                 xpath = self.path_to_xpath(key)
                 node = self.edoc.xpath(xpath)[0]
-                repl = etree.fromstring(u"<%s>%s</%s>" %(node.tag, data, node.tag) )
+                repl = etree.fromstring(u"<%s>%s</%s>" % (node.tag, data, node.tag))
                 node.getparent().replace(node, repl)
             except Exception, e:
                 node.getparent().replace(node, repl)
             except Exception, e:
-                unmerged.append( repr( (key, xpath, e) ) )
+                unmerged.append(repr((key, xpath, e)))
 
         return unmerged
 
 
         return unmerged
 
@@ -159,7 +159,7 @@ class WLDocument(object):
         """ deletes forbidden tags from nota_red """
 
         for node in self.edoc.xpath('|'.join('//%s//%s' % (note_tag, tag) for tag in
         """ deletes forbidden tags from nota_red """
 
         for node in self.edoc.xpath('|'.join('//%s//%s' % (note_tag, tag) for tag in
-                    ('pa', 'pe', 'pr', 'pt', 'begin', 'end', 'motyw'))):
+                                    ('pa', 'pe', 'pr', 'pt', 'begin', 'end', 'motyw'))):
             tail = node.tail
             node.clear()
             node.tag = 'span'
             tail = node.tail
             node.clear()
             node.tag = 'span'
@@ -172,8 +172,7 @@ class WLDocument(object):
         """
         if self.book_info is None:
             raise NoDublinCore('No Dublin Core in document.')
         """
         if self.book_info is None:
             raise NoDublinCore('No Dublin Core in document.')
-        persons = set(self.book_info.editors +
-                        self.book_info.technical_editors)
+        persons = set(self.book_info.editors + self.book_info.technical_editors)
         for child in self.parts():
             persons.update(child.editors())
         if None in persons:
         for child in self.parts():
             persons.update(child.editors())
         if None in persons:
@@ -211,15 +210,12 @@ class WLDocument(object):
             cover_class = DefaultEbookCover
         return cover_class(self.book_info, *args, **kwargs).output_file()
 
             cover_class = DefaultEbookCover
         return cover_class(self.book_info, *args, **kwargs).output_file()
 
-    def save_output_file(self, output_file, output_path=None,
-            output_dir_path=None, make_author_dir=False, ext=None):
+    def save_output_file(self, output_file, output_path=None, output_dir_path=None, make_author_dir=False, ext=None):
         if output_dir_path:
             save_path = output_dir_path
             if make_author_dir:
         if output_dir_path:
             save_path = output_dir_path
             if make_author_dir:
-                save_path = os.path.join(save_path,
-                        unicode(self.book_info.author).encode('utf-8'))
-            save_path = os.path.join(save_path,
-                                self.book_info.uri.slug)
+                save_path = os.path.join(save_path, unicode(self.book_info.author).encode('utf-8'))
+            save_path = os.path.join(save_path, self.book_info.uri.slug)
             if ext:
                 save_path += '.%s' % ext
         else:
             if ext:
                 save_path += '.%s' % ext
         else:
index 58bc8c5..dccb5b6 100644 (file)
@@ -13,20 +13,26 @@ New partners shouldn't be added here, but in the partners repository.
 """
 
 from librarian import packagers, cover
 """
 
 from librarian import packagers, cover
+from wolnelektury.utils import makedirs
+
 
 class GandalfEpub(packagers.EpubPackager):
     cover = cover.GandalfCover
 
 
 class GandalfEpub(packagers.EpubPackager):
     cover = cover.GandalfCover
 
+
 class GandalfPdf(packagers.PdfPackager):
     cover = cover.GandalfCover
 
 class GandalfPdf(packagers.PdfPackager):
     cover = cover.GandalfCover
 
+
 class BookotekaEpub(packagers.EpubPackager):
     cover = cover.BookotekaCover
 
 class BookotekaEpub(packagers.EpubPackager):
     cover = cover.BookotekaCover
 
+
 class PrestigioEpub(packagers.EpubPackager):
     cover = cover.PrestigioCover
     flags = ('less-advertising',)
 
 class PrestigioEpub(packagers.EpubPackager):
     cover = cover.PrestigioCover
     flags = ('less-advertising',)
 
+
 class PrestigioPdf(packagers.PdfPackager):
     cover = cover.PrestigioCover
     flags = ('less-advertising',)
 class PrestigioPdf(packagers.PdfPackager):
     cover = cover.PrestigioCover
     flags = ('less-advertising',)
@@ -51,7 +57,6 @@ class Virtualo(packagers.Packager):
         from librarian import DirDocProvider, ParseError
         from librarian.parser import WLDocument
         from copy import deepcopy
         from librarian import DirDocProvider, ParseError
         from librarian.parser import WLDocument
         from copy import deepcopy
-        import os
         import os.path
 
         xml = etree.fromstring("""<?xml version="1.0" encoding="utf-8"?>
         import os.path
 
         xml = etree.fromstring("""<?xml version="1.0" encoding="utf-8"?>
@@ -80,7 +85,7 @@ class Virtualo(packagers.Packager):
                 slug, ext = os.path.splitext(fname)
 
                 outfile_dir = os.path.join(output_dir, slug)
                 slug, ext = os.path.splitext(fname)
 
                 outfile_dir = os.path.join(output_dir, slug)
-                os.makedirs(os.path.join(output_dir, slug))
+                makedirs(os.path.join(output_dir, slug))
 
                 doc = WLDocument.from_file(main_input, provider=provider)
                 info = doc.book_info
 
                 doc = WLDocument.from_file(main_input, provider=provider)
                 info = doc.book_info
@@ -97,17 +102,14 @@ class Virtualo(packagers.Packager):
                 cover.VirtualoCover(info).save(os.path.join(outfile_dir, slug+'.jpg'))
                 outfile = os.path.join(outfile_dir, '1.epub')
                 outfile_sample = os.path.join(outfile_dir, '1.sample.epub')
                 cover.VirtualoCover(info).save(os.path.join(outfile_dir, slug+'.jpg'))
                 outfile = os.path.join(outfile_dir, '1.epub')
                 outfile_sample = os.path.join(outfile_dir, '1.sample.epub')
-                doc.save_output_file(doc.as_epub(),
-                        output_path=outfile)
-                doc.save_output_file(doc.as_epub(doc, sample=25),
-                        output_path=outfile_sample)
+                doc.save_output_file(doc.as_epub(), output_path=outfile)
+                doc.save_output_file(doc.as_epub(doc, sample=25), output_path=outfile_sample)
                 outfile = os.path.join(outfile_dir, '1.mobi')
                 outfile_sample = os.path.join(outfile_dir, '1.sample.mobi')
                 outfile = os.path.join(outfile_dir, '1.mobi')
                 outfile_sample = os.path.join(outfile_dir, '1.sample.mobi')
-                doc.save_output_file(doc.as_mobi(cover=cover.VirtualoCover),
-                        output_path=outfile)
+                doc.save_output_file(doc.as_mobi(cover=cover.VirtualoCover), output_path=outfile)
                 doc.save_output_file(
                 doc.save_output_file(
-                        doc.as_mobi(doc, cover=cover.VirtualoCover, sample=25),
-                        output_path=outfile_sample)
+                    doc.as_mobi(doc, cover=cover.VirtualoCover, sample=25),
+                    output_path=outfile_sample)
         except ParseError, e:
             print '%(file)s:%(name)s:%(message)s' % {
                 'file': main_input,
         except ParseError, e:
             print '%(file)s:%(name)s:%(message)s' % {
                 'file': main_input,
index 95883e1..c899afa 100644 (file)
@@ -41,20 +41,21 @@ STYLESHEETS = {
     'wl2tex': 'pdf/wl2tex.xslt',
 }
 
     'wl2tex': 'pdf/wl2tex.xslt',
 }
 
-#CUSTOMIZATIONS = [
-#    'nofootnotes',
-#    'nothemes',
-#    'defaultleading',
-#    'onehalfleading',
-#    'doubleleading',
-#    'nowlfont',
-#    ]
+# CUSTOMIZATIONS = [
+#     'nofootnotes',
+#     'nothemes',
+#     'defaultleading',
+#     'onehalfleading',
+#     'doubleleading',
+#     'nowlfont',
+# ]
+
 
 def insert_tags(doc, split_re, tagname, exclude=None):
     """ inserts <tagname> for every occurence of `split_re' in text nodes in the `doc' tree
 
 
 def insert_tags(doc, split_re, tagname, exclude=None):
     """ inserts <tagname> for every occurence of `split_re' in text nodes in the `doc' tree
 
-    >>> t = etree.fromstring('<a><b>A-B-C</b>X-Y-Z</a>');
-    >>> insert_tags(t, re.compile('-'), 'd');
+    >>> t = etree.fromstring('<a><b>A-B-C</b>X-Y-Z</a>')
+    >>> insert_tags(t, re.compile('-'), 'd')
     >>> print etree.tostring(t)
     <a><b>A<d/>B<d/>C</b>X<d/>Y<d/>Z</a>
     """
     >>> print etree.tostring(t)
     <a><b>A<d/>B<d/>C</b>X<d/>Y<d/>Z</a>
     """
@@ -95,6 +96,7 @@ def fix_hanging(doc):
                 exclude=[DCNS("identifier.url"), DCNS("rights.license")]
                 )
 
                 exclude=[DCNS("identifier.url"), DCNS("rights.license")]
                 )
 
+
 def fix_tables(doc):
     for kol in doc.iter(tag='kol'):
         if kol.tail is not None:
 def fix_tables(doc):
     for kol in doc.iter(tag='kol'):
         if kol.tail is not None:
@@ -109,10 +111,12 @@ def fix_tables(doc):
 
 def move_motifs_inside(doc):
     """ moves motifs to be into block elements """
 
 def move_motifs_inside(doc):
     """ moves motifs to be into block elements """
-    for master in doc.xpath('//powiesc|//opowiadanie|//liryka_l|//liryka_lp|//dramat_wierszowany_l|//dramat_wierszowany_lp|//dramat_wspolczesny'):
+    for master in doc.xpath('//powiesc|//opowiadanie|//liryka_l|//liryka_lp|'
+                            '//dramat_wierszowany_l|//dramat_wierszowany_lp|//dramat_wspolczesny'):
         for motif in master.xpath('motyw'):
             for sib in motif.itersiblings():
         for motif in master.xpath('motyw'):
             for sib in motif.itersiblings():
-                if sib.tag not in ('sekcja_swiatlo', 'sekcja_asterysk', 'separator_linia', 'begin', 'end', 'motyw', 'extra', 'uwaga'):
+                if sib.tag not in ('sekcja_swiatlo', 'sekcja_asterysk', 'separator_linia',
+                                   'begin', 'end', 'motyw', 'extra', 'uwaga'):
                     # motif shouldn't have a tail - it would be untagged text
                     motif.tail = None
                     motif.getparent().remove(motif)
                     # motif shouldn't have a tail - it would be untagged text
                     motif.tail = None
                     motif.getparent().remove(motif)
@@ -158,9 +162,8 @@ def parse_creator(doc):
     Finds all dc:creator and dc.contributor.translator tags
     and adds *_parsed versions with forenames first.
     """
     Finds all dc:creator and dc.contributor.translator tags
     and adds *_parsed versions with forenames first.
     """
-    for person in doc.xpath("|".join('//dc:'+(tag) for tag in (
-                    'creator', 'contributor.translator')),
-                    namespaces = {'dc': str(DCNS)})[::-1]:
+    for person in doc.xpath("|".join('//dc:' + tag for tag in ('creator', 'contributor.translator')),
+                            namespaces={'dc': str(DCNS)})[::-1]:
         if not person.text:
             continue
         p = Person.from_text(person.text)
         if not person.text:
             continue
         p = Person.from_text(person.text)
@@ -224,8 +227,7 @@ def transform(wldoc, verbose=False, save_tex=None, morefloats=None,
                 if book_info.cover_by:
                     root.set('data-cover-by', book_info.cover_by)
                 if book_info.cover_source:
                 if book_info.cover_by:
                     root.set('data-cover-by', book_info.cover_by)
                 if book_info.cover_source:
-                    root.set('data-cover-source',
-                            book_info.cover_source)
+                    root.set('data-cover-source', book_info.cover_source)
         if flags:
             for flag in flags:
                 root.set('flag-' + flag, 'yes')
         if flags:
             for flag in flags:
                 root.set('flag-' + flag, 'yes')
@@ -284,7 +286,7 @@ def transform(wldoc, verbose=False, save_tex=None, morefloats=None,
             with open(os.path.join(temp, 'cover.png'), 'w') as f:
                 bound_cover.save(f, quality=80)
 
             with open(os.path.join(temp, 'cover.png'), 'w') as f:
                 bound_cover.save(f, quality=80)
 
-        del document # no longer needed large object :)
+        del document  # no longer needed large object :)
 
         tex_path = os.path.join(temp, 'doc.tex')
         fout = open(tex_path, 'w')
 
         tex_path = os.path.join(temp, 'doc.tex')
         fout = open(tex_path, 'w')
@@ -343,8 +345,7 @@ def load_including_children(wldoc=None, provider=None, uri=None):
 
     text = re.sub(ur"([\u0400-\u04ff]+)", ur"<alien>\1</alien>", text)
 
 
     text = re.sub(ur"([\u0400-\u04ff]+)", ur"<alien>\1</alien>", text)
 
-    document = WLDocument.from_string(text,
-                parse_dublincore=True, provider=provider)
+    document = WLDocument.from_string(text, parse_dublincore=True, provider=provider)
     document.swap_endlines()
 
     for child_uri in document.book_info.parts:
     document.swap_endlines()
 
     for child_uri in document.book_info.parts:
index 6fc40b1..dbbb4de 100644 (file)
@@ -1,5 +1,5 @@
-
-from dcparser import (as_person, as_date, Field, WorkInfo, DCNS)
+# -*- coding: utf-8 -*-
+from dcparser import Field, WorkInfo, DCNS
 from librarian import (RDFNS, ValidationError, NoDublinCore, ParseError, WLURI)
 from xml.parsers.expat import ExpatError
 from os import path
 from librarian import (RDFNS, ValidationError, NoDublinCore, ParseError, WLURI)
 from xml.parsers.expat import ExpatError
 from os import path
@@ -10,15 +10,16 @@ import re
 from functools import *
 from operator import *
 
 from functools import *
 from operator import *
 
+
 class WLPictureURI(WLURI):
 class WLPictureURI(WLURI):
-    _re_wl_uri = re.compile('http://wolnelektury.pl/katalog/obraz/'
-            '(?P<slug>[-a-z0-9]+)/?$')
+    _re_wl_uri = re.compile('http://wolnelektury.pl/katalog/obraz/(?P<slug>[-a-z0-9]+)/?$')
 
     @classmethod
     def from_slug(cls, slug):
         uri = 'http://wolnelektury.pl/katalog/obraz/%s/' % slug
         return cls(uri)
 
 
     @classmethod
     def from_slug(cls, slug):
         uri = 'http://wolnelektury.pl/katalog/obraz/%s/' % slug
         return cls(uri)
 
+
 def as_wlpictureuri_strict(text):
     return WLPictureURI.strict(text)
 
 def as_wlpictureuri_strict(text):
     return WLPictureURI.strict(text)
 
@@ -39,15 +40,14 @@ class PictureInfo(WorkInfo):
         Field(DCNS('description.medium'), 'medium', required=False),
         Field(DCNS('description.dimensions'), 'original_dimensions', required=False),
         Field(DCNS('format'), 'mime_type', required=False),
         Field(DCNS('description.medium'), 'medium', required=False),
         Field(DCNS('description.dimensions'), 'original_dimensions', required=False),
         Field(DCNS('format'), 'mime_type', required=False),
-        Field(DCNS('identifier.url'), 'url', WLPictureURI,
-            strict=as_wlpictureuri_strict),
-        )
+        Field(DCNS('identifier.url'), 'url', WLPictureURI, strict=as_wlpictureuri_strict)
+    )
 
 
 class ImageStore(object):
     EXT = ['gif', 'jpeg', 'png', 'swf', 'psd', 'bmp'
 
 
 class ImageStore(object):
     EXT = ['gif', 'jpeg', 'png', 'swf', 'psd', 'bmp'
-            'tiff', 'tiff', 'jpc', 'jp2', 'jpf', 'jb2', 'swc',
-            'aiff', 'wbmp', 'xbm']
+           'tiff', 'tiff', 'jpc', 'jp2', 'jpf', 'jb2', 'swc',
+           'aiff', 'wbmp', 'xbm']
     MIME = ['image/gif', 'image/jpeg', 'image/png',
             'application/x-shockwave-flash', 'image/psd', 'image/bmp',
             'image/tiff', 'image/tiff', 'application/octet-stream',
     MIME = ['image/gif', 'image/jpeg', 'image/png',
             'application/x-shockwave-flash', 'image/psd', 'image/bmp',
             'image/tiff', 'image/tiff', 'application/octet-stream',
@@ -55,8 +55,8 @@ class ImageStore(object):
             'application/x-shockwave-flash', 'image/iff', 'image/vnd.wap.wbmp', 'image/xbm']
 
     def __init__(self, dir_):
             'application/x-shockwave-flash', 'image/iff', 'image/vnd.wap.wbmp', 'image/xbm']
 
     def __init__(self, dir_):
+        super(ImageStore, self).__init__()
         self.dir = dir_
         self.dir = dir_
-        return super(ImageStore, self).__init__()
 
     def path(self, slug, mime_type):
         """
 
     def path(self, slug, mime_type):
         """
@@ -127,7 +127,7 @@ class WLPicture(object):
             parser = etree.XMLParser(remove_blank_text=False)
             tree = etree.parse(StringIO(data.encode('utf-8')), parser)
 
             parser = etree.XMLParser(remove_blank_text=False)
             tree = etree.parse(StringIO(data.encode('utf-8')), parser)
 
-            me =  cls(tree, parse_dublincore=parse_dublincore, image_store=image_store)
+            me = cls(tree, parse_dublincore=parse_dublincore, image_store=image_store)
             me.load_frame_info()
             return me
         except (ExpatError, XMLSyntaxError, XSLTApplyError), e:
             me.load_frame_info()
             return me
         except (ExpatError, XMLSyntaxError, XSLTApplyError), e:
@@ -162,29 +162,31 @@ class WLPicture(object):
         def has_all_props(node, props):
             return reduce(and_, map(lambda prop: prop in node.attrib, props))
 
         def has_all_props(node, props):
             return reduce(and_, map(lambda prop: prop in node.attrib, props))
 
-        if has_all_props(area,  ['x1', 'x2', 'y1', 'y2']) == False:
+        if not has_all_props(area, ['x1', 'x2', 'y1', 'y2']):
             return None
             return None
-            
+
         def n(prop): return int(area.get(prop))
         return [[n('x1'), n('y1')], [n('x2'), n('y2')]]
         def n(prop): return int(area.get(prop))
         return [[n('x1'), n('y1')], [n('x2'), n('y2')]]
-        
 
     def partiter(self):
         """
         Iterates the parts of this picture and returns them and their metadata
         """
         # omg no support for //sem[(@type='theme') or (@type='object')] ?
 
     def partiter(self):
         """
         Iterates the parts of this picture and returns them and their metadata
         """
         # omg no support for //sem[(@type='theme') or (@type='object')] ?
-        for part in list(self.edoc.iterfind("//sem[@type='theme']")) + list(self.edoc.iterfind("//sem[@type='object']")):
-            pd = {}
-            pd['type'] = part.get('type')
+        for part in list(self.edoc.iterfind("//sem[@type='theme']")) +\
+                list(self.edoc.iterfind("//sem[@type='object']")):
+            pd = {'type': part.get('type')}
 
             coords = self.get_sem_coords(part)
 
             coords = self.get_sem_coords(part)
-            if coords is None: continue
+            if coords is None:
+                continue
             pd['coords'] = coords
 
             def want_unicode(x):
             pd['coords'] = coords
 
             def want_unicode(x):
-                if not isinstance(x, unicode): return x.decode('utf-8')
-                else: return x
+                if not isinstance(x, unicode):
+                    return x.decode('utf-8')
+                else:
+                    return x
             pd['object'] = part.attrib['type'] == 'object' and want_unicode(part.attrib.get('object', u'')) or None
             pd['themes'] = part.attrib['type'] == 'theme' and [part.attrib.get('theme', u'')] or []
             yield pd
             pd['object'] = part.attrib['type'] == 'object' and want_unicode(part.attrib.get('object', u'')) or None
             pd['themes'] = part.attrib['type'] == 'theme' and [part.attrib.get('theme', u'')] or []
             yield pd
index 15d9107..c9bc35b 100644 (file)
@@ -5,6 +5,7 @@
 #
 from librarian import get_resource
 
 #
 from librarian import get_resource
 
+
 def sponsor_logo(name):
     return {
         'Narodowe Centrum Kultury': get_resource('res/sponsors/nck.png')
 def sponsor_logo(name):
     return {
         'Narodowe Centrum Kultury': get_resource('res/sponsors/nck.png')
index 0f3c0bb..0eb7b59 100644 (file)
@@ -29,6 +29,7 @@ Utwór opracowany został w ramach projektu Wolne Lektury przez fundację Nowocz
 %(description)s%(contributors)s%(funders)s
 """
 
 %(description)s%(contributors)s%(funders)s
 """
 
+
 def transform(wldoc, flags=None, **options):
     """
     Transforms input_file in XML to output_file in TXT.
 def transform(wldoc, flags=None, **options):
     """
     Transforms input_file in XML to output_file in TXT.
@@ -59,10 +60,17 @@ def transform(wldoc, flags=None, **options):
             license_description = parsed_dc.license_description
             license = parsed_dc.license
             if license:
             license_description = parsed_dc.license_description
             license = parsed_dc.license
             if license:
-                license_description = u"Ten utwór jest udostepniony na licencji %s: \n%s" % (license_description, license)        
+                license_description = u"Ten utwór jest udostepniony na licencji %s: \n%s" % (
+                    license_description, license)
             else:
             else:
-                license_description = u"Ten utwór nie jest objęty majątkowym prawem autorskim i znajduje się w domenie publicznej, co oznacza że możesz go swobodnie wykorzystywać, publikować i rozpowszechniać. Jeśli utwór opatrzony jest dodatkowymi materiałami (przypisy, motywy literackie etc.), które podlegają prawu autorskiemu, to te dodatkowe materiały udostępnione są na licencji Creative Commons Uznanie Autorstwa – Na Tych Samych Warunkach 3.0 PL (http://creativecommons.org/licenses/by-sa/3.0/)"
-    
+                license_description = u"Ten utwór nie jest objęty majątkowym prawem autorskim i znajduje się " \
+                                      u"w domenie publicznej, co oznacza że możesz go swobodnie wykorzystywać, " \
+                                      u"publikować i rozpowszechniać. Jeśli utwór opatrzony jest dodatkowymi " \
+                                      u"materiałami (przypisy, motywy literackie etc.), które podlegają prawu " \
+                                      u"autorskiemu, to te dodatkowe materiały udostępnione są na licencji " \
+                                      u"Creative Commons Uznanie Autorstwa – Na Tych Samych Warunkach 3.0 PL " \
+                                      u"(http://creativecommons.org/licenses/by-sa/3.0/)"
+
             source = parsed_dc.source_name
             if source:
                 source = "\n\nTekst opracowany na podstawie: " + source
             source = parsed_dc.source_name
             if source:
                 source = "\n\nTekst opracowany na podstawie: " + source
@@ -79,7 +87,6 @@ def transform(wldoc, flags=None, **options):
         else:
             description = 'Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl).'
             url = '*' * 10
         else:
             description = 'Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl).'
             url = '*' * 10
-            license = ""
             license_description = ""
             source = ""
             contributors = ""
             license_description = ""
             source = ""
             contributors = ""
@@ -96,4 +103,3 @@ def transform(wldoc, flags=None, **options):
     else:
         result = unicode(result).encode('utf-8')
     return OutputFile.from_string("\r\n".join(result.splitlines()) + "\r\n")
     else:
         result = unicode(result).encode('utf-8')
     return OutputFile.from_string("\r\n".join(result.splitlines()) + "\r\n")
-
index b9a28f0..cab5b1c 100644 (file)
@@ -11,6 +11,7 @@ from tests.utils import get_all_fixtures
 import codecs
 from datetime import date
 
 import codecs
 from datetime import date
 
+
 def check_dcparser(xml_file, result_file):
     xml = file(xml_file).read()
     result = codecs.open(result_file, encoding='utf-8').read()
 def check_dcparser(xml_file, result_file):
     xml = file(xml_file).read()
     result = codecs.open(result_file, encoding='utf-8').read()
@@ -46,6 +47,7 @@ def test_serialize():
     for fixture in get_all_fixtures('dcparser', '*.xml'):
         yield check_serialize, fixture
 
     for fixture in get_all_fixtures('dcparser', '*.xml'):
         yield check_serialize, fixture
 
+
 def test_asdate():
     assert_equals(dcparser.as_date(u"2010-10-03"), date(2010, 10, 03))
     assert_equals(dcparser.as_date(u"2011"), date(2011, 1, 1))
 def test_asdate():
     assert_equals(dcparser.as_date(u"2010-10-03"), date(2010, 10, 03))
     assert_equals(dcparser.as_date(u"2011"), date(2011, 1, 1))
@@ -55,4 +57,3 @@ def test_asdate():
     assert_equals(dcparser.as_date(u"ok. 1813-1814"), date(1813, 1, 1))
     assert_equals(dcparser.as_date(u"ok.1876-ok.1886"), date(1876, 1, 1))
     assert_equals(dcparser.as_date(u"1893/1894"), date(1893, 1, 1))
     assert_equals(dcparser.as_date(u"ok. 1813-1814"), date(1813, 1, 1))
     assert_equals(dcparser.as_date(u"ok.1876-ok.1886"), date(1876, 1, 1))
     assert_equals(dcparser.as_date(u"1893/1894"), date(1893, 1, 1))
-    
index faa76e7..720fec6 100644 (file)
@@ -25,7 +25,8 @@ def test_transform():
     for par in tree.findall("//p"):
         if par.text.startswith(u'Opracowanie redakcyjne i przypisy:'):
             editors_attribution = True
     for par in tree.findall("//p"):
         if par.text.startswith(u'Opracowanie redakcyjne i przypisy:'):
             editors_attribution = True
-            assert_equal(par.text.rstrip(),
+            assert_equal(
+                par.text.rstrip(),
                 u'Opracowanie redakcyjne i przypisy: '
                 u'Adam Fikcyjny, Aleksandra Sekuła, Olga Sutkowska.')
     assert_true(editors_attribution)
                 u'Opracowanie redakcyjne i przypisy: '
                 u'Adam Fikcyjny, Aleksandra Sekuła, Olga Sutkowska.')
     assert_true(editors_attribution)
index 51d6acd..a0de630 100644 (file)
@@ -33,6 +33,7 @@ def test_passing_parse_dublincore_to_transform():
             parse_dublincore=False,
         ).as_html()
 
             parse_dublincore=False,
         ).as_html()
 
+
 def test_empty():
     assert not WLDocument.from_string(
             '<utwor />',
 def test_empty():
     assert not WLDocument.from_string(
             '<utwor />',
index 4956b7d..234f297 100644 (file)
@@ -1,11 +1,8 @@
 # -*- coding: utf-8
 from __future__ import unicode_literals
 
 # -*- coding: utf-8
 from __future__ import unicode_literals
 
-from StringIO import StringIO
-import tempfile
 from librarian.parser import WLDocument
 from librarian.html import extract_annotations
 from librarian.parser import WLDocument
 from librarian.html import extract_annotations
-from lxml import etree
 from nose.tools import eq_
 
 
 from nose.tools import eq_
 
 
@@ -13,10 +10,11 @@ def _test_annotation(expected, got, name):
     assert got[0].startswith('anchor-'), "%s: Unexpected anchor: '%s', should begin with 'anchor-'" % (name, got[0])
     eq_(expected[0], got[1], "%s: Unexpected type, expected '%s', got '%s'" % (name, expected[0], got[1]))
     eq_(expected[1], got[2], "%s: Unexpected qualifier, expected '%s', got '%s'" % (name, expected[1], got[2]))
     assert got[0].startswith('anchor-'), "%s: Unexpected anchor: '%s', should begin with 'anchor-'" % (name, got[0])
     eq_(expected[0], got[1], "%s: Unexpected type, expected '%s', got '%s'" % (name, expected[0], got[1]))
     eq_(expected[1], got[2], "%s: Unexpected qualifier, expected '%s', got '%s'" % (name, expected[1], got[2]))
-    eq_(expected[2], got[3], "%s: Unexpected text representation, expected '%s', got '%s'" % (name, expected[2], got[3]))
+    eq_(expected[2], got[3], "%s: Unexpected text representation, expected '%s', got '%s'" %
+        (name, expected[2], got[3]))
     exp_html = '<div class="fn-%s">%s</div>' % (expected[0], expected[3])
     eq_(exp_html, got[4], "%s: Unexpected html representation, expected '%s', got '%s'" % (name, exp_html, got[4]))
     exp_html = '<div class="fn-%s">%s</div>' % (expected[0], expected[3])
     eq_(exp_html, got[4], "%s: Unexpected html representation, expected '%s', got '%s'" % (name, exp_html, got[4]))
-    
+
 
 def test_annotations():
     annotations = (
 
 def test_annotations():
     annotations = (
@@ -29,8 +27,7 @@ def test_annotations():
             ),
             'Empty footnote'),
 
             ),
             'Empty footnote'),
 
-        (
-         '<pr>Definiendum --- definiens.</pr>', (
+        ('<pr>Definiendum --- definiens.</pr>', (
             'pr',
             [], 
             'Definiendum \u2014 definiens.', 
             'pr',
             [], 
             'Definiendum \u2014 definiens.', 
@@ -94,11 +91,14 @@ def test_annotations():
             ),
             'Footnote with a second parentheses and mdash.'),
 
             ),
             'Footnote with a second parentheses and mdash.'),
 
-        ('<pe><slowo_obce>gemajna</slowo_obce> (daw., z niem. <slowo_obce>gemein</slowo_obce>: zwykły) --- częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu.</pe>', (
+        ('<pe><slowo_obce>gemajna</slowo_obce> (daw., z niem. <slowo_obce>gemein</slowo_obce>: zwykły) --- '
+         'częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu.</pe>', (
             'pe',
             ['daw.', 'niem.'],
             'pe',
             ['daw.', 'niem.'],
-            'gemajna (daw., z niem. gemein: zwykły) \u2014 częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu.',
-            '<p><em class="foreign-word">gemajna</em> (daw., z niem. <em class="foreign-word">gemein</em>: zwykły) \u2014 częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu.</p>'
+            'gemajna (daw., z niem. gemein: zwykły) \u2014 częściej: gemajn, '
+            'szeregowiec w wojsku polskim cudzoziemskiego autoramentu.',
+            '<p><em class="foreign-word">gemajna</em> (daw., z niem. <em class="foreign-word">gemein</em>: zwykły) '
+            '\u2014 częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu.</p>'
             ),
             'Footnote with multiple and qualifiers and emphasis.'),
 
             ),
             'Footnote with multiple and qualifiers and emphasis.'),
 
index 99bb62d..3e87a9e 100644 (file)
@@ -14,7 +14,5 @@ def test_fragments():
     closed_fragments, open_fragments = extract_fragments(
         get_fixture('text', 'asnyk_miedzy_nami_expected.html'))
     assert not open_fragments
     closed_fragments, open_fragments = extract_fragments(
         get_fixture('text', 'asnyk_miedzy_nami_expected.html'))
     assert not open_fragments
-    fragments_text = u"\n\n".join(u"%s: %s\n%s" % (f.id, f.themes, f)
-                                    for f in closed_fragments.values())
+    fragments_text = u"\n\n".join(u"%s: %s\n%s" % (f.id, f.themes, f) for f in closed_fragments.values())
     assert_equal(fragments_text, file(expected_output_file_path).read().decode('utf-8'))
     assert_equal(fragments_text, file(expected_output_file_path).read().decode('utf-8'))
-
index 75b73bc..5b2dba1 100644 (file)
@@ -3,7 +3,6 @@
 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
-import re
 from tempfile import NamedTemporaryFile
 from nose.tools import *
 from librarian import DirDocProvider
 from tempfile import NamedTemporaryFile
 from nose.tools import *
 from librarian import DirDocProvider
@@ -22,7 +21,5 @@ def test_transform():
     print tex
 
     # Check contributor list.
     print tex
 
     # Check contributor list.
-    editors = re.search(ur'\\def\\editors\{'
-        ur'Opracowanie redakcyjne i przypisy: ([^}]*?)\.\s*\}', tex)
-    assert_equal(editors.group(1),
-        u"Adam Fikcyjny, Aleksandra Sekuła, Olga Sutkowska")
+    editors = re.search(ur'\\def\\editors\{Opracowanie redakcyjne i przypisy: ([^}]*?)\.\s*\}', tex)
+    assert_equal(editors.group(1), u"Adam Fikcyjny, Aleksandra Sekuła, Olga Sutkowska")
index 1169f44..00b03ce 100644 (file)
@@ -4,16 +4,14 @@
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 from librarian import picture, dcparser
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 from librarian import picture, dcparser
-from lxml import etree
-from nose.tools import *
-from os.path import splitext
 from tests.utils import get_all_fixtures, get_fixture
 from tests.utils import get_all_fixtures, get_fixture
-import codecs
 from os import path
 
 from os import path
 
+
 def test_wlpictureuri():
     uri = picture.WLPictureURI('http://wolnelektury.pl/katalog/obraz/angelus-novus')
 
 def test_wlpictureuri():
     uri = picture.WLPictureURI('http://wolnelektury.pl/katalog/obraz/angelus-novus')
 
+
 def check_load(xml_file):
     pi = dcparser.parse(xml_file, picture.PictureInfo)
     assert pi is not None
 def check_load(xml_file):
     pi = dcparser.parse(xml_file, picture.PictureInfo)
     assert pi is not None
@@ -39,6 +37,7 @@ def test_wlpicture():
     f = wlp.image_file('r')
     f.close()
 
     f = wlp.image_file('r')
     f.close()
 
+
 def test_picture_parts():
     wlp = picture.WLPicture.from_file(open(get_fixture('picture', 'angelus-novus.xml')))
     parts = list(wlp.partiter())
 def test_picture_parts():
     wlp = picture.WLPicture.from_file(open(get_fixture('picture', 'angelus-novus.xml')))
     parts = list(wlp.partiter())
@@ -55,7 +54,5 @@ def test_picture_parts():
         if p['object']:
             names.add(p['object'])
 
         if p['object']:
             names.add(p['object'])
 
-    assert motifs == set([u'anioł historii', u'spojrzenie']), "missing motifs, got: %s" % motifs
-    assert names == set([u'obraz cały', u'skrzydło']), 'missing objects, got: %s' % names
-    
-        
+    assert motifs == {u'anioł historii', u'spojrzenie'}, "missing motifs, got: %s" % motifs
+    assert names == {u'obraz cały', u'skrzydło'}, 'missing objects, got: %s' % names
index 3b1f4f5..fc87532 100644 (file)
@@ -6,7 +6,7 @@
 from __future__ import with_statement
 from os.path import realpath, join, dirname
 import glob
 from __future__ import with_statement
 from os.path import realpath, join, dirname
 import glob
-import os
+
 
 def get_fixture_dir(dir_name):
     """Returns path to fixtures directory dir_name."""
 
 def get_fixture_dir(dir_name):
     """Returns path to fixtures directory dir_name."""