[インデックス 11035] ファイルの概要
このコミットは、Go言語のドキュメント生成ツールにおいて、コードスニペットの末尾から不要な空白文字を削除する変更を導入しています。これにより、生成されるHTMLドキュメント内の<pre>
ブロックにおける表示上の問題を解決し、コードの整形を改善します。
コミット
- コミットハッシュ:
5353e1ef9673e2fb0604aa30549ff04d25e4837b
- 作者: Andrew Gerrand adg@golang.org
- 日付: Fri Jan 6 09:20:31 2012 +1100
- コミットメッセージ:
doc: trim spaces from code snippets gofmt likes to put lines like // STOP OMIT two blank lines from a closing brace, creating an ugly space inside <pre> blocks in some of these files. This change resolves this issue. R=golang-dev, iant CC=golang-dev https://golang.org/cl/5520044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/5353e1ef9673e2fb0604aa30549ff04d25e4837b
元コミット内容
doc: trim spaces from code snippets
gofmt likes to put lines like
// STOP OMIT
two blank lines from a closing brace, creating an ugly space inside
<pre> blocks in some of these files. This change resolves this issue.
R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/5520044
変更の背景
Go言語のドキュメントは、ソースコード内のコメントや特定のディレクティブ(例: // OMIT
, // STOP OMIT
)を使用して、コードスニペットをHTML形式で埋め込む機能を持っています。これらのコードスニペットは通常、HTMLの<pre>
タグで囲まれ、整形済みテキストとして表示されます。
問題は、Goのコードフォーマッタであるgofmt
が、特定の状況(特に閉じ括弧}
の後に// STOP OMIT
のようなコメントがある場合)で、コードブロックの末尾に余分な空白行を挿入する傾向があったことです。この余分な空白行が、ドキュメント生成時に<pre>
ブロック内にそのまま取り込まれてしまい、視覚的に不格好な余白を生み出していました。
このコミットは、この不要な空白を自動的に削除することで、生成されるドキュメントの見た目を改善し、よりクリーンなコード表示を実現することを目的としています。
前提知識の解説
- Go言語のドキュメンテーションツール: Go言語には、ソースコードから自動的にドキュメントを生成するツールチェーンがあります。これには、
go doc
コマンドや、ウェブベースのドキュメント(golang.org/doc
など)を生成するための内部ツールが含まれます。これらのツールは、Goのソースファイル内のコメントや特定のマーカー(// OMIT
,// STOP OMIT
など)を解析し、コードスニペットを抽出してHTMLに埋め込みます。 // OMIT
ディレクティブ: Goのドキュメントでは、コードスニペットの一部のみを表示するために// OMIT
ディレクティブが使用されます。// OMIT
で始まる行はドキュメントには表示されず、その行から// STOP OMIT
までのコードブロックが抽出されます。gofmt
:gofmt
はGo言語の公式なコードフォーマッタです。Goのコードを標準的なスタイルに自動的に整形し、一貫性を保つために広く使用されています。gofmt
は、コードの可読性を高めるために、空白行やインデントなどを自動的に調整します。しかし、このコミットの背景にあるように、特定の状況ではドキュメント生成の文脈で意図しない空白を生成することがありました。- HTML
<pre>
タグ: HTMLの<pre>
タグは、整形済みテキストを表示するために使用されます。このタグ内のテキストは、通常、等幅フォントで表示され、空白や改行がそのまま保持されます。この特性が、gofmt
によって挿入された余分な空白行がドキュメントにそのまま反映される原因となっていました。 strings.TrimSpace
関数: Go言語の標準ライブラリstrings
パッケージに含まれる関数で、文字列の先頭と末尾にあるすべての空白文字(スペース、タブ、改行など)を削除します。
技術的詳細
この変更は、Go言語のドキュメント生成パイプラインの一部であるtmpltohtml.go
ファイルに焦点を当てています。このファイルは、テンプレートからHTMLを生成する際に、Goのソースコードから抽出されたコードスニペットを処理する役割を担っています。
以前のバージョンでは、tmpltohtml.go
がコードスニペットを抽出した後、そのテキストをそのままHTMLの<pre>
ブロックに挿入していました。gofmt
がコードブロックの末尾に余分な改行や空白を挿入した場合、それらがそのままHTMLに転送され、ブラウザで表示された際に不必要な余白として現れていました。
このコミットでは、tmpltohtml.go
内のcode
関数が、抽出したコードスニペットのテキストに対してstrings.TrimSpace
関数を適用するように変更されました。strings.TrimSpace
は、文字列の先頭と末尾にあるすべての空白文字(スペース、タブ、改行など)を削除します。これにより、gofmt
によって追加された余分な空白行が、HTMLに埋め込まれる前に効果的に除去されるようになります。
結果として、生成されるHTMLドキュメント内の<pre>
ブロックは、コードスニペットの実際のコンテンツのみを含み、視覚的なノイズとなる余分な空白がなくなります。これは、特にコードの表示が重要な技術ドキュメントにおいて、ユーザーエクスペリエンスを向上させる小さな、しかし重要な改善です。
コアとなるコードの変更箇所
変更は、doc/tmpltohtml.go
ファイル内のcode
関数にあります。
--- a/doc/tmpltohtml.go
+++ b/doc/tmpltohtml.go
@@ -113,6 +113,8 @@ func code(file string, arg ...interface{}) (string, error) {
default:
return "", fmt.Errorf("incorrect code invocation: code %q %q", file, arg)
}\n+\t// Trim spaces from output.\n+\ttext = strings.TrimSpace(text)\n \t// Replace tabs by spaces, which work better in HTML.\n \ttext = strings.Replace(text, "\\t", " ", -1)\n \t// Escape the program text for HTML.\n```
## コアとなるコードの解説
追加された2行は以下の通りです。
```go
// Trim spaces from output.
text = strings.TrimSpace(text)
// Trim spaces from output.
:これは追加されたコード行の目的を説明するコメントです。出力から空白をトリムすることを示しています。text = strings.TrimSpace(text)
:この行が実際の変更です。code
関数内で処理されているコードスニペットのテキストコンテンツを保持するtext
変数に対して、strings.TrimSpace
関数が適用されています。この関数は、text
文字列の先頭と末尾にあるすべての空白文字(スペース、タブ、改行など)を削除し、その結果を再びtext
変数に代入します。
この変更により、gofmt
が挿入した不要な空白行や、その他の末尾の空白が、HTMLに変換される前に除去されるため、最終的なドキュメントの表示が改善されます。
関連リンク
- Go CL (Change List): https://golang.org/cl/5520044
参考にした情報源リンク
- Go言語の公式ドキュメント (特に
go doc
やドキュメンテーションの慣習に関するセクション) gofmt
の動作に関する情報- HTML
<pre>
タグの仕様 - Go言語の
strings
パッケージのドキュメント (特にTrimSpace
関数) - Go言語の
// OMIT
ディレクティブに関する情報 (例: Go Tourのコードスニペット) - https://golang.org/doc/effective_go.html (Effective Go - ドキュメンテーションに関するセクション)
- https://golang.org/cmd/gofmt/ (gofmtコマンドのドキュメント)
- https://pkg.go.dev/strings#TrimSpace (strings.TrimSpaceのGoDoc)