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

[インデックス 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言語の公式ドキュメント (特に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)