我正在使用Python Markdown 作为Jinja2的过滤器来生成HTML。在此过程中,我从渲染输入中填充表格条目。通过Markdown过滤器传递输入始终将文本包装在段落标记中,因此表格中的每个条目都被包装在<p></p>
中,而我不想要这样。
我已经阅读了Markdown文档和第三方扩展列表,但似乎除了编写自己的扩展程序之外,没有其他方法可以抑制这种行为。是否有其他方法可以抑制段落标签包装?或者我走错了路?
更新:这是我现在使用的肮脏可怕的恶心代码:
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(回复Aaron的答案):
感谢您的帮助,但问题肯定是由于Markdown引起的。以下是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>
,除非我使用肮脏的hack。更新3
这里有一个不那么恶心的hack,虽然仍然是一个hack,并不算真正的“答案”,在我看来。
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 -%}
startswith
和endswith
调用要好。 - Aaron Meier