1つのpythonのソースコードからmarkdownやipynbを作るツールを作りはじめた(文芸的プログラミングっぽい感じ)

github.com

jupyter notebookは便利なのだけれど。便利な点はcellがあることで。 一方で不便な点もあって。不便な点もまたcellがあることという感じ。

端的にいうとjupyterを立ち上げるのが面倒くさいのとcell間のコントロールを行き来するのが面倒くさい。

nbreversible?

まだ作り途中だけれど、reversibleというところに重きを置いている。jupyterにもnbconvertというサブコマンドがありこれによってnotebookのipynbをhtmlにしたりmarkdownにしたりscript(pythonコード)にしたりできるのだけれど。変換が一方向でreversibleじゃない。

とくにpythonコードとipynbの間で行ったり来たりができるようになれば。しばらくはエディタ上に引きこもれるのでは?というような事を思った。

具体的な仕組み

具体的な仕組みはpythonコードを生成してipynbを生成するだけ。

$ python -m nbreversible --format=notebook script.py > script.ipynb

この時のpythonの記述が少し特殊なもの。

  • トップレベルのトリプルクオートの文字列はmarkdown文章として扱う
  • markdown文章が現れた時点でcellが切られる

ついでにもう1つ条件があり、連続してpythonコードが続きつつcell自体を分けたい場合にはnbreversible.codeを利用しwith blockで括る(その範囲がcellになる)。

これが以下のような2つのcellに分かれる(今回はmarkdown出力)。

$ python -m nbreversible --capture --format=markdown script.py > script.md

--capture オプションをつけると標準出力もみてくれるようになる(そう言えば標準エラーは見ていないかも。あとnbconvertに合わせて--executeなどに変えるかもしれない)。

print("this is python code cell")

from nbreversible import code

# this is python code cell
with code():
        print("this is another python code cell")

# this is another python code cell

ちなみにこの記事自体もpythonコードから生成されている。

こういう感じ(gist)