在<;p>;<;/p>;中禁止Python标记换行文本;
问题描述
我使用pythonmarkdown作为JJAA2生成HTML的过滤。作为其中的一部分,我填充了来自呈现输入的表项。通过降价过滤传递输入总是将文本放在段落标记中,因此表中的每个条目都放在<p></p>
中,这是我不想要的。
我已经通读了标记文档和第三方扩展列表,但是似乎除了编写我自己的扩展之外,没有其他方法可以抑制这种行为。没有其他方法可以抑制段落标签换行吗?还是我做错了?
更新:这是我目前使用的肮脏、肮脏、可怕的黑客:
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的回答):
感谢您的帮助,但肯定是降价导致了问题。以下是JJJA模板的示例部分:
{%- 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 -%}
解决方案
正好碰上这个问题-来自markdown.markdown()
的不需要的免费开始/结束段落标记。
markdown()
换行为段落的字符串,以下方法很适合我。我没有直接调用markdown()
,而是将调用包装在一个正则表达式中,该正则表达式去掉了有问题的段落标记,并且不会干扰我的标记中嵌入的任何intended hard-wraps。
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")
相关文章