[9] [[HTML]] 構文において、[[終了タグ]]までのすべての[[文字]]がそのまま[[テキスト]]として解釈される[[要素]]のことを[DFN[[RUBYB[生テキスト要素]@en[raw text element]]]]といいます。 * 仕様書 [REFS[ - '''[10] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-05-15 23:40:56 +09:00]] 版) ''' - [13] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-05-15 23:40:56 +09:00]] 版) - [12] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-05-15 23:40:56 +09:00]] 版) - [24] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-06-08 22:09:53 +09:00]] 版) ]REFS] * 定義 [11] [[HTML]] 仕様によれば、[[生テキスト要素]]に分類されるのは次の2つの[[要素]]です [SRC[>>10]]。 - [CODE(HTMLe)@en[[[style]]]] - [CODE(HTMLe)@en[[[script]]]] [14] (構文の定義ではなく) [[構文解析器]]の仕様上は次の各[[要素]]も同じように扱われます。 - [CODE(HTMLe)@en[[[xmp]]]] - [CODE(HTMLe)@en[[[iframe]]]] - [CODE(HTMLe)@en[[[noscript]]]] ([[スクリプト有効]]の場合) - [CODE(HTMLe)@en[[[noframes]]]] - [CODE(HTMLe)@en[[[noembed]]]] ;; [15] [CODE(HTMLe)@en[[[script]]]] を除き、これらはいずれも[[共通生テキスト要素構文解析算法]]により処理されます。 ;; [16] [CODE(HTMLe)@en[[[iframe]]]] と [CODE(HTMLe)@en[[[noscript]]]] を除いた3つは[[廃止]]された[[要素]]であって不適合なので含まれていないのでしょう。 [CODE(HTMLe)@en[[[iframe]]]] と [CODE(HTMLe)@en[[[noscript]]]] は [[HTML]] として解釈され得る文字列が[[内容モデル]]と規定されており、やや特殊な扱いになっているため、 ここでは含まれていないのでしょう (仕様書のコメントで、敢えて除外していると記述があります)。 (ただ[[文字参照]]の扱いや [CODE(HTML)@en[]] [[終了タグ]]の適合性など、 [[HTML]] 仕様は少し抜けがあるように見えます。) [25] [CODE(HTMLe)@en[[[script]]]] [[要素]]については、 ([[HTML]] 構文としてではなく) [CODE(HTMLe)@en[[[script]]]] [[要素]]自体においても[[内容]]の文字列としての構文が定義されています (>>24)。 この構文は [[HTML構文解析器]]で正しく構文解析される範囲に収まるようになっています。 [26] >>25 によれば [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[内容]]として、 [[注釈]]のように見える文字列の中で [CODE(HTMLe)@en[[[script]]]] [[開始タグ]]と[[終了タグ]]の組に見える文字列を使うことができ、 実際 [[HTML構文解析器]]によってそのような文字列は (タグではなく) 文字データとして処理されます。 しかし、[[生テキスト要素]]に共通して適用される [[HTML]] 構文の規定により、 [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[内容]]として [CODE(HTMLe)@en[[[script]]]] [[終了タグ]]に見える文字列を使うことができず、したがって [[HTML]] 構文に適合するためにはこれを使うことができません。 [EG[ [27] 例えば [PRE(HTML code)[ ]PRE] ... は、 [[HTML構文解析器]]を通すと[[著者]]が意図した通りに解釈されます。そうして生成された [[DOM]] 自体は [[HTML]] 仕様に適合します。しかし、この [[HTML]] 片は [[HTML]] 構文に適合していません。 ]EG] * 構文解析 [17] [[HTML]] の[[構文解析算法]]においては、 [DFN[[RUBYB[共通生テキスト要素構文解析算法]@en[generic raw text element parsing algorithm]]]]によって >>11 と >>14 の[[要素]]の構文解析の方法が規定 (>>12) されています。ただし [COCDE(HTMLe)@en[[[script]]]] については[[スクリプト]]の実行があるので、別途規定されています。 [23] なお、 [CODE(XMLe)@en[[[svg]]]] [[要素]]や [CODE(XMLe)@en[[[math]]]] [[要素]]の中では、 一部の[[統合点]]要素内を除き、 >>11 や >>14 の[[要素名]]の[[要素]]は [[SVG]] や [[MathML]] の[[要素]]として扱われ、通常の[[要素]]同様に構文解析されます。これらは[[生テキスト要素]]ではありません。 * 歴史 ** HTML が SGML 応用と信じられていた時代 [1] [[HTML]] の太古の[[要素型]]である [CODE(HTMLe)@en[[[xmp]]]] と [CODE(HTMLe)@en[[[listing]]]] は、[[開始タグ]]以後、 対応する[[終了タグ]] ([CODE(HTMLe)@en[[[xmp]]]] なら [CODE(HTML)@en[]]、 [CODE(HTMLe)@en[[[listing]]]] なら [CODE(HTML)@en[]]) 以外のすべての[[マーク]]を[[認知]]''しません''。 このような[[要素]]の[[内容]]の[[マーク]]の解釈に関する性質を [DFN@en[HTML-CDATA]] と (勝手に) 呼んでいます。 [2] [[SGML]] の[[要素]]の[[内容]]の[[マーク]]の解釈の方法としての [CODE(SGML)@en[[[CDATA]]]] も[[開始タグ]]以後ほとんどの[[マーク]]の[[認知]]を中止しますが、 [[開始タグ]]と同じ[[要素型名]]が入った[[終了タグ]]でなくても (例えば[[空タグ]] [CODE(SGML)@en[]] であっても) そこで終わりとみなされます。ですから、 [CODE(HTML)@en[... <em>aaa</em> ...]] は [[SGML]] 的には本来許されないのです。 [3] [[HTML]] の [[SGML]] 化にあたってこれが問題になり、 [CODE(HTMLe)@en[[[xmp]]]] と [CODE(HTMLe)@en[[[listing]]]] は使わないことになりました。同じような[[要素型]]として [CODE(HTMLe)@en[[[pre]]]] が追加されましたが、 こちらは [CODE@en[HTML-CDATA]] でも [[SGML]] の [CODE(SGML)@en[[[CDATA]]]] でもなく、普通の[[内容]]を持つものとして定義されました。 [4] ただし、 [CODE(HTMLe)@en[[[xmp]]]] と [CODE(HTMLe)@en[[[listing]]]] も[[後方互換性]]のために仕様から削除されずに残りました。 [[HTML 2.0]] ([[RFC 1866]] : [[IETF]] [[提案標準]] = 当時) では [CODE(HTMLe)@en[[[xmp]]]] と [CODE(HTMLe)@en[[[listing]]]] は正式には [[SGML]] の [CODE(SGML)@en[[[CDATA]]]] として規定されていましたが、以前からの [CODE@en[HTML-CDATA]] としての解釈も説明されていました。 [WEAK[([[HTML 2.0]] は [[SGML応用]]だったので、 [[SGML]] 違反を正式に規定するわけにはいきませんでした。)]] [CODE(HTMLe)@en[[[xmp]]]] と [CODE(HTMLe)@en[[[listing]]]] はその後 [[HTML 2.x]] ([[RFC 2070]] : [[IETF]] [[提案標準]] = 当時) と [[HTML 3.2]] ([[W3C]] [[勧告]]) にもそのまま残りましたが、 [[HTML 4.0]] ([[W3C]] [[勧告]]) で完全に削除されました。 [5] 仕様上は >>4 のような状況でしたが、 [[Webブラウザ]]の実装は元の [CODE@en[HTML-CDATA]] のままでした。 [CODE(HTMLe)@en[[[xmp]]]] や [CODE(HTMLe)@en[[[listing]]]] を使った[[文書]]は [CODE(HTMLe)@en[[[pre]]]] の登場以後皆無といってよいのですが、 それ以前の[[文書]]との互換性のために現在でも [[SGML]] に基づく [[HTML]] の仕様は無視されています。 メモ: そろそろ思い切って削除してしまってもよさそうなものですが、 主要な [[Webブラウザ]]で一度実装した[[要素型]]への対応を削除した例はほとんどありません。 [6] [CODE(HTMLe)@en[[[plaintext]]]] [[要素型]]も [[HTML-CDATA]] で実装されることがあります。この[[要素型]]の[[タグ]]は元々 [[HTML]] ではなく[[平文]]として以後解釈するべきことを示すもので、 当然[[終了タグ]]は存在しませんでした。 もちろん [[SGML]] としても微妙な存在です。 それがいつのまにか、他の[[要素型]]と同じように[[終了タグ]]を[[認知]]する [[Webブラウザ]]が登場しました。しかしすべての [[Webブラウザ]]がそれに追随したわけではありませんから、 [[終了タグ]]を[[認知]]する [[Webブラウザ]]としない [[Webブラウザ]]が混在しています。 [7] [CODE(HTMLe)@en[[[title]]]] [[要素型]]も微妙な存在です。 [CODE(HTMLe)@en[[[title]]]] [[要素型]]は [[HTML]] が [[SGML]] によって定義されるようになる前から存在していました。 その時は[[実体参照]]や[[文字参照]]もありませんでした。 そして [CODE(HTMLe)@en[[[title]]]] 内に[[マーク]]を入れることなど考えられなかったので、 [CODE(HTMLe)@en[[[title]]]] の[[開始タグ]]と[[終了タグ]]の間をそのまま題名として表示するように実装されていました。 [[SGML]] が意識されるようになって状況は徐々に変化していきました。 [[Webブラウザ]]によって[[文字参照]]や[[実体参照]]を解釈したり、 [[注釈宣言]]を解釈したりするようにもなりました。 [[空白]]の取扱いも他の[[要素型]]と同じようになっていきました。 [[開始タグ]]や[[終了タグ]]があっても (他の文脈と同じように、未知のものとして) 無視するブラウザも出てきました。しかし、 このような変化は一斉に起こったものではなく、現在も実装間で統一されていません。 ** HTML5 [20] [[HTML5]] によって [[HTML]] は [[SGML]] ではないと明確にされ、 独自の構文解析算法と構文の定義がなされました。その中でこれまで [CODE(SGML)@en[[[CDATA]]]] と呼ばれていた[[要素]]の種類には[[生テキスト要素]]という呼称が与えられました。 [REFS[ - [8] [CITE[IRC logs: freenode / #whatwg / 20091019]] ([TIME[2009-12-11 02:05:00 +09:00]] 版) ]REFS] * 関連 [18] [[SGML]] では[[内容モデル]] [CODE(SGML)@en[[[CDATA]]]] が規定されており、 [[HTML]] の[[生テキスト要素]]もそれに由来するようです。実際 [[HTML]] が[[SGML応用]]と信じられていた頃、[[生テキスト要素]]は [[DTD]] 上で [CODE(SGML)@en[[[CDATA]]]] と定義されていました。 [[HTML]] の[[生テキスト要素]]は当該[[要素]]の[[終了タグ]]以外どんな[[テキスト]]も[[内容]]として含めることができますが、 [[SGML]] の [[CDATA]] では[[終了タグ]]として[[認知]]され得る[[文字列]]を含めることは (現在[[開いている要素]]と[[要素型名]]が異なっていたとしても) できないとされていました。 [19] [[HTML]] では類似した概念として[[RCDATA要素]]があります。 こちらも[[生テキスト要素]]と同じように[[タグ]]を認識しませんが、[[文字参照]]は使うことができます。 [21] [CODE(HTMLe)@en[[[listing]]]] [[要素]]は、かつては [CODE(HTMLe)@en[[[xmp]]]] [[要素]]と同じように [CODE(SGML)@en[[[CDATA]]]] であるとされていましたが、 いつからか違った扱いをされるようになっており、現在の [[HTML]] の[[構文解析算法]]では [CODE(HTMLe)@en[[[pre]]]] と同じように (ほとんど普通の[[要素]]として) 扱われています。 つまり、[[タグ]]も[[文字参照]]も使うことができる[[要素]]になっています。 [22] [CODE(HTMLe)@en[[[plaintext]]]] [[要素]]は[[終了タグ]]も含めてすべての[[タグ]]や[[文字参照]]を認識せずに[[テキスト]]とみなします。 この[[要素]]は[[適合]]しないため、特に分類名は与えられていません。