Skip to content

Resolve images against the repository content root - #10

Merged
halkn merged 2 commits into
mainfrom
feat/image-content-root
Aug 12, 2026
Merged

halkn merged 2 commits into
mainfrom
feat/image-content-root

Conversation

@halkn

@halkn halkn commented Aug 12, 2026

Copy link
Copy Markdown
Owner

変更理由

画像解決の信頼境界が Markdown ファイルの親ディレクトリだったため、Azure DevOps Wiki の標準構成で画像が描画できなかった。

wiki/
├── .attachments/architecture.png
└── design/platform.md

design/platform.md から ../.attachments/architecture.png を参照すると境界外になり、placeholder に落ちていた。Azure DevOps は相対パスに加えてルート起点の絶対パスもサポートしている。

変更内容

  • 信頼境界を content root(文書から遡って最初に .git を持つ祖先。ディレクトリでもファイルでもよいので worktree / submodule も可)へ広げた。git 管理外なら従来どおり文書の親が境界。
  • 先頭 / はフレーバーに関係なく content root 起点として解決する。ファイルシステムの絶対パスとしては扱わない。
  • 境界の外は従来どおり拒否する。canonicalize + starts_with(boundary) なので、root を越える ../ も root 外を指す symlink も同じ経路で弾かれる。
  • .attachments をマーカーに使わない理由: 1 リポジトリに複数あり得て、最も近いものがページの参照先とは限らない。
  • 副次的な修正: mdvu a.md のようにパスにディレクトリ成分が無いとき base_dir が空文字になり canonicalize に失敗して画像が一切解決されなかった不具合を直した(空文字 → .)。
  • --root などのフラグは追加していない。Azure の =500x250 サイズ指定は今回のスコープ外。

影響範囲

  • src/image/mod.rs — content_root() を追加、confined() に境界の概念を導入
  • src/layout/inline.rs — InlineContext.content_root
  • src/layout/document.rs / src/main.rs — 受け渡し。root の検出は起動時 1 回(パスにしか依存しないので --watch の reload でも変わらない)
  • README.md の Images 節・制限事項、.claude/rules/rendering.md
  • 実ファイルシステムの絶対パス(/Users/...)はこれまで「境界内なら通る」だったが、今後は content root 起点として再解釈されるため事実上通らなくなる

確認手順

  • cargo test --test render --test cli → 53 + 24 passed
  • cargo test --bin mdvu image:: → 40 passed(content root の unit test を追加)
  • cargo clippy --all-targets --all-features -- -D warnings / cargo fmt --check → clean
  • cargo test --all-features は pager::watch の 2 件が sandbox の FSEvents 制約で落ちる(.claude/rules/runtime.md に記録済みの既知事象。CI で検証)
  • e2e: tests/cli.rs の a_page_reads_attachments_from_the_repository_root で、一時 Wiki の相対 / ルート相対の 2 枚が kitty placement になり、root 外の 1 枚が placeholder のままであることを検証
  • 手動: .git を持つ一時 Wiki を作って mdvu design/platform.md を実行し、2 枚描画・root 外は placeholder を確認済み

@halkn
halkn merged commit 6a618f8 into main Aug 12, 2026
4 checks passed
@halkn
halkn deleted the feat/image-content-root branch October 1, 2026 01:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant