これは何か

この Wiki は Quartz で静的サイト化し、GitHub Pages に公開している(build は quartz.config.ts / quartz.layout.ts、deploy は .github/workflows/deploy-pages.yml)。本ページは、公開サイト上で各ページがどう表示されるか(URL と表示タイトル、Explorer のラベル)の規約をまとめる。source-codeより

URL と表示タイトルを分離する

  • URL は Markdown ファイル名由来の slug。英語 slug のまま変えない(既存リンク・被リンクを壊さないため)。
  • 表示タイトル は frontmatter の title。Quartz の FrontMatter transformer は「title があればそれ、無ければ file.stem(=英語 slug)」を表示名に採用する。
  • この表示名はページ見出し (ArticleTitle) と Explorer 左ペインのページ名の両方が使う(Explorer のツリーノード displayName が data.title 由来)。したがって title を 1 つ足すだけで両方が同時に日本語化され、URL は不変のまま。
  • 運用: 全ページに日本語 1 行 title を付ける。未設定だと英語 slug が見出しに出るので、新規作成・rename 時は必ず付ける。日付つき snapshot はタイトル末尾に日付 (YYYY-MM-DD) を残す。用語は用語ルール(広聴AI / LLM grouping / Jigsaw Sensemaker 等)に従う。source-codeより

Explorer のフォルダ見出しは mapFn で日本語化する

ページ(ファイル)の表示名は title で決まるが、分類フォルダ(concepts / entities / sources / analyses)の見出しはフォルダ slug のまま残る。これは quartz.layout.ts の Explorer mapFn で node.displayName を上書きして日本語化している。

フォルダ slug表示
concepts概念
entities人物・ツール
sourcesソース要約
analyses考察・分析

Explorer の並び順は同ファイルの sortFn(sortByRecency、配下ページの最新更新日で新しい順)。source-codeより

落とし穴: Explorer の mapFn / sortFn は client 側で再評価される

Explorer に渡した mapFn / sortFn は、サーバで .toString() により文字列化され、client 側で new Function によりグローバルスコープで再評価される(quartz/components/scripts/explorer.inline.ts)。このため関数は自己完結でなければならない:

  • inner named 関数を置かない。esbuild の --keep-names が注入する __name(...) 参照が、再評価時に未定義になって壊れる。
  • 外部変数を閉じ込めない(object literal と built-in のみ)。
  • 実装は top-level の const 名前 = (引数) => {...} 形にして Explorer に渡す(sortByRecency / mapFolderLabels が実例)。

検証は実ビルドで行う: pnpm build が通れば直列化は成功、生成 HTML の data-data-fns に(日本語は \uXXXX エスケープで)関数が埋まる。source-codeより

関連ファイル / CI gate

  • quartz.config.ts — locale=ja-JP、フォント、theme、plugin 構成。
  • quartz.layout.ts — Explorer の sortFn / mapFn、各ペインの構成。
  • scripts/check_pages_links.py — 生成物(public/)の内部リンク検査。deploy-pages.yml の CI gate。
  • scripts/build_index_txt.py — frontmatter summary から AI 向けカタログ index.txt を生成(title は使わない。表示用と AI カタログ用は別物)。

二層運用の全体像は wiki-driven-workflow、コントリビュート手順は contributing を参照。source-codeより

Updates

  • 2026-10-14: sortByRecency(Explorer を更新新しい順)の前提を 2 点補足。
    • client 側ソートには contentIndex.tsx で date を残す必要がある。emitter はデフォルトで client 用 index(static/contentIndex.json)から date を削除する(delete content.date、RSS 用途だけ残す設計)。これを外さないと client の FileTrieNode.data.date が undefined になり、全ページが同点=実質アルファベット順に戻る。今回この削除をやめて date を保持した。「更新日」は defaultDateType=modified≒git 最終コミット時刻で、一括コミットは多数ページを同日に揃えるため同点は辞書順にフォールバックする。
    • 「pnpm build が通れば OK」では検証不十分。__name の落とし穴は client 再評価時の ReferenceError で、build(Node 側に __name がある)は通ってしまう。確実な確認は、生成 HTML の data-data-fns から sortFn/mapFn 文字列を取り出し、new Function("return "+s)() でグローバルスコープ再評価して throw しないことを見る(Node でそのまま呼ぶと素通りする)。source-codeより