1

私は次のことを行うためにpythonマークダウンを使用しています:

という形の表現があるときは、 のよう[test]にレンダリングしたい

<span>[<a>test</a>]</span>

そのために、markdown の inlinePatterns に拡張機能を適用しています。

PATTERN = r'\[(test)\]'

class PerceptionPattern(Pattern):
    def handleMatch(self, m):
        span = etree.Element('span')
        anchor = etree.SubElement(span, "a")
        span.text = markdown.util.AtomicString("[")
        span.tail = markdown.util.AtomicString("]")

        anchor.text = m.group(2)
        return span

class TestExtension(markdown.extensions.Extension):
    """Adds cite extension to Markdown class"""

    def extendMarkdown(self, md, md_globals):
        """Modifies inline patterns"""
        md.inlinePatterns.add('test', PerceptionPattern(PATTERN), '<not_strong')

しかし、これは戻ってきています

<span>[]<a>test</a></span>

正しい属性かどうか.tailはわかりませんが、正しい構文が見つかりません。

これどうやってするの?


フルプログラム

from markdown.inlinepatterns import Pattern
from markdown.util import etree
from markdown import Markdown
import markdown

PATTERN = r'\[(test)\]'


class TestPattern(Pattern):
    def handleMatch(self, m):
        span = etree.Element('span')
        anchor = etree.SubElement(span, "a")
        span.text = markdown.util.AtomicString("[")
        span.tail = markdown.util.AtomicString("]")
        #anchor.tail = markdown.util.AtomicString("]")

        anchor.text = m.group(2)
        return span


class TestExtension(markdown.extensions.Extension):
    def extendMarkdown(self, md, md_globals):
        """Modifies inline patterns"""
        md.inlinePatterns.add('test_pattern', TestPattern(PATTERN), '<not_strong')

md = Markdown(extensions=[TestExtension()])

print md.convert(u'[test]')
4

1 に答える 1

0

ほとんどの実装(変更/拡張しようとしているpythonを含む)の文書化されていない機能としてすでに使用されているため、構文を実装する[test]ことは最良の選択ではないように思えます。

さらに、達成しようとしている出力は、ストレートなマークダウンですでに可能です (それ以外の場合は役に立たないスパンを差し引いたもの)。するだけです:\[[test]()\]。つまり、リテラル ブラケットをエスケープし、それらの間にマークダウン リンクを挿入します (それが必要な場合は空白の URL を使用します)。Babelmarkの出力を参照してください。

もちろん、あなたの例は、より大きなシステムの一部であり、専門家ではないマークダウンの作成者が使用できる単純な構文を必要とする、もう少し複雑なものの単純化された実装にすぎない可能性があることは理解しています。したがって、あなたが尋ねた実際の質問に答えるには:

スパンは、括弧をテキストとして挿入できるようにするためのものだと思います(ちなみに賢いです)。ただし、閉じ括弧はスパンではなく、アンカーの末尾になります。終了アンカー タグの後に来る必要がありますが、終了スパン タグの後ではありません。

>>> from markdown.util import etree
>>> span = etree.Element('span')
>>> anchor = etree.SubElement(span, 'a')
>>> span.text = '['
>>> anchor.tail = ']'
>>> anchor.text = 'test'
>>> etree.tostring(span)
'<span>[<a>test</a>]</span>'

あなたのコードはこれを出力するはずです: <span>[<a>test</a></span>]. 閉じ括弧は、ここではアンカーの尾ではなく、スパンの尾であることに注意してください。

もちろん、上記のどちらも出力として取得していないようです。マークダウンがどういうわけか物事を台無しにしているようです。ブラケットAtomicString()を他の構文と間違えないようにするためには、ブラケットを囲むのが正しい方法です。、しかし、スパンの末尾があなたの例のテキストにどのように追加されているのかわかりません。

以前に inlinePattern を挿入しようとしましたか? おそらく、ブラケット関連のパターンの前に?「参照」パターン ( '<reference') の前に言います。それが役立つかどうかを確認してください。

編集: inlinePattern が複雑な要素を返すときに奇妙なことを行う Python-Markdown に最近発見されたバグがあることが判明しました。具体的には、特に尾が関係する場合に、子を持つ要素です。詳細については、関連するバグ レポートのこのコメントを参照してください。その問題が解決されると、コードは要素の末尾に閉じ括弧を入れた 1 つの微調整で機能します (上記で説明したように)。そのバグが修正されるまで、残念ながらこれは機能しません。当分の間、拡張機能を必要としない (括弧をエスケープする) ソリューションに頼る必要があります。

于 2013-11-14T03:43:02.307 に答える