| Index: cms/converters.py |
| =================================================================== |
| --- a/cms/converters.py |
| +++ b/cms/converters.py |
| @@ -112,6 +112,7 @@ |
| whitelist = {"a", "em", "strong", "code", "span"} |
| missing_translations = 0 |
| total_translations = 0 |
| + removed_line = '' |
| def __init__(self, params, key="pagedata"): |
| self._params = params |
| @@ -121,9 +122,12 @@ |
| # Read in any parameters specified at the beginning of the file |
| lines = params[key].splitlines(True) |
| - while lines and re.search(r"^\s*[\w\-]+\s*=", lines[0]): |
| - name, value = lines.pop(0).split("=", 1) |
| + for i, line in enumerate(lines): |
|
Sebastian Noack
2015/09/15 17:48:36
In order to prevent line numbers from being off we
|
| + if not re.search(r"^\s*[\w\-]+\s*=", line): |
| + break |
| + name, value = line.split("=", 1) |
| params[name.strip()] = value.strip() |
| + lines[i] = self.removed_line |
| params[key] = "".join(lines) |
| def localize_string(self, page, name, default, comment, localedata, escapes): |
| @@ -246,6 +250,7 @@ |
| name = match.group(1) |
| for format, converter_class in converters.iteritems(): |
| if self._params["source"].has_include(name, format): |
| + self._params["include"] = name |
|
Sebastian Noack
2015/09/15 17:48:36
There seems to be no way to get the filename for i
|
| self._params["includedata"] = self._params["source"].read_include(name, format) |
| converter = converter_class(self._params, key="includedata") |
| result = converter() |
| @@ -319,15 +324,7 @@ |
| return result |
| class TemplateConverter(Converter): |
| - class _SourceLoader(jinja2.BaseLoader): |
| - def __init__(self, source): |
| - self.source = source |
| - |
| - def get_source(self, environment, template): |
| - try: |
| - return self.source.read_file(template + ".tmpl"), None, None |
| - except Exception: |
| - raise jinja2.TemplateNotFound(template) |
| + removed_line = "{#\n#}" |
| def __init__(self, *args, **kwargs): |
| Converter.__init__(self, *args, **kwargs) |
| @@ -353,13 +350,30 @@ |
| name = os.path.basename(root) |
| dictionary[name] = self._params["source"].import_symbol(path, name) |
| - self._env = jinja2.Environment(loader=self._SourceLoader(self._params["source"]), autoescape=True) |
| + self._env = jinja2.Environment(loader=self._params["source"].get_template_loader(), autoescape=True) |
| self._env.filters.update(filters) |
| self._env.globals.update(globals) |
| + def get_template_filename(self): |
| + source = self._params["source"] |
|
Sebastian Noack
2015/09/15 17:48:36
And here is where the problematic part starts. I d
|
| + if hasattr(source, "get_path"): |
| + if self._key == "pagedata": |
| + return source.get_path(source.page_filename(self._params["page"], "tmpl")) |
| + if self._key == "includedata": |
| + return source.get_path(source.include_filename(self._params["include"], "tmpl")) |
| + if self._key == "templatedata": |
| + return source.get_path(source.template_filename(self._params["template"])) |
| + |
| def get_html(self, source): |
| - template = self._env.from_string(source) |
| - module = template.make_module(self._params) |
| + env = self._env |
| + code = env.compile(source, None, self.get_template_filename()) |
|
Sebastian Noack
2015/09/15 17:48:36
There are two ways to make the template aware of t
|
| + template = env.template_class.from_code(env, code, env.globals) |
| + |
| + try: |
| + module = template.make_module(self._params) |
| + except Exception: |
| + env.handle_exception() |
|
Sebastian Noack
2015/09/15 17:48:36
Note that this is necessary because as opposed to
|
| + |
| for key, value in module.__dict__.iteritems(): |
| if not key.startswith("_"): |
| self._params[key] = value |