Sphinxでデータを読み込みたい
sphinxcontrib.datatemplates
Sphinxはinclude
を使って外部ファイルを読み込むことができるけど、ファイルの中身がそのままreST(やMyST)として表示されるだけ。
csv-table
やlist-table
で読み込んでも「テーブル」としてしか表示できない。
このsphinxcontrib.datatemplates
では、.. datatemplate:データ形式::
というディレクティブを新しく定義していて、そのbody部分でJinja2の構文を使ったテンプレートを使うことができる。
そのページだけでデータを読み込みたい、という場合にとても便利。
普通にPythonパッケージを作っている場合、「そのページだけ外部データを読み込みたい」ということはおそらくないかもしれない。。。
No Data Sample
:::{datatemplate:nodata}
- {{ data }}
:::
とりあえずサンプルを試してみる。
外部データがない場合はdatatemplate:nodata
を使うことができる。
読み込んだデータは{{ data }}
を使って表示できる。
このサンプルではNone
となっているので、次の内容のファイルとしてビルドされる。
- None
Sphinxが持っている変数を表示できる。
次のサンプルは、ドキュメントにあるファイル名とそのタイトルを表示できる。
:::{datatemplate:nodata}
Document titles from the Sphinx environment:
{% for doc, title in env.titles.items() %}
- ``{{ title }} ({{ doc }})``
{% endfor %}
:::
{% for ... %}
/ {% endfor %}
の部分がJinja2構文で書かれたfor文。
env.titles
にドキュメント内のタイトル情報が入っている(のだと思う)。
だからdoc, title
でそれぞれタイトルとファイル名を取得できる。
このサンプルは次の内容のファイルとしてビルドされる。
Document titles from the Sphinx environment:
- タイトル (ファイル名)
- タイトル (ファイル名)
- タイトル (ファイル名)
CSVを読み込む
:::{datatemplate:csv} sample.csv
---
template: "csv-sample.tmpl"
headers:
dialect: "excel-tab"
---
CSVを読み込むサンプル。いきなりレベルあがった気がするのでドキュメントをちゃんと読む。
オプション: template
レンダリング時に使うテンプレートはtemplate
で指定されているファイルcsv-sample.tmpl
。
このファイルがどこにあるかというと、conf.py
のtemplate_path
で設定したぱす。デフォルトだと_templates
。
ここに、自分が作成したいページのテンプレートを作成し、datatemplate
に読み込ませることができる。
オプション: headers
これはboolean。
True
にすると、データを読み込んだときdata
が辞書型になるっぽい。デフォルトはFalse
でリスト型。
このパッケージにヘルパー関数に、
make_list_table
make_list_table_from_mapping
の2つがある。
それぞれ指定できるデータがリスト型と辞書型なので、たぶんここと組み合わせてON/OFFにできるようにもなっているのだと思う。
オプション: dialect
ドキュメントには情報がないようなので、ソースコードを覗いてみた。
sphinxcontrib/datatemplates/loaders.pyでdialect
で検索。
csv.reader
or csv.DictReader
に渡しているオプションのよう。
dialect: "auto"
にすることもできるみたい。
その場合、csv.Sniffer
を使っていい感じに形式を推定してくれるみたい。
ということで、Pythonにビルトインのcsvモジュールのドキュメント内を探してみると、Dialectクラスにある値(excel
/ excel-tab
/ unix
)が指定できそう。