【问题标题】:How do I make django's markdown filter transform a carriage return to <br />?如何使 django 的降价过滤器将回车转换为 <br />?
【发布时间】:2010-12-19 21:31:45
【问题描述】:

如何更改 markdown 过滤器中的默认行为,以便将换行符转换为 br 标记?

【问题讨论】:

  • 那么,您是否想说您希望降价的行为与预期不同? Markdown 是一种特定的语法。如果您想发明自己的语法,那很好,但它不再是降价。不太清楚你在这里得到什么。
  • @Henrik Joretag - 你认为 StackOverflow 做了什么?

标签: python django markdown


【解决方案1】:

您可以通过在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:用
替换单个换行符 没错。

【讨论】:

    【解决方案2】:

    编辑:截至 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 用于使用和编写扩展。

    【讨论】:

    • 所以这是mentioned in the python-markdown source,但显然没有提供,或者至少在他们的最新版本中没有?
    • @poolie,自从我写了这个答案以来,Markdown 团队现在已经将扩展包含在 Markdown 中。这是接受它的问题:github.com/waylan/Python-Markdown/issues/13
    • 是的,它不在 pypi (2.0.3) 上的版本中,但它在主干中。感谢您添加!
    • @poolie 和其他任何人。我刚刚了解到 2.1.0 版现在在 PyPi 上,它包含了这个变化。
    【解决方案3】:

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

    我同意 Henrik 的评论。来自markdown docs

    如果您确实想使用 Markdown 插入 &lt;br /&gt; 中断标记,请以两个或多个空格结束一行,然后键入 return。

    是的,创建&lt;br /&gt; 需要付出更多的努力,但是简单的“每个换行符都是&lt;br /&gt;”规则不适用于 Markdown。 Markdown 的电子邮件样式块引用和多段列表项目在您使用硬中断格式化它们时效果最好 - 并且看起来更好。

    您是否查看过其他 Django 标记选项、textile 和 restructuredtext?它们的语法可能更适合您。


    但如果你还想...

    一种粗略且现成的方法是将markdown和linebreaksbr过滤器链接起来。

    {{ value|markdown|linebreaksbr }}
    

    这会运行 markdown 过滤器,然后运行 ​​linebreaksbr 过滤器,它将 \n 替换为 &lt;br /&gt;。您可能会以过多的换行符结束,但这对您来说可能比过少更好。

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

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

    2. 深入了解 Django 使用的 python-markdown 库和实现所需换行符语法的 write an extension。然后,您将使用带有过滤器的扩展名

      {{ value|markdown:"linebreakextension" }}

    【讨论】:

    • @vikingosegundo 不错,现已修复。
    【解决方案4】:

    似乎有一个linebreaks 过滤器将\n 字符转换为&lt;br&gt;&lt;p&gt;
    请参阅linebreakslinebreaksbr

    【讨论】:

      【解决方案5】:

      您可以编写一个调用 markdown 的 custom filter,然后在其输出上执行 replace

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 2015-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        • 1970-01-01
        相关资源
        最近更新 更多