/**
* Copyright Hakuhin ( http://wonderfl.net/user/Hakuhin )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/fCTr
*/
<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init();"><mx:Script><![CDATA[public function init():void{
// -------------------------------------------------
// ~ wonderfl名鑑 ~
//
// wonderfl API を使ってユーザー情報とコード情報を
// ぶっこ抜いてデータグリッドに表示します。
//
// 『USER:』に任意の「ユーザー名」を追加するか
// 『CODE:』に任意の「コードID」を追加すると
// その情報を種にして検索を行います。
//
// forks 数が多いほど効率よくヒットします。
// アイテムをダブルクリックするとURLジャンプします。
//
// forks が無いユーザーやコードが古い場合
// 検出できない事があります。
//
// ユーザー情報の「コードヒット数、総forked数、
// 総favorite数、総コード文字数」は、
// コードヒット時にリアルタイムで加算されます。
//
// ┌┐
// │↓
// │ユーザー情報
// │↓
// │コードID(最新20件)
// │↓
// │コード情報
// │↓
// │forksユーザー(最新50件)
// │↓
// └┘
//
// -------------------------------------------------
// -------------------------------------------------
// インポート
// -------------------------------------------------
import mx.core.*;
import mx.containers.*;
import mx.controls.*;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.collections.*;
import mx.containers.*;
import mx.events.*;
// -------------------------------------------------
// Flash 設定
// -------------------------------------------------
// フレームレート
stage.frameRate = 60;
// 100% 表示
stage.scaleMode = StageScaleMode.NO_SCALE;
// 左上
stage.align = StageAlign.TOP_LEFT;
stage.align = "TL";
// -------------------------------------------------
// Flex 設定
// -------------------------------------------------
// パディングなし
setStyle("paddingTop",0);
setStyle("paddingBottom",0);
setStyle("paddingLeft",0);
setStyle("paddingRight",0);
// 背景透過
setStyle("backgroundAlpha",0);
// 左上
setStyle("horizontalAlign","left");
setStyle("verticalAlign","top");
// キャンバス作成
var canvas:Canvas = new Canvas();
addChild(canvas);
// -------------------------------------------------
// Flex コンポーネント作成
// -------------------------------------------------
var text:Text;
text = new Text();
text.x = 5;
text.y = 7;
text.width = 50;
text.text = "USER:";
text.setStyle("textAlign","center");
canvas.addChild(text);
var text_input_user:TextInput = new TextInput();
text_input_user.x = 50;
text_input_user.y = 5;
text_input_user.width = 100;
canvas.addChild(text_input_user);
var button_user:Button = new Button();
button_user.x = 150;
button_user.y = 5;
button_user.width = 50;
button_user.height = 23;
button_user.label = "追加";
canvas.addChild(button_user);
button_user.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
UserRegistQueue(text_input_user.text);
});
text = new Text();
text.x = 200;
text.y = 7;
text.width = 50;
text.text = "CODE:";
text.setStyle("textAlign","right");
canvas.addChild(text);
var text_input_code:TextInput = new TextInput();
text_input_code.x = 250;
text_input_code.y = 5;
text_input_code.width = 100;
canvas.addChild(text_input_code);
var button_code:Button = new Button();
button_code.x = 300;
button_code.y = 5;
button_code.width = 50;
button_code.height = 23;
button_code.label = "追加";
canvas.addChild(button_code);
button_code.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
CodeRegistQueue(text_input_code.text);
});
var text_height:Text = new Text();
text_height.x = 400;
text_height.y = 7;
text_height.width = 50;
text_height.text = "高さ:";
text_height.setStyle("textAlign","right");
canvas.addChild(text_height);
var stepper_height:NumericStepper = new NumericStepper();
stepper_height.x = 450;
stepper_height.y = 5;
stepper_height.width = 60;
stepper_height.value = 25;
stepper_height.minimum = 1;
stepper_height.maximum = 1000;
canvas.addChild(stepper_height);
stepper_height.addEventListener(Event.CHANGE,function(e:Event):void{
data_grid_user.rowHeight = data_grid_code.rowHeight = stepper_height.value;
column_user.width = stepper_height.value;
column_code.width = stepper_height.value;
});
// キャンバス作成
var lower:Canvas = new Canvas();
canvas.addChild(lower);
var progress:ProgressBar = new ProgressBar();
lower.addChild(progress);
progress.x = 5;
progress.y = 5;
// スプリッタ
var box_v : VDividedBox = new VDividedBox();
canvas.addChild(box_v);
box_v.x = 5;
// ユーザー用データグリッド
var data_grid_user:DataGrid = new DataGrid();
data_grid_user.horizontalScrollPolicy = ScrollPolicy.AUTO;
box_v.addChild(data_grid_user);
data_grid_user.headerHeight = 25;
data_grid_user.rowHeight = 25;
data_grid_user.doubleClickEnabled = true;
data_grid_user.addEventListener(ListEvent.ITEM_DOUBLE_CLICK,function(e:ListEvent):void{
var param:Object = collect_user.getItemAt(e.rowIndex);
var url:URLRequest = new URLRequest("http://wonderfl.net/user/" + param.name);
navigateToURL( url ,"_blank");
});
// コード用データグリッド
var data_grid_code:DataGrid = new DataGrid();
data_grid_code.horizontalScrollPolicy = ScrollPolicy.AUTO;
box_v.addChild(data_grid_code);
data_grid_code.headerHeight = 25;
data_grid_code.rowHeight = 25;
data_grid_code.doubleClickEnabled = true;
data_grid_code.addEventListener(ListEvent.ITEM_DOUBLE_CLICK,function(e:ListEvent):void{
var param:Object = collect_code.getItemAt(e.rowIndex);
var url:URLRequest = new URLRequest("http://wonderfl.net/c/" + param.id);
navigateToURL( url ,"_blank");
});
// カラム設定
var columns:Array;
var column:DataGridColumn;
columns = new Array();
column = new DataGridColumn("名前");
column.dataField = "name";
column.width = 100;
column.wordWrap = true;
columns.push(column);
var column_user:DataGridColumn = new DataGridColumn(" ");
column_user.dataField = "icon";
column_user.itemRenderer = new ClassFactory(mx.controls.Image);
column_user.width = 25;
column_user.resizable = false;
column_user.setStyle("horizontalAlign","center");
column_user.setStyle("verticalAlign","middle");
columns.push(column_user);
column = new DataGridColumn("コード数");
column.dataField= "code_count";
column.width = 60;
column.wordWrap = true;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"code_count");
columns.push(column);
column = new DataGridColumn("URL");
column.dataField= "url";
column.width = 300;
column.wordWrap = true;
columns.push(column);
column = new DataGridColumn("コメント");
column.dataField = "description";
column.width = 300;
column.wordWrap = true;
columns.push(column);
column = new DataGridColumn("コードヒット数");
column.dataField = "code_hit_count";
column.width = 100;
column.wordWrap = true;
column.setStyle("textAlign","center");
columns.push(column);
column = new DataGridColumn("総forked数");
column.dataField = "forked_count";
column.width = 100;
column.wordWrap = true;
column.setStyle("textAlign","center");
columns.push(column);
column = new DataGridColumn("総favorite数");
column.dataField = "favorite_count";
column.width = 100;
column.wordWrap = true;
column.setStyle("textAlign","center");
columns.push(column);
column = new DataGridColumn("総コード文字数");
column.dataField = "code_text_count";
column.width = 100;
column.wordWrap = true;
column.setStyle("textAlign","center");
columns.push(column);
column = new DataGridColumn(" ");
column.dataField = "param";
column.width = 10;
columns.push(column);
data_grid_user.columns = columns;
columns = new Array();
column = new DataGridColumn("タイトル");
column.dataField = "title";
column.width = 200;
column.wordWrap = true;
columns.push(column);
var column_code:DataGridColumn = new DataGridColumn(" ");
column_code.dataField = "thumbnail";
column_code.itemRenderer = new ClassFactory(mx.controls.Image);
column_code.width = 25;
column_code.resizable = false;
column_code.setStyle("horizontalAlign","center");
column_code.setStyle("verticalAlign","middle");
columns.push(column_code);
column = new DataGridColumn("ID");
column.dataField = "id";
column.width = 50;
column.setStyle("textAlign","center");
columns.push(column);
column = new DataGridColumn("ユーザー");
column.dataField = "user";
column.width = 100;
columns.push(column);
column = new DataGridColumn("親");
column.dataField = "parent";
column.width = 50;
column.setStyle("textAlign","center");
columns.push(column);
column = new DataGridColumn("forked");
column.dataField = "forked_count";
column.width = 60;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"forked_count");
columns.push(column);
column = new DataGridColumn("favorite");
column.dataField = "favorite_count";
column.width = 60;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"favorite_count");
columns.push(column);
column = new DataGridColumn("実行可");
column.dataField= "compile_ok";
column.width = 50;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"compile_ok");
columns.push(column);
column = new DataGridColumn("作成日時");
column.dataField= "created_date";
column.width = 150;
column.setStyle("textAlign","center");
columns.push(column);
column = new DataGridColumn("更新日時");
column.dataField= "modified_date";
column.width = 150;
column.setStyle("textAlign","center");
columns.push(column);
column = new DataGridColumn("パス");
column.dataField = "swf";
column.width = 300;
column.wordWrap = true;
columns.push(column);
column = new DataGridColumn("diff");
column.dataField = "diff";
column.width = 50;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"diff");
columns.push(column);
column = new DataGridColumn("ライセンス");
column.dataField = "license";
column.width = 60;
column.setStyle("textAlign","center");
columns.push(column);
column = new DataGridColumn("文字総数");
column.dataField = "as3_length";
column.width = 60;
column.setStyle("textAlign","center");
DataGridColumnSetSortNumber(column,"as3_length");
columns.push(column);
column = new DataGridColumn("スクリプト");
column.dataField = "as3";
column.width = 300;
column.wordWrap = true;
columns.push(column);
column = new DataGridColumn(" ");
column.dataField = "param";
column.width = 10;
columns.push(column);
data_grid_code.columns = columns;
// -------------------------------------------------
// 数値ソート用コールバック関数
// -------------------------------------------------
function DataGridColumnSetSortNumber(column:DataGridColumn,str:String):void{
column.sortCompareFunction = function (o1:Object, o2:Object):int{
var v1:int = parseInt(o1[str]);
var v2:int = parseInt(o2[str]);
if(v1 < v2) {
return -1;
}
else if(v1 > v2){
return 1;
}
return 0;
}
}
var collect_user:ArrayCollection = new ArrayCollection();
var collect_code:ArrayCollection = new ArrayCollection();
data_grid_user.dataProvider = collect_user;
data_grid_code.dataProvider = collect_code;
// -------------------------------------------------
// スプリッタ用設定
// -------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME,function(e:Event):void{
box_v.moveDivider(0,1);
stage.removeEventListener(Event.ENTER_FRAME ,arguments.callee);
});
// -------------------------------------------------
// リサイズ時にフィット
// -------------------------------------------------
stage.addEventListener(Event.RESIZE,ResizeFunc);
function ResizeFunc(e:Event):void{
var w:uint = stage.stageWidth;
var h:uint = stage.stageHeight;
text_height.x = w - 5 - 60 - 50;
stepper_height.x = w - 5 - 60;
box_v.y = 35;
box_v.width = w - 10;
box_v.height = (h - 35 - 45);
data_grid_user.width = w - 10;
data_grid_code.width = w - 10;
lower.y = h - 45;
progress.width = w - 10;
}
ResizeFunc(null);
// -------------------------------------------------
// 初期化
// -------------------------------------------------
const STEP_WAIT:int = 0;
const STEP_LOAD:int = 1;
// ワンダフルAPI 作成
var wonderfl_api:Object = WonderflAPICreate(loaderInfo.parameters.open_api_key);
var step:int = STEP_WAIT;
// キュー
var user_queue:Array = new Array();
var code_queue:Array = new Array();
// ディクショナリ
var user_dictionary:Object = DictionaryCreate(0x10000);
var code_dictionary:Object = DictionaryCreate(0x10000);
var user_queue_count:int = 0;
var user_queue_max:int = 0;
var code_queue_count:int = 0;
var code_queue_max:int = 0;
var thread_count:int = 0;
var thread_max:int = 99;
// -------------------------------------------------
// 毎フレーム実行
// -------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME,function(e:Event):void{
var percent:Number = (user_queue_count + code_queue_count) / (user_queue_max + code_queue_max) * 100;
percent = Math.floor(percent * 10) / 10;
progress.label = "%3%% user(" + user_queue_count + "/" + user_queue_max + ") code(" + code_queue_count + "/" + code_queue_max + ") thread(" + thread_count + "/" + thread_max + ")";
progress.minimum = 0;
progress.mode = ProgressBarMode.MANUAL;
progress.setProgress((user_queue_count + code_queue_count) , (user_queue_max + code_queue_max));
// if(step == STEP_WAIT)
if(thread_count < thread_max)
{
// ユーザーキュー
if(user_queue.length > 0){
// 読み込みへ
step = STEP_LOAD;
var user_name:String = user_queue.shift();
// ユーザー情報を読み込む
thread_count ++;
WonderflAPIGetUser(wonderfl_api,user_name,function(ret:Boolean,data:Object):void{
user_queue_count ++;
thread_count --;
if(!ret){
// 待機へ
step = STEP_WAIT;
return;
}
var user:Object = data.user;
// ユーザーパラメータセット
var user_param:Object = UserGetParam(user.name);
user_param.icon = user.icon;
user_param.name = user.name;
user_param.url = user.external_url;
user_param.code_count = user.code_count;
user_param.description = user.description;
// データグリッドに登録
UserAddDataGrid(user_param);
// ユーザーコード情報を読み込む
thread_count ++;
WonderflAPIGetUserCode(wonderfl_api,user_name,function(ret:Boolean,data:Object):void{
thread_count --;
if(!ret){
// 待機へ
step = STEP_WAIT;
}
var codes:Array = data.codes;
var i:int;
var num:int = codes.length;
for(i=0;i<num;i++){
var code:Object = codes[i];
// パラメータセット
var code_param:Object = CodeGetParam(code.id);
code_param.thumbnail = code.thumbnail;
code_param.parent = code.parent;
code_param.user = user_name;
code_param.compile_ok = code.compile_ok;
code_param.created_date = DateGetString(parseInt(code.created_date));
code_param.license = code.license;
code_param.swf = code.swf;
code_param.diff = code.diff;
code_param.title = code.title;
code_param.id = code.id;
// コードをデータグリッドに登録
CodeAddDataGrid(code_param);
// コード登録
CodeRegistQueue(code.id);
CodeRegistQueue(code.parent);
}
// 待機へ
step = STEP_WAIT;
return;
});
});
return;
}
// コードキュー
if(code_queue.length > 0){
// 読み込みへ
step = STEP_LOAD;
var code_id:String = code_queue.shift();
// コード情報を読み込む
thread_count ++;
WonderflAPIGetCode(wonderfl_api,code_id,function(ret:Boolean,data:Object):void{
thread_count --;
if(!ret){
// 待機へ
step = STEP_WAIT;
return;
}
var code:Object = data.code;
var user:Object = code.user;
// ユーザーパラメータをセット
var user_param:Object = UserGetParam(user.name);
user_param.code_hit_count ++;
user_param.forked_count += parseInt(code.forked_count);
user_param.favorite_count += parseInt(code.favorite_count);
user_param.code_text_count += code.as3.length;
// ユーザーをデータグリッドに登録
UserAddDataGrid(user_param);
// コードパラメータをセット
var code_param:Object = CodeGetParam(code.id);
code_param.thumbnail = code.thumbnail;
code_param.parent = code.parent;
code_param.compile_ok = code.compile_ok;
code_param.created_date = DateGetString(parseInt(code.created_date));
code_param.license = code.license;
code_param.swf = code.swf;
code_param.diff = code.diff;
code_param.title = code.title;
code_param.id = code_id;
code_param.as3_length = code.as3.length;
code_param.as3 = code.as3;
code_param.modified_date = DateGetString(parseInt(code.modified_date));
code_param.forked_count = code.forked_count;
code_param.favorite_count = code.favorite_count;
// コードをデータグリッドに登録
CodeAddDataGrid(code_param);
// ユーザー登録
UserRegistQueue(user.name);
// コード登録
CodeRegistQueue(code.parent);
// コード Forks 情報を読み込む
thread_count ++;
WonderflAPIGetCodeForks(wonderfl_api,code_id,function(ret:Boolean,data:Object):void{
code_queue_count ++;
thread_count --;
step = STEP_WAIT;
if(!ret){
// 待機へ
step = STEP_WAIT;
return;
}
var forks:Array = data.forks;
var i:int;
var num:int = forks.length;
for(i=0;i<num;i++){
var fork:Object = forks[i];
// ユーザー登録
UserRegistQueue(fork.user.name);
}
// 待機へ
step = STEP_WAIT;
return;
});
});
return;
}
}
});
// -------------------------------------------------
// ユーザーキュー登録
// -------------------------------------------------
function UserRegistQueue(name:String):Boolean{
var user_name:String = name.toLowerCase();
var page:Object = DictionaryGetPage(user_dictionary,user_name);
if(!page){
page = DictionaryCreatePage(user_dictionary,user_name);
page.param = UserCreateParam();
}
var param:Object = page.param;
if(!param.queue){
user_queue_max ++;
user_queue.push(user_name);
param.queue = true;
return true;
}
return false;
}
// -------------------------------------------------
// ユーザーパラメータ作成
// -------------------------------------------------
function UserCreateParam():Object{
return {
name:"loading...", // 名前
queue:false, // キュー登録
data_grid:false, // グリッド登録
code_hit_count:0, // ヒットカウント
forked_count:0, // forked 数
favorite_count:0, // favorite 数
code_text_count:0 // 総スクリプト文字数
};
}
// -------------------------------------------------
// ユーザー情報取得
// -------------------------------------------------
function UserGetParam(name:String):Object{
var user_name:String = name.toLowerCase();
var page:Object = DictionaryGetPage(user_dictionary,user_name);
if(!page){
page = DictionaryCreatePage(user_dictionary,user_name);
page.param = UserCreateParam();
}
return page.param;
}
// -------------------------------------------------
// ユーザー情報をデータグリッドに登録
// -------------------------------------------------
function UserAddDataGrid(param:Object):Boolean{
if(!(param.data_grid)){
collect_user.addItemAt(param,collect_user.length);
param.data_grid = true;
}
return param.data_grid;
}
// -------------------------------------------------
// コードキュー登録
// -------------------------------------------------
function CodeRegistQueue(code_id:String):Boolean{
var page:Object = DictionaryGetPage(code_dictionary,code_id);
if(!page){
page = DictionaryCreatePage(code_dictionary,code_id);
page.param = CodeCreateParam();
}
var param:Object = page.param;
if(!param.queue){
code_queue_max ++;
code_queue.push(code_id);
param.queue = true;
return true;
}
return false;
}
// -------------------------------------------------
// コードパラメータ作成
// -------------------------------------------------
function CodeCreateParam():Object{
return {
title:"loading...", // タイトル
queue:false, // キュー登録
data_grid:false // グリッド登録
};
}
// -------------------------------------------------
// コード情報取得
// -------------------------------------------------
function CodeGetParam(code_id:String):Object{
var page:Object = DictionaryGetPage(code_dictionary,code_id);
if(!page){
page = DictionaryCreatePage(code_dictionary,code_id);
page.param = CodeCreateParam();
}
return page.param;
}
// -------------------------------------------------
// コード情報をデータグリッドに登録
// -------------------------------------------------
function CodeAddDataGrid(param:Object):Boolean{
if(!(param.data_grid)){
collect_code.addItemAt(param,collect_code.length);
param.data_grid = true;
}
return param.data_grid;
}
// -------------------------------------------------
// JSON から Object に変換
// -------------------------------------------------
function JsonGetObject(str:String):Object{
var obj:Object = null;
try{
var p:int = 0;
var l:int = str.length;
var c:String = _jumpNextChar();
// チェック
switch(c){
case "{": obj = _getObject(); break;
case "[": obj = _getArray(); break;
};
}catch(e:Error){
}
// オブジェクト取得
function _getObject():Object{
var obj:Object = new Object();
var c:String;
var name:String;
while(true){
// プロパティ名取得
name = _jumpNextString();
// データ
c = _getNextChar();
switch(c){
default:
obj[name] = _jumpNextProperty();
break;
case "{":
_jumpNextChar();
_jumpNextChar();
obj[name] = _getObject();
break;
case "[":
_jumpNextChar();
_jumpNextChar();
obj[name] = _getArray();
break;
};
// 次のデータ取得
c = _jumpNextChar();
if(c == ","){
continue;
}else if(c == "}"){
return obj;
}
// 異常終了
break;
}
return null;
}
// 配列取得
function _getArray():Array{
var ary:Array = new Array();
var c:String;
var i:int = 0;
while(true){
// データ
c = _getNextChar();
switch(c){
default:
ary[i] = _jumpNextString();
break;
case "{":
_jumpNextChar();
ary[i] = _getObject();
break;
case "[":
_jumpNextChar();
ary[i] = _getArray();
break;
};
// 次のデータ取得
i++;
c = _jumpNextChar();
if(c == ","){
continue;
}else if(c == "]"){
return ary;
}
// 異常終了
break;
}
return null;
}
// 次の文字を取得
function _getNextChar():String{
var s:int = p;
var c:String;
while(true){
c = str.charAt(s);
s++;
// 無視する文字
if(c == " ") continue;
if(c == "\t") continue;
if(c == "\r") continue;
if(c == "\n") continue;
if(c == ":") continue;
break;
}
return c;
}
// 次の文字までジャンプ
function _jumpNextChar():String{
var _c:String = _getNextChar();
var c:String;
while(true){
p++;
c = str.charAt(p);
// 無視する文字
if(c == " ") continue;
if(c == "\t") continue;
if(c == "\r") continue;
if(c == "\n") continue;
if(c == ":") continue;
break;
}
return _c;
}
// 次の文字列までジャンプ
function _jumpNextString():String{
var c:String;
// 開始
var s:int = p;
while(true){
c = str.charAt(s);
s++;
if(c == "\"") break;
}
// 終端
var e:int = s;
while(true){
c = str.charAt(e);
if(c == "\"") break;
e++;
}
p = e + 1;
return str.slice(s,e);
}
// 次のプロパティを取得
function _jumpNextProperty():String{
var c:String;
// 開始
var s:int = p;
while(true){
c = str.charAt(s);
s++;
if(c == ":") break;
}
// 空白無視
while(true){
c = str.charAt(s);
if(c != " ") break;
s++;
}
// 文字列
c = str.charAt(s);
var e:int;
if(c == "\""){
// 終端
var yen:int = 0;
e = s;
while(true){
e++;
c = str.charAt(e);
if(yen > 0){
yen ++;
if(yen > 2) yen = 0;
}
if(c == "\\"){
yen = 1;
}
if(yen == 0){
if(c == "\"") break;
}
}
e++;
}else{
// 終端
e = s;
while(true){
c = str.charAt(e);
if(c == ",") break;
if(c == "}") break;
e++;
}
}
p = e;
var t:String = str.slice(s,e);
// 除去
try{
var check:Boolean = true;
if(t.charAt(0) != "\""){
}else if(t.charAt(t.length - 1) != "\""){
}else{
t = t.slice(1,t.length - 1);
check = false;
}
if(check){
if(t == "null") t = "";
}
}catch(e:Error){
}
return t;
}
return obj;
}
// -------------------------------------------------
// ディクショナリ作成
// -------------------------------------------------
function DictionaryCreate(num:int):Object{
var obj:Object = new Object;
var ary:Array = new Array;
var i:int;
for(i=0;i<num;i++){
var list:Object = new Object();
list.pref = list;
list.post = list;
ary[i] = list;
}
obj.num = num;
obj.table = ary;
return obj;
}
// -------------------------------------------------
// ディクショナリからページ取得
// -------------------------------------------------
function DictionaryGetPage(obj:Object,name:String):Object{
var hash:uint = StringGetHash(name) % obj.num;
var table:Object = obj.table[hash];
var list:Object = table.post;
while(true){
if(list == table) break;
if(list.name == name){
return list;
}
list = list.post;
}
return null;
}
// -------------------------------------------------
// ディクショナリからページ取得
// -------------------------------------------------
function DictionaryCreatePage(obj:Object,name:String):Object{
var hash:uint = StringGetHash(name) % obj.num;
var table:Object = obj.table[hash];
var list:Object = table.post;
while(true){
if(list == table) break;
if(list.name == name){
return list;
}
list = list.post;
}
var pref:Object = table;
var post:Object = table.post;
list = new Object();
pref.post = list;
post.pref = list;
list.pref = pref;
list.post = post;
list.name = name;
return list;
}
// -------------------------------------------------
// 文字列からハッシュ値取得
// -------------------------------------------------
function StringGetHash(str:String):uint{
var i:int;
var num:int = str.length;
var hash:uint = 0;
for(i=0;i<num;i++){
hash = hash * 137 + str.charCodeAt(i);
}
return hash;
}
// -------------------------------------------------
// 文字列からハッシュ値取得
// -------------------------------------------------
function DateGetString(time:uint):String{
var date:Date = new Date(time * 1000);
// 曜日データ
var ary:Array = ["日","月","火","水","木","金","土"];
// ローカル時間で取得可能パラメータを文字として連結
var str:String = "";
str += (date.fullYear < 10 ? "0" : "") + date.fullYear;
str += "/";
var month:uint = date.month + 1;
str += (month < 10 ? "0" : "") + month;
str += "/";
str += (date.date < 10 ? "0" : "") + date.date;
str += " ";
str += "(" + ary[date.day] + ")";
str += " ";
str += (date.hours < 10 ? "0" : "") + date.hours;
str += ":";
str += (date.minutes < 10 ? "0" : "") + date.minutes;
str += ":";
str += (date.seconds < 10 ? "0" : "") + date.seconds;
return str;
}
// -------------------------------------------------
// WonderflAPI 作成
// -------------------------------------------------
function WonderflAPICreate(api_key:String):Object{
return {
loader:null, // ローダ
api_key:api_key // API キー
};
}
// -------------------------------------------------
// WonderflAPI からユーザー情報取得
// -------------------------------------------------
function WonderflAPIGetUser(obj:Object,name:String,func:Function):Boolean{
var str:String = "http://api.wonderfl.net/user/" + name + "?api_key="+obj.api_key;
var url:URLRequest = new URLRequest(str);
var url_loader:URLLoader = new URLLoader(url);
// ロード成功
url_loader.addEventListener(Event.COMPLETE,function (event : Event):void {
var data : String = url_loader.data;
data = unescape(data);
func(true,JsonGetObject(data));
});
// ロード失敗
url_loader.addEventListener (IOErrorEvent.IO_ERROR,function (event : IOErrorEvent):void {
func(false,null);
});
url_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR,function (event : IOErrorEvent):void {
func(false,null);
});
// 読み込み開始
url_loader.load (url);
obj.loader = url_loader;
return true;
}
// -------------------------------------------------
// WonderflAPI からユーザーコード情報取得
// -------------------------------------------------
function WonderflAPIGetUserCode(obj:Object,name:String,func:Function):Boolean{
var str:String = "http://api.wonderfl.net/user/" + name + "/codes?api_key="+obj.api_key;
var url:URLRequest = new URLRequest(str);
var url_loader:URLLoader = new URLLoader(url);
// ロード成功
url_loader.addEventListener(Event.COMPLETE,function (event : Event):void {
var data : String = url_loader.data;
data = unescape(data);
func(true,JsonGetObject(data));
});
// ロード失敗
url_loader.addEventListener (IOErrorEvent.IO_ERROR,function (event : IOErrorEvent):void {
func(false,null);
});
url_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR,function (event : IOErrorEvent):void {
func(false,null);
});
// 読み込み開始
url_loader.load (url);
obj.loader = url_loader;
return true;
}
// -------------------------------------------------
// WonderflAPI からコード情報取得
// -------------------------------------------------
function WonderflAPIGetCode(obj:Object,id:String,func:Function):Boolean{
var str:String = "http://api.wonderfl.net/code/" + id + "?api_key="+obj.api_key;
var url:URLRequest = new URLRequest(str);
var url_loader:URLLoader = new URLLoader(url);
// ロード成功
url_loader.addEventListener(Event.COMPLETE,function (event : Event):void {
var data : String = url_loader.data;
data = unescape(data);
func(true,JsonGetObject(data));
});
// ロード失敗
url_loader.addEventListener (IOErrorEvent.IO_ERROR,function (event : IOErrorEvent):void {
func(false,null);
});
url_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR,function (event : IOErrorEvent):void {
func(false,null);
});
// 読み込み開始
url_loader.load (url);
obj.loader = url_loader;
return true;
}
// -------------------------------------------------
// WonderflAPI からコード forks 情報取得
// -------------------------------------------------
function WonderflAPIGetCodeForks(obj:Object,id:String,func:Function):Boolean{
var str:String = "http://api.wonderfl.net/code/" + id + "/forks?api_key="+obj.api_key;
var url:URLRequest = new URLRequest(str);
var url_loader:URLLoader = new URLLoader(url);
// ロード成功
url_loader.addEventListener(Event.COMPLETE,function (event : Event):void {
var data : String = url_loader.data;
data = unescape(data);
func(true,JsonGetObject(data));
});
// ロード失敗
url_loader.addEventListener (IOErrorEvent.IO_ERROR,function (event : IOErrorEvent):void {
func(false,null);
});
url_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR,function (event : IOErrorEvent):void {
func(false,null);
});
// 読み込み開始
url_loader.load (url);
obj.loader = url_loader;
return true;
}
}]]></mx:Script></mx:Application>