[1] SGML における空白の取扱いや正規化, 周辺事項について。
XML//空白もあわせて参照されたい。 また、例示は規格参照具象構文又は XML と同じ具象構文を想定する。
また、ここで「空白」はなんとなくそれっぽい意味(謎)で曖昧に使います。
(詳しい意味は抽象構文・具象構文によりますが、
大体の場合は SPACE / RS / RE / SEPCHAR
≒ SP / TAB / CR / LF
と考えて良いでしょう。)
「間隔」は、文字 SPACE
を指します。
WebSGML では、まさに 空白 = SPACE / RS / RE / SEPCHAR
です。 (K.2.4.2)
括弧内の番号などは、 JISX4151 の該当部分です。
[2] 分離子 s
(= SPACE / RE / RS / SEPCHAR ;; (5)
) は無視されます。 (5.2.1)
つまり、
は無視されます。
[3] 内容の中で、 (ISO8879 7.6.1, JIS 6.6.1, 参考 3 3.3.3 も参照。)
RS
はマークとして解釈できなければ無視する。RE
は、
RE
をデータとするかどうかの判定は、 マークの認知の過程で行う。マークの認知に、 タグの省略の認知を含めて、 (1)〜(3)に従ってRE
か無視できるかどうかの判定に先立って行う。 この手順では、(quote | #PCDATA)*
のように、要素の内容のどこにでもデータが現れ得る通常の場合、 直感に合った結果が得られる。しかしながら、
(x, #PCDATA)
のように、内容モデルがデータの現れ得る位置に制限を課す場合には、 (1)又は(2)の状況がマークの認知の最中に誤りとなることがある。 このような内容モデルは、通常必要としないので、推奨しない (10.2.4 参照)。
RS1
record 1 <outer><sub>RE1
RS2
record 2 </sub>RE2
RS3
</outer> record 3RE3
で、要素 outer について考える。
RE1
及び
RS2
は子要素内にあるので、
ここでは考えないことになる。従って、
RE2
が内容の最初の
RE
である。
さて、 sub が真の部分要素であるなら、
この RE2
はデータとなるが、
添加要素であれば、前にデータも真の部分要素も無いので、
無視される。
要素 sub について、最初の RE
は RE1
である。
その前にはデータも真の部分要素も無いので、無視する。
[6] 添加要素とか真の部分要素とか、なんでこんなややこしい規則があるんだろう?
[21] >>6 参考3 3.3.1 参照。それっぽいことが書いてある。 (処理指令だけの記録を無視するとか。)
[7] >>3 の続き。 RE
は、それに続く最初のデータ又は真の部分要素の直前に位置するものとして扱います。
つまり、その間に他のマークがある場合、その後に位置するものとします。
ずなわち、 <e>fooRE
<!>bar</e> -> foo<!>RE
bar,
<e>fooRE
<add/>bar</e> -> foo<add/>RE
bar。
(なんでこんな面倒な規則があるんだろう?)
[22] 参考3 3.3.1 の例で、
<p> 最初のデータ <?処理指令1> <?処理指令2> 最後のデータ </p>
と
<p>最初のデータ <?処理指令1><?処理指令2>最後のデータ</p>
は同値って書いてある。で、 >>7 によれば更に
<p>最初のデータ<?処理指令1><?処理指令2> 最後のデータ</p>
と同値と解釈されるのか?
[8] なお、 >>3-8 で、「データ」として扱うのは通常の意味のデータのほかに、 特定文字データ実体, 非SGML実体, SGML部分文書実体も含んでいます。処理指令実体は含みません。 これについては直感とおおむね一致する動作でしょう。
[9] 参照終了
である RE
は無視されます (8.4.5)。例えば、
<e>&refRE
RS
non-ref</e>
→ refnon-ref
[26] このわけのわかんない複雑な規則は、
WebSGML で KEEPRSRE YES
にしている場合には適用されません。
混合内容中の全ての空白は、
データ文字節としてグローブ中に含まれ、
要素内容中の全ての空白は、
s分離子節としてグローブ中に含まれます。
(K.3.8.2 参照。)
[3] データタグ雛形と内容との照合は、その内容の
マークの認知及び参照の解決を行った後で、
RS
および RE
を無視する前に行います。
(6.3.2)
[15] 文字参照には数値文字参照と名前文字参照があります。 前者は常にデータとして、後者は生の文字と同等として扱われます。 (8.5)
例えば、 &ref&#RE; と
&refRE
は同値で、 &ref; とほぼ同じ意味です。
一方、 &ref は
&ref; と同値で、後半は SGML
的な意味を持たない単なる文字 0x0D
です。
[28] 名前文字参照は生の文字と同等に機能文字として解釈されますが、 区切子の先頭以外を名前文字参照で表すことはできません。 (名無しさん)
[29]
ですから、空白を含む短縮参照の途中に文字参照を使うことも、東漸できません。 (nero
の直前で区切れがあると見なされるはずです。)
もっとも、短縮参照の一部を文字参照で表そうとするのは普通では考えられないです。
(名無しさん)
[13] 8.4.6.1 では、同値な参照列が規定されています。 短縮参照を名前実体参照に置換する必要がある時に、 記録が長くなり過ぎないようにするための措置らしいです。
短縮参照に含まれるか否か | 同値な参照列 | |
RS | RE | |
× | × | ero 名前 refc |
○ | × | RS ero 名前 refc |
× | ○ | ero 名前 RE |
○ | ○ | RS ero 名前 RE |
内容の RS
は無視されるし参照終了の
RE
もデータにならないので本当に同値で、
この変換は影響が無いそうです。
[14] で、次の例でも影響が無いんでしょうか?
<!ENTITY ref "&#RE;something"> ... <e>&#RS;&ref;foo</e> <!-- ここで、 &#RS;&ref; はそれと同値な 短縮参照とします。 -->
う〜ん。。。
[16] 短縮参照の定義では特殊な文字列としてB列があります。
その中では文字 B
が1つの空白に対応します。
詳しくは短縮参照を参照。 (8.6.5)
[24] WebSGML K.3.8.2 では、新しい他機能
KEEPRSRE
を定義しています。
SGML宣言でこの機能を YES
にすると、 ISO8879:1986 7.6.1 == JIS X 4151‐1992
6.6.1 == >>3,>>7 は無視されます。
つまり、混合内容中の全ての空白は、データ文字節としてグローブに含まれ、
要素内容中の全ての空白は、 s分離子節としてグローブに含まれます。
なお、この機能が影響するのは要素内容の空白だけです。 属性値表記などでの規則は変化しません。
[25] XML の xml:space
辺りとこの機能が関連しているといえます。
[27]
>>25 XML は常に KEEPRSRE YES
で、 xml:space
は単に応用水準の情報 (構文解析には関係しない) ですから、直接は関係ないですね。
(名無しさん)
[30] IRC logs: freenode / #whatwg / 20130221 ( ( 版)) <http://krijnhoetmer.nl/irc-logs/whatwg/20130221>
[11] Breaking: stop treating alpha and alphanumeric as mass nouns (annevk著, ) <https://github.com/whatwg/infra/commit/4707bf7b3d8b5b6314ee3dabd29856011eebbb00>