[インデックス 12748] ファイルの概要
このコミットは、Go言語のドキュメンテーションツールであるgodoc
の表示機能に関する改善です。具体的には、パッケージの概要(Overview)セクションを折りたたみ可能(collapsible)にすることで、特に長いパッケージコメントを持つ場合のドキュメントの閲覧性を向上させています。この変更は、既存のコード例(Examples)の折りたたみ機能の汎用化と、その新しい汎用メカニズムをOverviewセクションに適用することによって実現されています。
コミット
commit 0b762d9523a8b672143556739726d3d4e8ac6c94
Author: Andrew Gerrand <adg@golang.org>
Date: Mon Mar 26 14:10:27 2012 +1100
godoc: make 'Overview' section collapsable
This makes packages with lengthly package comments easier to browse.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5901055
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0b762d9523a8b672143556739726d3d4e8ac6c94
元コミット内容
godoc: make 'Overview' section collapsable
This makes packages with lengthly package comments easier to browse.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5901055
変更の背景
godoc
で生成されるドキュメントにおいて、パッケージの概要(Overview)セクションに非常に長いコメントが含まれる場合、ユーザーがドキュメント全体をスクロールして閲覧する際に不便が生じていました。このコミットの目的は、Overviewセクションを折りたたみ可能にすることで、ユーザーがドキュメントの他の部分に素早くアクセスできるようにし、全体的な閲覧体験を向上させることです。これにより、特に詳細な説明が記述されたパッケージにおいて、ドキュメントの可読性とナビゲーションが改善されます。
前提知識の解説
この変更を理解するためには、以下の技術要素と概念に関する基本的な知識が必要です。
- godoc: Go言語のソースコードからドキュメンテーションを生成するツールです。Goのパッケージ、関数、型などに記述されたコメントを解析し、HTML形式のドキュメントとして表示します。開発者がコードとドキュメントを同時に管理できる「ドキュメント駆動開発」を促進します。
- HTML (HyperText Markup Language): ウェブページの構造を定義するためのマークアップ言語です。
div
(汎用的なコンテナ)、h2
(セクションの見出し)、p
(段落)、a
(ハイパーリンク)などの要素が使用されます。 - CSS (Cascading Style Sheets): HTML要素の見た目(スタイル)を定義するためのスタイルシート言語です。
class
セレクタを用いて特定の要素グループにスタイルを適用したり、display
プロパティで要素の表示/非表示を制御したりします。 - JavaScript: ウェブページに動的な振る舞いを追加するためのプログラミング言語です。DOM (Document Object Model) を操作してHTML要素の内容やスタイルを変更したり、イベントリスナー(例:
click
イベント)を設定してユーザーの操作に応答したりします。 - DOM (Document Object Model): HTMLやXMLドキュメントの構造を、プログラムからアクセス・操作できるようにするためのAPIです。JavaScriptはDOMを通じてウェブページの要素にアクセスし、そのプロパティ(例:
className
)を変更することで、動的なUIを実現します。 - 折りたたみ可能なセクション (Collapsible Sections): ウェブUIにおける一般的なデザインパターンの一つで、コンテンツの一部を初期状態で非表示にし、ユーザーがクリックなどの操作を行うことで表示/非表示を切り替えられるようにする機能です。これにより、ページの初期表示を簡潔にし、ユーザーが必要な情報に集中できるようにします。通常、JavaScriptで要素のクラスを変更し、CSSでそのクラスに応じた表示/非表示のスタイルを適用することで実現されます。
技術的詳細
このコミットの技術的な核心は、既存のコード例(Examples)の折りたたみ機能を汎用化し、それをパッケージの概要(Overview)セクションにも適用した点にあります。
-
汎用的なトグルメカニズムへのリファクタリング:
- これまで
example
という特定のクラス名に依存していたJavaScript関数(godocs_bindExampleToggle
,godocs_bindExampleLink
)が、より汎用的なtoggle
という概念に基づく関数(godocs_bindToggle
,godocs_bindToggleLink
)にリファクタリングされました。 - これに伴い、CSSのクラス名も
.example
、.exampleVisible
、.exampleHeading
などが、それぞれ.toggle
、.toggleVisible
、.toggleButton
といった汎用的な名前に変更されました。これにより、同じJavaScriptとCSSのロジックを異なる種類の折りたたみ可能な要素に再利用できるようになります。 - 新しいヘルパー関数
godocs_bindToggles
とgodocs_bindToggleLinks
が導入され、特定のクラス名を持つすべての要素に対して一括でトグル機能をバインドできるようになりました。
- これまで
-
Overviewセクションへの適用:
lib/godoc/package.html
において、OverviewセクションのHTML構造が大幅に変更されました。従来のシンプルな<h2>
タグとコメント表示部分が、toggleVisible
クラスを持つ<div>
要素でラップされました。- この
<div>
内部には、collapsed
(折りたたまれた状態)とexpanded
(展開された状態)の2つの<div>
が用意され、それぞれにtoggleButton
クラスを持つ<h2>
見出しが配置されました。これにより、ユーザーがクリックする見出し(トグルボタン)と、そのクリックによって表示/非表示が切り替わるコンテンツが明確に分離されます。 - 初期状態では
toggleVisible
クラスが適用されているため、Overviewセクションは展開された状態で表示されます。ユーザーがtoggleButton
をクリックすると、JavaScriptが親要素のクラスをtoggleVisible
からtoggle
に切り替えることで、CSSのルールに基づいてcollapsed
の内容が表示され、expanded
の内容が非表示になります。 - ナビゲーション内の「Overview」リンクには
overviewLink
という新しいクラスが追加され、JavaScriptがこのリンクをクリックした際に、対応するOverviewセクションを強制的に展開する(toggleVisible
クラスを適用する)ように設定されました。
この一連の変更により、godoc
はより柔軟なUIコンポーネントを持つようになり、将来的に他のセクションにも同様の折りたたみ機能を容易に適用できる基盤が構築されました。
コアとなるコードの変更箇所
このコミットでは、以下の4つのファイルが変更されています。
-
doc/godocs.js
:- JavaScriptのトグル関連関数が汎用化され、
godocs_bindExampleToggle
がgodocs_bindToggle
に、godocs_bindExampleLink
がgodocs_bindToggleLink
にリファクタリングされました。 - 新しいヘルパー関数
godocs_bindToggles
とgodocs_bindToggleLinks
が追加されました。 godocs_onload
関数が更新され、これらの新しい汎用関数を使用してExamplesとOverviewセクションのトグル機能を初期化するようになりました。
- JavaScriptのトグル関連関数が汎用化され、
-
doc/style.css
:- CSSのクラス名が、
example
プレフィックスからtoggle
プレフィックスへと汎用化されました。これにより、JavaScriptの変更と連携して、折りたたみ可能な要素のスタイルを統一的に管理できるようになりました。
- CSSのクラス名が、
-
lib/godoc/example.html
:- コード例のラッパー
div
のクラスがexample
からtoggle
に変更されました。 - コード例の見出し
p
タグにtoggleButton
クラスが追加されました。これにより、コード例も新しい汎用トグルメカニズムの恩恵を受けるようになりました。
- コード例のラッパー
-
lib/godoc/package.html
:- パッケージの概要(Overview)セクションのHTML構造が大幅に変更されました。
- Overviewセクション全体が
toggleVisible
クラスを持つdiv
でラップされ、その内部にcollapsed
とexpanded
のdiv
が配置されました。 - 各状態の見出しに
toggleButton
クラスが適用され、クリック可能なトグルボタンとして機能するようになりました。 - ナビゲーション内の「Overview」リンクに
overviewLink
クラスが追加され、このリンクからの遷移時にOverviewセクションが展開されるようにJavaScriptと連携します。
コアとなるコードの解説
doc/godocs.js
// godocs_bindExampleToggle から godocs_bindToggle へ汎用化
function godocs_bindToggle(el) {
var button = getElementsByClassName(el, "toggleButton"); // クリック可能なボタン要素を取得
var callback = function() {
if (el.className == "toggle") { // 現在折りたたまれている場合
el.className = "toggleVisible"; // 展開状態にする
} else { // 現在展開されている場合
el.className = "toggle"; // 折りたたみ状態にする
}
};
for (var i = 0; i < button.length; i++) {
bindEvent(button[i], "click", callback); // ボタンにクリックイベントをバインド
}
}
// godocs_bindExampleLink から godocs_bindToggleLink へ汎用化
function godocs_bindToggleLink(l, prefix) {
bindEvent(l, "click", function() {
var i = l.href.indexOf("#"+prefix);
if (i < 0) {
return;
}
var id = prefix + l.href.slice(i+1+prefix.length);
var eg = document.getElementById(id);
eg.className = "toggleVisible"; // リンククリックで対象要素を展開状態にする
});
}
// 特定のクラス名を持つ全ての要素にトグル機能をバインド
function godocs_bindToggles(className) {
var els = getElementsByClassName(document, className);
for (var i = 0; i < els.length; i++) {
godocs_bindToggle(els[i]);
}
}
// 特定のクラス名を持つ全てのリンクにトグルリンク機能をバインド
function godocs_bindToggleLinks(className, prefix) {
var links = getElementsByClassName(document, className);
for (i = 0; i < links.length; i++) {
godocs_bindToggleLink(links[i], prefix);
}
}
// ページロード時の初期化処理
function godocs_onload() {
godocs_bindSearchEvents();
godocs_generateTOC();
godocs_bindToggles("toggle"); // 初期状態で折りたたまれている要素にトグル機能をバインド
godocs_bindToggles("toggleVisible"); // 初期状態で展開されている要素にトグル機能をバインド
godocs_bindToggleLinks("exampleLink", "example_"); // コード例へのリンクにトグルリンク機能をバインド
godocs_bindToggleLinks("overviewLink", ""); // Overviewセクションへのリンクにトグルリンク機能をバインド
}
doc/style.css
/* 汎用的なトグルボタンのカーソルスタイル */
.toggleButton { cursor: pointer; }
/* 折りたたみ状態の要素: collapsed を表示し、expanded を非表示 */
.toggle .collapsed { display: block; }
.toggle .expanded { display: none; }
/* 展開状態の要素: collapsed を非表示にし、expanded を表示 */
.toggleVisible .collapsed { display: none; }
.toggleVisible .expanded { display: block; }
lib/godoc/package.html
<!-- ナビゲーション内のOverviewリンクに overviewLink クラスを追加 -->
<dd><a href="#overview" class="overviewLink">Overview</a></dd>
<!-- Overviewセクションの新しいHTML構造 -->
<div id="overview" class="toggleVisible"> <!-- 初期状態で展開されるように toggleVisible クラスを付与 -->
<div class="collapsed"> <!-- 折りたたみ状態の表示内容 -->
<h2 class="toggleButton" title="Click to show Overview section">Overview ▹</h2>
</div>
<div class="expanded"> <!-- 展開状態の表示内容 -->
<h2 class="toggleButton" title="Click to hide Overview section">Overview ▾</h2>
{{comment_html .Doc}} <!-- 実際のパッケージコメントの内容 -->
</div>
</div>
これらのコード変更により、JavaScriptがHTML要素のクラスを切り替えることで、CSSの表示/非表示ルールが適用され、ユーザーはOverviewセクションをインタラクティブに折りたたんだり展開したりできるようになります。
関連リンク
参考にした情報源リンク
- 上記のGitHubコミットページとGerrit変更リストのdiff情報。
- Go言語の公式ドキュメント(
godoc
に関する一般的な情報)。 - HTML, CSS, JavaScriptの基本的なウェブ技術に関する知識。