13

Jinja2がhtmlを生成するためのフィルターとしてPythonマークダウンを使用しています。その一環として、レンダリング入力からテーブルエントリを入力します。マークダウンフィルターを介して入力を渡すと、常にテキストが段落タグでラップされるため、テーブル内のすべてのエントリがでラップされますが<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(アーロンの回答への回答):

ヘルプに感謝しますが、それは間違いなく問題を引き起こしている値下げです。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

マークダウンを使用するときはいつでも、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>"

^ ほら?表にクレイジーな段落タグはありません。

ジンジャが酔っ払っている可能性もあり、これらのタグを追加しています. 個人的にはその動作に気づいていませんが、テンプレート フィルターの有無にかかわらず、この実験を試す価値があるかもしれません。

もう一つ。Markdown は揺るぎないものであり、ある程度のコントロールが失われますが、素晴らしい選択をしたと思います。

編集申し訳ありませんが、何が起こっているのか正確に理解していませんでした。私もこの問題を抱えていました!<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 に答える
0

<p> </p>タグがテーブルを台無しにするという同じ問題がありました。私にとって最も簡単な解決策は、追加してcssでこれを修正することでした

td p {display:inline;}
于 2016-10-19T11:40:30.953 に答える