Merge branch 'master' into edumed-ofop
[librarian.git] / librarian / parser.py
index 469b7df..9068fc0 100644 (file)
@@ -5,6 +5,7 @@
 #
 from librarian import ValidationError, NoDublinCore,  ParseError, NoProvider
 from librarian import RDFNS
 #
 from librarian import ValidationError, NoDublinCore,  ParseError, NoProvider
 from librarian import RDFNS
+from librarian.cover import WLCover
 from librarian import dcparser
 
 from xml.parsers.expat import ExpatError
 from librarian import dcparser
 
 from xml.parsers.expat import ExpatError
@@ -19,7 +20,8 @@ class WLDocument(object):
     LINE_SWAP_EXPR = re.compile(r'/\s', re.MULTILINE | re.UNICODE)
     provider = None
 
     LINE_SWAP_EXPR = re.compile(r'/\s', re.MULTILINE | re.UNICODE)
     provider = None
 
-    def __init__(self, edoc, parse_dublincore=True, provider=None):
+    def __init__(self, edoc, parse_dublincore=True, provider=None, 
+                    strict=False, meta_fallbacks=None):
         self.edoc = edoc
         self.provider = provider
 
         self.edoc = edoc
         self.provider = provider
 
@@ -36,7 +38,8 @@ class WLDocument(object):
             if self.rdf_elem is None:
                 raise NoDublinCore('Document has no DublinCore - which is required.')
 
             if self.rdf_elem is None:
                 raise NoDublinCore('Document has no DublinCore - which is required.')
 
-            self.book_info = dcparser.BookInfo.from_element(self.rdf_elem)
+            self.book_info = dcparser.BookInfo.from_element(
+                    self.rdf_elem, fallbacks=meta_fallbacks, strict=strict)
         else:
             self.book_info = None
 
         else:
             self.book_info = None
 
@@ -45,7 +48,7 @@ class WLDocument(object):
         return cls.from_file(StringIO(xml), *args, **kwargs)
 
     @classmethod
         return cls.from_file(StringIO(xml), *args, **kwargs)
 
     @classmethod
-    def from_file(cls, xmlfile, parse_dublincore=True, provider=None):
+    def from_file(cls, xmlfile, *args, **kwargs):
 
         # first, prepare for parsing
         if isinstance(xmlfile, basestring):
 
         # first, prepare for parsing
         if isinstance(xmlfile, basestring):
@@ -66,7 +69,7 @@ class WLDocument(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)
 
-            return cls(tree, parse_dublincore=parse_dublincore, provider=provider)
+            return cls(tree, *args, **kwargs)
         except (ExpatError, XMLSyntaxError, XSLTApplyError), e:
             raise ParseError(e)
 
         except (ExpatError, XMLSyntaxError, XSLTApplyError), e:
             raise ParseError(e)
 
@@ -146,7 +149,7 @@ class WLDocument(object):
                 xpath = self.path_to_xpath(key)
                 node = self.edoc.xpath(xpath)[0]
                 repl = etree.fromstring(u"<%s>%s</%s>" %(node.tag, data, node.tag) )
                 xpath = self.path_to_xpath(key)
                 node = self.edoc.xpath(xpath)[0]
                 repl = etree.fromstring(u"<%s>%s</%s>" %(node.tag, data, node.tag) )
-                node.getparent().replace(node, repl);
+                node.getparent().replace(node, repl)
             except Exception, e:
                 unmerged.append( repr( (key, xpath, e) ) )
 
             except Exception, e:
                 unmerged.append( repr( (key, xpath, e) ) )
 
@@ -162,10 +165,25 @@ class WLDocument(object):
             node.tag = 'span'
             node.tail = tail
 
             node.tag = 'span'
             node.tail = tail
 
+    def editors(self):
+        """Returns a set of all editors for book and its children.
+
+        :returns: set of dcparser.Person objects
+        """
+        if self.book_info is None:
+            raise NoDublinCore('No Dublin Core in document.')
+        persons = set(self.book_info.editors +
+                        self.book_info.technical_editors)
+        for child in self.parts():
+            persons.update(child.editors())
+        if None in persons:
+            persons.remove(None)
+        return persons
+
     # Converters
 
     def as_html(self, *args, **kwargs):
     # Converters
 
     def as_html(self, *args, **kwargs):
-        from librarian import html
+        from librarian import pyhtml as html
         return html.transform(self, *args, **kwargs)
 
     def as_text(self, *args, **kwargs):
         return html.transform(self, *args, **kwargs)
 
     def as_text(self, *args, **kwargs):
@@ -184,6 +202,15 @@ class WLDocument(object):
         from librarian import mobi
         return mobi.transform(self, *args, **kwargs)
 
         from librarian import mobi
         return mobi.transform(self, *args, **kwargs)
 
+    def as_fb2(self, *args, **kwargs):
+        from librarian import fb2
+        return fb2.transform(self, *args, **kwargs)
+
+    def as_cover(self, cover_class=None, *args, **kwargs):
+        if cover_class is None:
+            cover_class = WLCover
+        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):
         if output_dir_path:
     def save_output_file(self, output_file, output_path=None,
             output_dir_path=None, make_author_dir=False, ext=None):
         if output_dir_path:
@@ -191,7 +218,8 @@ class WLDocument(object):
             if make_author_dir:
                 save_path = os.path.join(save_path,
                         unicode(self.book_info.author).encode('utf-8'))
             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.slug)
+            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: