在<p></p>中禁止Python标记换行文本;

2022-02-27 00:00:00 python jinja2 markdown templating

问题描述

我使用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")

相关文章