| Index: sitescripts/cms/converters.py | 
| =================================================================== | 
| --- a/sitescripts/cms/converters.py | 
| +++ b/sitescripts/cms/converters.py | 
| @@ -115,6 +115,9 @@ | 
| text = re.sub(r"(<img\s[^<>]*\b(src)=\")([^<>\"]+)(\")", process_link, text) | 
| return text | 
|  | 
| +  include_start_regex = '<' | 
| +  include_end_regex = '>' | 
| + | 
| def resolve_includes(self, text): | 
| def resolve_include(match): | 
| global converters | 
| @@ -126,7 +129,14 @@ | 
| return converter() | 
| raise Exception("Failed to resolve include %s in page %s" % (name, self._params["page"])) | 
|  | 
| -    return re.sub(r'<\?\s*include\s+([^\s<>"]+)\s*\?>', resolve_include, text) | 
| +    return re.sub( | 
| +      r'%s\?\s*include\s+([^\s<>"]+)\s*\?%s' % ( | 
| +        self.include_start_regex, | 
| +        self.include_end_regex | 
| +      ), | 
| +      resolve_include, | 
| +      text | 
| +    ) | 
|  | 
| def __call__(self): | 
| result = self.get_html(self._params[self._key]) | 
| @@ -148,6 +158,15 @@ | 
| return result | 
|  | 
| class MarkdownConverter(Converter): | 
| +  include_start_regex = r'(?:%s|%s)' % ( | 
| +    Converter.include_start_regex, | 
| +    re.escape(jinja2.escape(Converter.include_start_regex)) | 
| +  ) | 
| +  include_end_regex = r'(?:%s|%s)' % ( | 
| +    Converter.include_end_regex, | 
| +    re.escape(jinja2.escape(Converter.include_end_regex)) | 
| +  ) | 
| + | 
| def get_html(self, source): | 
| def remove_unnecessary_entities(match): | 
| char = unichr(int(match.group(1))) | 
| @@ -172,6 +191,16 @@ | 
| 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) | 
| + | 
| def __init__(self, *args, **kwargs): | 
| Converter.__init__(self, *args, **kwargs) | 
|  | 
| @@ -197,7 +226,7 @@ | 
| filters[func] = getattr(module, func) | 
| filters[func].module_ref = module  # Prevent garbage collection | 
|  | 
| -    self._env = get_custom_template_environment(filters) | 
| +    self._env = get_custom_template_environment(filters, self._SourceLoader(self._params["source"])) | 
|  | 
| def get_html(self, source): | 
| template = self._env.from_string(source) | 
|  |