]> git.donarmstrong.com Git - lilypond.git/blobdiff - python/book_base.py
Imported Upstream version 2.14.2
[lilypond.git] / python / book_base.py
diff --git a/python/book_base.py b/python/book_base.py
new file mode 100644 (file)
index 0000000..b73f373
--- /dev/null
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+
+import lilylib as ly
+import book_snippets as BookSnippet
+from book_snippets import *
+import re
+global _;_=ly._
+
+progress = ly.progress
+warning = ly.warning
+error = ly.error
+
+########################################################################
+# Helper functions
+########################################################################
+
+def find_file (name, include_path, raise_error=True):
+    for i in include_path:
+        full = os.path.join (i, name)
+        if os.path.exists (full):
+            return full
+
+    if raise_error:
+        error (_ ("file not found: %s") % name + '\n')
+        exit (1)
+    return ''
+
+def verbatim_html (s):
+    return re.sub ('>', '>',
+           re.sub ('<', '&lt;',
+               re.sub ('&', '&amp;', s)))
+
+
+########################################################################
+# Option handling
+########################################################################
+
+#TODO: Definitions just once in all files!!!
+LINE_WIDTH = 'line-width'
+
+# TODO: Implement the intertext snippet option:
+#         'intertext': r',?\s*intertext=\".*?\"',
+
+default_snippet_opts = { 'alt': "[image of music]" }
+
+
+########################################################################
+# format handling
+########################################################################
+
+all_formats = []
+def register_format (fmt):
+  all_formats.append (fmt)
+
+
+
+########################################################################
+# Snippet handling
+########################################################################
+
+# Use this for sorting the keys of the defined snippet types (the dict
+# is unsorted, so we need to return sorted keys to ensure processing
+# in a pre-defined order)
+# Containing blocks must be first, see find_toplevel_snippets.
+
+snippet_type_order = [
+    'multiline_comment',
+    'verbatim',
+    'verb',
+    'lilypond_block',
+    'singleline_comment',
+    'lilypond_file',
+    'include',
+    'lilypond',
+    'lilypondversion',
+]
+
+
+
+########################################################################
+# Base class for all output formats
+########################################################################
+
+class BookOutputFormat:
+    def __init__ (self):
+        self.format = None
+        self.default_extension = None
+        self.snippet_res = {}
+        self.output = {}
+        self.handled_extensions = []
+        self.image_formats = "ps,png"
+        self.global_options = {}
+        self.document_language = ''
+        self.default_snippet_options = default_snippet_opts
+        self.snippet_option_separator = "\s*,\s*"
+
+    def supported_snippet_types (self):
+        # Sort according to snippet_type_order, unknown keys come last
+        keys = self.snippet_res.keys ()
+        # First the entries in snippet_type_order in that order (if present)
+        # then all entries not in snippet_type_order in given order
+        res = filter (lambda x:x in keys, snippet_type_order) + filter (lambda x:x not in snippet_type_order, keys)
+        return res
+
+    def snippet_regexp (self, snippettype):
+        return self.snippet_res.get (snippettype, None)
+
+    def can_handle_format (self, format):
+        return format == self.format
+    def can_handle_extension (self, extension):
+        return extension in self.handled_extensions
+
+    def add_options (self, option_parser):
+        pass
+
+    def process_options (self, global_options):
+        pass
+
+
+    def process_options_pdfnotdefault (self, global_options):
+        ## prevent PDF from being switched on by default.
+        global_options.process_cmd += ' --formats=eps '
+        if global_options.create_pdf:
+            global_options.process_cmd += "--pdf -dinclude-eps-fonts -dgs-load-fonts "
+            if global_options.latex_program == 'latex':
+                    global_options.latex_program = 'pdflatex'
+
+
+    def snippet_class (self, type):
+      return BookSnippet.snippet_type_to_class.get (type, BookSnippet.Snippet)
+
+    def get_document_language (self, source):
+        return ''
+
+
+    def init_default_snippet_options (self, source):
+        self.document_language = self.get_document_language (source)
+        if LINE_WIDTH not in self.default_snippet_options:
+            line_width = self.get_line_width (source)
+            if line_width:
+                self.default_snippet_options[LINE_WIDTH] = line_width
+
+    def get_line_width (self, source):
+        return None;
+
+    def split_snippet_options (self, option_string):
+        if option_string:
+            return re.split (self.snippet_option_separator, option_string)
+        return []
+
+    def input_fullname (self, input_filename):
+        return find_file (input_filename, self.global_options.include_path)
+
+    def adjust_snippet_command (self, cmd):
+        return cmd
+
+    def process_chunks (self, chunks):
+        return chunks
+
+    def snippet_output (self, basename, snippet):
+        warning (_("Output function not implemented"))
+        return ''
+
+    def output_simple (self, type, snippet):
+        return self.output.get (type, '') % snippet.get_replacements ()
+
+    def output_simple_replacements (self, type, variables):
+        return self.output.get (type, '') % variables
+
+    def output_print_filename (self, basename, snippet):
+        str = ''
+        rep = snippet.get_replacements ()
+        if PRINTFILENAME in snippet.option_dict:
+            rep['base'] = basename
+            rep['filename'] = os.path.basename (snippet.substring ('filename'))
+            str = self.output[PRINTFILENAME] % rep
+
+        return str
+
+    def required_files (self, snippet, base, full, required_files):
+        return []
+
+    def required_files_png (self, snippet, base, full, required_files):
+        # UGH - junk global_options
+        res = []
+        if (base + '.eps' in required_files and not snippet.global_options.skip_png_check):
+            page_count = BookSnippet.ps_page_count (full + '.eps')
+            if page_count <= 1:
+                res.append (base + '.png')
+            else:
+                for page in range (1, page_count + 1):
+                    res.append (base + '-page%d.png' % page)
+        return res