😸
ipynbでZennの記事を書こう
この記事は、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を使用して記事を反映する際に使用するものと同じになります。
docker-compose -f "docker\docker-compose.yml" up -d --build
docker-compose を使用すれば、USD入りの執筆環境JupyterNotebookが起動して、
で接続することができます。まとめ
通常の記事であれば、VSCodeでMarkdownを使用して書くほうが楽ですが、
スクリプトをごりごり検証しながら記事を書くような場合は、Notebook上で記事を作成できるのは
とてもメリットがあります。
しばらくは色々検証して、より書きやすい環境にアップデートしていければなとおもいます。
公開用のGithubはこちら。
Discussion