In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: favると流れてくる

Get Adobe Flash player
by Thy 28 Aug 2011
/**
 * Copyright Thy ( http://wonderfl.net/user/Thy )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/bWUD
 */

// forked from bkzen's favると流れてくる
package  
{
    import com.bit101.components.Label;
    import com.bit101.components.Style;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.ErrorEvent;
    import flash.events.Event;
    import flash.net.URLRequest;
    import net.wonderfl.utils.WonderflAPI;
    import org.libspark.betweenas3.BetweenAS3;
    import org.libspark.betweenas3.easing.Expo;
    
    /**
     * ワンダフルの API が誰が fav ったか、
     * どんなコメント付いてるかとか
     * フォローしてる人はどれくらい居るとか、誰だとか
     * を教えてくれないのでとりあえず自分で作った。 
     * loadC(id); // (http://wonderfl.net/c/[id])
     * loadFollowers(id); // (http://wonderfl.net/user/[id]/followers)
     * load(id); // (http://wonderfl.net/user/[id])
     * それぞれの HTML をただ返すだけ。
     * そっからは煮るなり焼くなりコロスケなり。
     * 
     * 注意
     * ※ カヤックさんに怒られたら消す。
     * ※ 危険だったら消す。
     * ※ サーバー負荷がやばくなったら消す。
     * ※ HTMLの書き方が変わったら使えなくなる。
     * ※ カヤックさんが用意してくれると嬉しいなぁー。(鎌倉の方を見ながら)
     * @author jc at bk-zen.com
     */
    [SWF (backgroundColor = "0xFFFFFF", frameRate = "30", width = "465", height = "465")]
    public class FavGetTest extends Sprite 
    {
        private var loader: WonderflExtendsAPI;
        private var api: WonderflAPI;
        private var favs: Array;
        private var follower: AllFollowsData;
        private var following: AllFollowsData;
        private var label: Label;
        private var icons: Array = [];
        
        public function FavGetTest() 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e: Event = null): void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            //
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            Style.fontName = "_typewriter";
            Style.fontSize = 12;
            Style.embedFonts = false;
            loader = new WonderflExtendsAPI(null, errorHandler);
            api = new WonderflAPI(loaderInfo.parameters);
            label = new Label(this, 0, 0, "now loading...");
            label.x = stage.stageWidth  - label.width  >> 1;
            label.y = stage.stageHeight - label.height >> 1;
            loader.loadC(api.appID || "h3SO", onCompC);
        }
        
        private function errorHandler(e: ErrorEvent):void 
        {
            error(e.type);
        }
        
        private function onCompC(res: String):void 
        {
            var str: String = WonderflExtendsAPI.getFav(res), xml: XML, b: Boolean;;
            if (str)
            {
                // favs
                xml = new XML(str);
                favs = new AllFavsData(xml).favs;
                var i: int, n: int = favs.length;
                for (i = 0; i < n; i++) 
                {
                    var f: FavData = favs[i];
                    icons[i] = new Icon(f.thumbURL, f.name, f.userURL, f.comment);
                    if (f.name == api.viewerDisplayName) b = true;
                }
                label.text = b ? "Thank you for your favorites!" : "Please Add to Favorites. and reload";
                label.draw();
                label.x = stage.stageWidth  - label.width  >> 1;
                label.y = stage.stageHeight - label.height >> 1;
                BetweenAS3.to(label, { alpha: 0 }, 2).play();
                addEventListener(Event.ENTER_FRAME, loop);
            }
            else
            {
                label.text = "no favs\nPlease Add to Favorites. and reload";
                label.x = stage.stageWidth  - label.width  >> 1;
                label.y = stage.stageHeight - label.height >> 1;
            }
        }
        
        private function loop(e:Event):void 
        {
            var i: int, n: int = icons.length, icon: Icon;
            for (i = 0; i < n; i++) 
            {
                icon = icons[i];
                if (icon.flag == 0 && icon.visible)
                {
                    iconInit(icon);
                    icon.flag = 1;
                    addChild(icon);
                }
                if (icon.visible)
                {
                    icon.x --;
                    if (icon.x < - icon.width) iconInit(icon);
                }
            }
        }
        
        private function iconInit(icon:Icon):void 
        {
            icon.x = stage.stageWidth + Math.random() * 200, icon.y = Math.random() * (stage.stageHeight - 100);
            var i: int, n: int = icons.length, ic: Icon, mx: int = icon.x + icon.width, iy: int = icon.y;
            for (i = 0; i < n; i++) 
            {
                ic = icons[i];
                if (ic.visible && ic.flag == 1)
                {
                    if (iy - 50 < ic.y && iy + 100 > ic.y) 
                    {
                        var tx: int = ic.x + ic.width + 50;
                        if (mx < tx) mx = tx;
                    }
                }
            }
            icon.x = mx;
        }
        
        private function onCompLoad(res: String): void 
        {
            var str: String = WonderflExtendsAPI.getFollowing(res), xml: XML;
            if (str)
            {
                // following
                xml = new XML(str);
                following = new AllFollowsData(xml);
            }
        }
        
        private function onCompFollowers(res: String): void 
        {
            var str: String = WonderflExtendsAPI.getFollowers(res), xml: XML;
            if (str)
            {
                // followers
                xml = new XML(str);
                follower = new AllFollowsData(xml);
            }
        }
        
        private function error(text: String):void 
        {
            
        }
    }
}
import com.bit101.components.Label;
import flash.display.Loader;
import flash.events.ErrorEvent;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.events.SecurityErrorEvent;
import flash.net.navigateToURL;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
class WonderflExtendsAPI extends EventDispatcher
{
    private static const FAV_START: String = '<section id="sectFavBy" class="group">';
    private static const FAV_END: String = '<!-- /#sectFavBy --></section>';
    private static const FOLLOWING_START: String = '<section id="sectFollowing">';
    private static const FOLLOWING_END: String = '<!-- / #sectFollowing --></section>';
    private static const FOLLOWERS_START: String = '<div class="follower_box autopagerize_page_element">';
    private static const FOLLOWERS_END: String = '</div>';
    private var loader:URLLoader;
    private var _errorHandler:Function;
    private var _errorHandlerSub:Function;
    private var _completeHandler: Function;
    private var _completeHandlerSub: Function;
    private var _id: String;
    /**
     * ワンダフルの API が誰が fav ったか、
     * どんなコメント付いてるかとか
     * フォローしてる人はどれくらい居るとか、誰だとか
     * を教えてくれないのでとりあえず自分で作った。 
     * loadC(id); // (http://wonderfl.net/c/[id])
     * loadFollowers(id); // (http://wonderfl.net/user/[id]/followers)
     * load(id); // (http://wonderfl.net/user/[id])
     * それぞれの HTML をただ返すだけ。
     * そっからは煮るなり焼くなりコロスケなり。
     * 
     * 注意
     * ※ カヤックさんに怒られたら消す。
     * ※ 危険だったら消す。
     * ※ サーバー負荷がやばくなったら消す。
     * ※ HTMLの書き方が変わったら使えなくなる。
     * ※ カヤックさんが用意してくれると嬉しいなぁー。(鎌倉の方を見ながら)
     * @author jc at bk-zen.com
     * @param    completeHandler
     * @param    errorHandler
     */
    function WonderflExtendsAPI(completeHandler: Function = null, errorHandler: Function = null)
    {
        _completeHandler = completeHandler, _errorHandler = errorHandler;
        loader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, onComplete);
        loader.addEventListener(IOErrorEvent.IO_ERROR, onError);
        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
        loader.dataFormat = URLLoaderDataFormat.TEXT;
    }
    /**
     * (http://wonderfl.net/c/[id]) の HTML を返す。
     * @param    id: code id
     * @param    completeHandler: サブハンドラ、コンストラクタで渡したコンプリートイベントハンドラとは別に呼ぶ。
     * @param    errorHandler: サブハンドラ、コンストラクタで渡したエラーイベントハンドラとは別に呼ぶ。
     */
    public function loadC(id: String, completeHandler: Function = null, errorHandler: Function = null): void
    {
        _id = id, _completeHandlerSub = completeHandler, _errorHandlerSub = errorHandler;
        loader.load(new URLRequest("http://wonderfl.bk-zen.com/c/?id=" + _id));
    }
    /**
     * (http://wonderfl.net/user/[id]/followers) の HTML を返す。
     * @param    id: ユーザーID
     * @param    completeHandler: サブハンドラ、コンストラクタで渡したコンプリートイベントハンドラとは別に呼ぶ。
     * @param    errorHandler: サブハンドラ、コンストラクタで渡したエラーイベントハンドラとは別に呼ぶ。
     */
    public function loadFollowers(id: String, completeHandler: Function = null, errorHandler: Function = null): void
    {
        _id = id, _completeHandlerSub = completeHandler, _errorHandlerSub = errorHandler;
        loader.load(new URLRequest("http://wonderfl.bk-zen.com/user/?id=" + _id + "&method=followers"));
    }
    
    /**
     * (http://wonderfl.net/user/[id]) の HTML を返す。
     * @param    id: ユーザーID
     * @param    completeHandler: サブハンドラ、コンストラクタで渡したコンプリートイベントハンドラとは別に呼ぶ。
     * @param    errorHandler: サブハンドラ、コンストラクタで渡したエラーイベントハンドラとは別に呼ぶ。
     */
    public function load(id: String, completeHandler: Function = null, errorHandler: Function = null): void
    {
        _id = id, _completeHandlerSub = completeHandler, _errorHandlerSub = errorHandler;
        loader.load(new URLRequest("http://wonderfl.bk-zen.com/user/?id=" + _id));
    }
    
    /**
     * サーバーから帰ってきた HTML から
     * fav の部分だけをパースする。
     * @param    str: サーバーから帰ってきたHTML
     * @return    
     */
    public static function getFav(str: String): String
    {
        var s: int = str.lastIndexOf(FAV_START);
        if (s < 0) return "";
        var e: int = str.indexOf(FAV_END, s);
        if (e < 0) return "";
        return str.substring(s, e + FAV_END.length);
    }
    
    /**
     * サーバーから帰ってきた HTML から
     * following の部分だけをパースする。
     * @param    str: サーバーから帰ってきたHTML
     * @return
     */
    public static function getFollowing(str: String): String
    {
        var s: int = str.indexOf(FOLLOWING_START);
        if (s < 0) return "";
        var e: int = str.indexOf(FOLLOWING_END, s);
        if (e < 0) return "";
        return str.substring(s, e + FOLLOWING_END.length);
    }
    
    /**
     * サーバーから帰ってきた HTML から
     * followers の部分だけをパースする。
     * @param    str: サーバーから帰ってきたHTML
     * @return
     */
    public static function getFollowers(str: String): String 
    {
        var s: int = str.indexOf(FOLLOWERS_START);
        if (s < 0) return "";
        var e: int = str.indexOf(FOLLOWERS_END, s);
        if (e < 0) return "";
        return str.substring(s, e + FOLLOWERS_END.length);
    }
    
    private function onComplete(e: Event): void 
    {
        if (loader.data == "error")
        {
            var error: ErrorEvent = new ErrorEvent(ErrorEvent.ERROR, false, false, "error : id=" + _id);
            if (_errorHandler    != null) _errorHandler(error);
            if (_errorHandlerSub != null) _errorHandlerSub(error);
        }
        else 
        {
            if (_completeHandler    != null) _completeHandler("" + loader.data);
            if (_completeHandlerSub != null) _completeHandlerSub("" + loader.data);
        }
    }
    
    private function onError(e: ErrorEvent): void 
    {
        if (_errorHandler    != null) _errorHandler(e);
        if (_errorHandlerSub != null) _errorHandlerSub(e);
    }
}

/**
 * fav のデータオブジェクト
 */
class AllFavsData
{
    private var _favs: Array = [];
    function AllFavsData(xml: XML) 
    {
        var nocomment: XMLList = xml.div.(@["class"] == "unitGroup group").div;
        var i:int, n: int = nocomment.length();
        for (i = 0; i < n; i++) 
        {
            _favs.push(new FavData(nocomment[i]));
        }
        var comment: XMLList = xml.div.(@["class"] == "unitFavUserL group");
        n = comment.length();
        for (i = 0; i < n; i++) 
        {
            _favs.push(new FavData(comment[i].p[0], comment[i].p[1]));
        }
        _favs.reverse();
    }
    public function get favs(): Array { return _favs; }
}
class FavData
{
    public static const NO_COMMENT_XML: XML = new XML();
    
    private var _xml: XML;
    private var _comment: XML;
    function FavData(xml: XML, comment: XML = null) { _xml = xml, _comment = comment || NO_COMMENT_XML; }
    public function get name(): String { return _xml.a.@title; }
    public function get thumbURL(): String { return "http://wonderfl.net" + _xml.span.a.img.@src; }
    public function get userURL(): String { return _xml.a.@href; }
    public function get comment(): String { return _comment.toXMLString(); }
}
/**
 * Follow 系のデータオブジェクト
 */
class AllFollowsData
{
    private var _follows: Array = [];
    function AllFollowsData(xml: XML)
    {
        var follows: XMLList = xml.ul.li;
        var i:int, n: int = follows.length();
        for (i = 0; i < n; i++) 
        {
            _follows[i] = new FollowData(follows[i]);
        }
    }
}
class FollowData
{
    private var _xml: XML;
    function FollowData(xml: XML) { _xml = xml; }
    public function get name(): String { return _xml.a.@title; }
    public function get userURL(): String { return _xml.a.@href; }
    public function get thumbURL(): String { return "http://wonderfl.net" + _xml.span.a.img.@src; }
}

import flash.display.Sprite;
class Icon extends Sprite
{
    private var icon:Loader;
    private var nameLabel:Label;
    private var commentLabel: TextField;
    private var _w: int;
    public var flag: int = 0; // ごめんこのあたり適当
    function Icon(url: String, name: String, userURL: String, comment: String = "")
    {
        visible = false
        addChild(icon = new Loader());
        icon.contentLoaderInfo.addEventListener(Event.COMPLETE, onComp);
        icon.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
        nameLabel = new Label(this, 0, 0, name);
        nameLabel.x = 60;
        _w = nameLabel.width + nameLabel.x;
        if (comment) 
        {
            addChild(commentLabel = new TextField());
            commentLabel.x = 60, commentLabel.y = 15;
            commentLabel.autoSize = TextFieldAutoSize.LEFT;
            commentLabel.defaultTextFormat = new TextFormat("_typewriter", 12, 0x555555);
            commentLabel.htmlText = comment;
            _w = 60 + commentLabel.width;
        }
        icon.load(new URLRequest(url));
        icon.addEventListener(MouseEvent.CLICK, function(e: Event): void {
            navigateToURL(new URLRequest(userURL));
        } );
    }
    
    private function onIOError(e: IOErrorEvent): void 
    {
        removeChild(icon);
        visible = true;
    }
    
    private function onComp(e:Event):void 
    {
        icon.scaleX = icon.scaleY = 0.5;
        visible = true;
    }
    
    override public function get width():Number { return _w; }
}