removed the annoying morefloats notice,
[librarian.git] / librarian / pdf.py
index 0b80a2d..a868a2b 100644 (file)
@@ -153,11 +153,12 @@ def package_available(package, args='', verbose=False):
     return p == 0
 
 
     return p == 0
 
 
-def transform(provider, slug, output_file=None, output_dir=None, make_dir=False, verbose=False, save_tex=None):
+def transform(provider, slug=None, file_path=None, output_file=None, output_dir=None, make_dir=False, verbose=False, save_tex=None):
     """ produces a PDF file with XeLaTeX
 
     provider: a DocProvider
     slug: slug of file to process, available by provider
     """ produces a PDF file with XeLaTeX
 
     provider: a DocProvider
     slug: slug of file to process, available by provider
+    file_path can be provided instead of a slug
     output_file: file-like object or path to output file
     output_dir: path to directory to save output file to; either this or output_file must be present
     make_dir: writes output to <output_dir>/<author>/<slug>.pdf istead of <output_dir>/<slug>.pdf
     output_file: file-like object or path to output file
     output_dir: path to directory to save output file to; either this or output_file must be present
     make_dir: writes output to <output_dir>/<author>/<slug>.pdf istead of <output_dir>/<slug>.pdf
@@ -167,16 +168,19 @@ def transform(provider, slug, output_file=None, output_dir=None, make_dir=False,
 
     # Parse XSLT
     try:
 
     # Parse XSLT
     try:
-        document = load_including_children(provider, slug)
+        if file_path:
+            if slug:
+                raise ValueError('slug or file_path should be specified, not both')
+            document = load_including_children(provider, file_path=file_path)
+        else:
+            if not slug:
+                raise ValueError('either slug or file_path should be specified')
+            document = load_including_children(provider, slug=slug)
 
 
-        # check for latex packages
-        if not package_available('morefloats', 'maxfloats=19', verbose=verbose):
+        # check for LaTeX packages
+        if not package_available('morefloats', 'maxfloats=19'):
+            # using old morefloats or none at all
             document.edoc.getroot().set('old-morefloats', 'yes')
             document.edoc.getroot().set('old-morefloats', 'yes')
-            print >> sys.stderr, """
-==============================================================================
-LaTeX `morefloats' package is older than v.1.0c or not available at all.
-Some documents with many motifs in long stanzas or paragraphs may not compile.
-=============================================================================="""
 
         # hack the tree
         move_motifs_inside(document.edoc)
 
         # hack the tree
         move_motifs_inside(document.edoc)
@@ -229,7 +233,10 @@ Some documents with many motifs in long stanzas or paragraphs may not compile.
                 os.makedirs(output_dir)
             except OSError:
                 pass
                 os.makedirs(output_dir)
             except OSError:
                 pass
-            output_path = os.path.join(output_dir, '%s.pdf' % slug)
+            if slug:
+                output_path = os.path.join(output_dir, '%s.pdf' % slug)
+            else:
+                output_path = os.path.join(output_dir, os.path.splitext(os.path.basename(file_path))[0] + '.pdf')
             shutil.move(pdf_path, output_path)
         else:
             if hasattr(output_file, 'write'):
             shutil.move(pdf_path, output_path)
         else:
             if hasattr(output_file, 'write'):
@@ -246,7 +253,7 @@ Some documents with many motifs in long stanzas or paragraphs may not compile.
         raise ParseError(e)
 
 
         raise ParseError(e)
 
 
-def load_including_children(provider, slug=None, uri=None):
+def load_including_children(provider, slug=None, uri=None, file_path=None):
     """ makes one big xml file with children inserted at end 
     either slug or uri must be provided
     """
     """ makes one big xml file with children inserted at end 
     either slug or uri must be provided
     """
@@ -255,13 +262,17 @@ def load_including_children(provider, slug=None, uri=None):
         f = provider.by_uri(uri)
     elif slug:
         f = provider[slug]
         f = provider.by_uri(uri)
     elif slug:
         f = provider[slug]
+    elif file_path:
+        f = open(file_path, 'r')
     else:
     else:
-        raise ValueError('Neither slug nor URI provided for a book.')
+        raise ValueError('Neither slug, URI nor file path provided for a book.')
 
     document = WLDocument.from_file(f, True,
         parse_dublincore=True,
         preserve_lines=False)
 
 
     document = WLDocument.from_file(f, True,
         parse_dublincore=True,
         preserve_lines=False)
 
+    f.close()
+
     for child_uri in document.book_info.parts:
         child = load_including_children(provider, uri=child_uri)
         document.edoc.getroot().append(child.edoc.getroot())
     for child_uri in document.book_info.parts:
         child = load_including_children(provider, uri=child_uri)
         document.edoc.getroot().append(child.edoc.getroot())