完全を期すために、最終的な解決策を投稿することにしました。
strip_spacenodes
タグのコード:
def _strip__space__text_nodes(nodelist):
for node in nodelist:
if isinstance(node, template.TextNode):
if not node.s.strip():
node.s = ''
else:
for list_ in node.child_nodelists:
_strip__space__text_nodes(getattr(node, list_, ()))
class StripSpaceNodes(template.Node):
def __init__(self, nodelist):
self.nodelist = nodelist
_strip__space__text_nodes(nodelist)
def render(self, context):
return self.nodelist.render(context)
@register.tag
def strip_spacenodes(parser, token):
nodelist = parser.parse(('endstrip_spacenodes',))
parser.delete_first_token()
return StripSpaceNodes(nodelist)
使用法:
{% strip_spacenodes %}
{% for segment in segments %}
{% if segment.is_marked %}
{##}<b>{##}
{% for sub in segment.details %}
{% if sub.is_marked %}
{##}<u>{{sub.text}}</u>{##}
{% else %}
{{sub.text}}
{% endif %}
{% empty %}
{{ segment.text }}
{% endfor %}
{##}</b> {##}
{% else %}
{{ segment.text }}
{% endif %}
{% endfor %}
{% endstrip_spacenodes %}
{##}
HTML タグの前に改行とスペースを含む単一の TextNode を 3 つのノード (スペースのみの TextNode、CommentNode、および HTML タグ付きの TextNode) に分割するブロックに注意してください。スペースのみを含む TextNode は削除されます。