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

[インデックス 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つの主要な変更を含んでいます。

  1. sed コマンドの正規表現の修正: htmlAutoClose 変数のコメントブロックには、W3CのHTML4 DTDから自己閉じ要素を抽出するための sed コマンドの例が記述されています。元の正規表現は <!ELEMENT (.*) - O EMPTY.+ でした。ここで (.*) は任意の文字の繰り返しにマッチしますが、要素名にスペースが含まれる可能性を考慮していませんでした。 修正後の正規表現は <!ELEMENT ([^ ]*) +- O EMPTY.+ となっています。ここで ([^ ]*) は「スペース以外の任意の文字の繰り返し」にマッチします。これにより、要素名がスペースで区切られている場合に、要素名のみを正確に抽出できるようになります。例えば、<!ELEMENT FOO - O EMPTY> のようなDTDエントリから FOO を正しく抽出できます。この修正は、htmlAutoClose リストを生成するスクリプトの堅牢性を向上させます。

  2. 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の間の構文の違いに起因する潜在的なパースエラーを防ぐことに貢献しています。

関連リンク

参考にした情報源リンク