mathjax

2013年8月30日金曜日

reStructuredText からmarkdownへの変換

reStructuredText からmarkdownへの変換

ソースファイル
前回、ノートブックファイルをreStructured text(rst)に変換することによって、画像ファイルが取り出せるという事を書きました。 その際、画像ファイルの対応箇所を見つけるのに、rstファイルをテキストエディタで開く必要がありました。
その続編として、rstがmarkdownに変換できる事が分かりましたので、紹介しておきます。(コメントを追加しましたので、参照下さい。)
ノートブックを他の形式に変換するnbconvertでは内部でpandocというソフトを使っているのですが、これにはパイソン版(正確には薄いラッパーと呼ぶそうです)があります。 これをpipなどを使ってインストールしておきます。 すると以下のように簡単なコマンドでmarkdown(md)に変換できました。
In [1]:
import pypandoc
output = pypandoc.convert('SVG2PNG.rst', 'md')
ただ、残念ながらそのままではノートブックでは読めませんでした。画像ファイルへのリンクの仕方が微妙に違うようです。
詳細は不明なのですが。
参考サイト
ともかくも、"files/"というのを付ければよさそうなので、以下のコマンドを書きました。 正規表現というモジュール(re)を用いて、該当箇所を書き換えます。
今回は、svgファイルだけに関心があるので、そこだけを書き換えますが、pngファイルも同様に可能です。
また、画像ファイルへのリンクの手前に次の画像はこういうファイル名だよ、と注釈を挿入しました。
In [2]:
import re
output2=re.sub(r'(!\[image\]\()(.+\.(svg|SVG)\))',r'</br><FONT color="red">(the next image is \2</br>\n\n\1files/\2</FONT> ',output)
#output2=re.sub(r'(!\[image\]\()(.+\.(png|svg|PNG|SVG)\))',r'**(the next image is \2**\n\n\1files/\2 ',output)
#pngを含める場合は上記のようにする。
出来上がった文字列(output2)をmarkdownセルに書き込めば良いのですが、簡単な方法が見つからなかったので、以下のように一旦ファイルに落としてから、読み出しました。
In [3]:
f = open('tmp.md', 'w') # 書き込みモードで開く
f.write(output2) # 引数の文字列をファイルに書き込む
f.close()
%load tmp.md
(以下、一部抜粋)
In[6]: .. code:: python
x=np.linspace(0,2*np.pi) plt.plot(x,np.sin(x)) plt.figure()
plt.plot(x,np.cos(x))
(the next image is SVG2PNG_files2PNG_8_1.svg)

(the next image is SVG2PNG_files2PNG_8_2.svg)



(以上、抜粋終わり)

まとめ

上のセルはcodeセルとして出力されますので、手動でMarkdownセルに変更しました。 また、長いので、SVGファイルがある周辺だけを抜粋しました。 このようにすれば、画像ファイルとノートブックとの対応は見やすいと思います。

なお、ブログに貼り付けるためにこのノートはnbconvertでhtmlに変換していますが、その際にローカルなSVGとのリンクは切れてしまっているので、代わりにPNGファイルを貼り込んであります。

nbconvertが改良されれば、nbconvertで変換したmarkdownで済む話なのかも知れませんが、参考まで。

1 件のコメント:

  1. Ipython1.1.0がリリースされ、nbconvertによるmarkdownへの変換が改良されていました。rstを経由する(Pypandocに頼る)必要はなくなりました。files/の追加は必要です。

    返信削除