2012年9月12日水曜日

emacsからBloggerに記事を投稿する方法。

outfile

普段、emacsの中で生活しているのでBloggerへの記事の投稿もemacsから行いたい(それほど、 投稿は多くないのだけど。。。)

emacsからBloggerへの投稿には、Ideas and Bulbs - Andrei Matveyeuで紹介されているemacsのorg-modeと pythonスクリプトbloggerpost.pyを利用した方法を試す。org-modeはかなり有名なパッケージなので、説明は省略。

bloggerpost.pyは、Beautiful Sourp library(python HTML/XML parser)、googlecl(Googleサービスを 利用するためのコマンド・ライン・ツール)に依存しているため、これらのライブラリをインストール する。

Ubuntuならばこれらのツールのパッケージが用意されているため、以下のコマンドでインストール。

sudo apt-get install python-beautifulsoup googlecl

続いて、bloggerpost.pyをダウンロードし適当な場所(例えば、~/bin)に配置する。

スクリプトbloggerpost.pyを開き、以下のオプションを自身の環境に合せて編集する。

username="my_google_user_name" #Googleのユーザ名。
orgelc="path_to_org_el" # ファイルorg.elへのパス。例えば、/usr/share/emacs/23.3/lisp/org/org.elc

emacsをバッチ・モードで実行し投稿するためのHTMLを生成している以下のラインで、org-mode 7.9.1ではHTMLの 生成に失敗するため以下のように修正する。

# 修正前
os.system("""emacs --batch --load="""+orgelc+""" --visit """+outfile+""" --funcall org-export-as-html-batch """)
# 修正後。 path_to_org_mode_dir_lispはorg-modeパッケージのlispディレクトリ。例えば、 ~/.emacs.d/elisp/org-7.9.1/lisp/
os.system("""emacs --batch --directory=path_to_org_mode_dir_lisp --load="""+orgelc+""" --visit """+outfile+""" --funcall org-export-as-html-batch""")

スクリプトbloggerpost.pyでは、Asciiでエンコードできない文字列を含む記事を投稿しようとすると、googleclの呼び出しで エンコード・エラーになる。このエラーを回避するためにgoogleclの呼び出しと呼び出し用のコマンドcommand生成処理を修正する。

if tags<>"":
    # 修正前
    command=unicode(googlecl+u' blogger post --draft -u '+username+' --blog '+blogname+' --tags "'+tags+u'" --title "'+title+u'" '+postHTML)
    # 修正後
    command=unicode(googlecl+' blogger post --config /home/taka/.googlecl/config --draft -u '+username+' --tags "'+tags+'" --title "'+title+'" '+postHTML)
else:
    # 修正前
    command=unicode(googlecl+u' blogger post --draft -u '+username+' --blog '+blogname+' --title "'+title+u'" '+postHTML)
    # 修正後
    command=unicode(googlecl+' blogger post --config /home/taka/.googlecl/config --draft -u '+username+' --title "'+title+'" '+postHTML)

# 関係のないコードを省略。

# 修正前
os.system(command)
# 修正後
os.system(command.encode('utf-8'))

上記設定で、org-modeからBloggerに記事を投稿できるようになる。org-modeのファイルを開き、投稿したいツリーを リージョンとして選択する。ツリーが閉じられている場合は、ツリーのタイトルをリージョンとして選択。ツリーが 開いている場合は、ツリー全体を選択。選択している状態で、M-x shell-command-on-regionで、リージョンに対して bloggerpost.pyを実行する。