読者です 読者をやめる 読者になる 読者になる

changes.xmlを利用したウェブリングもどき

changes.xmlを使って得たリストを、順にめぐっていけるようなシステムを考えてみる。一言で言えばウェブリングだが、順番が動的(更新順)であること、登録も動的(changes.xmlに載れば登録、消えれば削除)であること、ウェブリング用のリンクを張ってもらえないことを前提にしなければならないこと等々、それなりにある。というわけで、もどき、だ。

はてなダイアリー動的ウェブリング

この中で問題なのは、リング用のリンクを張ってもらえないことである。勝手に登録されるリングなので当たり前なのだが、ウェブリングの要であるリンクがなければ、前後への移動も出来ない。そこで今回は、ブックマークレットを使う。JavaScriptで現在閲覧中のURIを取得し、サーバサイドでURIを照合、リスト上での現在位置を把握し前後へジャンプする。

ブックマークレットによって移動することにより、インターフェイス的な利点も得られる。ブックマークバーの特定の場所をクリックするだけで、どんどん次へ進むことが出来るのだ。これが案外面白い。

PhotoBox用にRingBadgeというユーティリティを公開しており、かなりマイナーだが、私的には結構お気に入りなのだ。ここのソースは、そのロジックとほぼ同じである。

#!/usr/bin/perl -w

use strict;
use Storable 'lock_retrieve';

my $store_file = '/Users/a_aql/Sites/hcx/store.db';
my $about = 'http://aql.osx.cc/hcx/about_ring.html';

# # # # #

my $array = lock_retrieve $store_file;

$ENV{'QUERY_STRING'} = '' unless $ENV{'QUERY_STRING'};
my ($flag, $uri) = $ENV{'QUERY_STRING'} =~ m!^(prev|next):(.*)$!;
$flag = '' unless $flag;
$uri = '' unless $uri;

my $uri_index = '';
if( $flag and $uri ){
	for( my $i = 0; $i <= $#{$array}; $i++ ){
		if( $uri =~ /^$array->[$i]->{uri}/x ){
			$uri_index = $i;
			last;
		}
		else{
			next;
		}
	}
}

if( $flag eq 'prev' ){
	if( $uri_index == 0 or $uri_index eq ''){
		print
			"Location: ",
			$array->[ $#{$array} ]->{uri},
			"?n?n";
	}
	else{
		print
			"Location: ",
			$array->[ $uri_index - 1 ]->{uri},
			"?n?n";
	}
}
elsif( $flag eq 'next' ){
	if( $uri_index == $#{$array} or $uri_index eq '' ){
		print
			"Location: ",
			$array->[ 0 ]->{uri},
			"?n?n";
	}
	else{
		print
			"Location: ",
			$array->[ $uri_index + 1 ]->{uri},
			"?n?n";
	}
}
else{
	print "Location: $about?n?n";
}

exit;

クローラーは前回と同じ。デリファレンスがちょっとみにくいが、そういう構造にしたのだから仕方ないか。もちろんただの配列にURIだけ入れておいて問題ない。