Enhanced Feed Preview 0.1 公開2007年01月16日 23時14分

Another 朝顔日記 - Enhanced Feed Preview」で提案されていた Firefox の拡張機能、Enhanced Feed Preview を作成、公開しました。Firefox 2 ではフィードを表示する際組み込みのプレビュー画面が用いられますが、この拡張を使うとフィードが製作者スタイルシートを持っていればそれを使って表示するようになります。

[Enhanced Feed Preview のフィードの通知画面] [Enhanced Feed Preview の設定画面]

このバージョン 0.1 はベータ版です。メニュー項目名など改善案があればどんどんお寄せください。ある程度機能、UI が固まったら 1.0 として Firefox Add-ons にも登録するつもりです。なお、現時点では日本語ロケールしか含まれていません。

Enhanced Feed Preview 0.1

通知バーのラベルが「このフィードを購読する」となっていますが、「フィードを表示しています」のほうがいいような気がしてきたので、次バージョンではそうします。

専用ページを作成したので以降のバージョンはそちらでどうぞ。

バックエンドはどうすればいいのかわかっていたのですぐできましたが、UI の作成に手間取りました。しかしリストに登録されているフィードにはメッセージを表示しないって、それはホワイトリストではなくブラックリストではありませんか?

それにしても Firefox 2 にして以来、通知バーの上部が切れて表示されるのが不恰好です。機能上は問題ないので探していませんが、すでにバグは立っているのでしょうか。

Enhanced Feed Preview 0.2 公開2007年01月18日 21時35分

先日公開した Enhanced Feed Preview を 0.2 に更新しました。相変わらずベータ版です。ついでに専用ページも作りました。

Enhanced Feed Preview 0.2

  • メッセージ、メニュー項目などを一部変更。
  • 拡張のアイコンの追加。
  • 通知バーを表示したまま再読み込みすると動作しなくなる不具合を修正。
  • アプリケーション選択ダイアログのタイトルを修正。
  • trunk に対応。
  • 英語 (en-US) ロケールの追加。

auto-discovery - Mozilla Firefox Thunderbird の拡張あれこれ-MEMO」にて Sage のコンテキストメニューが動作しなくなるという報告がありましたが、こちらでは再現できなかったため、何も対策を講じていません。

なお、通常の Firefox において、種類の異なるフィードがひとつずつあるときに、その中のひとつしかフィードプレビューで表示されないのは仕様です。この場合、各フィードの内容は同じで単にフォーマットが異なるだけと考えられます。内容が同じものをわざわざ選ばせるのは利用者を混乱させるだけなので、Firefox が気を利かせて (?) 自動的にひとつ選んでくれるというわけです。同じ種類のフィードが複数あればそれらは内容が異なるとみなされ、すべてのフィードから選択するためのポップアップメニューが表示されます。Firefox のフィードアイコンのメニュー」にてまとめなおしました。

また、MIME タイプ application/atom+xml は RFC 4287 で定義された正式なものです。Atom フィードの MIME タイプを application/rss+xml としてはいけません。

Firefox のフィードアイコンのメニュー2007年01月19日 18時46分

気づいたら「Another 朝顔日記 - Re:複数のフィードと Mime タイプ」で補足してくださっているのですが、せっかくいろいろと調べて長々と書いたものをこのままハードディスクの肥やしにするのも惜しいので、蛇足ながら以下書き上げたまま掲載します。

複数のフィードと Mime タイプ - Mozilla Firefox Thunderbird の拡張あれこれ-MEMO」に関して。前回はひとつの記事内で書いたので混乱を招いてしまったようですが、「なお、通常の Firefox において」以下は Enhanced Feed Preview とは関係ない、素の Firefox のロケーションバーのフィードアイコンの動作について述べたつもりでした。ですが私自身調査が及ばず誤ったことを書いていたので、ここにまとめなおしたいと思います。

ある Web ページ中にフィードを参照する link 要素が含まれる (以下「ページがフィードを持つ」と表現します) 場合、ロケーションバーにフィードアイコンが現れます。ページがフィードをひとつだけ持つときは、フィードアイコンをクリックするとそのフィードがプレビュー表示されます。

さて、問題となるのはページが複数のフィードを持つ場合ですが、ここでフィードアイコンをクリックしたときの動作は Firefox 2 と trunk (Minefield) で異なります。trunk の場合は単純にすべてのフィードがポップアップメニューに表示され、その中からひとつ選択するとそのフィードがプレビュー表示されます。

そして Firefox 2 の場合ですが、これは種類ごとのフィードの数によって異なってきます。各種類のフィードの数がすべて同じならば、自動的に一種類が選ばれその種類のフィードがポップアップメニューに表示されます (各種類のフィードの数がすべてひとつならば、選ばれたひとつのフィードがプレビュー表示されます)。そうでなければすべてのフィードがポップアップメニューに表示されます。ここで種類というのは link 要素の type 属性により決定されます。同じ RSS であっても type 属性に application/rss+xml と指定されたものと application/xml と指定されたものでは違う種類とみなされます。

たとえば、あるページが Atom フィードを m 個、RSS フィードを n 個持っていたとしましょう。m = n ならば自動的に Atom が選ばれ (種類の選び方についてはここでは触れません)、m 個の Atom フィードがポップアップメニューに表示されます。mn ならば Atom フィード m 個と RSS フィード n 個がすべてポップアップメニューに表示されます。m = n = 1 ならばフィードアイコンをクリックすると Atom フィードがプレビュー表示されます。

どうして複数の中から一種類だけ選ぶのかといえば、利用者を混乱させないためです。複数種類のフィードが同じ数ずつある場合、それらは同じ内容のものが異なるフォーマットで提供されていると考えられます。同じ内容のものを選ばせるのは利用者の手間を増やすばかりなので、Firefox が代わりに重複を取り除いてくれるというわけです。

これが効果的に働いているのが元記事で触れられていた「Carnet Web de Pascal」の場合です。このページは「RSS」「Atom」「RSS-English Only」「Atom-English Only」と四つのフィードを持っていますが、このうち「RSS」と「Atom」、「RSS-English Only」と「Atom-English Only」はそれぞれフォーマットが違うだけで内容は基本的に同じものです。フィードのことをよく知らない人にとって、RSS か Atom かを選べといわれても困惑するばかりでしょうが (ましてやどちらを選んでも同じ内容ならばなおさら)、英語のみかそうでないかを選べというのなら自分の目的にかなったものを選択できるでしょう。

しかし、この方法では Atom で全文提供、RSS でタイトルのみ提供している場合などに、誤って内容の重複と判断されてしまいます。そこで、trunk では Bug 309085 によりこの機能を外し、すべてのフィードがポップアップメニューに表示されるようになっているのです。

Re: Atom の XSLT2007年01月21日 18時30分

Atom の XSLT - Mozilla Firefox Thunderbird の拡張あれこれ-MEMO」について。

XPath 式の中で接頭辞 atom が使われていますが、これに関連付けられた名前空間 URI は古いものです。また、デフォルト名前空間が宣言されておらず、xsl:output 要素の method 属性の値が html となっていますが、この状態だと空要素の終了タグが出力されないなど、出力結果が XML として不正になる可能性があります。application/xhtml+xml として出力するなら、デフォルト名前区間を XHTML にして、method 属性には値 xml を指定したほうがいいでしょう。細かい点ですが XHTML の公開識別子にも誤りがあります。

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns="http://www.w3.org/1999/xhtml"
  version="1.0">
 <xsl:output
  method="xml"
  encoding="utf-8"
  omit-xml-declaration="yes"
  doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
  doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
  indent="yes"
  media-type="application/xhtml+xml"/>

タイトル部分のリンク先が意図したものと異なる点については、XPath 式のマッチが失敗し、生成された a 要素の href 属性の値が空になっているのが原因です。式 "/" にマッチするのは文書ノードであり、ルート要素ノードではありません。カレントノードである文書ノードの子要素はルート要素だけです。ルート要素は atom:link 要素ではないのでマッチに失敗しているのです。

<xsl:template match="/">
 ...
    <a href="{atom:feed/atom:link[@rel='alternate']/@href}">

atom:entry 要素を処理するのに xsl:for-each 要素を使っていますが、xsl:for-each はその内容がテンプレートとなります。元のままでは内容がないため何も生成されません。xsl:template 要素に指定したテンプレートを使いたいときは xsl:apply-templates 要素を使う必要があります。

<xsl:template match="atom:feed">
 <div id="wrapper">
   <xsl:apply-templates select="atom:entry" />
 </div>
</xsl:template>

atom:entry 要素に対するテンプレート内の XPath 式で名前空間が指定されていません。また、xsl:value-of 要素だと単一のテキストノードに変換されてしまうので、atom:content 要素の内容は xsl:copy-of 要素を使い子孫要素も含めてコピーしたほうがいいでしょう。

<xsl:template match="atom:entry">
 <div class="contents">
   ...
   <xsl:copy-of select="atom:content/xhtml:div"/>
 </div>
</xsl:template>

以上をひとつの XSLT 文書にまとめてみました。ただ、私自身 XSLT に触れるのは久々ですし、もっと効率のいい、またはお行儀のいい書き方があるならどなたか教えていただけると幸いです。

Enhanced Feed Preview 1.0 公開2007年01月28日 21時55分

タイトルのままです。Enhanced Feed Preview の正式版を公開しました。

Enhanced Feed Preview 1.0

Firefox Add-ons にも登録を申請しておきました。承認待ちが 200 個近くあるそうなのでいつ承認されるかはわかりませんが。カテゴリをどうすればいいのかわからなかったので、とりあえず NavigationNews Reading にしておきました。承認されました。