forked from ui/django-post_office
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pulled code from django-compressor and removed it as dependency
- Loading branch information
1 parent
ecd4df2
commit 6cf6d4c
Showing
5 changed files
with
113 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,4 +12,3 @@ pytest-cov | |
redis | ||
requests | ||
django-jsoneditor | ||
django-compressor |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -94,4 +94,3 @@ webencodings==0.5.1 | |
wheel==0.44.0 | ||
zipp==3.20.0 | ||
django-jsoneditor==0.2.4 | ||
django-compressor==4.5.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
from copy import copy | ||
|
||
from django.template.base import VariableNode, TextNode, NodeList | ||
from django.template.defaulttags import IfNode | ||
from django.template.loader_tags import ( | ||
BLOCK_CONTEXT_KEY, | ||
ExtendsNode, | ||
BlockNode, | ||
BlockContext, | ||
) | ||
|
||
|
||
|
||
def handle_extendsnode(extendsnode, context): | ||
"""Create a copy of Node tree of a derived template replacing | ||
all blocks tags with the nodes of appropriate blocks. | ||
Also handles {{ block.super }} tags. | ||
""" | ||
if BLOCK_CONTEXT_KEY not in context.render_context: | ||
context.render_context[BLOCK_CONTEXT_KEY] = BlockContext() | ||
block_context = context.render_context[BLOCK_CONTEXT_KEY] | ||
blocks = dict( | ||
(n.name, n) for n in extendsnode.nodelist.get_nodes_by_type(BlockNode) | ||
) | ||
block_context.add_blocks(blocks) | ||
|
||
compiled_parent = extendsnode.get_parent(context) | ||
parent_nodelist = compiled_parent.nodelist | ||
# If the parent template has an ExtendsNode it is not the root. | ||
for node in parent_nodelist: | ||
# The ExtendsNode has to be the first non-text node. | ||
if not isinstance(node, TextNode): | ||
if isinstance(node, ExtendsNode): | ||
return handle_extendsnode(node, context) | ||
break | ||
# Add blocks of the root template to block context. | ||
blocks = dict((n.name, n) for n in parent_nodelist.get_nodes_by_type(BlockNode)) | ||
block_context.add_blocks(blocks) | ||
|
||
block_stack = [] | ||
new_nodelist = remove_block_nodes(parent_nodelist, block_stack, block_context) | ||
return new_nodelist | ||
|
||
|
||
def remove_block_nodes(nodelist, block_stack, block_context): | ||
new_nodelist = NodeList() | ||
for node in nodelist: | ||
if isinstance(node, VariableNode): | ||
var_name = node.filter_expression.token.strip() | ||
if var_name == "block.super": | ||
if not block_stack: | ||
continue | ||
node = block_context.get_block(block_stack[-1].name) | ||
if not node: | ||
continue | ||
if isinstance(node, BlockNode): | ||
expanded_block = expand_blocknode(node, block_stack, block_context) | ||
new_nodelist.extend(expanded_block) | ||
else: | ||
# IfNode has nodelist as a @property so we can not modify it | ||
if isinstance(node, IfNode): | ||
node = copy(node) | ||
for i, (condition, sub_nodelist) in enumerate( | ||
node.conditions_nodelists | ||
): | ||
sub_nodelist = remove_block_nodes( | ||
sub_nodelist, block_stack, block_context | ||
) | ||
node.conditions_nodelists[i] = (condition, sub_nodelist) | ||
else: | ||
for attr in node.child_nodelists: | ||
sub_nodelist = getattr(node, attr, None) | ||
if sub_nodelist: | ||
sub_nodelist = remove_block_nodes( | ||
sub_nodelist, block_stack, block_context | ||
) | ||
node = copy(node) | ||
setattr(node, attr, sub_nodelist) | ||
new_nodelist.append(node) | ||
return new_nodelist | ||
|
||
|
||
def expand_blocknode(node, block_stack, block_context): | ||
popped_block = block = block_context.pop(node.name) | ||
if block is None: | ||
block = node | ||
block_stack.append(block) | ||
expanded_nodelist = remove_block_nodes(block.nodelist, block_stack, block_context) | ||
block_stack.pop() | ||
if popped_block is not None: | ||
block_context.push(node.name, popped_block) | ||
return expanded_nodelist | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters