如何让django的降价过滤器将回车转换为<br />?

Hob*_*use 5 python django markdown

如何更改降价滤镜中的默认行为,以便将换行符转换为br标记?

Ala*_*air 5

我不认为搞乱换行语法是个好主意......

我同意Henrik的评论.从降价文档:

当您确实想要<br />使用Markdown 插入break标记时,您将结束包含两个或更多空格的行,然后键入return.

是的,这需要更多的努力来创建一个<br />,但是一个简单的"每个换行是一个<br />"规则对Markdown不起作用.当您使用硬中断格式化时,Markdown的电子邮件风格的区块报价和多段列表项目效果最好 - 看起来更好.

您是否看过其他Django标记选项,纺织品和重组文本?他们的语法可能更适合你.


但如果你还想......

粗略且准备好的方法是将markdown和linebreaksbr过滤器链接起来.

{{ value|markdown|linebreaksbr }}
Run Code Online (Sandbox Code Playgroud)

这将运行降价过滤器,然后运行替换\n为的linebreaksbr过滤器<br />.你可能最终会有太多的换行符,但这对你来说可能比太少更好.

如果你是一个比这更好的解决方案,你可以

  1. 写一个自定义过滤器,正如约翰在他的回答中所说.

  2. 深入了解Django使用的python-markdown库,并编写一个实现所需换行语法的扩展.然后,您将使用带过滤器的扩展名

    {{ value|markdown:"linebreakextension" }}


Bri*_*eal 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)
Run Code Online (Sandbox Code Playgroud)

我把它放在一个名为mdx_nl2br.py的文件中,并把它放在我的PYTHONPATH上.然后,您可以在Django模板中使用它,如下所示:

{{ value|markdown:"nl2br" }}
Run Code Online (Sandbox Code Playgroud)

如果您想在常规代码中使用它,您可以执行以下操作:

import markdown
md = markdown.Markdown(safe_mode=True, extensions=['nl2br'])
converted_text = md.convert(text)
Run Code Online (Sandbox Code Playgroud)

以下是使用和编写扩展的文档的起点.