pytex/pytex/pytex.py

107 lines
2.9 KiB
Python

#!/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
(by default: tpl is replaced by a 2 digits number)
:param force: Override is the output already exists
"""
logger.info(f"Getting template {template}")
tpl = texenv.get_template(str(template))
if not output:
num = 1
output_p = Path(template.replace('tpl', f'{num:02d}'))
while output_p.exists() and not force:
logger.debug(f"{output_p} exists. Try next one")
num += 1
output_p = Path(template.replace('tpl', f'{num:02d}'))
else:
output_p = Path(output)
if not force and output_p.exists():
logger.error(f"{output} exists. Use force=1 do override it")
raise ValueError(f"{output} exists. Use force=1 do override it")
output_dir = output_p.dirname()
if output_dir and not output_dir.exists():
output_dir.mkdir_p()
with open(output_p, "w") as output_f:
output_f.write(tpl.render(**EXPORT_DICT, **data))
logger.info(f"{template} has been rendered to {output}.")
def pdflatex(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().abspath()
compilation = subprocess.Popen(
[
"pdflatex",
f"-output-directory={output_dir}",
str(latex_file),
],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
# shell=True
)
out, err = compilation.communicate(timeout=5)
if err:
logger.error(err)
if out:
logger.info(out)
logger.debug(f"{latex_file} has been compiled in {output_dir}")
def clean(dirname=".", garbages=["*.aux", "*.log"]):
""" Clean the directory from aux and log latex files """
if not dirname:
dirname = Path("./")
for g in garbages:
g_files = Path(dirname).files(g)
logger.debug(f"Remove {g_files}")
print(g_files)
for g_file in g_files:
g_file.remove()
# -----------------------------
# Reglages pour 'vim'
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
# cursor: 16 del