岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

hAtomを含むXHTMLをサーバサイドでもAtomテンプレートとして使うのはどうか

Ruptaに続いては、MVCのVに関わるライブラリを作ろうと思っています。

さて、あるリソースについて、さまざまな表現でクライアントに返したいことがあります。単純な例は、コレクションリソースをHTML文書として返したり、Atomフィード文書として返したりするケースです。

上記のような場面で使いやすいライブラリとしてまず浮かぶのは、表現非依存のコレクションリソースオブジェクトでしょう。こんなイメージです。

# コレクションリソースオブジェクトを作る
resources = MyResources.new
resources.title = '岩本隆史の日記帳'
resources.author.name = 'IwamotoTakashi'
...

# リソースオブジェクトを作る
resource = MyResource.new
resource.title = 'hAtomを含むXHTMLをサーバサイドでも云々'
resource.content = '<div><p>どうしたもんかねぇ。</p></div>'
...

# コレクションリソースオブジェクトにリソースオブジェクトを追加する
resources.add(resource)

# 指定の表現形式で返す
case request_format

when REQUEST_FORMAT_HTML
  return resources.html

when REQUEST_FORMAT_ATOM
  return resources.atom

end

Atom形式の文字列を生成する MyResources#atom メソッドの内部実装として考えているのは、hAtomを含むXHTMLXSLTAtom形式に変換する方式です。そのため、MyResources#html メソッドでは、hAtomを含むXHTMLを返します。

MyResources#atom メソッドの内部実装イメージはこんな感じです。

class MyResources
  def atom
    @xslt_processor.transform(self.html, 'hAtom2Atom.xsl')
  end
end

ERBなどのテンプレートやREXMLなどのビルダを使うよりコストが高いでしょうが、セマンティック・ウェブに貢献すべくXHTMLにhAtomを含めるならば、テンプレートを別に持たなくてよいぶん、XSLT変換のほうがDRYに実装できるはずです。

今のところ、そんなことを考えているという話でした。