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

5

我该如何更改Markdown过滤器的默认行为,使其将换行符转换为br标签?


1
那么,你是想说你希望Markdown的行为与它应该有的不同吗?Markdown是一种特定的语法。如果你想发明自己的语法,那也没问题,但那就不再是Markdown了。我真的不太确定你在这里想表达什么。 - Henrik Joreteg
2
@Henrik Joretag - 你认为StackOverflow做了什么? - Brian Neal
5个回答

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)

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


所以这在python-markdown源代码中提到了,但显然没有包含在其中,或者至少不是在它们的最新版本中? - poolie
1
@poolie,自从我写下这个答案以来,Markdown团队现在已经将扩展名与Markdown一起包含了。这是接受它的问题:https://github.com/waylan/Python-Markdown/issues/13 - Brian Neal
是的,在pypi(2.0.3)版本中没有,但在主干中有。感谢您添加! - poolie
1
@poolie和其他人。我刚刚得知2.1.0版本现在已经发布到PyPi上,并包含了这个更改。 - Brian Neal

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库,并编写扩展来实现所需的换行符号。然后,您将使用该扩展与过滤器一起使用:
  3. {{ value|markdown:"linebreakextension" }}


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时,将单个换行符替换为


0

0

似乎有一个 linebreaks 过滤器,将 \n 字符转换为 <br><p>。请参见 linebreakslinebreaksbr


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接