Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 12754] ファイルの概要

このコミットは、Go言語のドキュメント生成ツール godoc が使用するHTMLテンプレートとCSSファイルにおける、HTMLのID属性の重複問題を修正するものです。具体的には、フッター部分の div 要素に割り当てられていた id="copyright"id="footer" に変更することで、HTMLの仕様に準拠させ、ウェブ標準への適合性を高めています。

コミット

commit f4ec146454171751e2239528509a46afcf9110f3
Author: Benny Siegert <bsiegert@gmail.com>
Date:   Mon Mar 26 09:12:15 2012 -0700

    doc: Change id of footer
    
    The heading "Copyright" uses id="copyright" as the anchor name.
    However, there is also a <div id="copyright"> at the bottom.
    Using the same ID value twice in the same file is illegal
    (http://www.w3.org/TR/html401/struct/links.html#h-12.2.3).
    
    R=golang-dev, bradfitz, rsc
    CC=golang-dev
    https://golang.org/cl/5909045

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/f4ec146454171751e2239528509a46afcf9110f3

元コミット内容

このコミットの目的は、HTMLドキュメント内で同じ id 属性値が複数回使用されているという、HTMLの仕様違反を修正することです。具体的には、godoc が生成するHTMLページにおいて、著作権表示のセクション見出しとページ下部のフッター div 要素の両方に id="copyright" が割り当てられていました。HTMLの仕様では、id 属性はドキュメント内で一意である必要があるため、この重複は不正とされています。

変更の背景

HTMLの id 属性は、ドキュメント内で要素を一意に識別するためのグローバル属性です。これは、CSSによるスタイリング、JavaScriptによる要素の操作、またはフラグメント識別子(URLの # の後に続く部分)としてのアンカーリンクなど、様々な目的で使用されます。

このコミットが行われた背景には、godoc が生成するHTMLページがHTML 4.01の仕様に準拠していなかったという問題があります。具体的には、以下の2箇所で id="copyright" が使用されていました。

  1. 著作権表示のセクション見出し: ページ内の特定のセクションへのアンカーリンクとして id="copyright" が使用されていた可能性があります。
  2. ページ下部のフッター div 要素: ページ全体のフッター部分を構成する div 要素に id="copyright" が割り当てられ、CSSでスタイリングされていました。

HTML 4.01の仕様(特に http://www.w3.org/TR/html401/struct/links.html#h-12.2.3)では、「ID属性の値は、ドキュメントツリー内で一意でなければならない」と明確に規定されています。この重複は、ブラウザの挙動の不整合、CSSスタイルの適用問題、JavaScriptによる要素選択の誤動作、そして何よりもウェブ標準への非準拠という問題を引き起こす可能性があります。

このコミットは、このような潜在的な問題を回避し、生成されるHTMLがより堅牢で標準に準拠したものとなるようにするための修正です。

前提知識の解説

HTMLのID属性

HTMLの id 属性は、ウェブページ内の特定の要素に一意の識別子を付与するために使用されます。

  • 一意性: id 属性の値は、HTMLドキュメント内で必ず一意でなければなりません。同じ id を持つ要素が複数存在することは、HTMLの仕様違反です。
  • 用途:
    • CSSセレクタ: id を使用して特定の要素にスタイルを適用できます(例: #myElement { color: blue; })。
    • JavaScript: document.getElementById() などのメソッドを使用して、特定の要素をJavaScriptから操作できます。
    • フラグメント識別子: URLの末尾に #id_value を追加することで、その id を持つ要素までページをスクロールさせることができます(アンカーリンク)。
    • ARIA属性: アクセシビリティのために、他の要素との関連付けに使用されることがあります。

CSSセレクタ

CSSセレクタは、HTML要素を選択し、スタイルを適用するためのパターンです。

  • IDセレクタ: # の後にID名を続けることで、そのIDを持つ要素を選択します。例: #copyrightid="copyright" を持つ要素を選択します。
  • クラスセレクタ: . の後にクラス名を続けることで、そのクラスを持つ要素を選択します。クラスは複数の要素に適用できます。
  • 要素セレクタ: 要素名を直接指定します。例: div はすべての div 要素を選択します。

godoc とは

godoc は、Go言語のソースコードからドキュメントを生成するためのツールです。Goのコードコメントや構造から自動的にAPIドキュメントやパッケージの概要を生成し、ウェブブラウザで閲覧可能な形式で提供します。このツールは、Go言語のエコシステムにおいて非常に重要な役割を担っており、Goの標準ライブラリのドキュメントも godoc によって生成されています。

技術的詳細

このコミットの技術的詳細は、HTMLのID属性の一意性制約と、それに伴うCSSセレクタの変更に集約されます。

  1. ID属性の重複問題: godoc が生成するHTMLページには、以下の2つの要素が存在していました。

    • <h2 id="copyright">Copyright</h2> のような見出し要素(アンカーとして機能)。
    • <div id="copyright">...</div> のようなフッター要素。 HTMLの仕様では、id 属性はドキュメント内で一意であるべきとされています。この重複は、ブラウザがどちらの要素を id="copyright" として認識すべきか混乱する可能性があり、特にJavaScriptによる document.getElementById('copyright') の呼び出しや、CSSセレクタ #copyright の適用において予期せぬ挙動を引き起こす原因となります。
  2. 修正アプローチ: この問題の解決策は、重複しているIDの一方を変更し、一意性を確保することです。このコミットでは、フッターの div 要素のIDを copyright から footer に変更するというアプローチが取られました。これは、フッターという要素の役割をより明確に表すIDであり、かつ既存の copyright 見出しのIDと衝突しないため、適切な選択と言えます。

  3. CSSの変更: HTML要素のIDが変更された場合、そのIDをターゲットにしていたCSSセレクタも更新する必要があります。doc/style.css ファイルでは、div#copyright というセレクタがフッターのスタイルを定義していました。IDが footer に変更されたため、このセレクタも div#footer に更新され、フッターのスタイルが引き続き正しく適用されるようにしています。

この修正は、機能的な変更を伴わないものの、生成されるHTMLの品質と標準準拠性を向上させる重要な「衛生的な」変更です。これにより、将来的なウェブ標準の変更や、異なるブラウザでの互換性問題のリスクを低減します。

コアとなるコードの変更箇所

このコミットでは、以下の2つのファイルが変更されています。

  1. doc/style.css:

    --- a/doc/style.css
    +++ b/doc/style.css
    @@ -150,7 +150,7 @@ div#plusone {
     	float: right;
     }
     
    -div#copyright {
    +div#footer {
     	color: #666;
     	font-size: 14px;
     	margin: 40px 0;
    

    この変更により、CSSセレクタが div#copyright から div#footer に更新され、フッター要素のスタイルが新しいIDに正しく適用されるようになります。

  2. lib/godoc/godoc.html:

    --- a/lib/godoc/godoc.html
    +++ b/lib/godoc/godoc.html
    @@ -50,7 +50,7 @@
     
     </div>
     
    -<div id="copyright">
    +<div id="footer">
     Build version {{html .Version}}.
     Except as noted, this content is licensed under a
     Creative Commons Attribution 3.0 License.
    

    この変更により、godoc が使用するHTMLテンプレート内のフッター div 要素の id 属性が copyright から footer に変更されます。

コアとなるコードの解説

doc/style.css の変更

元の doc/style.css には、以下のようなCSSルールがありました。

div#copyright {
    color: #666;
    font-size: 14px;
    margin: 40px 0;
}

これは、id="copyright" を持つ div 要素に対して、文字色をグレー (#666)、フォントサイズを14px、上下のマージンを40pxに設定するものです。 コミットによって、このセレクタが div#footer に変更されました。

div#footer {
    color: #666;
    font-size: 14px;
    margin: 40px 0;
}

これにより、HTMLテンプレートで id="footer" に変更されたフッター要素が、引き続き同じスタイルで表示されることが保証されます。

lib/godoc/godoc.html の変更

lib/godoc/godoc.html は、godoc がHTMLページを生成する際に使用するGoテンプレートファイルです。 元のファイルには、フッター部分を定義する以下のHTMLスニペットがありました。

<div id="copyright">
Build version {{html .Version}}.
Except as noted, this content is licensed under a
Creative Commons Attribution 3.0 License.
</div>

この div 要素の id 属性が copyright となっていました。 コミットによって、この id 属性が footer に変更されました。

<div id="footer">
Build version {{html .Version}}.
Except as noted, this content is licensed under a
Creative Commons Attribution 3.0 License.
</div>

この変更により、HTMLドキュメント内で id="copyright" の重複が解消され、HTMLの仕様に準拠するようになりました。{{html .Version}} の部分はGoテンプレートの構文で、godoc のビルドバージョンが動的に挿入されることを示しています。

関連リンク

  • HTML 4.01 Specification - 12.2.3 Fragment identifiers: http://www.w3.org/TR/html401/struct/links.html#h-12.2.3
    • このコミットの根拠となったHTML仕様の具体的なセクションです。ID属性の一意性について記述されています。
  • Go言語の godoc コマンド: Go言語の公式ドキュメントやツールに関する情報源。

参考にした情報源リンク