diff --git a/pytex/__init__.py b/pytex/__init__.py new file mode 100644 index 0000000..e8cb0c0 --- /dev/null +++ b/pytex/__init__.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +# encoding: utf-8 + +from .texenv import texenv + +# ----------------------------- +# Reglages pour 'vim' +# vim:set autoindent expandtab tabstop=4 shiftwidth=4: +# cursor: 16 del diff --git a/pytex/pytex.py b/pytex/pytex.py new file mode 100644 index 0000000..8b8895f --- /dev/null +++ b/pytex/pytex.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +Feeding latex templates and compiling it +""" + +import logging +import math as m +import subprocess +import random as rd +from path import Path +from .texenv import texenv + +logger = logging.getLogger(__name__) + +EXPORT_DICT = {} +EXPORT_DICT.update(m.__dict__) +EXPORT_DICT.update(rd.__dict__) +EXPORT_DICT.update(__builtins__) + +def update_export_dict(new_dict): + """Update global variable with new_dict + + :param new_dict: needed tools across all template renders + """ + EXPORT_DICT.update(new_dict) + +def feed(template, data, output, force=0): + """ Feed template with data to output + + :param template: jinja2 template with textenv environment + :param data: Data dictionnary + :param output: name of the output file + """ + logger.info(f"Getting template {template}") + tpl = texenv.get_template(template) + + output_p = Path(output) + output_dir = output_p.dirname() + if not output_dir.exists(): + output_dir.mkdir() + + if output_p.exists() and not force: + logger.error(f"{output} exists. Use force=1 do override it") + raise ValueError(f"{output} exists. Use force=1 do override it") + + with open(output, "w") as output_f: + output_f.write(tpl.render(**EXPORT_DICT, **data)) + logger.info(f"{template} has been rendered to {output}.") + +def compile(latex_file, output_dir=""): + """ Compile latex file + + If output_dir is not set, it produce it next to the latex file. + """ + if not output_dir: + output_dir = Path(latex_file).dirname() + + compilation = subprocess.Popen( + [ + "pdflatex", + f"-output-directory={output_dir}", + latex_file, + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + # shell=True + ) + + out, err = compilation.communicate() + if err: + logger.error(err) + if out: + logger.info(out) + logger.debug(f"{latex_file} has been compiled in {output_dir}") + +def clean(dirname): + """ Clean the directory from aux and log latex files """ + cleanning = subprocess.Popen( + [f"rm {dirname}/*.aux {dirname}/*.log"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True + ) + out, err = cleanning.communicate() + logger.error(err) + logger.info(out) + + + + +# ----------------------------- +# Reglages pour 'vim' +# vim:set autoindent expandtab tabstop=4 shiftwidth=4: +# cursor: 16 del diff --git a/pytex/texenv.py b/pytex/texenv.py new file mode 100644 index 0000000..dddfea8 --- /dev/null +++ b/pytex/texenv.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# encoding: utf-8 + +import logging +import jinja2 + +logger = logging.getLogger(__name__) + +__all__ = ["texenv"] + +# Definition of jinja syntax for latex +texenv = jinja2.Environment( + block_start_string='\Block{', + block_end_string='}', + variable_start_string='\Var{', + variable_end_string='}', + comment_start_string='\#{', + comment_end_string='}', + line_statement_prefix='%-', + line_comment_prefix='%#', + loader=jinja2.ChoiceLoader([ + # jinja2.PackageLoader("notes_tools.reports", "templates"), + jinja2.FileSystemLoader(['./']), + ]), + extensions=['jinja2.ext.do'] +) + +def feed_template(target, datas, template): + """ Get the template and feed it to create reports + + :param target: path where the report will be saved + :param datas: dictonnary to feed the template + :param template: the template + """ + logger.info("Getting template {}".format(template)) + report = texenv.get_template(template) + + path_to_target = target.dirname() + if not path_to_target.exists(): + path_to_target.mkdir() + + with open(target, "w") as f: + f.write(report.render(**datas, directory=path_to_target)) + logger.info("{} est construit! Ya plus qu'à compiler!".format(target)) + +# ----------------------------- +# Reglages pour 'vim' +# vim:set autoindent expandtab tabstop=4 shiftwidth=4: +# cursor: 16 del