[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]] 版)
]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]] 仕様は少し抜けがあるように見えます。)
* 構文解析
[17] [[HTML]] の[[構文解析算法]]においては、
[DFN[[RUBYB[共通生テキスト要素構文解析算法]@en[generic raw text element parsing algorithm]]]]によって
>>11 と >>14 の[[要素]]の構文解析の方法が規定 (>>12) されています。ただし [COCDE(HTMLe)@en[[[script]]]]
については[[スクリプト]]の実行があるので、別途規定されています。
* 歴史
** HTML が SGML 応用と信じられていた時代
[1] [[HTML]] の太古の[[要素型]]である [CODE(HTMLe)@en[[[xmp]]]]
と [CODE(HTMLe)@en[[[listing]]]] は、[[開始タグ]]以後、
対応する[[終了タグ]] ([CODE(HTMLe)@en[[[xmp]]]] なら
[CODE(HTML)@en[[CODE(HTMLe)@en[[[xmp]]]]>]]、
[CODE(HTMLe)@en[[[listing]]]] なら
[CODE(HTML)@en[[CODE(HTMLe)@en[[[listing]]]]>]])
以外のすべての[[マーク]]を[[認知]]''しません''。
このような[[要素]]の[[内容]]の[[マーク]]の解釈に関する性質を
[DFN@en[HTML-CDATA]] と (勝手に) 呼んでいます。
[2]
[[SGML]] の[[要素]]の[[内容]]の[[マーク]]の解釈の方法としての
[CODE(SGML)@en[[[CDATA]]]] も[[開始タグ]]以後ほとんどの[[マーク]]の[[認知]]を中止しますが、
[[開始タグ]]と同じ[[要素型名]]が入った[[終了タグ]]でなくても
(例えば[[空タグ]] [CODE(SGML)@en[>]] であっても)
そこで終わりとみなされます。ですから、
[CODE(HTML)@en[... aaa ...]]
は [[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要素]]があります。
こちらも[[生テキスト要素]]と同じように[[タグ]]を認識しませんが、[[文字参照]]は使うことができます。