@@ -381,3 +381,135 @@ docutilsの`desc`ノードファミリー(API説明用の汎用ノード)、
381381- ** AND** 生成されたPDFにtypsphinxのすべてのモジュール、クラス、関数のドキュメントが含まれる
382382- ** AND** Issue #55 で報告された1896件の警告が発生しない
383383
384+ ### Requirement: 画像パスの相対パス調整
385+
386+ ネストされたドキュメント内の画像参照は、出力ファイルの位置に基づいて相対パスを調整しなければならない (MUST)。Sphinxはすべての画像URIをソースルート相対パスに正規化するが、Typst出力では各出力ファイルの位置からの相対パスに変換する必要がある。
387+
388+ ** Related Issue** : #69
389+
390+ #### Scenario: ルートドキュメントの画像パス
391+
392+ - ** GIVEN** ルートディレクトリ(` index.rst ` )に画像参照がある
393+ - ** AND** Sphinxが画像URIを` images/logo.png ` として正規化する
394+ - ** WHEN** ` visit_image() ` が呼び出される
395+ - ** THEN** 出力パスは` images/logo.png ` のまま(調整不要)
396+ - ** AND** Typstは` images/logo.png ` を正しく解決する
397+
398+ ``` typst
399+ // File: index.typ
400+ image("images/logo.png", width: 200px)
401+ ```
402+
403+ #### Scenario: ネストされたドキュメントの画像パス
404+
405+ - ** GIVEN** ネストされたドキュメント(` chapter1/section1.rst ` )に画像参照がある
406+ - ** AND** Sphinxが画像URIを` images/logo.png ` として正規化する(ソースルート相対)
407+ - ** WHEN** ` visit_image() ` が呼び出される
408+ - ** AND** ` current_docname ` が` chapter1/section1 ` である
409+ - ** THEN** 画像パスが` ../images/logo.png ` に調整される
410+ - ** AND** Typstは` chapter1/section1.typ ` から` images/logo.png ` を正しく解決する
411+
412+ ``` typst
413+ // File: chapter1/section1.typ
414+ image("../images/logo.png", width: 200px)
415+ ```
416+
417+ #### Scenario: 深くネストされたドキュメントの画像パス
418+
419+ - ** GIVEN** 深くネストされたドキュメント(` part1/chapter1/section1.rst ` )に画像参照がある
420+ - ** AND** Sphinxが画像URIを` images/logo.png ` として正規化する
421+ - ** WHEN** ` visit_image() ` が呼び出される
422+ - ** AND** ` current_docname ` が` part1/chapter1/section1 ` である
423+ - ** THEN** 画像パスが` ../../images/logo.png ` に調整される
424+ - ** AND** Typstは正しい階層を遡って画像を解決する
425+
426+ ``` typst
427+ // File: part1/chapter1/section1.typ
428+ image("../../images/logo.png", width: 200px)
429+ ```
430+
431+ #### Scenario: 同一ディレクトリ内の画像参照
432+
433+ - ** GIVEN** ` chapter1/section1.rst ` から` chapter1/image.jpeg ` を参照する
434+ - ** AND** Sphinxが画像URIを` chapter1/image.jpeg ` として正規化する
435+ - ** WHEN** ` visit_image() ` が呼び出される
436+ - ** AND** ` current_docname ` が` chapter1/section1 ` である
437+ - ** THEN** 画像パスが` image.jpeg ` に調整される(` ../ ` 不要)
438+ - ** AND** Typstは同一ディレクトリ内の画像を正しく解決する
439+
440+ ``` typst
441+ // File: chapter1/section1.typ
442+ image("image.jpeg", width: 150px)
443+ ```
444+
445+ #### Scenario: サブディレクトリ内の画像参照(子フォルダ)
446+
447+ - ** GIVEN** ` chapter1/section1.rst ` から` chapter1/img/diagram.jpeg ` を参照する
448+ - ** AND** Sphinxが画像URIを` chapter1/img/diagram.jpeg ` として正規化する
449+ - ** WHEN** ` visit_image() ` が呼び出される
450+ - ** AND** ` current_docname ` が` chapter1/section1 ` である
451+ - ** THEN** 画像パスが` img/diagram.jpeg ` に調整される(子フォルダへの相対パス)
452+ - ** AND** Typstはサブディレクトリ内の画像を正しく解決する
453+
454+ ``` typst
455+ // File: chapter1/section1.typ
456+ image("img/diagram.jpeg", width: 250px)
457+ ```
458+
459+ #### Scenario: クロスディレクトリの画像参照
460+
461+ - ** GIVEN** ` chapter1/section1.rst ` から` chapter2/images/diagram.png ` を参照する
462+ - ** AND** Sphinxが画像URIを` chapter2/images/diagram.png ` として正規化する
463+ - ** WHEN** ` visit_image() ` が呼び出される
464+ - ** AND** ` current_docname ` が` chapter1/section1 ` である
465+ - ** THEN** 画像パスが` ../chapter2/images/diagram.png ` に調整される
466+ - ** AND** Typstはクロスディレクトリ参照を正しく解決する
467+
468+ ``` typst
469+ // File: chapter1/section1.typ
470+ image("../chapter2/images/diagram.png", width: 300px)
471+ ```
472+
473+ ### Requirement: 相対パス計算メソッドの実装
474+
475+ ` TypstTranslator ` は、画像URIの相対パス計算を行う` _compute_relative_image_path() ` メソッドを提供しなければならない (MUST)。このメソッドは、Issue #5 で実装された` _compute_relative_include_path() ` と同様のロジックを使用する。
476+
477+ ** Related** : Issue #5 , ` _compute_relative_include_path() ` method
478+
479+ #### Scenario: パス計算メソッドの実装
480+
481+ - ** GIVEN** ` _compute_relative_image_path(image_uri, current_docname) ` メソッドが実装されている
482+ - ** WHEN** ` image_uri="images/logo.png" ` , ` current_docname="chapter1/section1" ` で呼び出される
483+ - ** THEN** ` "../images/logo.png" ` を返す
484+
485+ #### Scenario: ルートドキュメントのケース
486+
487+ - ** GIVEN** ` current_docname ` が` None ` または` "index" ` である
488+ - ** WHEN** ` _compute_relative_image_path() ` が呼び出される
489+ - ** THEN** 元の` image_uri ` をそのまま返す(調整不要)
490+
491+ #### Scenario: 同一ディレクトリ内の画像
492+
493+ - ** GIVEN** ` image_uri="chapter1/local-image.png" ` , ` current_docname="chapter1/section1" `
494+ - ** WHEN** ` _compute_relative_image_path() ` が呼び出される
495+ - ** THEN** ` "local-image.png" ` を返す(同一ディレクトリ)
496+
497+ #### Scenario: visit_image()の統合
498+
499+ - ** GIVEN** ` visit_image() ` メソッドが画像ノードを処理する
500+ - ** WHEN** ノードから` uri ` を取得する
501+ - ** THEN** ` _compute_relative_image_path(uri, current_docname) ` を呼び出す
502+ - ** AND** 調整されたパスを` image() ` 関数に出力する
503+ - ** AND** ` current_docname ` は` self.builder.current_docname ` から取得する
504+
505+ ### Requirement: 後方互換性の維持
506+
507+ 既存のルートドキュメントの画像参照は、変更前と同じ動作を維持しなければならない (MUST)。パス調整は、ネストされたドキュメントでのみ適用され、ルートドキュメントでは影響を与えない。
508+
509+ #### Scenario: 既存テストの互換性
510+
511+ - ** GIVEN** 既存の画像関連テストが存在する
512+ - ** WHEN** パス調整機能を実装する
513+ - ** THEN** すべての既存テストが引き続きパスする
514+ - ** AND** ルートドキュメントの画像出力は変更されない
515+
0 commit comments