k-l-lambda's picture
added node-addon-lilypond
f65fe85
# -*- coding: utf-8 -*-
# book_docbook.py
#
# This file is part of LilyPond, the GNU music typesetter.
#
# Copyright (C) 2010 Reinhold Kainhofer <[email protected]>,
# 2020--2020 Han-Wen Nienhuys <[email protected]>
#
# LilyPond is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# LilyPond is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
import os
import book_base
import book_snippets
# Recognize special sequences in the input.
#
# (?P<name>regex) -- Assign result of REGEX to NAME.
# *? -- Match non-greedily.
# (?!...) -- Match if `...' doesn't match next (without consuming
# the string).
#
# (?m) -- Multiline regex: Make ^ and $ match at each line.
# (?s) -- Make the dot match all characters including newline.
# (?x) -- Ignore whitespace in patterns.
# See book_base.BookOutputFormat for possible keys
Docbook_snippet_res = {
'lilypond':
r'''(?smx)
(?P<match>
<(?P<inline>(inline)?)mediaobject>\s*
<textobject.*?>\s*
<programlisting\s+language="lilypond".*?(role="(?P<options>.*?)")?>
(?P<code>.*?)
</programlisting\s*>\s*
</textobject\s*>\s*
</(inline)?mediaobject>)''',
'lilypond_block':
r'''(?smx)
(?P<match>
<(?P<inline>(inline)?)mediaobject>\s*
<textobject.*?>\s*
<programlisting\s+language="lilypond".*?(role="(?P<options>.*?)")?>
(?P<code>.*?)
</programlisting\s*>\s*
</textobject\s*>\s*
</(inline)?mediaobject>)''',
'lilypond_file':
r'''(?smx)
(?P<match>
<(?P<inline>(inline)?)mediaobject>\s*
<imageobject.*?>\s*
<imagedata\s+
fileref="(?P<filename>.*?\.ly)"\s*
(role="(?P<options>.*?)")?\s*
(/>|>\s*</imagedata>)\s*
</imageobject>\s*
</(inline)?mediaobject>)''',
'multiline_comment':
r'''(?smx)
(?P<match>
\s*(?!@c\s+)
(?P<code><!--\s.*?!-->)
\s)''',
}
Docbook_output = {
book_snippets.FILTER: r'''<mediaobject>
<textobject>
<programlisting language="lilypond"
role="%(options)s">
%(code)s
</programlisting>
</textobject>
</mediaobject>''',
book_snippets.OUTPUT: r'''<imageobject role="latex">
<imagedata fileref="%(base)s.pdf" format="PDF"/>
</imageobject>
<imageobject role="html">
<imagedata fileref="%(base)s.png" format="PNG"/>
</imageobject>''',
book_snippets.PRINTFILENAME: r'''<textobject>
<simpara>
<ulink url="%(base)s%(ext)s">
<filename>
%(filename)s
</filename>
</ulink>
</simpara>
</textobject>''',
book_snippets.VERBATIM: r'''<programlisting>
%(verb)s</programlisting>''',
book_snippets.VERSION: r'''%(program_version)s''',
}
class BookDocbookOutputFormat (book_base.BookOutputFormat):
def __init__(self):
book_base.BookOutputFormat.__init__(self)
self.format = "docbook"
self.default_extension = ".xml"
self.snippet_res = Docbook_snippet_res
self.output = Docbook_output
self.handled_extensions = ['.lyxml']
self.snippet_option_separator = r'\s+'
def adjust_snippet_command(self, cmd):
if '--formats' not in cmd:
return cmd + ' --formats=png,pdf '
else:
return cmd
def snippet_output(self, basename, snippet):
s = ''
rep = snippet.get_replacements()
for image in snippet.get_images():
rep['image'] = image
(rep['base'], rep['ext']) = os.path.splitext(image)
s += self.output[book_snippets.OUTPUT] % rep
s += self.output_print_filename(basename, snippet)
if snippet.substring('inline') == 'inline':
s = '<inlinemediaobject>' + s + '</inlinemediaobject>'
else:
s = '<mediaobject>' + s + '</mediaobject>'
if book_snippets.VERBATIM in snippet.option_dict:
rep['verb'] = book_base.verbatim_html(snippet.verb_ly())
s = self.output[book_snippets.VERBATIM] % rep + s
return s
book_base.register_format(BookDocbookOutputFormat())