13

我使用 python markdown作为 Jinja2 的过滤器来生成 html。作为其中的一部分,我从渲染输入中填写表格条目。通过降价过滤器传递输入总是将文本包装在段落标签中,因此表中的每个条目都包装在 中<p></p>,这是我不想要的。

我已经阅读了降价文档和第 3 方扩展列表,但似乎除了编写我自己的扩展之外没有办法抑制这种行为。没有其他方法可以抑制段落标签换行吗?还是我以错误的方式解决这个问题?

更新:这是我现在正在使用的肮脏肮脏可怕的黑客:

def safe_markdown(text):
  p = '<p>'
  np = '</p>'
  md = markdown.markdown(text)
  if md.startswith(p) and md.endswith(np): #you filthy bastard
    md = md[len(p):-len(np)]
  return jinja2.Markup(md)

env = jinja2.Environment(...)
env.filters['markdown'] = safe_markdown 

更新 2(回应亚伦的回答):

感谢您的帮助,但这绝对是导致问题的降价。这是 jinja 模板的示例部分:

        {%- if spc.docs -%}
<td>{{ spc.docs|markdown }}</td></tr>
        {%- else -%}
<td></td></tr>
        {%- endif -%}

如果spc.docs只是'foo'生成的 html 将结束,<td><p>foo</p></td></tr>除非我使用肮脏的黑客。

更新 3

这是一个不那么讨厌的黑客,虽然仍然是一个黑客而不是真正的“答案”,IMO。

def safe_markdown(text):
    md = markdown.markdown(text)
    return jinja2.Markup(md)

def safe_markdown_td(text):
    text = ''.join(['<td>', text, '</td>'])
    return safe_markdown(text)

env = jinja2.Environment(...)
env.filters['markdown'] = safe_markdown
env.filters['markdowntd'] = safe_markdown_td

那么模板就变成了:

        {%- if spc.docs -%}
{{ spc.docs|markdowntd }}</tr>
        {%- else -%}
<td></td></tr>
        {%- endif -%}
4

6 回答 6

2

任何时候你使用 markdown,你都必须在 html 的最终结构上接受一些相当严重的妥协。有许多你根本无法表达的结构。不要把它当成是html的替代品,把它当成另一种语言来简单地写内容。

可能发生的情况是将表格单元格内容包装在段落标签中会弄乱您的布局,在这种情况下,您应该使用 CSS 修复它:

td p {
  margin: 0;
  padding: 0;
}
于 2013-03-21T19:00:00.053 回答
2

只是偶然发现了同样的问题 - 不需要的开始/结束段落标签免费从markdown.markdown().

对于我不想markdown()包装为段落的字符串,以下内容对我很有用。我没有直接调用,而是将调用markdown()包装在一个正则表达式中,该表达式去除了有问题的段落标记,并且不会干扰嵌入在我的降价中的任何预期的硬包装。

from markdown import markdown

# ... other stuff ...

def no_p_markdown(non_p_string) -> str:
    ''' Strip enclosing paragraph marks, <p> ... </p>, 
        which markdown() forces, and which interfere with some jinja2 layout
    '''
    return re.sub("(^<P>|</P>$)", "", markdown(non_p_string), flags=re.IGNORECASE)

# ... other stuff ...

non_p_html = no_p_markdown("my markdown text not intended for a paragraph")
于 2020-09-13T00:10:35.687 回答
1

我同意,那个黑客是肮脏的(但总比没有好)。

根据我的经验,表格内部的怪异,特别<td>是由于标记格式错误。在您的情况下,这可能是相同的问题。

>>> import markdown
>>> markdown.version
'2.1.1'
>>> text = '''
... <table>
... <tr>
...     <td>
...             Here's some fancy text
...
...             and some more
...     </td>
...     <td>Here's other text</td>
... </tr>
... </table>
... 
... This should be in a **paragraph.**
... '''
>>> markdown.markdown(text)
u"<table>
<tr>
    <td>
        Here's some fancy text

        and some more
    </td>
    <td>Here's other text</td>
</tr>
</table>
<p>This should be in a <strong>paragraph.</strong></p>"

^ 看到了吗?表格中没有疯狂的段落标签。

Jinja喝醉的可能性也很小,并添加了这些标签。我个人没有注意到这种行为,但无论是否使用模板过滤器,都值得尝试这个实验。

还有一件事。Markdown 摇滚,虽然你会失去一些控制,但我认为你做出了一个很好的选择。

编辑对不起Elhefe,我不完全理解发生了什么。我也遇到过这个问题!<div>我的解决方案:如果我不想要段落,就把那个垃圾包起来。

>>> markdown.markdown(text)
u'<p>Here be some <em>foo</em></p>'
>>> text = '<div>Here be some *foo*</div>'
>>> markdown.markdown(text)
u'<div>Here be some *foo*</div>'

但这并不能解决您的问题。我唯一能想到的就是在<td></td>标记之前将文本包装起来。

于 2013-04-16T23:44:01.787 回答
1

...另一种去除烦人的外部标签的方法是编写一个简单的剥离函数:

def strip(s):
    """ strips outer html tags """

    start = s.find('>')+1
    end = len(s)-s[::-1].find('<')-1

    return s[start:end]
于 2016-10-24T15:25:32.227 回答
0

<p> </p>标签弄乱了我的桌子,我也遇到了同样的问题。对我来说最简单的解决方案是通过添加

td p {display:inline;}
于 2016-10-19T11:40:30.953 回答
0

当我使用 Markdown 将 HTML 标记添加到配置文件中的某些用户定义的字符串时,我遇到了同样的问题,这样他们就不必学习 HTML(这就是 Markdown 的用途,对吗?)。这些字符串被嵌入到其他可能已经是

元素。所以我不想在中间再有一个。两件事情:

  1. Markdown 的 convert() 不加

    如果提供的文本已经被任何块级标签包裹(在此处列出:https ://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements ),则为提供的文本添加标签。

  2. 如果这对您不起作用,那么我扩展了 Markdown 以覆盖 convert() 方法以剥离

    标签。

    从降价进口降价
    EMarkdown 类(降价):
    def 转换(自我,文本):
        t = super().convert(文本)
        t = t.removeprefix("<p>").removesuffix("</p>")
        返回

将此扩展到所有块级标签作为练习留给读者。;-)

于 2022-01-31T03:32:25.097 回答