【发布时间】:2010-12-19 21:31:45
【问题描述】:
如何更改 markdown 过滤器中的默认行为,以便将换行符转换为 br 标记?
【问题讨论】:
-
那么,您是否想说您希望降价的行为与预期不同? Markdown 是一种特定的语法。如果您想发明自己的语法,那很好,但它不再是降价。不太清楚你在这里得到什么。
-
@Henrik Joretag - 你认为 StackOverflow 做了什么?
如何更改 markdown 过滤器中的默认行为,以便将换行符转换为 br 标记?
【问题讨论】:
您可以通过在extras 设置中添加"break-on-newline": True 来覆盖默认的MARKDOWN_DEUX_STYLES:
MARKDOWN_DEUX_STYLES = {
"default": {
"extras": {
"code-friendly": None,
"break-on-newline": True,
},
"safe_mode": "escape",
}
}
Documentation 的 python-markdown2:
break-on-newline:用
替换单个换行符 没错。
【讨论】:
编辑:截至 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)
Here is the starting point in the docs 用于使用和编写扩展。
【讨论】:
我同意 Henrik 的评论。来自markdown docs:
如果您确实想使用 Markdown 插入
<br />中断标记,请以两个或多个空格结束一行,然后键入 return。是的,创建
<br />需要付出更多的努力,但是简单的“每个换行符都是<br />”规则不适用于 Markdown。 Markdown 的电子邮件样式块引用和多段列表项目在您使用硬中断格式化它们时效果最好 - 并且看起来更好。
您是否查看过其他 Django 标记选项、textile 和 restructuredtext?它们的语法可能更适合您。
一种粗略且现成的方法是将markdown和linebreaksbr过滤器链接起来。
{{ value|markdown|linebreaksbr }}
这会运行 markdown 过滤器,然后运行 linebreaksbr 过滤器,它将 \n 替换为 <br />。您可能会以过多的换行符结束,但这对您来说可能比过少更好。
如果你有比这更好的解决方案,你可以
按照 John 在回答中的建议,编写自定义过滤器。
深入了解 Django 使用的 python-markdown 库和实现所需换行符语法的 write an extension。然后,您将使用带有过滤器的扩展名
{{ value|markdown:"linebreakextension" }}
【讨论】:
似乎有一个linebreaks 过滤器将\n 字符转换为<br> 或<p>。
请参阅linebreaks 或linebreaksbr。
【讨论】:
您可以编写一个调用 markdown 的 custom filter,然后在其输出上执行 replace。
【讨论】: