[3]
逆に削除された部分をマークする [CODE(HTMLe)[[[del]]]]
要素型も用意されています。
[[XHTML 2]] では[[汎用属性]] [CODE(XHTMLa)[[[edit]]]]
として一般化される見込みです。
[2]
:[[開始タグ]]:必須
:[[終了タグ]]:必須
:[[内容模型]]:[CODE(SGML)[(%[[flow]];)*]] >>4
:出現できる文脈:[CODE(HTMLe)[[[body]]]] 内ほぼどこでも >>4
:[[属性]]:
,[CODE(HTMLe)[[[cite]]]] ,[[URI参照]] ,(なし) ,修正事由 ,[HTML4]
,[CODE(HTMLa)[[[class]]]] , , ,[[級]] ,[HTML4] %[[coreattr]]
,[CODE(HTMLa)[[[datetime]]]] ,[CODE(SGML)[%[[Datetime]]]] ,(なし) ,修正日時 ,[HTML4]
,[CODE(HTMLa)[[[dir]]]] , , ,[[書字方向]] ,[HTML4] %[[i18n]]
,[CODE(HTMLa)[[[id]]]] , , ,一意識別子 ,[HTML4] %coreattr
,[CODE(HTMLa)[[[lang]]]] , , ,[[自然言語]] ,[HTML4] %i18n
,[CODE(HTMLa)[[[xml]]:lang]] , , ,自然言語 ,[XHTML1]
,[CODE(HTMLa)[[[onclick]]]] , , , ,[HTML4] %[[events]]
,[CODE(HTMLa)[[[ondblclick]]]] , , , ,[HTML4] %events
,[CODE(HTMLa)[[[onkeydown]]]] , , , ,[HTML4] %events
,[CODE(HTMLa)[[[onkeypress]]]] , , , ,[HTML4] %events
,[CODE(HTMLa)[[[onkeyup]]]] , , , ,[HTML4] %events
,[CODE(HTMLa)[[[onmousedown]]]] , , , ,[HTML4] %events
,[CODE(HTMLa)[[[onmousemove]]]] , , , ,[HTML4] %events
,[CODE(HTMLa)[[[onmouseout]]]] , , , ,[HTML4] %events
,[CODE(HTMLa)[[[onmouseover]]]] , , , ,[HTML4] %events
,[CODE(HTMLa)[[[onmouseup]]]] , , , ,[HTML4] %events
,[CODE(HTMLa)[[[style]]]] , , ,スタイル情報 ,[HTML4] %coreattr
,[CODE(HTMLa)[[[title]]]] , , ,注釈的題 ,[HTML4] %coreattr
[[#comment]]
** 出現できる文脈と内容模型
[4] [CODE(HTMLe)[ins]] 要素や [CODE(HTMLe)[del]] 要素は [[HTML]] では特殊で、[[ブロック水準要素]]としても[[行内要素]]としても使用できます。
(両方同時にはできません。)
[5]
[CODE(HTMLe)[ins]] 要素や [CODE(HTMLe)[del]] 要素が行内要素として使用されているときには、
ブロック水準要素を[[内容]]とすることはできません。
逆にブロック水準要素として使われているときに行内要素や[[文字データ]]を子供にしてはいけないとは
HTML 4 仕様書には書いてないみたいです。
ただ、仮に [CODE(HTMLe)[ins]] タグや [CODE(HTMLe)[del]] タグを取り去ったときに行内要素や文字データが
[CODE(HTMLe)[body]] 要素の子供になってしまうような場合は問題でしょう。
[6] HTML 4 仕様書にたぶん明確に書かれていないと思いますが、
[CODE(SGML)[%[[flow]]]] な文脈 (ブロック水準要素も行内要素も来得る文脈)
では [CODE(HTMLe)[ins]] 要素や [CODE(HTMLe)[del]]
要素はどのように振る舞うべきかという問題があります。
理想的には、
[PRE(HTML)[
]PRE]
はブロック水準要素として、
[PRE(HTML)[
あいうえおかきくけこさしすせそ
]PRE]
は行内要素として働いて欲しいですが、これを機械的に区別するなら兄弟や子供をチェックしないと決定できません。
[14]
HTML 4 は [CODE(HTMLe)[ins]] と [CODE(HTMLe)[del]] を [CODE(HTMLe)[[[body]]]] 要素型の[[添加要素]]指定に入れています。
このように添加要素を使った [[DTD]] では、
[[空白]]の [[SGML]] 的処理が他の要素とは違ってきます。詳しくは [[SGML//空白]]を参照。
[15]
HTML 4 DTD では [CODE(HTMLe)[body]] で添加されていながらどの要素型でも除外されていないので、 DTD 的には本当にどこにでも
[WEAK[(例えば [CODE(HTMLe)[[[ul]]]] 要素の直下や [CODE(HTMLe)[[[table]]]] 要素の直下や [CODE(HTMLe)[[[legend]]]] 要素の前など。ただし [CODE(HTMLe)[[[img]]]] のような[[強制空要素]]内は不可。)]] にも [CODE(HTMLe)[ins]] や [CODE(HTMLe)[del]] が入って良いことになってしまいます。
仕様書でも特にそれに言及していません。
それでよいのでしょうか。
(添加要素指定を使っていない DTD、例えば XHTML 1 ではこの問題はありません。)
[CODE(HTMLe)[ul]] の直下などは使えて嬉しいこともありそうですが、 [CODE(HTMLe)[ins]] や [CODE(HTMLe)[del]]
の子供に [CODE(HTMLe)[[[li]]]] が来れないので意味がありません。
[16]
>>6 [CODE[%flow]] の問題は [CODE(HTMLe)[li]] などだけかと思っていましたが、それは [[Strict DTD]] での話、
[[Transitional]] 系 DTD では [CODE(HTMLe)[[[body]]]] 要素など色々なところで問題が起こりますね。
[[CSS]] で [CODE(CSS)[[[display]]]] を決定するような処理は不可能。
[[#comment]]
** レンダリング
[10] HTML 4 によれば、 [[UA]] は変更が明らかであるように挿入をレンダリングするべきです。
たとえば、特別な[[フォント]]で表示する方法があると述べられています。
[11] 多くの視覚的 UA では、 [SAMP(CSS)[[[text-decoration]]: [[underline]]]]
な[[既定スタイル]]を持っています。
その他に著者のスタイルシートで広く行われている表現としては、
枠で囲ったり、背景色を変えてみたりされています。
[12] [[テキストブラウザ]]の類では、
引用部の最初と最後に目印となる文字列を入れるものもあります。
[13] [CODE(HTMLe)[ins]] 要素型に対応していない古い[[ブラウザ]]では
[CODE(HTMLe)[ins]] 部分と周りの部分の見分けがつかない表示になってしまうのが普通です。
(ただ、 [CODE(HTMLe)[ins]] 要素はその性質上、
変更点を見たい場合以外は問題にならないでしょう。)
[17]
変更後の文書を見たいときのモード (あるいは代替スタイル) では [CODE(HTMLe)[ins]] は普通に表示し、 [CODE(HTMLe)[del]] はまったく表示しないというのもありでしょう。
逆に、変更前を見たいモードでは
[CODE(HTMLe)[ins]] は非表示で [CODE(HTMLe)[del]] は普通に表示、てな具合。
[18]
[CODE(HTMLa)[datetime]] 属性を使っていれば、何月何日の時点での文書の状態を表示、なんてのもできそうです。
;; もっとも、それだけの版管理を HTML でやってる人がいるかどうか...
[[#comment]]
** 例
[8] (HTML 4 仕様書より):
[PRE(HTML)[
Furthermore, the latest figures from the marketing department
suggest that such practice is on the rise.
]PRE]
[CODE(HTMLa)[datetime]] 属性は修正日時、
[CODE(HTMLa)[cite]] 属性は修正理由の書かれた資源を記述できます。
[9] (HTML 4 仕様書より):
[PRE(HTML)[
Furthermore, the latest figures from the marketing department
suggest that such practice is on the rise.
]PRE]
[CODE(HTMLa)[title]] 属性は修正理由の簡単な説明のために使うことができます。
[7] 不正な例 (HTML 4 仕様書より):
[PRE(HTML)[
...block-level content...
]PRE]
[19]
複数の修正の重なった例:
>
利用者エージェントは、ここをこうしなければなりませんするべきですするように利用者を促さなければなりません。
この例では、第2版における修正を
[CODE[r2]], 第3版における修正を
[CODE[r3]] として分類しています。
この文書のスタイル・シートは次のような感じにするとよさげです。
[CODE(HTMLe)[[[head]]]] 要素内で:
[PRE(HTML)[
<[CODE(HTMLe)[[[link]]]] [CODE(HTMLa)[[[rel]]]]="[CODE(HTML)[[[stylesheet]]]]" [CODE(HTMLa)[[[href]]]]="document-style">
<[CODE(HTMLe)[link]] [CODE(HTMLa)[rel]]="[CODE(HTML)[[[alternate]]]] [CODE(HTML)[stylesheet]]" [CODE(HTMLa)[href]]="rev1-style" [CODE(HTMLa)[[[title]]]]="初版">
<[CODE(HTMLe)[link]] [CODE(HTMLa)[rel]]="[CODE(HTML)[alternate]] [CODE(HTML)[stylesheet]]" [CODE(HTMLa)[href]]="rev2-style" title="第2版">
<[CODE(HTMLe)[link]] [CODE(HTMLa)[rel]]="[CODE(HTML)[stylesheet]]" [CODE(HTMLa)[href]]="rev3-style" title="第3版">
]PRE]
4種類のスタイル・シートのうち、文書全般に関するものを[[持続スタイル]]に、
残りを[[代替スタイル]]にします。
そのうち、最新の版は[[優先スタイル]]にしておきます。
[[CSS]] スタイル・シート [CODE(URI)[rev1-style]] の例:
[PRE(CSS)[
ins {
display: none;
}
del {
display: inline;
}
body > del {
display: block;
}
]PRE]
CSS スタイル・シート [CODE(URI)[rev2-style]] の例:
[PRE(CSS)[
ins {
display: none;
}
ins.r2 {
display: inline;
}
body > ins.r2 {
display: block;
}
del {
display: inline;
}
body > del {
display: block;
}
del.r2, body > del.r2 {
display: none;
}
]PRE]
CSS スタイル・シート [CODE(URI)[rev3-style]] の例:
[PRE(CSS)[
ins {
display: none;
}
ins.r2, ins.r3 {
display: inline;
}
body > ins.r2, body > ins.r3 {
display: block;
}
del {
display: inline;
}
body > del {
display: block;
}
del.r2, body > del.r2,
del.r3, body > del.r3 {
display: none;
}
]PRE]
;; 改訂が多ければ多いほど面倒になっていく・・・ように思えますけど、実際には改訂毎にコピペして新しい方のスタイル・シートに少し付け足すだけで済みます。
;; むしろ面倒なのは、ブロック要素の子供かどうかで [CODE(CSS)[block]] か [CODE(CSS)[inline]] か分けないといけないところ。
[[#comment]]
** メモ
[20] '''どんな時に [CODE(HTMLe)[[[ins]]]] や [CODE(HTMLe)[[[del]]]] を使うのか''':
[CODE(HTMLe)[[[ins]]]] 要素や [CODE(HTMLe)[[[del]]]]
要素を使うと [[HTML]] [[文書]]内の編集履歴を残すことができます。
しかし、 [[HTML]] [[文書]]を編集する時に必ずこれらの要素を使って[[マーク]]しなければならないのでは''ありません''。
例えば[Q[正式]]な仕様書や規則の案であるとか、
書籍の原稿を[[校正]]するとか、
あるいは一旦日付入りで公表した文書に長い時間が経過した後に状況の変化を反映した補足を付けるとか、
変更履歴をわざわざ残すことに価値があると判断できる場合にこれらの要素を使います。
[21]
''不適切な例'': 特に重要な文書の変更案などを除き、
単なる [[typo]] をわざわざ [CODE(HTMLe)[[[del]]]] で
[CODE(HTMLe)[[[ins]]]] で[[マーク]]することは意味がありません。
文書が読みづらくなるだけです。
[22]
''不適切な例'': [[日記]]で、毎日[Q[追記]]していくからといって、
日毎に [CODE(HTMLe)[[[ins]]]] で[[マーク]]するのは間違いです。
[WEAK[(以前の記事に後から新しい情報を補うために使うのは適当です。)]]
[23]
長い文書の一部が修正されている時に
[Q[次の編集箇所へ]]のような機能が利用者エージェントについているとうれしいなあ。
([[名無しさん]])
[[#comment]]
* メモ