/homeタイムライン自動更新 ver0.02

以前作った奴の改良版
タイムライン自動更新JavaScript使用中に発言できるようにするJavaScript - 文殊堂
上にスクロールしなくても発言(含むreply)できるようにする - 文殊堂
と併用するといい感じ
タイムライン自動更新JavaScript使用中にエントリ削除できるようにするJavaScript - 文殊堂
との併用はpluginの仕組みがちゃんと出来てからかな。

改良点・変更点は

  • スクレイピング用のdivをdocumentにくっつけるのをやめた
  • .publishedが現在表示されている最新エントリの投稿日時より新しいもののみ追加していたのを、以下のように変更。
    • 取得したエントリから既存のエントリと重複するものをfilteringし、先頭に追加する。
  • ベタでいろいろ書くのをやめ、filtering用関数、filtering後先頭に追加する前に実行する関数、追加後に実行する関数をそれぞれ配列で持つようにし、plugin的に追加できるようなもののプロトを作った
    • 今は無名関数内に書かれているので拡張しようがないが、さっさといい感じのAPIを作りたい
(function($){
	var timeline = $('#container #timeline');
	var filters = [];
	var beforeAppend = [];
	var afterAppend = [];
	filters.push(function(index){
						return $( '#' + $(this).attr('id') ).size() < 1;
					});
	beforeAppend.push(function(){
			$(this).find('img[title^=reply to]').parent()
				.each(function(){
						var replyUserName = $(this).attr('onclick').replace('replyTo(\'','').replace('\');','');
						$(this).attr('onclick','');
						$(this)
							.bind('click',function(){
										$('#status').val(['@',replyUserName,' ',$('#status').val()].join(''));
										$('#status').focus();
										return false;
									});
					});
			});

	(function(){
		var func = arguments.callee;
		$.ajax({
			type:'GET',
			url:'http://twitter.com/home',
			success:function(data){
				var temp = $('<div/>');
				
				// 取得したHTMLから#container内のみ取り出す
				var result = /<div\s+id="container"[^<>]*>/.exec(data);
				var start = result.index + result[0].length;
				var end = data.search(/<!--\s+\/container\s+-->/);
				var container = data.slice(start,end);

				// 一次格納用divに取得したHTMLの#container内を書き出す
				var beforeParse = new Date();
				temp.get(0).innerHTML = container;
				var afterParse = new Date();
				temp = temp.find('#timeline tr.hentry');
				// timelineにすでにある発言をfiltering
				for(var i = 0; i < filters.length; i++){
					temp = temp.filter(filters[i]);
				}
				for(var i = 0; i < beforeAppend.length; i++){
					beforeAppend[i].apply(temp);
				}
				timeline.find('tr.hentry:first')
					.before(temp);
				for(var i = 0; i < afterAppend.length; i++){
					afterAppend[i].apply(temp);
				}
				
			},
			error:function(){
			},
			complete:function(xhr,textStatus){
				setTimeout(func,30*1000);
			}
		});
	})();
})(jQuery);