def parse(source_code, path, context, main_template=False): """ Parse the code. - source_code: string - path: for attaching meta information to the tree. - context: preprocess context (holding the settings/dependecies/warnings, ...) - main_template: False for includes/extended templates. True for the original path that was called. """ # To start, create the root node of a tree. tree = Token(name='root', line=1, column=1, path=path) tree.children = [ source_code ] # Lex Django tags tokenize(tree, __DJANGO_STATES, Token) # Phase I: add parser extensions _add_parser_extensions(tree) # Phase II: process inline tags _process_inline_tags(tree) # Phase III: create recursive structure for block level tags. nest_block_level_elements(tree, __DJANGO_BLOCK_ELEMENTS, DjangoTag, lambda c: c.tagname) # === Actions === if main_template: _find_first_level_dependencies(tree, context) # Extend parent template and process includes tree = _process_extends(tree, context) # NOTE: this returns a new tree! _preprocess_includes(tree, context) _preprocess_decorate_tags(tree, context) # Following actions only need to be applied if this is the 'main' tree. # It does not make sense to apply it on every include, and then again # on the complete tree. if main_template: _update_preprocess_settings(tree, context) options = context.options # Remember translations in context (form PO-file generation) remember_gettext_entries(tree, context) # Do translations if options.preprocess_translations: _preprocess_trans_tags(tree) # Reverse URLS if options.preprocess_urls: _preprocess_urls(tree) # Do variable lookups if options.preprocess_variables: sites_enabled = 'django.contrib.sites' in settings.INSTALLED_APPS _preprocess_variables(tree, { 'MEDIA_URL': getattr(settings, 'MEDIA_URL', ''), 'STATIC_URL': getattr(settings, 'STATIC_URL', ''), }) if sites_enabled: from django.contrib.sites.models import Site try: # Don't preprocess anything when we don't have a Site # instance yet. site = Site.objects.get_current() _preprocess_variables(tree, { 'SITE_DOMAIN': site.domain, 'SITE_NAME': site.name, 'SITE_URL': 'http://%s' % site.domain, }) except Site.DoesNotExist, e: pass # Don't output {% block %} tags in the compiled file. if options.remove_block_tags: tree.collapse_nodes_of_class(DjangoBlockTag) # Preprocess {% callmacro %} tags if options.preprocess_macros: _preprocess_macros(tree) # Group all {% load %} statements if options.merge_all_load_tags: _group_all_loads(tree) # Preprocessable tags if options.execute_preprocessable_tags: _execute_preprocessable_tags(tree) # HTML compiler if options.is_html: compile_html(tree, context)
def parse(source_code, path, context, main_template=False): """ Parse the code. - source_code: string - path: for attaching meta information to the tree. - context: preprocess context (holding the settings/dependecies/warnings, ...) - main_template: False for includes/extended templates. True for the original path that was called. """ # To start, create the root node of a tree. tree = Token(name="root", line=1, column=1, path=path) tree.children = [source_code] # Lex Django tags tokenize(tree, __DJANGO_STATES, Token) # Phase I: add parser extensions _add_parser_extensions(tree) # Phase II: process inline tags _process_inline_tags(tree) # Phase III: create recursive structure for block level tags. nest_block_level_elements(tree, __DJANGO_BLOCK_ELEMENTS, DjangoTag, lambda c: c.tagname) # === Actions === if main_template: _find_first_level_dependencies(tree, context) # Extend parent template and process includes tree = _process_extends(tree, context) # NOTE: this returns a new tree! _preprocess_includes(tree, context) _preprocess_decorate_tags(tree, context) # Following actions only need to be applied if this is the 'main' tree. # It does not make sense to apply it on every include, and then again # on the complete tree. if main_template: _update_preprocess_settings(tree, context) options = context.options # Remember translations in context (form PO-file generation) remember_gettext_entries(tree, context) # Do translations if options.preprocess_translations: _preprocess_trans_tags(tree) # Reverse URLS if options.preprocess_urls: _preprocess_urls(tree) # Do variable lookups if options.preprocess_variables: sites_enabled = "django.contrib.sites" in settings.INSTALLED_APPS _preprocess_variables( tree, {"MEDIA_URL": getattr(settings, "MEDIA_URL", ""), "STATIC_URL": getattr(settings, "STATIC_URL", "")}, ) if sites_enabled: from django.contrib.sites.models import Site try: # Don't preprocess anything when we don't have a Site # instance yet. site = Site.objects.get_current() _preprocess_variables( tree, {"SITE_DOMAIN": site.domain, "SITE_NAME": site.name, "SITE_URL": "http://%s" % site.domain}, ) except Site.DoesNotExist, e: pass # Don't output {% block %} tags in the compiled file. if options.remove_block_tags: tree.collapse_nodes_of_class(DjangoBlockTag) # Preprocess {% callmacro %} tags if options.preprocess_macros: _preprocess_macros(tree) # Group all {% load %} statements if options.merge_all_load_tags: _group_all_loads(tree) # Preprocessable tags if options.execute_preprocessable_tags: _execute_preprocessable_tags(tree) # HTML compiler if options.is_html: compile_html(tree, context)
def parse(source_code, path, loader, main_template=False, options=None): """ Parse the code. - source_code: string - loader: method to be called to include other templates. - path: for attaching meta information to the tree. - main_template: False for includes/extended templates. True for the original path that was called. """ # To start, create the root node of a tree. tree = Token(name='root', line=1, column=1, path=path) tree.children = [ source_code ] # Lex Django tags tokenize(tree, __DJANGO_STATES, [Token]) # Phase I: add parser extensions _add_parser_extensions(tree) # Phase II: process inline tags _process_inline_tags(tree) # Phase III: create recursive structure for block level tags. nest_block_level_elements(tree, __DJANGO_BLOCK_ELEMENTS, [DjangoTag], lambda c: c.tagname) # === Actions === # Extend parent template and process includes tree = _process_extends(tree, loader) # NOTE: this returns a new tree! _preprocess_includes(tree, loader) _preprocess_decorate_tags(tree, loader) # Following actions only need to be applied if this is the 'main' tree. # It does not make sense to apply it on every include, and then again # on the complete tree. if main_template: options = _get_preprocess_settings(tree, options) # Do translations if options.preprocess_translations: _preprocess_trans_tags(tree) # Reverse URLS if options.preprocess_urls: _preprocess_urls(tree) # Do variable lookups if options.preprocess_variables: from django.contrib.sites.models import Site _preprocess_variables(tree, { 'MEDIA_URL': settings.MEDIA_URL, 'SITE_DOMAIN': Site.objects.get_current().domain, 'SITE_NAME': Site.objects.get_current().name, 'SITE_URL': 'http://%s' % Site.objects.get_current().domain, }) # Don't output {% block %} tags in the compiled file. if options.remove_block_tags: tree.collapse_nodes_of_class(DjangoBlockTag) # Preprocess {% callmacro %} tags if options.preprocess_macros: _preprocess_macros(tree) if options.preprocess_ifdebug: _preprocess_ifdebug(tree) # Group all {% load %} statements if options.merge_all_load_tags: _group_all_loads(tree) # Preprocessable tags if options.execute_preprocessable_tags: _execute_preprocessable_tags(tree) # HTML compiler if options.is_html: compile_html(tree, options) return tree