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(); } }