[インデックス 15214] ファイルの概要
このコミットは、Go言語の標準ライブラリ encoding/xml
パッケージにおける htmlAutoClose
変数とその生成スクリプトの修正に関するものです。具体的には、HTMLの自己閉じタグのリストを生成する際に使用される sed
コマンドの正規表現と、htmlAutoClose
リスト内の col
要素の表記が修正されています。
コミット
commit 83da2014a84878382b213beea69ac2e4f3b0729e
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Wed Feb 13 02:27:42 2013 +0800
encoding/xml: fix htmlAutoClose and its generating script
Thanks Mitică for reporting this.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/7308081
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/83da2014a84878382b213beea69ac2e4f3b0729e
元コミット内容
encoding/xml: fix htmlAutoClose and its generating script
Thanks Mitică for reporting this.
このコミットは、encoding/xml
パッケージ内の htmlAutoClose
変数と、その変数を生成するためのスクリプトの修正を目的としています。この問題はMitică氏によって報告されました。
変更の背景
Go言語の encoding/xml
パッケージは、XMLデータのエンコードとデコードを扱うためのものです。HTMLはXMLとは異なる構文規則を持つため、特に自己閉じタグ(例: <br>
, <input>
)の扱いで問題が生じることがあります。XMLではすべての開始タグに対応する終了タグが必要ですが、HTMLでは一部の要素は終了タグを省略できます。
encoding/xml
パッケージには htmlAutoClose
という変数が存在し、これはHTMLにおいて自己閉じ要素として扱われるタグのリストを保持しています。このリストは、HTMLのようなマークアップをXMLとしてパースする際に、これらの要素を正しく解釈するために使用されます。
このコミットの背景には、htmlAutoClose
リストの生成スクリプトにバグがあったこと、およびリスト内の特定の要素(col
)の表記が不正確であったことが挙げられます。元のスクリプトは、W3CのHTML4 DTDから自己閉じ要素のリストを抽出するために sed
コマンドを使用していますが、その正規表現が一部の要素名を正しく抽出できない可能性がありました。また、col
要素がリスト内で余分なスペースを含んで記述されており、これがパース時の問題を引き起こす可能性がありました。
Mitică氏からの報告を受け、これらの不正確さを修正し、encoding/xml
パッケージがHTMLライクなコンテンツをより堅牢に処理できるようにすることが、この変更の動機となりました。
前提知識の解説
- XML (Extensible Markup Language): 構造化されたデータを表現するためのマークアップ言語。厳格な構文規則を持ち、すべての開始タグには対応する終了タグが必要です。
- HTML (HyperText Markup Language): ウェブページを作成するためのマークアップ言語。XMLよりも柔軟な構文を持ち、一部の要素(例:
<img>
,<br>
,<input>
)は自己閉じタグとして扱われ、終了タグを省略できます。 - 自己閉じタグ (Self-closing tags): HTMLにおいて、内容を持たず、開始タグのみで完結する要素。XMLでは
<tag/>
のように明示的に自己閉じを示す必要があります。 - DTD (Document Type Definition): XMLやHTML文書の構造を定義するためのスキーマ言語。どの要素が使用でき、どのようにネストできるかなどを規定します。
encoding/xml
パッケージ: Go言語の標準ライブラリの一部で、XMLデータのエンコード(Goの構造体からXMLへ)とデコード(XMLからGoの構造体へ)を提供します。HTMLのようなマークアップをXMLとして扱う際に、HTMLの自己閉じ要素の特性を考慮する必要があります。sed
コマンド: Unix系のOSで利用されるストリームエディタ。テキストファイルの内容を正規表現に基づいて変換・置換するのに使われます。- 正規表現 (Regular Expression): 文字列のパターンを記述するための強力なツール。特定の文字列の検索、置換、抽出などに用いられます。
技術的詳細
このコミットは、src/pkg/encoding/xml/xml.go
ファイル内の2つの主要な変更を含んでいます。
-
sed
コマンドの正規表現の修正:htmlAutoClose
変数のコメントブロックには、W3CのHTML4 DTDから自己閉じ要素を抽出するためのsed
コマンドの例が記述されています。元の正規表現は<!ELEMENT (.*) - O EMPTY.+
でした。ここで(.*)
は任意の文字の繰り返しにマッチしますが、要素名にスペースが含まれる可能性を考慮していませんでした。 修正後の正規表現は<!ELEMENT ([^ ]*) +- O EMPTY.+
となっています。ここで([^ ]*)
は「スペース以外の任意の文字の繰り返し」にマッチします。これにより、要素名がスペースで区切られている場合に、要素名のみを正確に抽出できるようになります。例えば、<!ELEMENT FOO - O EMPTY>
のようなDTDエントリからFOO
を正しく抽出できます。この修正は、htmlAutoClose
リストを生成するスクリプトの堅牢性を向上させます。 -
col
要素の表記修正:htmlAutoClose
リスト内で、col
要素が"col "
のように余分なスペースを含んで記述されていました。これは、リストの要素として正確ではありません。 修正により、この余分なスペースが削除され、"col"
となりました。これにより、encoding/xml
パッケージがcol
要素を自己閉じ要素として正しく認識し、パース時の誤動作を防ぐことができます。
これらの変更は、encoding/xml
パッケージがHTMLライクなドキュメントをXMLとして処理する際の正確性と信頼性を向上させるものです。特に、HTMLの自己閉じ要素の定義が厳密でない場合に、GoのXMLパーサーがより適切に動作するようになります。
コアとなるコードの変更箇所
--- a/src/pkg/encoding/xml/xml.go
+++ b/src/pkg/encoding/xml/xml.go
@@ -1692,7 +1692,7 @@ var HTMLAutoClose = htmlAutoClose
var htmlAutoClose = []string{
/*
hget http://www.w3.org/TR/html4/loose.dtd |
- 9 sed -n 's/<!ELEMENT (.*) - O EMPTY.+/\t\"\\1\",/p' | tr A-Z a-z
+ 9 sed -n 's/<!ELEMENT ([^ ]*) +- O EMPTY.+/\t\"\\1\",/p' | tr A-Z a-z
*/
"basefont",
"br",
@@ -1702,7 +1702,7 @@ var htmlAutoClose = []string{
"param",
"hr",
"input",
-" col ",
+" col",
"frame",
"isindex",
"base",
コアとなるコードの解説
-
src/pkg/encoding/xml/xml.go
: このファイルは、Go言語のencoding/xml
パッケージの主要な実装を含んでいます。XMLのエンコード/デコードロジック、およびHTMLの自己閉じ要素の処理に関連するhtmlAutoClose
変数が定義されています。 -
var htmlAutoClose = []string{...}
: この変数は、HTMLの自己閉じ要素のタグ名を文字列スライスとして保持しています。このリストは、XMLパーサーがHTMLコンテンツを処理する際に、これらの要素が終了タグを持たないことを認識するために使用されます。 -
sed
コマンドのコメント行の変更:- 9 sed -n 's/<!ELEMENT (.*) - O EMPTY.+/\t\"\\1\",/p' | tr A-Z a-z
+ 9 sed -n 's/<!ELEMENT ([^ ]*) +- O EMPTY.+/\t\"\\1\",/p' | tr A-Z a-z
この変更は、sed
コマンドの正規表現をより厳密にしています。元の(.*)
は任意の文字にマッチするため、要素名以外の部分まで誤ってキャプチャする可能性がありました。新しい([^ ]*)
は「スペース以外の文字」にマッチするため、<!ELEMENT
の直後にある要素名を正確に抽出できます。これにより、htmlAutoClose
リストを生成する際のスクリプトが、より正確な要素名を抽出できるようになります。 -
"col "
から"col"
への変更:- "col ",
+ "col",
これはhtmlAutoClose
リスト内の具体的な要素の修正です。元のリストではcol
要素が誤って余分なスペースを含んでいました。この修正により、col
が正確なタグ名として認識され、encoding/xml
パッケージがHTMLのcol
要素を正しく処理できるようになります。
これらの変更は、encoding/xml
パッケージの内部的な正確性を高め、HTMLとXMLの間の構文の違いに起因する潜在的なパースエラーを防ぐことに貢献しています。
関連リンク
- Go言語の
encoding/xml
パッケージのドキュメント: https://pkg.go.dev/encoding/xml - Go言語のコードレビューシステム (Gerrit): https://go.dev/cl/7308081 (コミットメッセージに記載されているCL番号)
参考にした情報源リンク
- GitHubのコミットページ: https://github.com/golang/go/commit/83da2014a84878382b213beea69ac2e4f3b0729e
- Go言語の
encoding/xml
パッケージに関する一般的な情報 (Web検索結果):- https://pkg.go.dev/encoding/xml
- https://github.com/golang/go/blob/master/src/encoding/xml/xml.go
- Stack OverflowなどのコミュニティでのHTMLとXMLの自己閉じタグに関する議論。