如何让Django的markdown过滤器将换行符转换为<br />?

5 投票
5 回答
5659 浏览
提问于 2025-04-15 16:20

我该怎么做才能改变markdown过滤器的默认行为,让它把换行符转换成
标签呢?

5 个回答

1

你可以通过在 extras 设置中添加 "break-on-newline": True 来覆盖默认的 MARKDOWN_DEUX_STYLES:

MARKDOWN_DEUX_STYLES = {
    "default": {
        "extras": {
            "code-friendly": None,
            "break-on-newline": True,
        },
        "safe_mode": "escape",
    }
}

python-markdown2 的文档

break-on-newline: 当设置为 True 时,单个换行符会被替换为

5

编辑:截至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)

这里是使用和编写扩展的文档起点

5

我觉得随便改换换行符的写法不是个好主意...

我同意Henrik的看法。根据Markdown文档的说明:

如果你想在Markdown中插入一个<br />换行符,你需要在行末加上两个或更多的空格,然后按回车。

是的,这样做确实需要多一点儿功夫来创建<br />,但如果简单地把“每个换行都是<br />”当作规则,那在Markdown中是行不通的。Markdown的邮件式引用和多段列表项在使用硬换行格式时效果最好,看起来也更好。

你有没有考虑过其他的Django标记选项,比如textile和restructuredtext?它们的语法可能更适合你。


但如果你还是想要...

一个简单粗暴的方法是把markdown和linebreaksbr过滤器连起来使用。

{{ value|markdown|linebreaksbr }}

这样会先运行markdown过滤器,然后运行linebreaksbr过滤器,这个过滤器会把\n替换成<br />。你可能会得到太多的换行,但这可能比换行太少要好。

如果你有更好的解决方案,可以:

  1. 按照John在他的回答中建议的,写一个自定义过滤器。

  2. 深入了解Django使用的python-markdown库,并编写一个扩展来实现你想要的换行语法。然后你可以用这个扩展和过滤器一起使用:

    {{ value|markdown:"linebreakextension" }}

撰写回答