pybtexでbibtexをHTMLに変換(作成編)

今度こそpybtexを使ってみる。

pybtexのインストール

easy_installがつかえる:

easy_install pybtex
参考HP: Pybtex! (公式) 開発版が利用可能 pybtex 0.16 : Python Package Index

bibtexソースの読み込み

pybtexからbibtexパーザを読み込みbibtexファイルを読みこむ

from pybtex.database.input import bibtex
parser = bibtex.Parser()
bib_data = parser.parse_file("some.bib")
bib_dataにパースした内容が含まれる。 bib_dataはentriesというbibtex keyをkeyとした辞書をメンバーにもつ。
entries = []
for key in bib_data.entries:
    persons = bib_data.entries[key].persons[u'author']
    authors = [unicode(au) for au in persons]

    entry = { u"key" : key, u"author" : ",".join(authors)}

    fields = bib_data.entries[key].fields
    if u'title' in fields:
        entry.update({ u"title" : fields[u'title'], })
    if u'journal' in fields:
        entry.update({ u"journal" : fields[u'journal'], })
    if u'year' in fields:
        entry.update({ u"year" : fields[u'year'], })
    entries.append(entry)
辞書の各要素はさらにfield、personsなるメンバーをもつ。 タイトル、ジャーナル等の情報はfieldに含まれており、 著者の情報はpersons[u'author']に含まれる。 後者は独自のclassになっているが、unicode関数を用いて変換できるようである。 この辺の詳細はipythonを使って、逐次取得した変数を調べることで解析した。 __str__()をちゃんと実装していてくれて助かった。

HTML生成

CGIでよく用いられるtemplateエンジンjinja2を用いて上記entriesをHTMLに変換する。 ここは今回の主題でないので軽く述べる。

<!DOCTYPE html>
<html>
    <body>
        {% for entry in entries %}
        <div>
            <h4><a href='./pdf/{{entry["key"]}}.pdf'>{{entry["title"]}}</a></h4>
            <ul>
                <li>Author : {{entry["author"]}}</li>
                <li>Journal: {{entry["journal"]}}</li>
                <li>Published Year: {{entry["year"]}}</li>
            </ul>
        </div>
        {% endfor %}
    </body>
</html>
 
jinja2テンプレート内でpythonのfor文が使える。

from jinja2 import Template
template = Template(open(template_file).read())
html = template.render({u'entries':entries})
print html.encode("utf-8")
以上でリンクを含んだHTMLが生成される。