AtomフィードをCSVのテンプレートから作るWebアプリをゆるっと作ってみる。

導入

Twitter凍結騒ぎで一部で話題になった(?)RSSフィードAtomフィード。仕様を知らなかったのでAtom(特に配信フォーマット)を調べてみるついでに作る方もゆるっと実装してみました。

今回調べるにあたってRFC 4287 The Atom Syndication Format 日本語訳を拝見しました。この場を借りてお礼申し上げます。

つくるもの

出力内容文法

Atom配信フォーマットのサブセットをゆるっと定義します。厳密さはほぼほぼ考えていません。ゆるっと。
 \langle\mathit{atom}\rangle::=\langle\mathit{xmldecl}\rangle\langle\mathit{feed}\rangle
 \langle\mathit{xmldecl}\rangle::={\tt < ?xml\ version="1.0"\ encoding="utf-8"? >}
 \langle\mathit{feed}\rangle::={\tt < feed\ xmlns="http:// www .w3.org/2005/Atom" >}\langle\mathit{feedmeta}\rangle\langle\mathit{entries}\rangle{\tt < /feed >}
 \langle\mathit{feedmata}\rangle::=\langle\mathit{author}\rangle\langle\mathit{id}\rangle\langle\mathit{link}\rangle\langle\mathit{title}\rangle\langle\mathit{updated}\rangle
 \langle\mathit{author}\rangle::={\tt < author >< name >}\langle\mathit{string}\rangle{\tt < /name > < /author >}
 \langle\mathit{entries}\rangle::=\langle\mathit{entry}\rangle | \langle\mathit{entry}\rangle\langle\mathit{entries}\rangle
 \langle\mathit{entry}\rangle::={\tt < entry >}\langle\mathit{id}\rangle\langle\mathit{link}\rangle\langle\mathit{title}\rangle\langle\mathit{updated}\rangle\langle\mathit{summary}\rangle{\tt < /entry >}
 \langle\mathit{summary}\rangle::={\tt < summary\ type="}\langle\mathit{type}\rangle{\tt " >}\langle\mathit{string}\rangle{\tt < /summary >}
 \langle\mathit{id}\rangle::={\tt < id >}\langle\mathit{url}\rangle{\tt < /id >}
 \langle\mathit{link}\rangle::={\tt < link\ href="}\langle\mathit{url}\rangle{\tt "/>}
 \langle\mathit{title}\rangle::={\tt < title >}\langle\mathit{string}\rangle{\tt < /title >}
 \langle\mathit{updated}\rangle::= {\tt < updated >}\langle\mathit{date}\rangle{\tt < /updated >}
 \langle\mathit{type}\rangle::= {\tt text} | {\tt html}
 \langle\mathit{string}\rangle::=\mathrm{任意のエスケープ済文字列}
 \langle\mathit{url}\rangle::=\mathrm{URL文字列}
 \langle\mathit{date}\rangle::=\mathrm{YYYY-MM-DDThh:mm:ss+09:00形式の日付}
本来IDはリソースが移転しても同一であることが求められているためURL文字列をそのままIDとするのは不適切ですが……ゆるっと作るためここは無視します。

ユーザ入力検討

文法定義より、feed部の入力要素はauthor, URL(link), title, 日付(updated)の4要素、各entry部の入力要素はURL(link), title, 日付(updated), summary, type(summary)の5要素となりますが、feed部のupdatedはentry部の最新のupdatedをそのまま採用するものとしてユーザ入力はなしとします。

入出力定義

feed部のcsvとentry部のcsvの2入力とし、作成したAtomフィード(.atomファイル)を出力とします。
feed部のcsvはauthor, title, URLの3列からなる1行のcsvファイル、entry部のcsvはtitle, type, summary, URL, updatedの5列からなるn行(n > 0)のcsvファイルとします。

つくった

github.com