2005-12-18 Sun

RSS 1.0で全文配信

先日「RSSとWebの関係を考える」という記事を読んで、当サイトの RSS について試行錯誤していました。今までは「RSS 0.91 & RSS 1.0 スキン」をそのまま使用していたのですが、どうも RSS も全文配信した方がいいのかなぁ、という気になってきました。

そもそもなぜ標準でついてくる RSS 2.0 のスキンを使用していないかというと、僕が HTML の勉強をした時に猛烈に参考にした「The Web KANZAKI」さんが、RSS 1.0 を推奨していたからなんですね。後は全文配信したくなかった*1、というのもあります。全文配信しちゃうと、サイトに来てくれる人が少なくなるな、と思ったんです。が、もともと人少ないし、僕自身は Bloglines を利用しているのですが、つよく魅かれた記事は、サイト上で読んでいるんですね。なぜそうするのか自分でもよくわかりませんが。

つまり、どういう形で配信しようが、サイトに人が来ないのはデータの形式ではなく、記事がおもしろくないからだ、という当たり前のことにようやく気付いたわけです。で、RSS に全文含ませようとしたですが、RSS 1.0 は HTML タグを「<description>」内に含むことができません。ならば RSS 2.0 か ATOM を使えばいいのですが、原理主義的観点から、スキンとテンプレートを削除していました。インポートすればいいのですが、なんかそれも悔しいので、「<%syndicate_description(500)%>」とかにして、とにかく文字数を増やしたのですが、続きの部分はこれでは表示できません。そういうプラグインもあったのですが、この変数を使うとタグが全て除去されるため、猛烈に可読性が落ちます。で、RSS 1.0 で全文配信する方法を探していたのですが、その答えも「The Web KANZAKI」さんが「RSS(RDF Site Summary)によるサイト情報の要約と公開」という記事で書いてくれていました。それをふまえて、もともと配付されている RSS 1.0 スキンを、全文配信を可能にした形に修正しました。

以下の修正はもちろん Nucleus 専用ですが、下線部を追記すれば HTML のコードを RSS に埋め込むことが可能になります。

「feeds/rss10」スキン

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns="http://purl.org/rss/1.0/" xml:lang="ja"
 xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel rdf:about="<%blogsetting(url)%>">
    <title><%blogsetting(name)%></title>
    <link><%blogsetting(url)%></link>
    <description><%blogsetting(desc)%></description>
    <dc:language>ja</dc:language>
  <items>
   <rdf:Seq>
    <%blog(feeds/rss10/rdfli,10)%>
   </rdf:Seq>
  </items>
  </channel>
    <%blog(feeds/rss10/entries,10)%>
</rdf:RDF>

「feeds/rss10/entries」テンプレート

<item rdf:about="<%blogurl%><%category%>/<%Permalink(name)%>.html">
 <title><%syndicate_title%></title>
 <link><%blogurl%><%category%>/<%Permalink(name)%>.html</link>
 <description><%syndicate_description(500)%></description>
 <content:encoded><![CDATA[<%body%><%more%>]]></content:encoded>
 <dc:subject><%category%></dc:subject>
 <dc:creator><%author(realname)%></dc:creator>
<dc:date><%date(%Y-%m-%d)%>T<%time(%H:%M:%S)%>+09:00</dc:date>
</item>

以上で Content モジュールに対応している RSS リーダーなら、「<description>」よりも「<content:encoded>」の方が優先されて表示されるはずです。Safari RSS や Bloglines は対応しているようですね。

神崎さんが書かれていますが、この時の img 要素やリンク先は絶対パスにする必要があるようです。僕はもともと絶対パスを用いていたので問題ない、と思っていたのですが、意外な落とし穴が。注釈をつけるのに大活躍しているプラグイン「NP_FootNote」が生成するリンクが、相対パスなんですね。これはもうはっきりいって因縁といいますか。注釈をつけるのにいちいち絶対パスにしている人の方が少ないですよね。しかし、「Feed Validator for Atom and RSS」で注意されるのも癪に障るので、プラグインを改造しました。が、僕は「NP_Permalink」を使用しているので、別のプラグインから Permalink を呼び出すのは結構大変です。というわけで、リンクをなくすことにしました。頑張って絶対リンクを生成するようにプラグインを修正しました。「NP_Permalink|導入まとめ」のトラックバック対応に記述した内容を、NP_FootNote にも記述する事で実現できます。注釈の番号に title 属性を埋め込んで、そこに注釈文を表示するようにしています。

NP_FootNote の footnote 関数を方を以下のように修正。

function footnote($matches){
	global $i, $id, $notelist;
	$i++;
	if($this->getOption('CreateTitle') == 'yes'){
		$fnote2 = strip_tags($matches[1]);
		$fnote2 = preg_replace('/\r\n/s','',$fnote2);
		$fnote2 = ' title="'.$fnote2.'"';
	}else{
		$fnote2 = '';
	}
//pushman
	$result = sql_query('SELECT name FROM ' . sql_table('plugin_permalink') . ' WHERE (itemid = ' . intval($id) . ')');

	if (mysql_num_rows($result) > 0) {
		$object = mysql_fetch_object($result);
		$name = $object->name;
	}

	$query = "SELECT cname "
			 . "FROM ".sql_table('item').", ".sql_table('category')." "
			 . "WHERE icat=catid "
			 . "AND inumber=$id";

	$results = mysql_query($query);
	$row = mysql_fetch_assoc($results);
	$cname = $row['cname'];
//namhsup
	$uri = 'http://blog.heartfield-web.com/'.$cname.'/'.$name.'.html';
	$note = '<span id="footnoteID'.$id.'-'.$i.'f"'.$fnote2.' class="footnote"><a href="'.$uri.'#footnoteID'.$id.'-'.$i.'">*'.$i.'</a></span>';
	$notelist[] = '<li id="footnoteID'.$id.'-'.$i.'"><a href="'.$uri.'#footnoteID'.$id.'-'.$i.'f">*'.$i.'</a>:'.$matches[1].'</li>';
	return $note;

NP_Permalink を利用していない場合は「pushman〜namhsup」の間は不要です。「$uri」をサイトの形式に合わせて作り替えてください。

記事の要約を配信する前に、もっと記事自体を要約する必要があることを痛感する長ーい記事なってしまいました。

ついでなんですが、先日作成した「pushman's Clip」も独立した RSS として配信しました。ソーシャルブックマークとは全然違いますが、はてなブックマークと同じように RSS も配信できるかな? という好奇心で作成してまみした。あまり感度はよくないアンテナですが、とりあえず気になったものを記録していますので、興味のある方は「pushman's Clip RSS」も登録してみてください。

  1. *1 - アサマシイ理由です(笑)。

2005-12-18 Sun by pushman - Category: Nucleus
Keyword: /
Comment: 4 - TrackBack: 0

このページの先頭に戻る

「RSS 1.0で全文配信」へのツイート

「RSS 1.0で全文配信」へのトラックバック

TrackBack URL:

「RSS 1.0で全文配信」へのコメント

Tori (旧smallstar) wrote...

RSSの配信は迷いますよね全文にするか一部にするか、画像は付けるべきか否かと。。。うちも悩んだあげくに全文画像無しにしてます。
NucleusのRSS 1.0って全文にするのに改造いるのかー、勉強になります。

2005-12-18 Sun 16:51

pushman wrote...

Tori さん
こんにちは。なんかみんなの意見を聞いても、いいものはできない典型といいますか(笑)。人によっては全文配信して欲しくない人もいるでしょうしね。そういう意味では、複数の選択肢を提供するべきなのかも知れませんが、そうなると今度は管理が…(笑)。

NucleusのRSS 1.0って全文にするのに改造いるのかー、勉強になります。

えーっと(笑)、多分です。基礎が無いので自信がないですが、Valideter が「合格」と言ってくれてるので問題はないと思います(笑)。

当分これで落ち着くと思ったのですが、そう簡単ではないようです。「<![CDATA[]]>」内の実体参照がエラーの原因になるとかで。詳しくはわかりませんが、この記事のよう HTML のタグなどを実体参照で表示していると、ブラウザでは文字列として扱われるのに、本当のタグだと解釈される場合があるそうです。じっさい、Bulkfeeds で見たところ、<pre><code></code></pre>の中が消えたりしていました…

ちょっとこれは、僕ではちんぷんかんぷんですので、見なかったことにしてます(笑)。

2005-12-18 Sun 17:22

Tori wrote...

こんばん~
管理はがんばるにしても、複数あるとわかりにくいですからね来てくれる人も自分も、、、うちはRSS、ATM、RSSのCOMMENT版すでに3個あったりするのでこれ以上増えるとなにがなにやら。

Valideterでのチェックとかシッカリやってるのですね、うちもやんなky・・・。
はは、わからないことは闇に葬るのが一番ですね。。。

2005-12-18 Sun 23:11

pushman wrote...

Tori さん
こんにちはー。

僕も以前のサイトではありとあらゆる Feed を提供していました。誰にも利用されていませんでしたが(笑)。

Valideter でのチェックは結構してます。XHTML も CSS も。意図する表示にならない最大の原因は、構文エラーだったりするので。RSS も頻繁ではないですがチェックしてますね。合格しているから大丈夫、とは思いませんが、少なくとも一つの指標にはなりますので。特に僕のように基本的なことを知らない場合は、エラーメッセージも勉強になります。

とはいえ、わからないことは放置するんですけどね(笑)。

2005-12-19 Mon 12:40





このページの先頭に戻る