如何更改降价过滤器中的默认行为,以便将换行符转换为 br 标记?
5 回答
我不认为弄乱换行符语法是个好主意...
我同意 Henrik 的评论。从降价文档:
当您确实想
<br />
使用 Markdown 插入中断标记时,请以两个或更多空格结束一行,然后键入 return。是的,这需要更多的努力来创建一个
<br />
,但是简单的“每个换行符都是一个<br />
”规则不适用于 Markdown。Markdown 的电子邮件风格的块引用和多段列表项目在您使用硬中断格式化它们时效果最好 - 并且看起来更好。
您是否查看过其他 Django 标记选项、textile 和 restructuredtext?它们的语法可能更适合您。
但如果你还想...
一个粗略且现成的方法是链接 markdown 和linebreaksbr过滤器。
{{ value|markdown|linebreaksbr }}
这将运行 markdown 过滤器,然后是 linebreaksbr 过滤器,它替换\n
为<br />
. 您最终可能会遇到太多换行符,但这对您来说可能比太少更好。
如果你有比这更好的解决方案,你可以
正如约翰在他的回答中所建议的那样,编写一个自定义过滤器。
深入了解 Django 使用的python-markdown库,并编写一个扩展来实现您所需的换行符语法。然后,您将使用带有过滤器的扩展名
{{ value|markdown:"linebreakextension" }}
编辑:截至 2011 年 6 月,以下扩展现在包含在 Python Markdown 中。
这是我编写的 Markdown 扩展,目前正在我的网站上进行测试,以完全满足您的要求:
"""
A python-markdown extension to treat newlines as hard breaks; like
StackOverflow and GitHub flavored Markdown do.
"""
import markdown
BR_RE = r'\n'
class Nl2BrExtension(markdown.Extension):
def extendMarkdown(self, md, md_globals):
br_tag = markdown.inlinepatterns.SubstituteTagPattern(BR_RE, 'br')
md.inlinePatterns.add('nl', br_tag, '_end')
def makeExtension(configs=None):
return Nl2BrExtension(configs)
我把它放在一个名为 mdx_nl2br.py 的文件中,并将它放在我的 PYTHONPATH 上。然后,您可以在 Django 模板中使用它,如下所示:
{{ value|markdown:"nl2br" }}
如果您想在常规代码中使用它,可以执行以下操作:
import markdown
md = markdown.Markdown(safe_mode=True, extensions=['nl2br'])
converted_text = md.convert(text)
这是文档中使用和编写扩展的起点。
"break-on-newline": True
您可以通过添加设置覆盖默认 MARKDOWN_DEUX_STYLES extras
:
MARKDOWN_DEUX_STYLES = {
"default": {
"extras": {
"code-friendly": None,
"break-on-newline": True,
},
"safe_mode": "escape",
}
}
break-on-newline:将单个换行符替换为
True。
似乎有一个linebreaks
过滤器可以将\n
字符转换为<br>
或<p>
。
请参阅换行符或linebreaksbr。