Source code for Musica.Figure.Render
####################################################################################################
#
# Musica - A Music Theory Package for Python
# Copyright (C) 2017 Fabrice Salvaire
#
# This program 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.
#
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
#
####################################################################################################
####################################################################################################
import datetime
import importlib
import logging
import os
from Musica.Tex.Document import Document
from Musica.Tex.Package import Package
# from Musica.Tex.Tikz import TikzFigure
####################################################################################################
_logger = logging.getLogger(__name__)
####################################################################################################
####################################################################################################
[docs]def render_figure(figure,
kwargs,
output,
paper='a4paper',
margin=10,
dvisvgm=False,
force=False):
parts = figure.split('.')
figure_module = importlib.import_module('.'.join(parts[:-1]))
figure_class = getattr(figure_module, parts[-1])
if (not force
and os.path.exists(output)
and timestamp(figure_module.__file__) <= timestamp(output)):
return
header = '''
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This LaTeX source file
% is part of the Musica Toolkit https://musica.fabrice-salvaire.fr
% and licensed under CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'''
if dvisvgm:
class_options = ['dvisvgm']
else:
class_options = [paper]
tex_document = Document(
class_name='minimal',
class_options=class_options,
header=header.lstrip()
)
if not dvisvgm:
tex_document.append_preambule(r'\RequirePackage{luatex85} % for geometry')
tex_document.packages.add(Package('geometry',
'includeheadfoot',
paper=paper,
margin='1cm',
# headsep='1cm',
# footskip='1cm',
))
# TikzFigure.setup_externalisation(tex_document)
now = datetime.datetime.now()
# Fixme: don't work
pdfinfo_template = r'''
\protected\def\pdfinfo{{\pdfextension info}}
\pdfinfo{{
/Title ({title})
/Author ({author})
}}
'''
tex_document.append_preambule(pdfinfo_template.format(
title=figure,
date=now,
source='https://musica.fabrice-salvaire.fr',
author='Musica Tookit',
rights='http://creativecommons.org/licenses/by-nc-sa/4.0/',
))
kwargs = eval('dict(' + kwargs + ')')
_logger.info(kwargs)
tex_figure = figure_class(**kwargs)
tex_figure.add_license()
tex_document.append(tex_figure)
# print(str(tex_document))
tex_document.generate(output, crop=True, margin=margin, dvisvgm=dvisvgm)
if output.endswith('.svg'):
with open(output, 'r') as fh:
source = fh.read()
position = source.find('>')
position = source.find('>', position +1)
metadata_template = '''
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>
<title id="title1">{title}</title>
<metadata id="metadata1">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>{title}</dc:title>
<cc:license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/4.0/" />
<dc:creator><cc:Agent><dc:title>Musica Tookit</dc:title></cc:Agent></dc:creator>
<dc:date>{date}</dc:date>
<dc:source>{source}</dc:source>
<dc:rights><cc:Agent><dc:title>{rights}</dc:title></cc:Agent></dc:rights>
<dc:publisher><cc:Agent><dc:title>{publisher}</dc:title></cc:Agent></dc:publisher>
<dc:identifier></dc:identifier>
<dc:relation></dc:relation>
<dc:language></dc:language>
<dc:subject><rdf:Bag>
<rdf:li></rdf:li>
</rdf:Bag></dc:subject>
<dc:coverage></dc:coverage>
<dc:description>{description}</dc:description>
<dc:contributor><cc:Agent><dc:title>{contributor}</dc:title></cc:Agent></dc:contributor>
</cc:Work>
<cc:License rdf:about="https://creativecommons.org/licenses/by-nc-sa/4.0/">
<cc:permits rdf:resource="https://creativecommons.org/ns#Reproduction" />
<cc:permits rdf:resource="https://creativecommons.org/ns#Distribution" />
<cc:requires rdf:resource="https://creativecommons.org/ns#Notice" />
<cc:requires rdf:resource="https://creativecommons.org/ns#Attribution" />
<cc:prohibits rdf:resource="https://creativecommons.org/ns#CommercialUse" />
<cc:permits rdf:resource="https://creativecommons.org/ns#DerivativeWorks" />
<cc:requires rdf:resource="https://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
'''
metadata = metadata_template.format(
title=figure,
date=now,
source='https://musica.fabrice-salvaire.fr',
publisher='Musica Tookit',
rights='http://creativecommons.org/licenses/by-nc-sa/4.0/',
description='',
contributor='',
)
with open(output, 'w') as fh:
fh.write(source[:position])
fh.write(metadata)
fh.write(source[position+2:]) # skip \n