为了完整起见,我决定发布我的最终解决方案:
标签的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 %}
注意将{##}
带有换行符和空格的单个 TextNode 在 HTML 标记之前分成三个节点的块:仅空格 TextNode、CommentNode 和带有 HTML 标记的 TextNode。仅包含空格的 TextNode 将被剥离。