katsuの駄日記

続・Pelicanのプラグインを書いてみる

先日のコードだと、他の処理が走る前にプラグインの処理が走ってしまい、 置換してほしくないところまで置換されてしまったのだけど、 以下のように書けば、意図した感じでいけそうですね。 少々、 preタグとcodeタグの扱いが泥臭いというか酷いですが……。 なんか良い手があればよいのだけど。

from pelican import signals

import re

regexs = [re.compile(x, re.I | re.S) for x in [r'(<pre>.*?</pre>)', r'(<code>.*?</code>)']]

def data_splitter(reg, s_list):

    ret = []

    for s in s_list:
        ret += reg.split(s)

    return ret

def parser_for_amazonaffi(article_generator):

    for a in article_generator.articles:

        settings = article_generator.settings
        c_list = [a._content]

        for r in regexs:
            c_list = data_splitter(r, c_list)

        for i, c in enumerate(c_list):
            for r in regexs:
                if r.search(c):
                    break
                else:
                    c_list[i] = re.sub(r'\[amazonaffi:(.+)\|(.+?)\]',
                                       r'<a href="http://www.amazon.co.jp/dp/\1/?tag=%s">\2</a>' % (settings.get("AMAZON_AFFILIATE_ID")),
                                       c)
        # [amazonaffi:affiliate-id|link-name]
        a._content = "".join(c_list)

def register():
    signals.article_generator_finalized.connect(parser_for_amazonaffi)

これで、エントリのpreタグとcodeタグに囲まれたとこ以外に [amazonaffi:] って記法で書いたのがamazonのリンクへと置換されます。 こんな感じ→ サンワサプライ USBヘッドセット

Simple Footnotes というプラグインを大いに参考にさせてもらいました。 素敵!!