flash on 2012-4-21

by tepe
♥0 | Line 338 | Modified 2012-04-23 12:02:52 | MIT License
play

ActionScript3 source code

/**
 * Copyright tepe ( http://wonderfl.net/user/tepe )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/swXj
 */

package {
        
    

    import flash.display.*;
    import flash.events.*;
    import flash.net.*;
    import flash.text.*;
  
    public class twit1 extends Sprite {
        private var _resultStage:Sprite = new Sprite();
        private var maxID:Number=0;//これより古いIDを取得
        private var sinceID:Number=0;//これより新しいIDを取得
        private var tlTop:Number = 25;
        private var tlBottom:Number;
        private var titleArea:Sprite = new Sprite();
        private var keyword:String;
        private var serchWord:TextField = new TextField();
        public function twit1():void {
            
            //背景
            titleArea.graphics.beginFill(0x39CCFF);
            titleArea.graphics.drawRect(0, 0, 165, 23);
            
            //Serchの文字
            serchWord.text = "検索:";
            serchWord.width = 33;
            serchWord.height = 18;
            serchWord.x = 2;
            serchWord.y = 2;
            serchWord.textColor = 0xFFFFFF;
            titleArea.addChild(serchWord);
            titleArea.x =300;

            //テキスト入力欄。キーボードのキーを押し上げた際にonKeyUpが実行される
            var title:TextField = new TextField();
            with(title){
                text = "wonderfl";
                width = 126;
                height = 18;
                x = 36;
                y = 2;
                border = true;
                borderColor = 0xFFFFFF;
                background = true;
                backgroundColor = 0x99DDFF;
                type = TextFieldType.INPUT;
                addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
            }
            titleArea.addChild(title);
            serchWord.addEventListener(MouseEvent.CLICK,function():void{
                if(title.text != keyword){
                    setKeyword(title.text);
                    request();
                }
            });
            //検索結果を配置するSpriteをaddChild
            _resultStage.y = 25;
            addChild(_resultStage);
            
            
            addChild(titleArea);
            
            //初期状態で検索結果画面が出るように、検索を実行する。
            //setUserID("kis");
            //request();
            _resultStage.addEventListener(MouseEvent.MOUSE_OVER,addScrool);
            _resultStage.addEventListener(MouseEvent.MOUSE_OUT,removeScrool);
            
        }
        private function removeScrool(e:MouseEvent):void{
            removeEventListener(Event.ENTER_FRAME,onFrame);
            addEventListener(Event.ENTER_FRAME,stopScr);
        }

        private function addScrool(e:MouseEvent):void{
            addEventListener(Event.ENTER_FRAME,onFrame);
            
        }
        private function stopScr(e:Event):void{
            if(1<Math.abs(scrSpeed))scrSpeed/=1.001;
            else{
                scrSpeed=0;
                removeEventListener(Event.ENTER_FRAME,stopScr);
            }
            if(_resultStage.y+(scrSpeed*100)>tlTop || _resultStage.y+(scrSpeed*100)<tlBottom){
                scrSpeed/=1.1;
            }

            _resultStage.y-=scrSpeed;
            
        }

        private var scrSpeed:Number=0;
        private var requestNow:Boolean=false;
        private function onFrame(e:Event):void{
            if(mouseY < 100 && mouseY-100 < scrSpeed*10 ){
                if(tlTop > _resultStage.y)scrSpeed = (mouseY-100)/10;
                else scrSpeed=0;
            }
            else if(350 < mouseY && scrSpeed*10 < mouseY-350){
                scrSpeed = (mouseY-350)/10;
            }

            else {
                if(0.1<Math.abs(scrSpeed))scrSpeed/=1.05;
                else scrSpeed=0;
            }
            _resultStage.y-=scrSpeed;
            if(-tlBottom+600 > _resultStage.y && requestNow==false){
                moreRequest();
                requestNow=true;
            }

        }



        
        private function onKeyUp(e:KeyboardEvent):void {
            //Enterキーのキーコード13だったら、serchメソッドを実行。引数には適すと入力欄の文字列
            if (e.keyCode == 13) {
                setKeyword(e.currentTarget.text);
                request();
            }
        }
        
        
        private var requestURL:String;
        
        //リクエスト実行
        public function request():void{
            //_resultStage上のオブジェクトを全て削除
            tlBottom=0;        
            while (_resultStage.numChildren) {
                _resultStage.removeChildAt(0);
            }
            _resultStage.y = 25;
            
            var myURLLoader:URLLoader = new URLLoader();
            myURLLoader.addEventListener(Event.COMPLETE, onCompleteXML);
            myURLLoader.addEventListener(IOErrorEvent.IO_ERROR, onIoError);
            myURLLoader.load(new URLRequest(requestURL));
        }
        
        //キーワードを指定してリクエスト
        public function setKeyword(keyword:String=""):void{
            if(keyword=="")return;
            var myURLLoader:URLLoader = new URLLoader();
            var xmlURL:String = "http://search.twitter.com/search.atom?q=";
            xmlURL += encodeURIComponent(keyword);
            requestURL = xmlURL;
        }

        //ユーザーを指定してリクエスト
        public function setUserID(userID:String=""):void{
            if(userID=="")return;
            //url指定
            const SEARCH_PARAMS:Object = { rpp:20 };//取得数
            var xmlURL:String = "http://search.twitter.com/search.atom?q="+"from%3A"+ userID
            for (var key:String in SEARCH_PARAMS) {
                xmlURL += "&" + key + "=" + SEARCH_PARAMS[key];
            }  
            requestURL = xmlURL;
        }
        
        //追加リクエスト
        public function moreRequest():void{        
            var myURLLoader:URLLoader = new URLLoader();
            myURLLoader.addEventListener(Event.COMPLETE, onCompleteXML);
            myURLLoader.addEventListener(IOErrorEvent.IO_ERROR, onIoError);
            myURLLoader.load(new URLRequest(requestURL + "&max_id=" + maxID.toString()));
        }

        
        public function onIoError(e:IOErrorEvent):void {
            trace(e.type);
        }
        
        private function idNum(id:String):String{
            var reg:RegExp = new RegExp();
            reg = /:\d+/;
            var result:Object = reg.exec(id);
            var str:String = id.substring(result.index+1);  
            return str;
        }
        
        //URLにリンクタグを付ける
        private function setHttpLink(str:String):String{
            var reg:RegExp = new RegExp();
            reg = /http(:|s:)\/\/[\w.%&\/]+/g;
            var result:Object;
            var res2:String=new String();
            var str2:String;
            var prev:int=0;
            for(var i:int =0;i<10;i++){
                result = reg.exec(str);
                
                if(result == null)break;
                if(reg.lastIndex!=0){
                    res2+=str.substring(prev,result.index);
                    str2 = str.substring(result.index,reg.lastIndex);
                    res2+="<a href='" + str2 + "' target='_blank'>"+ '<u><font color="#0088ff">'+ str2+"</font></u>"+"</a>";
                    prev=reg.lastIndex;
                }
                else{
                    res2+=str.substring(prev,result.index);
                    str2 = str.substring(result.index);
                    res2+="<a href='" + str2 + "' target='_blank'>"+  '<u><font color="#0088ff">'+ str2+"</font></u>"+"</a>";
                    prev=str.length;
                    break;
                }
            }
            res2+=str.substring(prev);
            return res2;
        }
        
        //表示名取得
        private function getUserName(str:String=""):String{
            var reg:RegExp = new RegExp();
            reg = / (.*)/;
            var result:Object;
            var str2:String;
            result = reg.exec(str);
            str2 = str.substring(result.index+2,str.length-1);
            
            return str2;
        }
        //アカウント名取得
        private function getAccountName(str:String=""):String{
            var reg:RegExp = new RegExp();
            reg = / /;
            var result:Object;
            var str2:String;
            result = reg.exec(str);
            str2 = str.substring(0,result.index);
            
            return str2;
        }
        //ID取得
        private function getUserID(str:String=""):String{
            var reg:RegExp = new RegExp();
            reg = /.+ /;
            var result:Object;
            var str2:String;
            result = reg.exec(str);
            str2 = str.substring(result.index,str.length-1);
            
            return str2;
        }
        
        private function removeTag(str:String=""):String{
            var reg:RegExp = new RegExp();
            reg = /#[^ $]+/g;
            var result:Object;
            var res2:String=new String();
            var str2:String;
            var prev:int=0;

            for(var i:int =0;i<10;i++){
                result = reg.exec(str);
                
                if(result == null)break;
                if(reg.lastIndex!=0){
                    res2+=str.substring(prev,result.index);
                    prev=reg.lastIndex;
                }
                else{
                    res2+=str.substring(prev,result.index);
                    prev=str.length;
                    break;
                }
            }
            res2+=str.substring(prev);
            return res2;
        }
        //タイムスタンプ取得
        private function getTime(str:String):Date{
            var year:int, mon:int, day:int, hour:int, min:int, sec:int;
            
            //日付取得            
            var reg:RegExp = new RegExp();
            reg = /\d\d\d\d-\d\d-\d\d/g; 
            var res:Object= reg.exec(str);
            var str2:String = str.substring(res.index,reg.lastIndex);
            year = parseInt(str2.substring(0,4));
            mon = parseInt(str2.substring(5,7))-1;
            day = parseInt(str2.substring(8,10));
            //時間取得
            var reg2:RegExp = new RegExp()
            reg2 = /\d\d:\d\d:\d\d/g;
            res = reg2.exec(str);
            str2 = str.substring(res.index,reg2.lastIndex);
            hour = parseInt(str2.substring(0,2));
            min = parseInt(str2.substring(3,5));
            sec = parseInt(str2.substring(6,8));
            //日時データ生成
            var dat:Date = new Date(year,mon,day,hour,min,sec);
            dat.minutes-=dat.timezoneOffset;//GMTをローカルタイムに修正
            
            return dat;
        }

 
        
        //タグリスト取得
        private function getTag(str:String):Array{
            var tagList:Array = new Array();
            var reg:RegExp = new RegExp();
            var result:Object;
            var tag:String;
            
            reg = /#[^ $]+/g;
            for(var i:int =0;i<10;i++){//10以上は取らない
                result = reg.exec(str);
                
                if(result == null)break;
                if(reg.lastIndex!=0){
                    tag = str.substring(result.index,reg.lastIndex);
                    tagList.push(tag);
                }
                else{
                    tag = str.substring(result.index,str.length);
                    tagList.push(tag);
                    break;
                }
            }
            return tagList;
        }
        
        
        //ツイートデータ
        // id:Number        ツイートID
        // time:Date        タイムスタンプ
        // title:String     本文。htmlText形式。ハッシュタグは非表示。
        // userName:String  ユーザー表示名
        // account:String   アカウント名
        // tag:Array        ハッシュタグ
        // imgURL:String    ユーザーアイコンのURL
        // link:String      ユーザータイムラインのURL
        
        private function twitObj(entry:XML):Object{     
            default xml namespace = new Namespace("http://www.w3.org/2005/Atom");      
            var item:Object = new Object();
                item.time = getTime( entry.published);//文字列 → 日時データ         
                item.id = Number( idNum( entry.id));//ツイートID
                item.link = entry.author.uri;//ユーザータイムラインへのリンク
                item.userName = getUserName( entry.author.name);//ユーザー名(表示名)
                item.account = getAccountName( entry.author.name);//アカウント名
                item.title = setHttpLink( removeTag( entry.title));//本文 タグ除外
                item.tag = getTag( entry.title);//タグリスト
                
                //アイコン画像のURLを取得
                var imgURL:String = entry.link[1].@href;
                var extention:String = imgURL.substr( -4);
                extention = extention.toLowerCase();
                if (extention != ".jpg" && extention != ".gif" && extention != ".png") {
                    imgURL = "http://s.twimg.com/a/1254440757/images/default_profile_mini.png";//デフォルトアイコン
                }
                imgURL = encodeURI(imgURL);
                item.imgURL = imgURL;         

                return item;
        }




        private var dat2:Date = new Date();
        private function onCompleteXML(e:Event):void {
            requestNow = false;
            //eventListenerを削除
            e.currentTarget.removeEventListener(Event.COMPLETE, onCompleteXML);
            
            
            //XML型にキャスト
            var myXML:XML = new XML(e.currentTarget.data);
            //namespaceを設定
            default xml namespace = new Namespace("http://www.w3.org/2005/Atom");        //*2
            
            //ヘッダーの下
            var tfY:int = tlBottom;
            //要素を取り出して、textFieldを作りならべる
            var itemLength:int = myXML.entry.length();
            maxID=myXML.max_id;
            
            var dat3:Date = new Date();
            var item2:Object = twitObj(XML(myXML.entry[0]));

            if(maxID==0)maxID = Number( idNum(myXML.entry[0].id) );
            if(sinceID==0)sinceID = Number( idNum(myXML.entry[0].id) );
            for (var i:int = 0; i < itemLength; i++) {
                var item:Object = twitObj(XML(myXML.entry[i]));
                
                //日時タグ作成
                if(item.time > dat3.time){
                    
                    var dTag:TextField = new TextField();
                    with(dTag){
                        width = 460;
                        x = 2;
                        Wrap = true;
                        background = true;
                        backgroundColor = 0xFFFFFF;
                        border = true;
                        borderColor = 0x39CCFF;
                        //htmlText = "";
                        autoSize = "left";
                        
                    }
                    dTag.text = String(dat3.month+1)+"/"+String(dat3.date)+"\n";
                    //テキストフィールドのy座標はtfYに加算していくことにより、決定
                    dTag.y = tfY+50;
                    tfY += dTag.height + 53;
                    _resultStage.addChild(dTag); 

                    dat2 = dat3;
                
                }

//-------------
                //idの評価
                if(sinceID < item.id )sinceID=item.id;
                if( item.id < maxID )maxID=item.id;

//--------------                

                //得られた各値をhtmlTextに入るように整形
                var htmldata:String = "";
                htmldata = "<a href='" + item.link + "' target='_blank'>";
                htmldata += "<img src='" + item.imgURL + "' width='48' height='48' />";
                htmldata += "</a>";
                htmldata += "<b>" + item.userName + "</b> ";
                htmldata += "<b>"+item.time.toLocaleTimeString()+"\n</b> ";
                //htmldata += "<b>"+dat1.toString()+"\n" + ts+"</b> ";
                htmldata += "\n"+item.title;  
                
                //検索結果のテキストフィールド
                var tf:TextField = new TextField();
                tf.width = 460;
                tf.x = 2;
                tf.wordWrap = true;
                tf.background = true;
                tf.backgroundColor = 0xFFFFFF;
                tf.border = true;
                tf.borderColor = 0x39CCFF;
                tf.htmlText = htmldata;
                tf.autoSize = "left";
                //テキストフィールドのy座標はtfYに加算していくことにより、決定
                tf.y = tfY;
                tfY += tf.height + 3;
                _resultStage.addChild(tf);

            }
            tlBottom=tfY;
        }
        
        
    }
}