先日のコードだと、他の処理が走る前にプラグインの処理が走ってしまい、 置換してほしくないところまで置換されてしまったのだけど、 以下のように書けば、意図した感じでいけそうですね。 少々、 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 というプラグインを大いに参考にさせてもらいました。 素敵!!