SGMLの空白

空白 (SGML)

[1] SGML における空白の取扱いや正規化, 周辺事項について。

XML//空白もあわせて参照されたい。 また、例示は規格参照具象構文又は XML と同じ具象構文を想定する。

また、ここで「空白」はなんとなくそれっぽい意味(謎)で曖昧に使います。 (詳しい意味は抽象構文・具象構文によりますが、 大体の場合は SPACE / RS / RE / SEPCHARSP / 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 も参照。)

RE をデータとするかどうかの判定は、 マークの認知の過程で行う。マークの認知に、 タグの省略の認知を含めて、 (1)〜(3)に従って RE か無視できるかどうかの判定に先立って行う。 この手順では、

  (quote | #PCDATA)*

のように、要素の内容のどこにでもデータが現れ得る通常の場合、 直感に合った結果が得られる。しかしながら、

  (x, #PCDATA)

のように、内容モデルがデータの現れ得る位置に制限を課す場合には、 (1)又は(2)の状況がマークの認知の最中に誤りとなることがある。 このような内容モデルは、通常必要としないので、推奨しない (10.2.4 参照)。

[5] >>3 の例 (JIS X 4151 より):

RS1 record 1 <outer><sub> RE1
RS2 record 2 </sub> RE2
RS3 </outer> record 3 RE3

で、要素 outer について考える。 RE1 及び RS2 は子要素内にあるので、 ここでは考えないことになる。従って、 RE2 が内容の最初の RE である。

さて、 sub が真の部分要素であるなら、 この RE2 はデータとなるが、 添加要素であれば、前にデータも真の部分要素も無いので、 無視される。

要素 sub について、最初の RERE1 である。 その前にはデータも真の部分要素も無いので、無視する。

[6] 添加要素とか真の部分要素とか、なんでこんなややこしい規則があるんだろう?

[21] >>6 参考3 3.3.1 参照。それっぽいことが書いてある。 (処理指令だけの記録を無視するとか。)

[7] >>3 の続き。 RE は、それに続く最初のデータ又は真の部分要素の直前に位置するものとして扱います。 つまり、その間に他のマークがある場合、その後に位置するものとします。 ずなわち、 <e>fooRE<!>bar</e> -> foo<!>REbar, <e>fooRE<add/>bar</e> -> foo<add/>REbar(なんでこんな面倒な規則があるんだろう?)

[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
RSnon-ref</e>

refnon-ref

[26] このわけのわかんない複雑な規則は、 WebSGMLKEEPRSRE YES にしている場合には適用されません。 混合内容中の全ての空白は、 データ文字節としてグローブ中に含まれ、 要素内容中の全ての空白は、 s分離子節としてグローブ中に含まれます。 (K.3.8.2 参照。)

マーク最小化と空白

[3] データタグ雛形内容との照合は、その内容の マーク認知及び参照解決を行った後で、 RS および RE を無視する前に行います。 (6.3.2)

表記の中の空白と正規化

[18] 引数表記には、それ自体には空白と正規化についての規定はありません。

実体参照・文字参照

[15] 文字参照には数値文字参照名前文字参照があります。 前者は常にデータとして、後者は生の文字と同等として扱われます。 (8.5)

例えば、 &ref&#RE;&refRE は同値で、 &ref; とほぼ同じ意味です。 一方、 &ref&#13;&ref;&#13; と同値で、後半は SGML 的な意味を持たない単なる文字 0x0D です。

[28] 名前文字参照は生の文字と同等に機能文字として解釈されますが、 区切子の先頭以外を名前文字参照で表すことはできません。 (名無しさん)

[29] ですから、空白を含む短縮参照の途中に文字参照を使うことも、東漸できません。 (nero の直前で区切れがあると見なされるはずです。) もっとも、短縮参照の一部を文字参照で表そうとするのは普通では考えられないです。 (名無しさん)

短縮参照と空白

[12] 短縮参照について (8.4.6)。

  • 短縮参照が現対応表により一般実体に対応付けてある場合には一般実体に置換しますが、そうでない場合には、
    • 区切子として認知できるなら、分離子 s とみなし、結果無視します (>>2)。
    • できないなら、データとして扱います。

[13] 8.4.6.1 では、同値な参照列が規定されています。 短縮参照を名前実体参照に置換する必要がある時に、 記録が長くなり過ぎないようにするための措置らしいです。

短縮参照に含まれるか否か同値な参照列
RSRE
××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)

内容中の空白の保持 — Web SGML

[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] XMLxml:space 辺りとこの機能が関連しているといえます。

[27] >>25 XML は常に KEEPRSRE YES で、 xml:space は単に応用水準の情報 (構文解析には関係しない) ですから、直接は関係ないですね。 (名無しさん)

メモ

[10] Web SGML
K.2.4.2 空白 (white space)
SEPCHAR, SPACE, RE 及び RS の各機能に割り当てられた文字

[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>