txqz memo

Atom1.0仕様メモ

RFC4287のまとめ。並行してAtomPP(APP)のドラフト14もまとめたのだけれども、RFC4287のほうは日本語訳があった。APPドキュメントの新しめの日本語訳が見当たらなかったのでRFC4287の日本語訳はろくに探さずに自分で訳してメモっていたのだけれども、実はRFC4287の日本語訳はすでに公開されていた。まぁ英語の勉強だということで。

overview

押さえておきたいのはIRIという概念について。URLはURIであり、絶対URIはIRIである。IRIはi18nされていて、日本語も普通に使える。URIであってURLでないものは、たとえば書籍に付されるISBNコードやid要素で使われることがあるUUIDなど。HTTP通信をするときは、HTTPはIRIを使えないので適切にIRIをURLに置換する必要がある。

コンストラクト

Text, Person, Dateという3つのコンストラクトがある。

「コンストラクト」は、複数の要素に共通する子要素や属性の定義をまとめたものという理解でいいのかな。この後出てくるauthor要素contibuter要素Personコンストラクトだが、これは違う言葉で言うと「authorクラスはPersonクラスを継承している」と同じ意味か?

Textコンストラクト

人間が読めるテキストで、それゆえ言語依存性がある (xml:lang要素の指定が重要)。

このコンストラクトの要素はtype属性を持てる。type属性の値はtext,html,xhtmlのいずれかで、値が"text"または"html"の場合は子要素を持てない。要素の中身は全て文字列になる。htmlを指定した場合はHTMLのタグを実体参照させる。これならHTMLがXML的に整形式になっていなくても安心。

仕様書の例を見ると、&lt;em>のように">"を実体参照にしていない。確かに"<"さえエスケープしておけばパース上は問題ないとはいえ、どうも見た目がしっくりこない。まぁ、">"を"&gt;"に置換する瞬間も惜しいこともあるかもしれないけど。

type属性の値が"xhtml"の場合は、子要素はxhtml:div要素となる。直下にテキストは置けず、全てxhtml:div要素の子孫要素となる。XHTMLの文法に妥当な範囲で、XHTML名前空間下の任意の要素を置ける。XHTML名前空間の宣言はTextコンストラクタの要素で行っても良いし、Textコンストラクタの要素の子要素(xhtml:div要素)で行っても良い。とくにXHTMLブロックがFeed中に1回しか登場しないなら後者のほうがすっきり書ける。

Textコンストラクタの要素でXHTML名前空間を宣言する例
<title type="xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml">
   <xhtml:div>
       Less: <xhtml:em> &lt; </xhtml:em>
   </xhtml:div>
</title>
Textコンストラクタの要素の子要素でXHTML名前空間を宣言する例
<summary type="xhtml">
   <div xmlns="http://www.w3.org/1999/xhtml">
       This is <b>XHTML</b> content.
   </div>
</summary>

Personコンストラクト

Dateコンストラクト

たとえば、以下のような文字列表現はすべて正しい:

<updated>2003-12-13T18:30:02Z</updated>
<updated>2003-12-13T18:30:02.25Z</updated>
<updated>2003-12-13T18:30:02+01:00</updated>
<updated>2003-12-13T18:30:02.25+01:00</updated>

Atom要素の定義

feed

子要素説明コンストラクト登場パタン
author著者名Person1個以上。ただし、すべてのentry要素がauthor要素を持っているなら、0個でもよい
categoryカテゴリ0個以上
contributer貢献した人Person0個以上
generatorフィードを生成したもの0個か1個
iconフィードのアイコンのIRI0個か1個
id識別IRI1個
linkフィードへのリンク0個以上。ただし、rel="self"なlink要素が1つあるべき。AtomフィードをあらわすAtomフィード文書を取り出すためのURIとして使われる。rel="alternate"なlink要素でtype属性とhreflang属性の値が同じものは2つ以上存在してはならない (他言語版代替文書は1言語につき1つまで)
logoフィードのロゴ画像のIRI0個か1個
rights権利情報Text0個か1個
subtitleサブタイトルやフィードの説明Text0個か1個
titleフィードのタイトルText1個
updated重要な更新がされた日時Date1個
(任意の独自拡張要素)0個以上
entryエントリ0個以上

entry

子要素説明コンストラクト登場パタン
author著者名Person1個以上。ただし、feed要素直下にauthor要素がある場合や、子のsource要素がauthor要素を持っているなら、0個でもよい
categoryカテゴリ0個以上
contentエントリのコンテンツかコンテンツへのリンクText0個か1個
contributer貢献した人Person0個以上
id識別IRI1個
linkエントリへのリンク0個以上。ただし、(HTML版へのリンクを表すような) rel="alternate"なlink要素が1つあるべき。AtomフィードをあらわすAtomフィード文書を取り出すためのURIとして使われる。rel="alternate"なlink要素でtype属性とhreflang属性の値が同じものは2つ以上存在してはならない (他言語版代替文書は1言語につき1つまで)
published初出日時Date0個か1個
rights権利情報Text0個か1個
sourceentryに紐付けられているfeedの情報0個か1個
summary要約Text0個か1個。ただし、content要素にsrc属性が指定されている場合か、content要素のtype属性がtext/*や*/xml,*/*+xmlでない場合は1個必要。entryの指す先がhuman-readableな形式でないなら、要約が必須ということ
titleエントリのタイトルText1個
updated重要な更新がされた日時Date1個
(任意の独自拡張要素)0個以上

content

type属性とsrc属性を取る。type属性の値はtext, html, xhtml またはmediatype値で、mediatype値の場合はコンテンツを表すURIをsrc属性に記述する。

子要素はtype属性値がtextかhtmlの場合はテキストのみ。xhtmlの場合はxhtml:div要素。mediatype値の場合はテキストか任意の要素が0個以上。

content要素処理の実装

最初に適用されるルールに則って処理をする。

  1. type="text"のときは子要素はテキストである。空白文字や改行文字を無視して表示してもよい。
  2. type="html"のときは子要素は実体参照されたテキストである。適宜HTMLを利用して表示する。実体参照は展開する
  3. type="xhtml"のときは子要素はxhtml:divが1つである。適宜XHTMLを利用して表示する。実体参照は展開しない
  4. type属性の値がRFC3023で定義されるメディアタイプのときか*/*+xml、*/xmlなら、指定されたメディアタイプで定義される要素を子要素に持てる。src属性が指定されていないなら、直下には指定されたタイプのXML文書のルート要素が来る
  5. type属性の値が"text/"で始まるときは、子要素はテキストのみ
  6. 以上に該当しない場合は、content要素の中身はRFC3548によってBase64エンコーディングされた文字列である。先頭の空白文字は無視する。改行文字(U+000A)で行を分ける

author

category

属性名取りうる値登場パタン捕捉
termテキスト必須カテゴリを表す文字列
schemeURI任意分類スキームを表す (カテゴリの名前空間?)
labelテキスト任意human-readableなラベル。言語依存性あり。実体参照は展開してテキストとして扱う

Atomのcategory要素とURI参照が参考になる。

contributer

generator

icon

フィードを象徴するアイコン画像のURI。画像の大きさは1:1であって、小さいサイズでも中身がわかるものがよい。

id

id要素値生成の方針

属性名取りうる値登場パタンと捕捉
hrefIRI必須
relalternate代替リソース省略時はalternateとみなす
related関連リソース
self自分自身
enclosureサイズの大きい特別な関連リソース
via情報元
typeメディアタイプ値
hreflangRFC3066で定義された言語タグ(en-USとかja-JPとか)rel="alternate"と一緒に使われたときは、ここで示された言語による翻訳であることを暗示する
titlehuman-readableな情報。言語依存性がある実体参照は展開してテキストとして扱う
lengthリンクされたコンテンツのオクテット長

logo

フィードを象徴するビジュアル識別子となる画像。2:1の横長画像であるべき

published

rights

source

entryをあるfeedから他のfeedに複製するときに、entryに付随させておくべき元feedの情報を表す。

子要素説明コンストラクト登場パタン
author著者名Person1個以上。ただし、すべてのentry要素がauthor要素を持っているなら、0個でもよい
categoryカテゴリ0個以上
contributer貢献した人Person0個以上
generatorフィードを生成したもの0個か1個
iconフィードのアイコンのIRI0個か1個
id識別IRI1個
linkフィードへのリンク0個以上。ただし、rel="self"なlink要素が1つあるべき。AtomフィードをあらわすAtomフィード文書を取り出すためのURIとして使われる。rel="alternate"なlink要素でtype属性とhreflang属性の値が同じものは2つ以上存在してはならない (他言語版代替文書は1言語につき1つまで)
logoフィードのロゴ画像のIRI0個か1個
rights権利情報Text0個か1個
subtitleサブタイトルやフィードの説明Text0個か1個
titleフィードのタイトルText1個
updated重要な更新がされた日時Date1個
(任意の独自拡張要素)0個以上

subtitle

human-readableなフィードの説明やサブタイトル。いわゆるタグラインか?

summary

title

updated