如何让Django的markdown过滤器将换行符转换为<br />?
我该怎么做才能改变markdown过滤器的默认行为,让它把换行符转换成
标签呢?
5 个回答
你可以通过在 extras
设置中添加 "break-on-newline": True
来覆盖默认的 MARKDOWN_DEUX_STYLES:
MARKDOWN_DEUX_STYLES = {
"default": {
"extras": {
"code-friendly": None,
"break-on-newline": True,
},
"safe_mode": "escape",
}
}
break-on-newline: 当设置为 True 时,单个换行符会被替换为
。
编辑:截至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)
我觉得随便改换换行符的写法不是个好主意...
我同意Henrik的看法。根据Markdown文档的说明:
如果你想在Markdown中插入一个
<br />
换行符,你需要在行末加上两个或更多的空格,然后按回车。是的,这样做确实需要多一点儿功夫来创建
<br />
,但如果简单地把“每个换行都是<br />
”当作规则,那在Markdown中是行不通的。Markdown的邮件式引用和多段列表项在使用硬换行格式时效果最好,看起来也更好。
你有没有考虑过其他的Django标记选项,比如textile和restructuredtext?它们的语法可能更适合你。
但如果你还是想要...
一个简单粗暴的方法是把markdown和linebreaksbr过滤器连起来使用。
{{ value|markdown|linebreaksbr }}
这样会先运行markdown过滤器,然后运行linebreaksbr过滤器,这个过滤器会把\n
替换成<br />
。你可能会得到太多的换行,但这可能比换行太少要好。
如果你有更好的解决方案,可以:
按照John在他的回答中建议的,写一个自定义过滤器。
深入了解Django使用的python-markdown库,并编写一个扩展来实现你想要的换行语法。然后你可以用这个扩展和过滤器一起使用:
{{ value|markdown:"linebreakextension" }}