|  | 
| 22 | 22 | from pattern_library.exceptions import TemplateIsNotPattern | 
| 23 | 23 | 
 | 
| 24 | 24 | 
 | 
|  | 25 | + | 
|  | 26 | +from django.utils.html import escape | 
|  | 27 | + | 
| 25 | 28 | def path_to_section(): | 
| 26 | 29 |  section_config = get_sections() | 
| 27 | 30 |  sections = {} | 
| @@ -79,75 +82,6 @@ def get_template_dirs(): | 
| 79 | 82 |  return template_dirs | 
| 80 | 83 | 
 | 
| 81 | 84 | 
 | 
| 82 |  | -def get_pattern_templates(): | 
| 83 |  | - templates = base_dict() | 
| 84 |  | - template_dirs = get_template_dirs() | 
| 85 |  | - | 
| 86 |  | - for lookup_dir in template_dirs: | 
| 87 |  | - for root, dirs, files in os.walk(lookup_dir, topdown=True): | 
| 88 |  | - # Ignore folders without files | 
| 89 |  | - if not files: | 
| 90 |  | - continue | 
| 91 |  | - | 
| 92 |  | - base_path = os.path.relpath(root, lookup_dir) | 
| 93 |  | - section, path = section_for(base_path) | 
| 94 |  | - | 
| 95 |  | - # It has no section, ignore it | 
| 96 |  | - if not section: | 
| 97 |  | - continue | 
| 98 |  | - | 
| 99 |  | - found_templates = [] | 
| 100 |  | - for current_file in files: | 
| 101 |  | - pattern_path = os.path.join(root, current_file) | 
| 102 |  | - pattern_path = os.path.relpath(pattern_path, lookup_dir) | 
| 103 |  | - | 
| 104 |  | - if is_pattern(pattern_path): | 
| 105 |  | - template = get_template(pattern_path) | 
| 106 |  | - pattern_config = get_pattern_config(pattern_path) | 
| 107 |  | - pattern_name = pattern_config.get("name") | 
| 108 |  | - pattern_filename = os.path.relpath( | 
| 109 |  | - template.origin.template_name, | 
| 110 |  | - base_path, | 
| 111 |  | - ) | 
| 112 |  | - if pattern_name: | 
| 113 |  | - template.pattern_name = pattern_name | 
| 114 |  | - else: | 
| 115 |  | - template.pattern_name = pattern_filename | 
| 116 |  | - | 
| 117 |  | - template.pattern_filename = pattern_filename | 
| 118 |  | - | 
| 119 |  | - found_templates.append(template) | 
| 120 |  | - | 
| 121 |  | - if found_templates: | 
| 122 |  | - lookup_dir_relpath = os.path.relpath(root, lookup_dir) | 
| 123 |  | - sub_folders = os.path.relpath(lookup_dir_relpath, path) | 
| 124 |  | - templates_to_store = templates | 
| 125 |  | - for folder in [section, *sub_folders.split(os.sep)]: | 
| 126 |  | - try: | 
| 127 |  | - templates_to_store = templates_to_store["template_groups"][ | 
| 128 |  | - folder | 
| 129 |  | - ] | 
| 130 |  | - except KeyError: | 
| 131 |  | - templates_to_store["template_groups"][folder] = base_dict() | 
| 132 |  | - templates_to_store = templates_to_store["template_groups"][ | 
| 133 |  | - folder | 
| 134 |  | - ] | 
| 135 |  | - | 
| 136 |  | - templates_to_store["templates_stored"].extend(found_templates) | 
| 137 |  | - | 
| 138 |  | - # Order the templates alphabetically | 
| 139 |  | - for templates_objs in templates["template_groups"].values(): | 
| 140 |  | - templates_objs["template_groups"] = order_dict( | 
| 141 |  | - templates_objs["template_groups"] | 
| 142 |  | - ) | 
| 143 |  | - | 
| 144 |  | - # Order the top level by the sections | 
| 145 |  | - section_order = [section for section, _ in get_sections()] | 
| 146 |  | - templates["template_groups"] = order_dict( | 
| 147 |  | - templates["template_groups"], key_sort=lambda key: section_order.index(key) | 
| 148 |  | - ) | 
| 149 |  | - | 
| 150 |  | - return templates | 
| 151 | 85 | 
 | 
| 152 | 86 | 
 | 
| 153 | 87 | def get_pattern_config_str(template_name): | 
| @@ -227,27 +161,149 @@ def render_pattern(request, template_name, allow_non_patterns=False, config=None | 
| 227 | 161 |  return render_to_string(template_name, request=request, context=context) | 
| 228 | 162 | 
 | 
| 229 | 163 | 
 | 
| 230 |  | -def get_template_ancestors(template_name, context=None, ancestors=None): | 
| 231 |  | - """ | 
| 232 |  | - Returns a list of template names, starting with provided name | 
| 233 |  | - and followed by the names of any templates that extends until | 
| 234 |  | - the most extended template is reached. | 
| 235 |  | - """ | 
| 236 |  | - if ancestors is None: | 
| 237 |  | - ancestors = [template_name] | 
|  | 164 | +def get_renderer(): | 
|  | 165 | + return JinjaTemplateRenderer | 
|  | 166 | + | 
|  | 167 | + | 
|  | 168 | +class TemplateRenderer: | 
|  | 169 | + | 
|  | 170 | + @classmethod | 
|  | 171 | + def get_pattern_templates(cls,): | 
|  | 172 | + templates = base_dict() | 
|  | 173 | + template_dirs = get_template_dirs() | 
|  | 174 | + | 
|  | 175 | + for lookup_dir in template_dirs: | 
|  | 176 | + for root, dirs, files in os.walk(lookup_dir, topdown=True): | 
|  | 177 | + # Ignore folders without files | 
|  | 178 | + if not files: | 
|  | 179 | + continue | 
|  | 180 | + | 
|  | 181 | + base_path = os.path.relpath(root, lookup_dir) | 
|  | 182 | + section, path = section_for(base_path) | 
|  | 183 | + | 
|  | 184 | + # It has no section, ignore it | 
|  | 185 | + if not section: | 
|  | 186 | + continue | 
|  | 187 | + | 
|  | 188 | + found_templates = [] | 
|  | 189 | + for current_file in files: | 
|  | 190 | + pattern_path = os.path.join(root, current_file) | 
|  | 191 | + pattern_path = os.path.relpath(pattern_path, lookup_dir) | 
|  | 192 | + | 
|  | 193 | + if is_pattern(pattern_path): | 
|  | 194 | + template = get_template(pattern_path) | 
|  | 195 | + pattern_config = get_pattern_config(pattern_path) | 
|  | 196 | + pattern_name = pattern_config.get("name") | 
|  | 197 | + pattern_filename = os.path.relpath( | 
|  | 198 | + template.origin.template_name, | 
|  | 199 | + base_path, | 
|  | 200 | + ) | 
|  | 201 | + if pattern_name: | 
|  | 202 | + template.pattern_name = pattern_name | 
|  | 203 | + else: | 
|  | 204 | + template.pattern_name = pattern_filename | 
|  | 205 | + | 
|  | 206 | + template.pattern_filename = pattern_filename | 
|  | 207 | + | 
|  | 208 | + found_templates.append(template) | 
|  | 209 | + | 
|  | 210 | + if found_templates: | 
|  | 211 | + lookup_dir_relpath = os.path.relpath(root, lookup_dir) | 
|  | 212 | + sub_folders = os.path.relpath(lookup_dir_relpath, path) | 
|  | 213 | + templates_to_store = templates | 
|  | 214 | + for folder in [section, *sub_folders.split(os.sep)]: | 
|  | 215 | + try: | 
|  | 216 | + templates_to_store = templates_to_store["template_groups"][ | 
|  | 217 | + folder | 
|  | 218 | + ] | 
|  | 219 | + except KeyError: | 
|  | 220 | + templates_to_store["template_groups"][folder] = base_dict() | 
|  | 221 | + | 
|  | 222 | + templates_to_store = templates_to_store["template_groups"][ | 
|  | 223 | + folder | 
|  | 224 | + ] | 
|  | 225 | + | 
|  | 226 | + templates_to_store["templates_stored"].extend(found_templates) | 
|  | 227 | + | 
|  | 228 | + # Order the templates alphabetically | 
|  | 229 | + for templates_objs in templates["template_groups"].values(): | 
|  | 230 | + templates_objs["template_groups"] = order_dict( | 
|  | 231 | + templates_objs["template_groups"] | 
|  | 232 | + ) | 
|  | 233 | + | 
|  | 234 | + # Order the top level by the sections | 
|  | 235 | + section_order = [section for section, _ in get_sections()] | 
|  | 236 | + templates["template_groups"] = order_dict( | 
|  | 237 | + templates["template_groups"], key_sort=lambda key: section_order.index(key) | 
|  | 238 | + ) | 
|  | 239 | + | 
|  | 240 | + return templates | 
|  | 241 | + | 
|  | 242 | +class DTLTemplateRenderer(TemplateRenderer): | 
|  | 243 | + @classmethod | 
|  | 244 | + def get_pattern_source(cls, template): | 
|  | 245 | + return escape(template.template.source) | 
|  | 246 | + | 
|  | 247 | + @classmethod | 
|  | 248 | + def get_template_ancestors(cls, template_name, context=None, ancestors=None): | 
|  | 249 | + """ | 
|  | 250 | + Returns a list of template names, starting with provided name | 
|  | 251 | + and followed by the names of any templates that extends until | 
|  | 252 | + the most extended template is reached. | 
|  | 253 | + """ | 
|  | 254 | + if ancestors is None: | 
|  | 255 | + ancestors = [template_name] | 
| 238 | 256 | 
 | 
| 239 |  | - if context is None: | 
| 240 |  | - context = Context() | 
|  | 257 | +  if context is None: | 
|  | 258 | +  context = Context() | 
| 241 | 259 | 
 | 
| 242 |  | - pattern_template = get_template(template_name) | 
|  | 260 | +  pattern_template = get_template(template_name) | 
| 243 | 261 | 
 | 
| 244 |  | - for node in pattern_template.template.nodelist: | 
| 245 |  | - if isinstance(node, ExtendsNode): | 
| 246 |  | - parent_template_name = node.parent_name.resolve(context) | 
|  | 262 | + for node in pattern_template.template.nodelist: | 
|  | 263 | + if isinstance(node, ExtendsNode): | 
|  | 264 | + parent_template_name = node.parent_name.resolve(context) | 
|  | 265 | + ancestors.append(parent_template_name) | 
|  | 266 | + cls.get_template_ancestors( | 
|  | 267 | + parent_template_name, context=context, ancestors=ancestors | 
|  | 268 | + ) | 
|  | 269 | + break | 
|  | 270 | + | 
|  | 271 | + return ancestors | 
|  | 272 | + | 
|  | 273 | + | 
|  | 274 | + | 
|  | 275 | +class JinjaTemplateRenderer(TemplateRenderer): | 
|  | 276 | + | 
|  | 277 | + @classmethod | 
|  | 278 | + def get_pattern_source(cls, template): | 
|  | 279 | + with open(template.template.filename) as f: | 
|  | 280 | + source = escape(f.read()) | 
|  | 281 | + return source | 
|  | 282 | + | 
|  | 283 | + | 
|  | 284 | + @classmethod | 
|  | 285 | + def get_template_ancestors(cls, template_name, context=None, ancestors=None): | 
|  | 286 | + """ | 
|  | 287 | + Returns a list of template names, starting with provided name | 
|  | 288 | + and followed by the names of any templates that extends until | 
|  | 289 | + the most extended template is reached. | 
|  | 290 | + """ | 
|  | 291 | + from jinja2.nodes import Extends | 
|  | 292 | + | 
|  | 293 | + if ancestors is None: | 
|  | 294 | + ancestors = [template_name] | 
|  | 295 | + | 
|  | 296 | + if context is None: | 
|  | 297 | + context = Context() | 
|  | 298 | + | 
|  | 299 | + pattern_template = get_template(template_name) | 
|  | 300 | + #todo - make sure envrionment has context passed in | 
|  | 301 | + environment = pattern_template.template.environment | 
|  | 302 | + nodelist = environment.parse(pattern_template.name) | 
|  | 303 | + parent_template_name = nodelist.find(Extends) | 
|  | 304 | + if parent_template_name: | 
| 247 | 305 |  ancestors.append(parent_template_name) | 
| 248 |  | - get_template_ancestors( | 
| 249 |  | - parent_template_name, context=context, ancestors=ancestors | 
| 250 |  | - ) | 
| 251 |  | - break | 
|  | 306 | + cls.get_template_ancestors(parent_template_name, context=context, ancestors=ancestors) | 
| 252 | 307 | 
 | 
| 253 |  | - return ancestors | 
|  | 308 | + return ancestors | 
|  | 309 | +>>>>>>> 68fea3c (First pass at renderers) | 
0 commit comments