Source code for pyquickhelper.texthelper.templating
"""
Templating functions
:githublink:`%|py|5`
"""
from pprint import pformat
[docs]class CustomTemplateException(Exception):
"""
Raised when a templatre could not compile.
:githublink:`%|py|11`
"""
pass
[docs]def apply_template(text, context, engine="mako"):
"""
Extend a string containing templating instructions.
See :epkg:`mako` or :epkg:`jinja2`.
:param text: text
:param context: local variable to use
:param engine: 'mako' or 'jinja2'
:return: resulting text
:githublink:`%|py|24`
"""
if engine == "mako":
from mako.template import Template
from mako.exceptions import CompileException
try:
tmpl = Template(text)
except CompileException as ee:
mes = ["%04d %s" % (i + 1, _)
for i, _ in enumerate(text.split("\n"))]
import mako.exceptions
exc = mako.exceptions.text_error_template()
text = exc.render()
raise CustomTemplateException(
"unable to compile with mako\n{0}\nCODE:\n{1}".format(text, "\n".join(mes))) from ee
try:
res = tmpl.render(**context)
except Exception as ee:
import mako.exceptions
exc = mako.exceptions.text_error_template()
text = exc.render()
raise CustomTemplateException(
"Some parameters are missing or mispelled.\n" + text) from ee
return res
elif engine == "jinja2":
from jinja2 import Template
from jinja2.exceptions import TemplateSyntaxError, UndefinedError
try:
template = Template(text)
except TemplateSyntaxError as eee:
mes = ["%04d %s" % (i + 1, _)
for i, _ in enumerate(text.split("\n"))]
raise CustomTemplateException(
"unable to compile with jinja2\n" + "\n".join(mes)) from eee
try:
res = template.render(**context)
except UndefinedError as ee:
raise CustomTemplateException(
"Some parameters are missing or mispelled\n{}"
"".format(pformat(context))) from ee
return res
else:
raise ValueError( # pragma: no cover
"engine should be 'mako' or 'jinja2', not '{0}'".format(engine))