ChumbyでRSSを表示させるテスト

今回は、こんな感じのちょーしょぼいRSSリーダを作ってみた。読み込んだRSSの記事のタイトルと概要を2秒おきに自動で表示していく。

Chumby Wikiのガジェットの例を参考にした。うちにはFlash CSとかいうものが無いので、コンパイルはおろかソースを見ることもできない;;
でも、viでflaファイルを見てみたらバイナリ表示に混じってActionScriptのコードが見れたので、何とかなりそう。
http://wiki.chumby.com/mediawiki/index.php/Sample_RSS_Widget

それにしたって、ソース見れないと厳しいなー。てか、Flash CSなしでどこまで開発できるのかな。限界に挑戦??

ちなみに以下のコードを実行するには↓の記事を参考に。
2009-01-31 - ありの日記

RSSTest.asファイル

class RSSTest {
	// RSSを取得したり、取得したデータを保持したりするクラス
	private var x:XML;
	
    // 現在表示している記事(RSS内のitem要素)のインデックス
	private var itemIndex:Number = -1;
	
	// item要素の配列
	private var gItems:Array;
	
	// 取得するRSSのURL
	private var url = "http://www.chumby.com/rss/recentwidgets";
	
	public function RSSTest() {
		
		// ここで定義した関数はXMLオブジェクトに対して利用する
		/**
		 * 現在のXML要素の子要素からsで指定した要素すべてを取り出し配列で返す.
		 * 2つ目の引数に配列を渡すと、見つかった子要素をそれに追加する。
		 * 
		 * @param s 取得したい子要素の名前 
		 * @param a 追加した配列
		 * @return 見つかった子要素の配列
		 */
		Object.prototype.childrenOfType = function(s,a) {
	        if (a == undefined) {
	                a = new Array();
	        }
	        var n = this.firstChild;
	        while (n) {
	                if (n.nodeName==s) {
	                        a.push(n);
	                }
	                n = n.nextSibling;
	        }
	        return a;
		}
		/**
		 * 現在のXML要素の子要素からsで指定した要素を取り出す.
		 * @param s 取得したい子要素の名前
		 * @return 見つかった子要素(XML)
		 */
		Object.prototype.firstChildOfType = function(s) {
	        var n = this.firstChild;
	        while (n) {
	            if (n.nodeName==s) {
	                    return n;
	            }
	            n = n.nextSibling;
	        }
		    return null;
		}
		/**
		 * 現在のXML要素の子要素からsで指定した要素の値(nodeValue)を取得する.
		 * @param s 値を取得したい子要素の名前
		 * @return 子要素の値
		 */
		Object.prototype.firstValueOfType = function(s) {
	        var n = this.firstChild;
	        while (n) {
	                if (n.nodeName==s) {
	                        return n.firstChild.nodeValue;
	                }
	                n = n.nextSibling;
	        }
	        return null;
		}
		
		// XMLを初期化
        this.x = new XML();	
		
	}
	
	function run() {
        
        // テキストフォーマット
	    _root.format = new TextFormat();
	    _root.format.font = "_typewriter"; // これをやっとかないと日本語の記事が正しく表示されない
	    _root.format.size = 20;
	    
	    // URL表示部分のテキストフィールド
        _root.createTextField("url", 2, 20, 20, 400, 30);
	    _root.url.text = this.url;
	    _root.url.selectable = true;
	    
	    // RSSのタイトル部分のテキストフィールド
        _root.createTextField("title", 3, 20, 50, 300, 30);
	    _root.title.border = true;
        
        // RSSのディスクリプション部分のテキストフィールド
		_root.createTextField("t",4,20,100,300,200);
		_root.t.multiline = true;
	    _root.t.border = true;
	    _root.t.wordWrap = true;
	    
	    var index = this.itemIndex;
	    var g_items = this.gItems;
	    var obj = this;
	    
	    // ロード(指定したURLを取得)し終わった時の動作
        this.x.onLoad = function(success:Boolean) {
        	// リクエストが正常に終了した場合
        	if (success) {
	        	var rss = this.firstChildOfType('rss'); // RSSの一番親になる要素
	        	var channel = rss.firstChildOfType('channel'); // rssの内側の要素
	        	obj.gItems = channel.childrenOfType('item'); // RSSの記事の部分
	        	
				var timeOut = (new Date()).getTime(); // 現在の時間を保存
				
				// onEnterFrameは一秒後とに呼び出される関数
				_root.onEnterFrame = function() {
					// timeOutで指定した時間を越えたら表示を更新する
					if (timeOut < (new Date()).getTime()) {
						// 表示を更新する
						obj.showItem.call(obj);
						// 次の表示までの時間(ミリ秒)を設定
						// ここでは2秒おきに表示を更新する
						timeOut += 2000;
					}
				}
        	}
        }
        // XMLをロードする(リクエスト)
        this.x.load(this.url);
	}
	
	/**
	 * RSSの内容を表示する。
	 * 呼び出す度にインデックスを1つずつ増やしていく
	 */
	private function showItem() {
		// showItemを実行する度にインデックスをインクリメントしていく
		var index = (this.itemIndex++) % this.gItems.length;
		
		// タイトルのテキストを更新
	    _root.title.text = this.gItems[index].firstValueOfType("title");
	    // ディスクリプションのテキストを更新
	    _root.t.text = gItems[index].firstValueOfType("description");
	    
	    // フォーマット適用(これは、、、毎回やるの??)
		_root.title.setTextFormat(_root.format);
		_root.t.setTextFormat(_root.format);
		
	}
	
	// 最初に呼び出されるmain関数
	public static function main():Void {
		var rsst:RSSTest = new RSSTest();
		rsst.run();
	}
}