在<;中抑制python标记换行文本;p></p>;

在<;中抑制python标记换行文本;p></p>;,python,markdown,jinja2,templating,Python,Markdown,Jinja2,Templating,我使用python作为Jinja2生成html的过滤器。作为其中的一部分,我从渲染输入中填写表格条目。通过标记过滤器传递输入总是将文本包装在段落标记中,因此表中的每个条目都包装在中,这是我不希望看到的 我已经阅读了降价文档和第三方扩展列表,但是除了编写自己的扩展之外,似乎没有其他方法可以抑制这种行为。是否没有其他方法抑制段落标记换行?还是我走错了方向 更新:以下是我目前正在使用的肮脏可怕的黑客: def safe_markdown(text): p = '<p>' np =

我使用python作为Jinja2生成html的过滤器。作为其中的一部分,我从渲染输入中填写表格条目。通过标记过滤器传递输入总是将文本包装在段落标记中,因此表中的每个条目都包装在

中,这是我不希望看到的

我已经阅读了降价文档和第三方扩展列表,但是除了编写自己的扩展之外,似乎没有其他方法可以抑制这种行为。是否没有其他方法抑制段落标记换行?还是我走错了方向

更新:以下是我目前正在使用的肮脏可怕的黑客:

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 
然后,模板变为:

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

无论何时使用降价,都必须在html的最终结构上接受一些相当严重的折衷。有许多结构是你无法表达的。不要把它看作是html的替代品,而应该把它看作是另一种简单编写内容的语言

可能发生的情况是,将表格单元格内容包装在段落标记中会弄乱布局,在这种情况下,您应该使用CSS来解决这一问题:

td p {
  margin: 0;
  padding: 0;
}

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

根据我的经验,表内部的奇怪,特别是
,是由于错误的标记造成的。在您的案例中,这可能是相同的问题

>>> 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>"
导入降价 >>>markdown.version '2.1.1' >>>文本=''' ... ... ... ... 这里有一些有趣的文字 ... ... 还有更多 ... ... 这里是其他文本 ... ... ... ... 这应该在**段中** ... ''' >>>标记。标记(文本) u“ 这里有一些有趣的文字 还有更多 这里是其他文本 这应该在段落中。

” ^看到了吗?表中没有疯狂的段落标记

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

还有一件事。降价岩石,虽然你会失去一些控制,但我认为你做了一个很好的选择

编辑对不起,Elhefe,我没有完全理解发生了什么。我也有这个问题!我的解决方案是:如果我不想要段落,就用
包装那些垃圾

>>> 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>'
>>标记。标记(文本)
这里有一些食物
>>>text='这里有一些*foo*'
>>>标记。标记(文本)
这里有一些“foo”

但这并不能解决你的问题。我能想到的唯一一件事是在标记之前将文本包装在

我也遇到了同样的问题,标签把我的表格弄乱了。对我来说,最简单的解决方案是在css中添加

td p {display:inline;}

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

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

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

    return s[start:end]
def带:
“”“剥离外部html标记”“”
start=s.find('>')+1

end=len(s)-s[::-1]。查找(“在同一问题上遇到了麻烦-从
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")
从标记导入标记
#…其他东西。。。
def no_p_标记(非_p_字符串)->str:
“包含段落标记的条形图,…

, 哪些markdown()强制,哪些干扰了一些jinja2布局 ''' 返回re.sub((^

|

$),“”,标记(非字符串),flags=re.IGNORECASE) #…其他东西。。。 non_p_html=no_p_markdown(“我的标记文本不用于段落”)
WAT?这真的很奇怪。我试了两秒钟--没关系,我不明白发生了什么!对OQ发表评论。重新编辑:然后你将模型和视图混合在一起,愿上帝怜悯你的异教徒灵魂。我会为你祈祷。事实上,nm-有一种方法可以在不干扰模型的情况下工作。参见OQ。嘿,我更新了我的答案。这也是一个肮脏的黑客行为,但可能不是一个肮脏的黑客行为。不过,这比一个
startswith
endswith
呼叫感觉更好。
def strip(s):
    """ strips outer html tags """

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

    return s[start:end]
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")