함수와 필터
템플릿이 부를 수 있는 전부, 그리고 그 밖엔 없다는 마지막 줄
sqzass가 제공하는 것
함수 둘. 이게 전부입니다.
asset(path)
정적 파일이 실제로 쓰인 URL을 돌려줍니다. 해시와 서브경로가 포함됩니다.
인자는 static/ 기준 논리 경로이고, 앞의 슬래시는 있어도 없어도 됩니다. 수집되지
않은 이름을 요청하면 수집된 이름 전부를 나열하는 빌드 에러가 납니다. 스타일시트
이름을 바꿨을 때 모든 방문자에게 404를 내는 대신 빌드가 실패합니다.
t(key)
지금 렌더 중인 페이지의 언어로 i18n/<언어>.toml에서 UI 문자열을 찾습니다.
{{ t("skip_to_content") }}
인자는 하나입니다. 언어는 절대 넘기지 않는데, 그게 왜 의도된 것인지는 언어에 적어 두었습니다. 현재 언어에 키가 없으면 빌드 에러입니다.
Warning
루프 변수 이름을 t로 두지 마세요. {% for t in page.translations %}는 그 블록
안에서 함수를 가리고, 거기에 라벨을 처음 넣는 사람이 원인에서 멀리 떨어진 에러를
받게 됩니다.
minijinja가 주는 것
표준 Jinja2 문법이 동작합니다. {% if %}, {% for %}, {% extends %},
{% block %}, {% include %}, {% macro %}, {% from … import … %},
{% set %}, 그리고 익숙한 필터들 — safe, escape, length, join,
default, upper, lower, replace, trim, first, last, reverse,
sort, map, select, selectattr, batch, slice, int, float, abs,
round, indent.
이 사이트의 템플릿이 {% macro %}와
{% from "partials/sidebar.html" import nav %}를 쓰므로, 그 둘은 빌드마다 실제로
돌고 있습니다.
Jinja2 습관으로 손이 가는 필터 셋은 없습니다. tojson, urlencode,
striptags입니다. 셋 다 켜지 않은 minijinja 피처 뒤에 있고, 셋 다 이미 되는
일을 위한 의존성입니다 — {% for %} 루프, 바로 쓸 수 있는 형태로 오는 URL,
직접 썼으니 벗겨 낼 일이 없는 마크업. 불러도 빈 문자열이 아니라 빌드 에러라서
페이지가 아니라 빌드 시점에 알게 됩니다.
그 밖엔 없습니다
url_for도, markdownify도, date도, now()도, env()도, 커스텀 테스트도
없습니다. 그중 일부는 미처 못 만든 구멍이 아니라, 이유가 있어 두지 않은 것입니다.
now()와 env()는 "같은 입력이면 같은 바이트"라는 보장을 깹니다. CI가 push마다
확인하는 그 보장입니다. 시계를 읽을 수 있는 템플릿은 재현 가능할 수 없습니다.
url_for는 이미 한 줄인 비교를 감싸는 것입니다. 페이지와 섹션 URL은 바로 쓸 수
있는 형태로 오고, 서브경로도 이미 붙어 있습니다.
없는 이름을 읽으면 빈 문자열이 아니라 빌드 에러입니다. 다른 생성기의 습관으로 무언가를 불렀다면 구멍 난 페이지가 아니라 빌드 시점에 알게 됩니다.
현재 페이지 표시하기
이걸 위한 헬퍼는 없고, 필요하지도 않습니다. 페이지는 정확히 일치로:
{{ p.title }}
섹션은 page.section으로 조상 일치를:
{{ s.title }}
접두사 검사에는 startingwith를 쓰되 루트를 조심하세요. 모든 URL이 /로
시작하므로, 홈 링크는 반드시 정확히 일치로 비교해야 하고 조상으로 봐서는 안 됩니다.