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

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

このコミットは、Go言語のドキュメンテーションツールであるgodocが生成するHTML出力における、コード例の表示方法を改善するものです。具体的には、出力がないコード例に対して「Output:」という空のセクションが表示されてしまう問題を解決し、表示の整合性を高めています。

コミット

commit 1e5aecf6ce72fa16f9e834702d083325646108b7
Author: Volker Dobler <dr.volker.dobler@gmail.com>
Date:   Fri Dec 2 09:52:31 2011 +1100

    godoc: improved output of examples in html.
    
    Fixes #2467.
    Fixes #2464.
    
    R=golang-dev, rsc, adg
    CC=golang-dev
    https://golang.org/cl/5447051

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

https://github.com/golang/go/commit/1e5aecf6ce72fa16f9e834702d083325646108b7

元コミット内容

godoc: improved output of examples in html.

Fixes #2467.
Fixes #2464.

R=golang-dev, rsc, adg
CC=golang-dev
https://golang.org/cl/5447051

変更の背景

このコミットは、godocツールが生成するHTMLドキュメントにおけるコード例の表示に関する2つの既存の問題(Issue #2467 と #2464)を修正するために行われました。

特にIssue #2464は、「godoc: example with no output shows empty output box」と題されており、コード例に実際には出力がない場合でも、godocがHTML出力に「Output:」という見出しと空の出力ボックスを不必要に表示してしまうという問題でした。これはユーザーエクスペリエンスを損ね、ドキュメントの見た目を乱す原因となっていました。

このコミットは、このような不必要な表示を排除し、コード例の出力セクションが実際に内容を持つ場合にのみ表示されるようにすることで、godocのHTML出力の品質と整合性を向上させることを目的としています。また、コード例のヘッディングもより簡潔に改善されています。

前提知識の解説

Go言語のgodocツール

godocは、Go言語のソースコードからドキュメンテーションを生成するための公式ツールです。Go言語では、コード内のコメントを特定の形式で記述することで、自動的にAPIドキュメントを生成できます。godocはこれらのコメントを解析し、HTML形式で整形されたドキュメントとして提供したり、コマンドラインで表示したりする機能を持っています。

特に、Example関数(ExampleFExampleTExamplePなど)として記述されたコードは、godocによって自動的に実行され、その標準出力がドキュメントに埋め込まれます。これにより、コードの動作例を直接ドキュメント内で示すことができ、ユーザーがAPIの利用方法を理解する上で非常に役立ちます。

Go言語のテンプレートエンジン

Go言語には、HTMLやテキストを動的に生成するための強力なテンプレートエンジンが標準ライブラリとして提供されています。主にhtml/templateパッケージとtext/templateパッケージがあります。

  • html/template: HTMLコンテンツを生成する際に使用され、クロスサイトスクリプティング(XSS)攻撃を防ぐための自動エスケープ機能を提供します。
  • text/template: 任意のテキストコンテンツを生成する際に使用されます。

これらのテンプレートは、{{.FieldName}}のようなプレースホルダーを使用してデータ構造のフィールドにアクセスしたり、{{if .Condition}}...{{end}}のような制御構造(条件分岐)を使用してコンテンツの表示を制御したりできます。

HTMLの構造とCSSクラス

このコミットで変更されているexample.htmlは、godocがコード例を表示するために使用するHTMLテンプレートの一部です。HTMLはウェブページの構造を定義し、CSS(Cascading Style Sheets)はウェブページの見た目(スタイル)を定義します。

テンプレート内の<p class="exampleHeading"><p class="code"><p class="output">といった要素は、特定のCSSクラスが適用されており、これによりgodocのドキュメント全体で一貫したデザインが実現されています。

技術的詳細

このコミットの技術的な核心は、Go言語のテンプレートエンジンにおける条件分岐の利用です。

変更前は、lib/godoc/example.htmlテンプレート内で、コード例の出力セクションが以下のように記述されていました。

<p>Output:</p>
<p class="output"><pre>{{html .Output}}</pre></p>

ここで、{{html .Output}}は、GoのExample関数が標準出力に出力した内容をHTMLエスケープして表示するプレースホルダーです。しかし、Example関数が何も出力しなかった場合でも、.Outputは空文字列となり、結果として「Output:」という見出しと空の<pre>タグが常に表示されていました。

このコミットでは、この問題を解決するために、{{if .Output}}という条件分岐が導入されました。

{{if .Output}}
<p>Output:</p>
<p class="output"><pre>{{html .Output}}</pre></p>
{{end}}

この変更により、.Outputフィールドに何らかのコンテンツ(つまり、空文字列ではない値)が存在する場合にのみ、「Output:」という見出しと実際の出力内容を含む<pre>タグがHTMLにレンダリングされるようになります。.Outputが空の場合、このブロック全体がスキップされるため、不必要な「Output:」セクションが表示されることがなくなります。

また、このコミットでは、コード例のヘッディングも微調整されています。

変更前:

<p class="exampleHeading">▾ Example Code:</p>

変更後:

<p class="exampleHeading">▾ Example</p>
<p>Code:</p>

これにより、「Example Code:」という一つの見出しが、「Example」というより一般的な見出しと、その後に続く「Code:」という独立したパラグラフに分割されました。これは、ドキュメントの視覚的な階層を改善し、より読みやすくするための調整と考えられます。

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

変更はlib/godoc/example.htmlファイルのみです。

diff --git a/lib/godoc/example.html b/lib/godoc/example.html
index 8c1fd1adc6..7badbb6fad 100644
--- a/lib/godoc/example.html
+++ b/lib/godoc/example.html
@@ -3,9 +3,12 @@
 	<p class="exampleHeading">▹ Example</p>
 </div>
 <div class="expanded">
-	<p class="exampleHeading">▾ Example Code:</p>
+	<p class="exampleHeading">▾ Example</p>
+	<p>Code:</p>
 	<p class="code"><pre>{{.Code}}</pre></p>
+	{{if .Output}}
 	<p>Output:</p>
 	<p class="output"><pre>{{html .Output}}</pre></p>
+	{{end}}
 </div>
 </div>

コアとなるコードの解説

このコミットの主要な変更点は以下の2つです。

  1. 出力セクションの条件付きレンダリング: {{if .Output}}{{end}}のブロックが追加されました。これにより、GoのExample関数が生成する出力(.Output)が存在する場合にのみ、<p>Output:</p><p class="output"><pre>{{html .Output}}</pre></p>の行がHTMLとしてレンダリングされます。出力がない場合は、これらの行は完全にスキップされ、空の「Output:」セクションが表示されることがなくなります。これはIssue #2464の直接的な解決策です。

  2. コード例ヘッディングの変更: <p class="exampleHeading">▾ Example Code:</p>が、<p class="exampleHeading">▾ Example</p><p>Code:</p>に分割されました。これにより、コード例のセクションがより明確に「Example」と「Code」に区別され、視覚的な構造が改善されます。これはIssue #2467に関連する改善である可能性があります。

これらの変更は、godocが生成するHTMLドキュメントの品質とユーザーエクスペリエンスを向上させるための、細かではあるが重要な改善です。

関連リンク

参考にした情報源リンク