コード例における<wa-include>の展開による可読性向上

shoelace-style/webawesome

WebAwesomeのコード例表示機能が拡張され、<wa-include>タグが参照先のソースコードに再帰的に展開されるようになりました。これにより、コンポーネント化されたマルチページアプリケーションの実装をコード例から直接理解できるようになります。

背景

マルチページパターンのアプリケーションでは、<wa-include>を使ってインターフェース要素をコンポーネント化し、コードの重複を避けています。しかし、コード例に<wa-include>タグが表示されると、実際のソースコードを把握するのが困難になっていました。#1958data-select-src属性によるソース選択機能が追加されましたが、<wa-include>自体は展開されないままでした。

本PRは、この制約を解消するために<wa-include>を参照先コードに置き換える処理を実装しています。

技術的な変更

packages/webawesome/docs/_transformers/code-examples.jsgetFrameSource関数が追加され、<wa-zoomable-frame>のソースコード取得処理が大幅に拡張されました。

変更前:

// getFrameSource関数は存在せず、
// srcdocまたはsrc属性の値をそのまま使用

変更後:

const getFrameSource = frame => {
  const selectSrc = frame?.hasAttribute('data-select-src');
  if (!selectSrc) return;
  let src = frame.getAttribute('src');
  let source = frame.getAttribute('srcdoc');
  if (!source && src) {
    // srcからファイルパスを正規化してソースを読み込み
    src += src.match(/\.html/) ? '' : `${src.endsWith('/') ? '' : '/'}index.html`;
    src = src.split('?')[0].split('#')[0];
    source = readFileSync(path.join(baseDir, src), 'utf8');
  }
  const selectors = frame?.getAttribute('data-select-src');
  if (selectors) {
    const sourceNode = parse(source, { comment: true, voidTag: { closingSlash: true } });
    sourceNode.querySelectorAll('wa-include').forEach(e => replaceIncludeWithSource(e));
    // CSSセレクタに一致する要素を抽出し、フォーマットを正規化
    // ...
  }
  return source.trim();
};

関数は以下の処理を順次実行します:

  1. ソースの取得: srcdoc属性が指定されている場合はその値を、src属性の場合はファイルシステムから読み込む
  2. wa-includeの展開: sourceNode.querySelectorAll('wa-include').forEach(e => replaceIncludeWithSource(e))により、すべての<wa-include>を参照先のソースコードに再帰的に置き換える
  3. セレクタによる抽出: data-select-src属性の値をCSSセレクタとして使用し、該当する要素のみを抽出
  4. フォーマットの正規化: インデントの調整、空行の整理、末尾空白の削除を実行

これにより、payment applicationのような複雑なマルチページアプリケーションのコード例でも、<wa-include>が実際のコードに展開されて表示されます。

設計判断

再帰的な展開処理が採用されました。querySelectorAll('wa-include')で抽出したすべての<wa-include>要素に対してreplaceIncludeWithSourceを適用することで、ネストされた<wa-include>も含めて完全に展開されます。

フォーマットの正規化では、parse()の出力における属性の不適切な改行を修正し、トップレベルまでインデントを削減し、複数の空行を単一の空行に折りたたむ処理が実装されています。これらの処理により、元のソースファイルとは異なるパース結果であっても、読みやすい形式で表示されます。

#1958で追加されたdata-select-src属性との統合により、展開後のコードから特定の要素のみを選択的に表示できる設計になっています。

まとめ

本PRは、コード例表示機能に再帰的な<wa-include>展開処理を追加した変更です。getFrameSource関数内で<wa-include>を参照先コードに置き換えることで、コンポーネント化されたアプリケーションの実装を、コード例から直接理解できるようになりました。既存のdata-select-src属性との組み合わせにより、展開後のコードから必要な部分のみを抽出して表示できます。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「総論→各論→結論」の構成が明確です。リード文、背景、技術詳細、設計判断、まとめの各要素がすべて含まれており、ガイドラインに準拠しています。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```javascript:path/to/file.js)とGitHubのPRリンク記法([#1958](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

コードトランスフォーマーやDOM操作に関する専門的な内容を、過度な単純化をせずエンジニア向けに記述しており、対象読者に適合しています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが要点から始まり、詳細を説明する構成になっています。また、各パラグラフもトピックセンテンスで始まり、1段落1トピックの原則が守られており、非常に読みやすいです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

Diffで新規追加された`getFrameSource`関数のコードを正確に引用しています。「変更前」の表現は、関数が存在しなかったことを示すための適切な記述です。ファイル名も一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`<wa-include>`, `data-select-src`, `srcdoc`, `querySelectorAll`など、PRや関連技術で使われる用語を正確かつ適切な文脈で使用しています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

`<wa-include>`の再帰的な展開処理や、`getFrameSource`関数の処理フローに関する説明は、Diffのコード内容と完全に一致しており、技術的に正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(再帰的展開、[#1958]との関連性、payment applicationの例など)は、PRのタイトルや説明文で裏付けられており、ハルシネーションは検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2077、#1958)やその他の固有名詞はすべて正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「コード例における<wa-include>の展開による可読性向上」は、PRの主題「Replace <wa-include> in code examples with referenced source code」を的確に要約し、その目的を明確に伝えています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に記載のないバージョン情報やリリース予定などの外部知識は含まれておらず、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

過去のPR([#1958])について「追加されました」と過去形で記述するなど、時間に関する表現は正確です。