"""Creole engine Created by: EOLE (http://eole.orion.education.fr) Copyright (C) 2005-2018 Forked by: Cadoles (http://www.cadoles.com) Copyright (C) 2021 distribued with GPL-2 or later license 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ from os.path import abspath, normpath from Cheetah.Template import Template from Cheetah.NameMapper import NotFound from typing import Dict, Any from ...i18n import _ from ...utils import normalize_family from ...error import TemplateError @classmethod def cl_compile(kls, *args, **kwargs): """Rewrite compile methode to force some settings """ kwargs['compilerSettings'] = {'directiveStartToken': '%', 'cheetahVarStartToken': '%%', 'EOLSlurpToken': '%', 'commentStartToken': '#', 'multiLineCommentStartToken': '#*', 'multiLineCommentEndToken': '*#', } return kls.old_compile(*args, **kwargs) # pylint: disable=E1101 Template.old_compile = Template.compile Template.compile = cl_compile class CheetahTemplate(Template): # pylint: disable=W0223 """Construct a cheetah templating object """ def __init__(self, filename: str, source: str, context, eosfunc: Dict, extra_context: Dict, ): """Initialize Creole CheetahTemplate """ if filename is not None: super().__init__(file=filename, searchList=[context, eosfunc, extra_context], ) else: super().__init__(source=source, searchList=[context, eosfunc, extra_context], ) # FORK of Cheetah function, do not replace '\\' by '/' def serverSidePath(self, path=None, normpath=normpath, abspath=abspath ): # pylint: disable=W0621 # strange... if path is None and isinstance(self, str): path = self if path: # pylint: disable=R1705 return normpath(abspath(path)) # original code return normpath(abspath(path.replace("\\", '/'))) elif hasattr(self, '_filePath') and self._filePath: # pragma: no cover return normpath(abspath(self._filePath)) else: # pragma: no cover return None # Sync to creole_legacy.py def process(filename: str, source: str, true_destfilename: str, destfilename: str, destdir: str, variable: Any, index: int, rougail_variables_dict: Dict, eosfunc: Dict, ): """Process a cheetah template """ # full path of the destination file try: extra_context = {'normalize_family': normalize_family, 'rougail_filename': true_destfilename, 'rougail_destination_dir': destdir, } if variable is not None: extra_context['rougail_variable'] = variable if index is not None: extra_context['rougail_index'] = index cheetah_template = CheetahTemplate(filename, source, rougail_variables_dict, eosfunc, extra_context, ) data = str(cheetah_template) except NotFound as err: # pragma: no cover varname = err.args[0][13:].split(' ', 1)[0][:-1] if filename: msg = f"Error: unknown variable used in template {filename} to {destfilename}: {varname}" else: msg = f"Error: unknown variable used in file {destfilename}: {varname}" raise TemplateError(_(msg)) from err except Exception as err: # pragma: no cover if filename: msg = _(f"Error while instantiating template {filename} to {destfilename}: {err}") else: msg = _(f"Error while instantiating filename {destfilename}: {err}") raise TemplateError(msg) from err with open(destfilename, 'w') as file_h: file_h.write(data)