Python | サイト構造に基づいたテンプレートマッピングファイルを自動生成するスクリプト

大規模なWebサイトの構築や保守において、**テンプレートファイルと仮想URLとの対応関係を明示する一覧ファイル(マッピングファイル)**を用意するケースは少なくありません。

特に階層構造を持つ多数のテンプレートファイルを扱う場合、この一覧を手作業でメンテナンスするのは困難です。

この記事では、そうした課題を解決するために作成した Python製のテンプレートマッピング自動生成スクリプト を紹介します。


✅ このスクリプトでできること

例えば、以下のような構造を持つサイトを対象に:

/siteA/
  ├── templates/secure_area/
  └── settings/template_map.php(← 出力ファイル)

templates/secure_area/ 以下にある .php ファイルを走査して、以下のようなルールで template_map.php を自動生成します:

  • パスは 'secure_area/xxx.php' の形式で一覧化
  • 各テンプレートに記述された パンくずナビゲーションの文言を解析し、コメントとして付加
  • パンくずがないファイルにも // の空コメントを明示的に追加
  • コメントの位置はインデントで揃えて読みやすく整形
  • 深い階層にあるファイルほど上位に表示し、同階層内はA-Z順

📁 想定ディレクトリ構成(ダミー)

/project-root/
  ├── siteA/
  │    ├── templates/secure_area/
  │    └── settings/template_map.php
  ├── siteB/
  │    └── ...
  └── siteC/

🧾 出力されるPHPファイルの例

<?php
// テンプレートファイルと画面構造のマッピング(パンくず付き)
return [
    'secure_area/user/index.php',               // ユーザー情報
    'secure_area/user/password_change.php',     // ユーザー情報 > パスワード変更
    'secure_area/user/notification_settings.php', // ユーザー情報 > 通知設定
    'secure_area/data/download.php',            // 
];
  • パンくずが存在する場合 → // に続けて 区切りで表記
  • パンくずがない場合でも // を表示
  • コメントは右揃えで整列

🧠 処理の特徴

  • BeautifulSoup を用いて .php ファイル内の HTML を解析
  • <div class="c-breadcrumb"> の内容からパンくず要素(<li>)を抽出
  • 最上位(トップリンク)は無視し、それ以降を で連結
  • パンくずがないテンプレートも検出し、明示的な空コメントを出力
  • 出力は カンマを含めた整列済みのPHP配列形式

🔧 実行環境

  • Python 3.x
  • beautifulsoup4 ライブラリ

インストール:

pip install beautifulsoup4

▶ 実行方法

python3 generate_template_map.py

各サイトごとに settings/template_map.php が出力されます。


🔢 ソートルール

  1. 階層が深い順(例:secure_area/user/settings/index.php の方が上に)
  2. 同階層内は アルファベット順

これにより、細かい画面やサブページが上位にくるため、構造の見通しがしやすくなります。


💡 応用アイデア

  • コメント部分だけを別形式で出力(JSONやCSVなど)
  • パンくずが取得できなかったテンプレートのみ抽出してレビュー対象に
  • 特定のセクション(例:download/, admin/)だけを別マップとして出力

✅ まとめ

このスクリプトは、テンプレート構成の視覚化と保守性を向上させるために非常に有効です。
特に以下のようなニーズがある場合には導入をおすすめします:

  • 多層構造のテンプレートを扱っている
  • パンくず設計とテンプレート構成の整合性を保ちたい
  • ページ構成表やURL設計の自動生成のベースにしたい

手作業では煩雑になるテンプレート管理を自動化・体系化する第一歩として、ぜひ活用してみてください。

コメント

タイトルとURLをコピーしました