😸

ipynbでZennの記事を書こう

2021/05/12に公開

この記事は、Notebookを使用して書いています。

HeaderFormatterの書き方

Markdownで書いてもよいですが、NotebookらしくPythonで記述できるようにしました。

# -*- coding: utf-8 -*-

import glob
import os.path
import os
import codecs

import nbconvert
import nbformat

os.makedirs('articles', exist_ok=True)


for ipynb in glob.glob("./ipynb/*.ipynb"):

    with codecs.open(ipynb, 'r', 'utf-8') as f:
        lines = f.readlines()
    f = nbformat.reads("".join(lines), as_version=4)
    cell = f['cells'].pop(0)
    exec(cell['source'])
    header = ["---",
              f'title: "{title}"',
              f'emoji: "{emoji}"',
              f'type: "{text_type}"',
              "topics: " + "[" + ",".join([f"\"{x}\"" for x in topics]) + "]",
              "published: " + ("true" if published else "false"),
              "---"]

    exporter = nbconvert.TemplateExporter(template_file="template/markdown.tpl")
    (body, resources) = exporter.from_notebook_node(f)

    with codecs.open(f'articles/{os.path.splitext(os.path.basename(ipynb))[0]}.md', 'w', 'utf-8') as f:
        f.write("\n".join(header) + "\n" + body)

ipynbからの変換は、コマンドラインではなくPythonスクリプトを使用します。
1セル目はFormatterであるとして、CellをPopして
その内容をHeaderとして使用します。

あとは、nbconvertのTemplateExporterを使用すれば markdownにすることができます。

print("Hello World!!!")
print("hoge hoge hoge")
>> Result
Hello World!!!
hoge hoge hoge

Pythonの実行結果を表示した例。
Notebookを使用するメリットとして、このようにコマンドをその場で実行し
その実行結果を残せることがあります。

テストしつつ、そのまま記事になるのはとても良さそうです。

記事は、VSCodeで書くこともできますが、JupyterLabで書くこともできます。

JupyterLabで書いている場合の参考例。
こちらも問題なく記事を書くことができます。

JupyterLabの環境は、Dockerコンテナを使用して構築されています。
このコンテナは、GithubActionsを使用して記事を反映する際に使用するものと同じになります。

https://github.com/fereria/zenn_ipynb/tree/master/docker

docker-compose -f "docker\docker-compose.yml" up -d --build

docker-compose を使用すれば、USD入りの執筆環境JupyterNotebookが起動して、
http://localhost:8888
で接続することができます。

まとめ

通常の記事であれば、VSCodeでMarkdownを使用して書くほうが楽ですが、
スクリプトをごりごり検証しながら記事を書くような場合は、Notebook上で記事を作成できるのは
とてもメリットがあります。

しばらくは色々検証して、より書きやすい環境にアップデートしていければなとおもいます。

https://github.com/fereria/zenn_ipynb
公開用のGithubはこちら。

GitHubで編集を提案

Discussion