diff --git a/songbook_core/content/tex.py b/songbook_core/content/tex.py new file mode 100644 index 00000000..083053c4 --- /dev/null +++ b/songbook_core/content/tex.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""Include LaTeX raw code in the songbook.""" + +import logging +import os + +from songbook_core.content import Content, ContentError + +LOGGER = logging.getLogger(__name__) + +class LaTeX(Content): + """Inclusion of LaTeX code""" + + def __init__(self, filename): + self.filename = filename + + def render(self, context): + outdir = os.path.dirname(context['filename']) + if os.path.abspath(self.filename).startswith(os.path.abspath(outdir)): + filename = os.path.relpath(self.filename, outdir) + else: + filename = os.path.abspath(self.filename) + return r'\input{{{}}}'.format(filename) + +#pylint: disable=unused-argument +def parse(keyword, argument, contentlist, config): + """Parse the contentlist. + + Arguments: + - keyword: unused; + - argument: unused; + - contentlist: a list of name of tex files; + - config: configuration dictionary of the current songbook. + """ + if not contentlist: + LOGGER.warning( + "Useless 'tex' content: list of files to include is empty." + ) + filelist = [] + for filename in contentlist: + checked_file = None + for path in config['_songdir']: + if os.path.exists(os.path.join(path, filename)): + checked_file = os.path.relpath(os.path.join(path, filename)) + break + if not checked_file: + raise ContentError( + keyword, + "Cannot find file '{}' in '{}'.".format( + filename, + str(config['_songdir']), + ) + ) + filelist.append(LaTeX(checked_file)) + + return filelist + + +CONTENT_PLUGINS = {'tex': parse}