やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Zolaでマクロを作りインポートする

 ちょっと面倒くさい。こまかいところが残念。

成果物

情報源

コード抜粋

マクロ定義

templates/macro/header.html

{% macro menu(items) %}
<header><nav><ul>
{% for item in items %}
<li><a href="/{{item}}">{{item}}</a></li>
{% endfor %}
</ul></nav></header>
{% endmacro menu %}

templates/macro/footer.html

{% macro footer() %}
<footer>© 2021 {{ config.extra.author }}</footer>
{% endmacro footer %}

マクロのインポート

templates/index.html templates/page.html

{% import "macro/header.html" as header %}
{% import "macro/footer.html" as footer %}
...

マクロの呼出

templates/index.html templates/page.html

...
{{ header::menu(items=["archive","author","about","blog"]) }}
...
{{ footer::footer() }}
...

フォーマット

マクロの定義

{% macro マクロ名(引数名=デフォルト値, 引数名=デフォルト値) %}
{# 実装内容 #}
{% endmacro マクロ名 %}
  • 引数はなくてもいい
  • デフォルト値はリテラル値のみ

マクロのインポート

{% import "templates/からの相対パス" as 任意名 %}
  • ファイルの先頭に書かねばならない
  • as句は必須。省略できない
  • asの名前は1ファイルごとに別名が必要

マクロの呼出

{{ 任意名::マクロ名(引数名=値) }}

ダメな点

  • macro
    • 可変引数*args,**kwargsで書けない
  • import
    • ファイルの先頭で呼ばねばならない
    • as句が必須である
      • as句の名前はファイルごとに異なるものにせねばならない

as句を省略できない

{% import "macro/footer.html" as macro %}

 なんでや! ワイは以下のように書きたかったんや!

{% import "macro/footer.html" %}
{{ footer() }}

おなじ名前のas名にできない

{% import "macro/header.html" as macro %}
{% import "macro/footer.html" as macro %}
{{ macro::menu(items=["archive","author","about","blog"]) }}
{{ macro::footer() }}

 headerもfooterもmacroにまとめたかった。なのに、これができなかった。なんでや! いちいちファイル単位で別名をつけねばならないって苦痛すぎぃ!

1行で使えない

 必ずインポートと呼出の2行いる。

{% import "macro/header.html" as header %}
{{ header::menu(items=["archive","author","about","blog"]) }}

 ウザい。長い。くさい。キモイ。

 ワイはもっと短く書きたかったんや!

{{ macro.header.menu(site.section_names) }}

インポートはファイルの先頭のみ

 インポートは必ずファイルの先頭で行わねばエラーになる。

{% import "macro/header.html" as header %}
...

 C言語かよ。ダッサ。おっくれってる〜♪

所感

 マクロは地雷。いちいち罠が多すぎる。

 でも、このマクロを使いこなすのがテンプレートエンジンの真髄だとも思うわけで。つまりはこのクソ体系を強いられているんだ!

対象環境

$ uname -a
Linux raspberrypi 5.4.83-v7l+ #1379 SMP Mon Dec 14 13:11:54 GMT 2020 armv7l GNU/Linux