チェンジセット 2634

差分発生行の前後
無視リスト:
コミット日時:
2009/05/14 12:35:25 (3 年前)
コミッタ:
uwi
ログメッセージ:

コード整形
他諸々

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • air/TLife/trunk/application.xml

    r2628 r2634  
    11<?xml version="1.0" encoding="utf-8" ?>  
    22<application xmlns="http://ns.adobe.com/air/application/1.5">  
    3          
    4        <id>uwi.TLife</id>  
    5        <version>alpha17</version> 
    6        <filename>TLife</filename> 
    7        <name>TLife</name>  
    8        <description>Twitter is Life.</description>  
    9        <copyright>(c) @uwitenpen 2009</copyright>  
    10          
    11        <initialWindow>  
    12                <title>TLife</title>  
    13                <content>TLife.swf</content>  
    14                <systemChrome>standard</systemChrome> 
    15                <transparent>false</transparent> 
    16                <visible>false</visible>  
    17                <minimizable>true</minimizable>  
    18                <maximizable>false</maximizable>  
    19                <resizable>true</resizable>  
    20        </initialWindow> 
    21          
    22        <icon> 
    23                <image16x16>icon/icon_016.png</image16x16> 
    24                <image32x32>icon/icon_032.png</image32x32> 
    25                <image48x48>icon/icon_048.png</image48x48> 
    26                <image128x128>icon/icon_128.png</image128x128> 
    27        </icon> 
     3   
     4  <id>uwi.TLife</id>  
     5  <version>alpha17</version> 
     6  <filename>TLife</filename> 
     7  <name>TLife</name>  
     8  <description>Twitter is Life.</description>  
     9  <copyright>(c) @uwitenpen 2009</copyright>  
     10   
     11  <initialWindow>  
     12    <title>TLife</title>  
     13    <content>TLife.swf</content>  
     14    <systemChrome>standard</systemChrome> 
     15    <transparent>false</transparent> 
     16    <visible>false</visible>  
     17    <minimizable>true</minimizable>  
     18    <maximizable>false</maximizable>  
     19    <resizable>true</resizable>  
     20  </initialWindow> 
     21   
     22  <icon> 
     23    <image16x16>icon/icon_016.png</image16x16> 
     24    <image32x32>icon/icon_032.png</image32x32> 
     25    <image48x48>icon/icon_048.png</image48x48> 
     26    <image128x128>icon/icon_128.png</image128x128> 
     27  </icon> 
    2828</application> 
  • air/TLife/trunk/bin/lang-config.xml

    r2533 r2634  
    11<tlife> 
    2        <login> 
    3                <userid>ユーザーID</userid> 
    4                <password>パスワード</password> 
    5        </login> 
    6        <method>取得方法(scrape:スクレイピング(推奨), api:API)</method> 
    7        <numpageget> 
    8                <recent>recentが一度に取得するページ数(1ページ20post)</recent> 
    9                <reply>replyが一度に取得するページ数(1ページ20post)</reply> 
    10        </numpageget> 
    11        <numdisplay>タブに表示するpost数(グローバル)</numdisplay> 
    12        <manageunread>未読管理(全体設定、0:しない, 1:する)</manageunread> 
    13        <numnotify>新着通知件数(全体設定、0:新着通知しない)</numnotify> 
    14        <removecosuffix>共通語尾を削除する(全体設定、0:しない, 1:する)</removecosuffix> 
     2  <login> 
     3    <userid>ユーザーID</userid> 
     4    <password>パスワード</password> 
     5  </login> 
     6  <method>取得方法(scrape:スクレイピング(推奨), api:API)</method> 
     7  <numpageget> 
     8    <recent>recentが一度に取得するページ数(1ページ20post)</recent> 
     9    <reply>replyが一度に取得するページ数(1ページ20post)</reply> 
     10  </numpageget> 
     11  <numdisplay>タブに表示するpost数(グローバル)</numdisplay> 
     12  <manageunread>未読管理(全体設定、0:しない, 1:する)</manageunread> 
     13  <numnotify>新着通知件数(全体設定、0:新着通知しない)</numnotify> 
     14  <removecosuffix>共通語尾を削除する(全体設定、0:しない, 1:する)</removecosuffix> 
    1515    <readoldposts>前回起動時の投稿を表示に含める</readoldposts> 
    1616    <hammer>同一ユーザーの発言表示件数の上限</hammer> 
    1717    <numpagegetwhenfirstloadcustomtimeline>パーソナルタイムライン等を作成した時に取得するページ数</numpagegetwhenfirstloadcustomtimeline> 
    18        <footer>post時に末尾に追加する文字列</footer> 
    19        <interval>更新間隔(ms)</interval> 
    20        <main> 
    21                <tablock>タブをロック(ドラッグ禁止)する</tablock> 
    22                <datagrid> 
    23                        <headerlock>カラム移動を禁止する</headerlock> 
    24                        <sortlock>カラムソートを禁止する</sortlock> 
    25                    <interval>背景色変更等重い処理のインターバル(frame)</interval> 
    26                        <rowheight>1行の高さ</rowheight> 
    27                        <dateformat>時刻のフォーマット</dateformat> 
    28                        <selectioncolor>選択時の色</selectioncolor> 
    29                </datagrid> 
    30                <isearch> 
    31                        <timeout>インクリメンタルサーチのタイムアウト(ms)</timeout> 
    32                </isearch> 
    33                <fontcolor> 
    34                        <charleft> 
    35                                <error>文字数オーバー時の残り文字数文字色</error> 
    36                                <normal>通常時の残り文字数ラベルの文字色</normal> 
    37                        </charleft> 
    38                        <replypost> 
    39                                <error>エラー時のreplyポストの文字色</error> 
    40                                <getting>取得中のreplyポストの文字色</getting> 
    41                                <normal>通常時のreplyポストの文字色</normal> 
    42                                <protected>プロテクト時のタイムラインの文字色</protected> 
    43                        </replypost> 
    44                        <timeline> 
    45                                <bgsameposter>同じ発言者の背景色</bgsameposter> 
    46                                <fav>ふぁぼのタイムラインの文字色</fav> 
    47                                <normal>通常時のタイムラインの文字色</normal> 
    48                        </timeline> 
    49                </fontcolor> 
    50                <friendimage>friendpost欄に画像を表示する</friendimage> 
    51        </main> 
    52        <search> 
    53                <queryuserid> 
    54                        <numhistory>検索のUserIDクエリの履歴</numhistory> 
    55                </queryuserid> 
    56                <querycontent> 
    57                        <numhistory>検索のcontentクエリの履歴</numhistory> 
    58                </querycontent> 
    59                <at>@表記を除く</at> 
    60                <cosuffix>共通語尾を除く</cosuffix> 
    61                <url>URLを除く</url> 
    62                <word>単語単位で検索</word> 
    63                <regexp>正規表現を使用</regexp> 
    64                <simplemigemo>簡易Migemoを使用(かな変換のみ、DBを使わず)</simplemigemo> 
    65                <migemo>Migemoを使用</migemo> 
    66                <socialime>SocialIMEAPIを使用(未実装)</socialime> 
    67                <fav>ふぁぼに限定</fav> 
    68                <capital>大文字・小文字を区別</capital> 
    69                <twobyte>全角・半角を区別</twobyte> 
    70                <closedialog>検索語、ダイアログを閉じる</closedialog> 
    71        </search> 
    72        <dbsearch> 
    73                <queryuserid> 
    74                        <numhistory>DB検索のUserIDクエリの履歴</numhistory> 
    75                </queryuserid> 
    76                <querycontent> 
    77                        <numhistory>DB検索のcontentクエリの履歴</numhistory> 
    78                </querycontent> 
    79                <dbregexp>簡易正規表現を使用</dbregexp> 
    80                <simplemigemo>簡易Migemoを使用(かな変換のみ、DBを使わず)</simplemigemo> 
    81                <migemo>Migemoを使用</migemo> 
    82                <socialime>SocialIMEAPIを使用(未実装)</socialime> 
    83                <fav>ふぁぼに限定</fav> 
    84                <capital>大文字・小文字を区別</capital> 
    85                <twobyte>全角・半角を区別</twobyte> 
    86        </dbsearch> 
    87        <balloon> 
    88                <timeout>新着通知の表示時間(ms)</timeout> 
    89        </balloon> 
    90        <backup>config.xmlのバックアップをとる</backup> 
    91        <timeout>リクエストタイムアウト(ms)</timeout> 
    92        <autorelogininterval>自動再ログインの間隔(ms)</autorelogininterval> 
    93        <log> 
    94                <level>ログのレベル(DEBUG, INFO, WARN, ERROR, FATAL)</level> 
    95        </log> 
     18  <footer>post時に末尾に追加する文字列</footer> 
     19  <interval>更新間隔(ms)</interval> 
     20  <main> 
     21    <tablock>タブをロック(ドラッグ禁止)する</tablock> 
     22    <datagrid> 
     23      <headerlock>カラム移動を禁止する</headerlock> 
     24      <sortlock>カラムソートを禁止する</sortlock> 
     25        <interval>背景色変更等重い処理のインターバル(frame)</interval> 
     26      <rowheight>1行の高さ</rowheight> 
     27      <dateformat>時刻のフォーマット</dateformat> 
     28      <selectioncolor>選択時の色</selectioncolor> 
     29    </datagrid> 
     30    <isearch> 
     31      <timeout>インクリメンタルサーチのタイムアウト(ms)</timeout> 
     32    </isearch> 
     33    <fontcolor> 
     34      <charleft> 
     35        <error>文字数オーバー時の残り文字数文字色</error> 
     36        <normal>通常時の残り文字数ラベルの文字色</normal> 
     37      </charleft> 
     38      <replypost> 
     39        <error>エラー時のreplyポストの文字色</error> 
     40        <getting>取得中のreplyポストの文字色</getting> 
     41        <normal>通常時のreplyポストの文字色</normal> 
     42        <protected>プロテクト時のタイムラインの文字色</protected> 
     43      </replypost> 
     44      <timeline> 
     45        <bgsameposter>同じ発言者の背景色</bgsameposter> 
     46        <fav>ふぁぼのタイムラインの文字色</fav> 
     47        <normal>通常時のタイムラインの文字色</normal> 
     48      </timeline> 
     49    </fontcolor> 
     50    <friendimage>friendpost欄に画像を表示する</friendimage> 
     51  </main> 
     52  <search> 
     53    <queryuserid> 
     54      <numhistory>検索のUserIDクエリの履歴</numhistory> 
     55    </queryuserid> 
     56    <querycontent> 
     57      <numhistory>検索のcontentクエリの履歴</numhistory> 
     58    </querycontent> 
     59    <at>@表記を除く</at> 
     60    <cosuffix>共通語尾を除く</cosuffix> 
     61    <url>URLを除く</url> 
     62    <word>単語単位で検索</word> 
     63    <regexp>正規表現を使用</regexp> 
     64    <simplemigemo>簡易Migemoを使用(かな変換のみ、DBを使わず)</simplemigemo> 
     65    <migemo>Migemoを使用</migemo> 
     66    <socialime>SocialIMEAPIを使用(未実装)</socialime> 
     67    <fav>ふぁぼに限定</fav> 
     68    <capital>大文字・小文字を区別</capital> 
     69    <twobyte>全角・半角を区別</twobyte> 
     70    <closedialog>検索語、ダイアログを閉じる</closedialog> 
     71  </search> 
     72  <dbsearch> 
     73    <queryuserid> 
     74      <numhistory>DB検索のUserIDクエリの履歴</numhistory> 
     75    </queryuserid> 
     76    <querycontent> 
     77      <numhistory>DB検索のcontentクエリの履歴</numhistory> 
     78    </querycontent> 
     79    <dbregexp>簡易正規表現を使用</dbregexp> 
     80    <simplemigemo>簡易Migemoを使用(かな変換のみ、DBを使わず)</simplemigemo> 
     81    <migemo>Migemoを使用</migemo> 
     82    <socialime>SocialIMEAPIを使用(未実装)</socialime> 
     83    <fav>ふぁぼに限定</fav> 
     84    <capital>大文字・小文字を区別</capital> 
     85    <twobyte>全角・半角を区別</twobyte> 
     86  </dbsearch> 
     87  <balloon> 
     88    <timeout>新着通知の表示時間(ms)</timeout> 
     89  </balloon> 
     90  <backup>config.xmlのバックアップをとる</backup> 
     91  <timeout>リクエストタイムアウト(ms)</timeout> 
     92  <autorelogininterval>自動再ログインの間隔(ms)</autorelogininterval> 
     93  <log> 
     94    <level>ログのレベル(DEBUG, INFO, WARN, ERROR, FATAL)</level> 
     95  </log> 
    9696</tlife> 
  • air/TLife/trunk/obj/TLifeConfig.old

    r2621 r2634  
    11<?xml version="1.0" encoding="utf-8"?> 
    2 <!--Flex compiler config for project TLife generated by FDBuild--> 
    3 <!--============--> 
    4 <!--This file was generated by a tool.--> 
     2<!--This file was generated by a FDBuild.--> 
    53<!--Any modifications you make may be lost.--> 
    64<flex-config> 
  • air/TLife/trunk/obj/TLifeConfig.xml

    r2621 r2634  
    11<?xml version="1.0" encoding="utf-8"?> 
    2 <!--Flex compiler config for project TLife generated by FDBuild--> 
    3 <!--============--> 
    4 <!--This file was generated by a tool.--> 
     2<!--This file was generated by a FDBuild.--> 
    53<!--Any modifications you make may be lost.--> 
    64<flex-config> 
  • air/TLife/trunk/src/Main.mxml

    r2626 r2634  
    5454                        import mx.utils.ObjectUtil; 
    5555                        import mx.validators.StringValidator; 
     56                        import org.iotashan.utils.URLEncoding; 
    5657                        import org.libspark.thread.EnterFrameThreadExecutor; 
    5758                        import org.libspark.thread.Thread; 
     
    128129                                postvalidator.maxLength = CommonData.LIMLEN_POST; 
    129130                                postvalidator.tooLongError = "長すぎですよー"; 
    130                                  
    131                                 var tf : TextField = new TextField(); 
    132                                 tf.type = "input"; 
    133                                 stage.addChild(tf); 
    134131                                 
    135132                                new MainThread().start(); 
     
    280277                                Logger.errorLevel = Class(Logger).hasOwnProperty(level) ? Logger[level] : Logger.INFO; 
    281278                                 
    282                                 CommonData.incrementalSearchJudgers = [ 
     279                                CommonData.judgers_incrementalsearch = [ 
    283280                                        null,  
    284281                                        KeyBind.makeJudger(CommonData.configxml.keybind.isearchcontent), 
     
    343340                        private function onFPMouseMove(event : MouseEvent) : void 
    344341                        { 
    345                                 if (CommonData.FPATagData == null) return; 
     342                                if (CommonData.atagdata_friendpost == null) return; 
    346343 
    347344                                // XXX too dangerous! 
    348345                                // TextArea.textField 
    349346                                var pos : int = (friendpost.getChildAt(2) as IUITextField).getCharIndexAtPoint(event.localX, event.localY); 
    350                                 if (pos == CommonData.FPprevpos || pos == -1) return; 
    351                                 CommonData.FPprevpos = pos; 
    352                                  
    353                                 for each(var tag : Object in CommonData.FPATagData) { 
     347                                if (pos == CommonData.prevpos_friendpost || pos == -1) return; 
     348                                CommonData.prevpos_friendpost = pos; 
     349                                 
     350                                for each(var tag : Object in CommonData.atagdata_friendpost) { 
    354351                                        if (tag.start <= pos && pos < tag.end) { 
    355352                                                CommonData.mainstatusbar.write(tag.href, DEPTH_FP); 
     
    368365                        private function onRPMouseMove(event : MouseEvent) : void 
    369366                        { 
    370                                 if (CommonData.RPATagData == null) return; 
     367                                if (CommonData.atagdata_replypost == null) return; 
    371368 
    372369                                // XXX too dangerous! 
    373370                                // Text.textField 
    374371                                var pos : int = (replypost.getChildAt(0) as IUITextField).getCharIndexAtPoint(event.localX, event.localY); 
    375                                 if (pos == CommonData.RPprevpos || pos == -1) return; 
    376                                 CommonData.RPprevpos = pos; 
    377                                  
    378                                 for each(var tag : Object in CommonData.RPATagData) { 
     372                                if (pos == CommonData.prevpos_replypost || pos == -1) return; 
     373                                CommonData.prevpos_replypost = pos; 
     374                                 
     375                                for each(var tag : Object in CommonData.atagdata_replypost) { 
    379376                                        if (tag.start <= pos && pos < tag.end) { 
    380377                                                CommonData.mainstatusbar.write(tag.href, DEPTH_RP); 
  • air/TLife/trunk/src/uwi/bean/Status.as

    r2218 r2634  
    11package uwi.bean { 
    2          
    3        /** 
    4         * ... 
    5         * @author Uwi 
    6         */ 
    7        public class Status { 
    8                private var _postid : String; // postID 
    9                private var _postername : String; // 発言者名 
    10                private var _posterid : String; // 発言者ID 
    11                private var _content : String; // post本文 
    12                private var _replyto : String; // postのreply先ID 
    13                private var _postedtime : Date; // postされた時刻 
    14                private var _iconurl : String; // iconのURL 
    15                private var _fav : Boolean; 
    16                private var _tag : String; 
     2   
     3  /** 
     4  * ... 
     5  * @author Uwi 
     6  */ 
     7  public class Status { 
     8    private var _postid : String; // postID 
     9    private var _postername : String; // 発言者名 
     10    private var _posterid : String; // 発言者ID 
     11    private var _content : String; // post本文 
     12    private var _replyto : String; // postのreply先ID 
     13    private var _postedtime : Date; // postされた時刻 
     14    private var _iconurl : String; // iconのURL 
     15    private var _fav : Boolean; 
     16    private var _tag : String; 
    1717 
    18                public function Status(postid : String, postername : String, posterid : String, content : String, replyid : String, postedtime : Date, iconurl : String, fav : Boolean) { 
    19                        _postid = postid; 
    20                        _postername = postername; 
    21                        _posterid = posterid; 
    22                        _content = content; 
    23                        _replyto = replyid; 
    24                        _postedtime = postedtime; 
    25                        _iconurl = iconurl; 
    26                        _fav = fav; 
    27                
    28                  
    29                public function toString() : String 
    30                
    31                        return "postid : " + _postid + ", " +  
    32                                "postername : " + _postername + ", " +  
    33                                "posterid : " + _posterid + ", " +  
    34                                "content : " + _content + ", " +  
    35                                "replyid : " + _replyto + ", " +  
    36                                "iconurl : " + _iconurl + ", " +  
    37                                "postedtime : " + _postedtime + ", " +  
    38                                "fav : " + _fav; 
    39                
    40                  
    41                public function get postid():String { return _postid; } 
    42                  
    43                public function set postid(value:String):void  
    44                
    45                        _postid = value; 
    46                
    47                  
    48                public function get postername():String { return _postername; } 
    49                  
    50                public function set postername(value:String):void  
    51                
    52                        _postername = value; 
    53                
    54                  
    55                public function get posterid():String { return _posterid; } 
    56                  
    57                public function set posterid(value:String):void  
    58                
    59                        _posterid = value; 
    60                
    61                  
    62                public function get content():String { return _content; } 
    63                  
    64                public function set content(value:String):void  
    65                
    66                        _content = value; 
    67                
    68                  
    69                public function get replyid():String { return _replyto; } 
    70                  
    71                public function set replyid(value:String):void  
    72                
    73                        _replyto = value; 
    74                
    75                  
    76                public function get postedtime():Date { return _postedtime; } 
    77                  
    78                public function set postedtime(value:Date):void  
    79                
    80                        _postedtime = value; 
    81                
    82                  
    83                public function get iconurl():String { return _iconurl; } 
    84                  
    85                public function set iconurl(value:String):void  
    86                
    87                        _iconurl = value; 
    88                
    89                  
    90                public function get fav():Boolean { return _fav; } 
    91                  
    92                public function set fav(value:Boolean):void  
    93                
    94                        _fav = value; 
    95                
    96                  
    97                public function get tag():String { return _tag; } 
    98                  
    99                public function set tag(value:String):void  
    100                
    101                        _tag = value; 
    102                
    103                  
    104        
    105          
     18    public function Status(postid : String, postername : String, posterid : String, content : String, replyid : String, postedtime : Date, iconurl : String, fav : Boolean) { 
     19      _postid = postid; 
     20      _postername = postername; 
     21      _posterid = posterid; 
     22      _content = content; 
     23      _replyto = replyid; 
     24      _postedtime = postedtime; 
     25      _iconurl = iconurl; 
     26      _fav = fav; 
     27   
     28     
     29    public function toString() : String 
     30   
     31      return "postid : " + _postid + ", " +  
     32        "postername : " + _postername + ", " +  
     33        "posterid : " + _posterid + ", " +  
     34        "content : " + _content + ", " +  
     35        "replyid : " + _replyto + ", " +  
     36        "iconurl : " + _iconurl + ", " +  
     37        "postedtime : " + _postedtime + ", " +  
     38        "fav : " + _fav; 
     39   
     40     
     41    public function get postid():String { return _postid; } 
     42     
     43    public function set postid(value:String):void  
     44   
     45      _postid = value; 
     46   
     47     
     48    public function get postername():String { return _postername; } 
     49     
     50    public function set postername(value:String):void  
     51   
     52      _postername = value; 
     53   
     54     
     55    public function get posterid():String { return _posterid; } 
     56     
     57    public function set posterid(value:String):void  
     58   
     59      _posterid = value; 
     60   
     61     
     62    public function get content():String { return _content; } 
     63     
     64    public function set content(value:String):void  
     65   
     66      _content = value; 
     67   
     68     
     69    public function get replyid():String { return _replyto; } 
     70     
     71    public function set replyid(value:String):void  
     72   
     73      _replyto = value; 
     74   
     75     
     76    public function get postedtime():Date { return _postedtime; } 
     77     
     78    public function set postedtime(value:Date):void  
     79   
     80      _postedtime = value; 
     81   
     82     
     83    public function get iconurl():String { return _iconurl; } 
     84     
     85    public function set iconurl(value:String):void  
     86   
     87      _iconurl = value; 
     88   
     89     
     90    public function get fav():Boolean { return _fav; } 
     91     
     92    public function set fav(value:Boolean):void  
     93   
     94      _fav = value; 
     95   
     96     
     97    public function get tag():String { return _tag; } 
     98     
     99    public function set tag(value:String):void  
     100   
     101      _tag = value; 
     102   
     103     
     104 
     105   
    106106} 
  • air/TLife/trunk/src/uwi/bean/TabRule.as

    r2501 r2634  
    11package uwi.bean  
    22{ 
    3        import ken39arg.logging.Logger; 
    4        import uwi.regexp.RegExpParser; 
    5          
    6        /** 
    7         * ... 
    8         * @author Uwi 
    9         */ 
    10        public class TabRule  
    11        
    12                public static const OPERATION_COPY : int = 0; 
    13                public static const OPERATION_MOVE : int = 1; 
    14                public static const OPERATION_DELETE : int = 2; 
    15                public static const OPERATIONSTR : Array = ["コピー", "移動", "削除"]; 
    16                  
    17                private var _tabname : String; // 適用先タブ名 
    18                private var _reqid : String; // ID条件(スペース区切り) 
    19                private var _reqcontent : String; // 本文条件(正規表現) 
    20                private var _operation : int; // 操作(コピー・移動元はRecent) 
    21                private var _treecontent : Object; // _reqcontentの構文木 
    22                  
    23                public function TabRule( 
    24                        tabname : String,  
    25                        reqid : String,  
    26                        reqcontent : String, 
    27                        operation : int 
    28                        )  
    29                
    30                        _tabname = tabname; 
    31                        _reqid = reqid; 
    32                        _reqcontent = reqcontent; 
    33                        _operation = operation; 
    34                        generateRegExp(); 
    35                
    36                  
    37                public function deepcopy() : TabRule 
    38                
    39                        return new TabRule(_tabname, _reqid, _reqcontent, _operation); 
    40                
    41                  
    42                public function toXML() : XML 
    43                
    44                        var ret : XML = <tabrule />; 
    45                        ret.@tabname = _tabname; 
    46                        ret.@reqid = _reqid; 
    47                        ret.@reqcontent = _reqcontent; 
    48                        ret.@operation = _operation; 
    49                        return ret; 
    50                
    51                  
    52                public static function fromXML(xml : XML) : TabRule 
    53                
    54                        return new TabRule( 
    55                                xml.@tabname.toString(), 
    56                                xml.@reqid.toString(), 
    57                                xml.@reqcontent.toString(), 
    58                                int(xml.@operation)); 
    59                
    60                  
    61                public function generateRegExp() : void 
    62                
    63                        _treecontent = null; 
    64                                  
    65                        if (_reqcontent != null) { 
    66                                try { 
    67                                        _treecontent = RegExpParser.parse(_reqcontent); 
    68                                }catch (epos : int) { 
    69                                        Logger.error("TabRule Content parse error! @" + epos); 
    70                                
    71                        
    72                
    73                  
    74                public function get tabname():String { return _tabname; } 
    75                  
    76                public function set tabname(value:String):void  
    77                
    78                        _tabname = value; 
    79                
    80                  
    81                public function get reqid():String { return _reqid; } 
    82                  
    83                public function set reqid(value:String):void  
    84                
    85                        _reqid = value; 
    86                
    87                  
    88                public function get reqcontent():String { return _reqcontent; } 
    89                  
    90                public function set reqcontent(value:String):void  
    91                
    92                        _reqcontent = value; 
    93                
    94                  
    95                public function get operation():int { return _operation; } 
    96                  
    97                public function set operation(value:int):void  
    98                
    99                        _operation = value; 
    100                
    101                  
    102                public function get treecontent():Object { return _treecontent; } 
    103        
    104          
     3  import ken39arg.logging.Logger; 
     4  import uwi.regexp.RegExpParser; 
     5   
     6  /** 
     7  * ... 
     8  * @author Uwi 
     9  */ 
     10  public class TabRule  
     11 
     12    public static const OPERATION_COPY : int = 0; 
     13    public static const OPERATION_MOVE : int = 1; 
     14    public static const OPERATION_DELETE : int = 2; 
     15    public static const OPERATIONSTR : Array = ["コピー", "移動", "削除"]; 
     16     
     17    private var _tabname : String; // 適用先タブ名 
     18    private var _reqid : String; // ID条件(スペース区切り) 
     19    private var _reqcontent : String; // 本文条件(正規表現) 
     20    private var _operation : int; // 操作(コピー・移動元はRecent) 
     21    private var _treecontent : Object; // _reqcontentの構文木 
     22     
     23    public function TabRule( 
     24      tabname : String,  
     25      reqid : String,  
     26      reqcontent : String, 
     27      operation : int 
     28      )  
     29   
     30      _tabname = tabname; 
     31      _reqid = reqid; 
     32      _reqcontent = reqcontent; 
     33      _operation = operation; 
     34      generateRegExp(); 
     35   
     36     
     37    public function deepcopy() : TabRule 
     38   
     39      return new TabRule(_tabname, _reqid, _reqcontent, _operation); 
     40   
     41     
     42    public function toXML() : XML 
     43   
     44      var ret : XML = <tabrule />; 
     45      ret.@tabname = _tabname; 
     46      ret.@reqid = _reqid; 
     47      ret.@reqcontent = _reqcontent; 
     48      ret.@operation = _operation; 
     49      return ret; 
     50   
     51     
     52    public static function fromXML(xml : XML) : TabRule 
     53   
     54      return new TabRule( 
     55        xml.@tabname.toString(), 
     56        xml.@reqid.toString(), 
     57        xml.@reqcontent.toString(), 
     58        int(xml.@operation)); 
     59   
     60     
     61    public function generateRegExp() : void 
     62   
     63      _treecontent = null; 
     64         
     65      if (_reqcontent != null) { 
     66        try { 
     67          _treecontent = RegExpParser.parse(_reqcontent); 
     68        }catch (epos : int) { 
     69          Logger.error("TabRule Content parse error! @" + epos); 
     70       
     71     
     72   
     73     
     74    public function get tabname():String { return _tabname; } 
     75     
     76    public function set tabname(value:String):void  
     77   
     78      _tabname = value; 
     79   
     80     
     81    public function get reqid():String { return _reqid; } 
     82     
     83    public function set reqid(value:String):void  
     84   
     85      _reqid = value; 
     86   
     87     
     88    public function get reqcontent():String { return _reqcontent; } 
     89     
     90    public function set reqcontent(value:String):void  
     91   
     92      _reqcontent = value; 
     93   
     94     
     95    public function get operation():int { return _operation; } 
     96     
     97    public function set operation(value:int):void  
     98   
     99      _operation = value; 
     100   
     101     
     102    public function get treecontent():Object { return _treecontent; } 
     103 
     104   
    105105} 
  • air/TLife/trunk/src/uwi/db/DB.as

    r2621 r2634  
    11package uwi.db { 
    2        import flash.data.SQLConnection; 
    3        import flash.data.SQLStatement; 
    4        import flash.errors.SQLError; 
    5        import flash.filesystem.File; 
    6        import ken39arg.logging.Logger; 
    7        import mx.collections.ArrayCollection; 
    8        import uwi.util.CommonData; 
    9          
    10        /** 
    11         * ... 
    12         * @author Uwi 
    13         */ 
    14        public class DB { 
    15                private var _conn : SQLConnection; 
    16                  
    17                public function DB(path : File) 
    18                
    19                        _conn = new SQLConnection(); 
    20                        _conn.open(path); 
    21                
    22                  
    23                public function close() : void 
    24                
    25                        try { 
    26                                if (_conn.connected) _conn.close(); 
    27                        }catch (e : Error) { 
    28                        
    29                
    30                  
    31                public function createTables() : void 
    32                
    33                        execute(conn,  
    34                                "create table if not exists " + CommonData.TABLE_STATUS + "(" +  
    35                                "postid integer primary key," + 
    36                                "posterid varchar(15) not null," + 
    37                                "content text not null," +  
    38                                "rawcontent text not null," +  
    39                                "postedtime date not null," +  
    40                                "replyid integer not null," + 
    41                                "fav boolean not null" + 
    42                                ")"); 
    43                        execute(conn,  
    44                                "create table if not exists " + CommonData.TABLE_POSTER + "(" +  
    45                                "screenname varchar(15) primary key," +  
    46                                "id integer not null default -1," +  
    47                                "name text not null," +  
    48                                "url text default ''," +  
    49                                "iconurl string default null," + 
    50                                "protected boolean not null default false," +  
    51                                "createdat date default 0," + 
    52                                "nfriends integer not null default -1," +  
    53                                "nfollowers integer not null default -1," +  
    54                                "nstatuses integer not null default -1," +  
    55                                "description string defualt ''," +  
    56                                "lastpost string not null default ''," + 
    57                                "lastposttime date default 0," + 
    58                                "lastupdated date not null" +  
    59                                ")"); 
    60                        execute(conn,  
    61                                "create table if not exists " + CommonData.TABLE_FOLLOWING + "(" +  
    62                                "idfrom varchar(15) not null," +  
    63                                "idto varchar(15) not null," +  
    64                                "lastupdated date not null," +  
    65                                "primary key(idfrom, idto)" +  
    66                                ")"); 
    67                
    68                  
    69                public static function execute(conn : SQLConnection, text : String) : void 
    70                
    71                        var stmt : SQLStatement = new SQLStatement(); 
    72                        stmt.sqlConnection = conn; 
    73                        stmt.text = text; 
    74                        try { 
    75                                stmt.execute(); 
    76                        }catch (error : SQLError) { 
    77                                Logger.error("DB Error" + error.message); 
    78                                Logger.error("DB text : " + text); 
    79                        
    80                
    81                  
    82                public function get conn() : SQLConnection { return _conn; } 
    83        
    84          
     2  import flash.data.SQLConnection; 
     3  import flash.data.SQLStatement; 
     4  import flash.errors.SQLError; 
     5  import flash.filesystem.File; 
     6  import ken39arg.logging.Logger; 
     7  import mx.collections.ArrayCollection; 
     8  import uwi.util.CommonData; 
     9   
     10  /** 
     11  * ... 
     12  * @author Uwi 
     13  */ 
     14  public class DB { 
     15    private var _conn : SQLConnection; 
     16     
     17    public function DB(path : File) 
     18   
     19      _conn = new SQLConnection(); 
     20      _conn.open(path); 
     21   
     22     
     23    public function close() : void 
     24   
     25      try { 
     26        if (_conn.connected) _conn.close(); 
     27      }catch (e : Error) { 
     28     
     29   
     30     
     31    public function createTables() : void 
     32   
     33      execute(conn,  
     34        "create table if not exists " + CommonData.TABLE_STATUS + "(" +  
     35        "postid integer primary key," + 
     36        "posterid varchar(15) not null," + 
     37        "content text not null," +  
     38        "rawcontent text not null," +  
     39        "postedtime date not null," +  
     40        "replyid integer not null," + 
     41        "fav boolean not null" + 
     42        ")"); 
     43      execute(conn,  
     44        "create table if not exists " + CommonData.TABLE_POSTER + "(" +  
     45        "screenname varchar(15) primary key," +  
     46        "id integer not null default -1," +  
     47        "name text not null," +  
     48        "url text default ''," +  
     49        "iconurl string default null," + 
     50        "protected boolean not null default false," +  
     51        "createdat date default 0," + 
     52        "nfriends integer not null default -1," +  
     53        "nfollowers integer not null default -1," +  
     54        "nstatuses integer not null default -1," +  
     55        "description string defualt ''," +  
     56        "lastpost string not null default ''," + 
     57        "lastposttime date default 0," + 
     58        "lastupdated date not null" +  
     59        ")"); 
     60      execute(conn,  
     61        "create table if not exists " + CommonData.TABLE_FOLLOWING + "(" +  
     62        "idfrom varchar(15) not null," +  
     63        "idto varchar(15) not null," +  
     64        "lastupdated date not null," +  
     65        "primary key(idfrom, idto)" +  
     66        ")"); 
     67   
     68     
     69    public static function execute(conn : SQLConnection, text : String) : void 
     70   
     71      var stmt : SQLStatement = new SQLStatement(); 
     72      stmt.sqlConnection = conn; 
     73      stmt.text = text; 
     74      try { 
     75        stmt.execute(); 
     76      }catch (error : SQLError) { 
     77        Logger.error("DB Error" + error.message); 
     78        Logger.error("DB text : " + text); 
     79     
     80   
     81     
     82    public function get conn() : SQLConnection { return _conn; } 
     83 
     84   
    8585} 
  • air/TLife/trunk/src/uwi/db/DBExcite.as

    r2533 r2634  
    11package uwi.db 
    22{ 
    3        import flash.data.SQLConnection; 
    4        import flash.data.SQLStatement; 
    5        import flash.errors.SQLError; 
    6        import ken39arg.logging.Logger; 
    7        import mx.core.Application; 
    8        import uwi.util.CommonData; 
    9        import uwi.util.StringUtility; 
    10        import uwi.util.Utility; 
    11          
    12        /** 
    13         * diskDBからmemoryDBに必要なデータをコピー 
    14         * @author Uwi 
    15         */ 
    16        public class DBExcite 
    17        
    18                public static function excite(readoldposts : Boolean) : void 
    19                
    20                        var conn : SQLConnection = CommonData.db_memory.conn; 
    21                          
    22                        conn.attach("disk", CommonData.FILE_DISKDB); 
    23                          
    24                        try { 
    25                                conn.begin(); 
    26                                  
    27                                if(readoldposts){ 
    28                                        Logger.debug("DBExcite STATUS"); 
    29                                        for each(var tabname : String in Application.application.tabbar.titles) { 
    30                                                if (CommonData.tabmap[tabname].type == 1) continue; 
    31                                                  
    32                                                var sqlpre : String = "replace into " + CommonData.TABLE_STATUS +  
    33                                                        " select * from disk." + CommonData.TABLE_STATUS; 
    34                                                var sqlsuf : String = " limit " + Utility.getNumber("numdisplay", tabname); 
    35                                                var sql : String = null; 
    36                                                switch(tabname) { 
    37                                                case CommonData.LABEL_RECENT: 
    38                                                        sql = " where posterid in (select posterid from disk." +  
    39                                                                CommonData.TABLE_FOLLOWING +  
    40                                                                " where userid = '" + StringUtility.escapeSQL(CommonData.configxml.login.userid) + "')"; 
    41                                                        break; 
    42                                                case CommonData.LABEL_REPLY: 
    43                                                        sql = " where content glob '*@" + StringUtility.escapeSQLForLike(CommonData.configxml.login.userid) + "*'"; 
    44                                                        break; 
    45                                                case CommonData.LABEL_FAVORITES: 
    46                                                        sql = " where fav = true"; 
    47                                                        break; 
    48                                                default: 
    49                                                        sql = CommonData.tabmap[tabname].rule; 
    50                                                        break; 
    51                                                
    52                                                if (sql == null) continue; 
    53                                                  
    54                                                var stmt_rep_status : SQLStatement = new SQLStatement(); 
    55                                                stmt_rep_status.sqlConnection = conn; 
    56                                                stmt_rep_status.text = sqlpre + sql + sqlsuf; 
    57                                                  
    58                                                try { 
    59                                                        stmt_rep_status.execute(); 
    60                                                }catch (e : SQLError) { 
    61                                                        Logger.stacktrace(e); 
    62                                                
    63                                        
    64                                
    65                                  
    66                                Logger.debug("DBExcite POSTER"); 
    67                                var stmt_rep_poster : SQLStatement = new SQLStatement(); 
    68                                stmt_rep_poster.sqlConnection = conn; 
    69                                stmt_rep_poster.text = "insert into " + CommonData.TABLE_POSTER +  
    70                                        " select * from disk." + CommonData.TABLE_POSTER; 
    71                                try { 
    72                                        stmt_rep_poster.execute(); 
    73                                }catch (e : SQLError) { 
    74                                        Logger.stacktrace(e); 
    75                                
    76                                  
    77                                Logger.debug("DBExcite FOLLOWING"); 
    78                                var stmt_rep_following : SQLStatement = new SQLStatement(); 
    79                                stmt_rep_following.sqlConnection = conn; 
    80                                stmt_rep_following.text = "insert into " +      CommonData.TABLE_FOLLOWING +  
    81                                        " select * from disk." + CommonData.TABLE_FOLLOWING; 
    82                                try { 
    83                                        stmt_rep_following.execute(); 
    84                                }catch (e : SQLError) { 
    85                                        Logger.stacktrace(e); 
    86                                
    87                                  
    88                                Logger.debug("DBExcite END"); 
    89                                  
    90                                conn.commit(); 
    91                        }catch (e : SQLError) { 
    92                                conn.rollback(); 
    93                        
    94                          
    95                        conn.detach("disk"); 
    96                
    97        
    98          
     3  import flash.data.SQLConnection; 
     4  import flash.data.SQLStatement; 
     5  import flash.errors.SQLError; 
     6  import ken39arg.logging.Logger; 
     7  import mx.core.Application; 
     8  import uwi.util.CommonData; 
     9  import uwi.util.StringUtility; 
     10  import uwi.util.Utility; 
     11   
     12  /** 
     13  * diskDBからmemoryDBに必要なデータをコピー 
     14  * @author Uwi 
     15  */ 
     16  public class DBExcite 
     17 
     18    public static function excite(readoldposts : Boolean) : void 
     19   
     20      var conn : SQLConnection = CommonData.db_memory.conn; 
     21       
     22      conn.attach("disk", CommonData.FILE_DISKDB); 
     23       
     24      try { 
     25        conn.begin(); 
     26         
     27        if(readoldposts){ 
     28          Logger.debug("DBExcite STATUS"); 
     29          for each(var tabname : String in Application.application.tabbar.titles) { 
     30            if (CommonData.tabmap[tabname].type == 1) continue; 
     31             
     32            var sqlpre : String = "replace into " + CommonData.TABLE_STATUS +  
     33              " select * from disk." + CommonData.TABLE_STATUS; 
     34            var sqlsuf : String = " limit " + Utility.getNumber("numdisplay", tabname); 
     35            var sql : String = null; 
     36            switch(tabname) { 
     37            case CommonData.LABEL_RECENT: 
     38              sql = " where posterid in (select posterid from disk." +  
     39                CommonData.TABLE_FOLLOWING +  
     40                " where userid = '" + StringUtility.escapeSQL(CommonData.configxml.login.userid) + "')"; 
     41              break; 
     42            case CommonData.LABEL_REPLY: 
     43              sql = " where content glob '*@" + StringUtility.escapeSQLForLike(CommonData.configxml.login.userid) + "*'"; 
     44              break; 
     45            case CommonData.LABEL_FAVORITES: 
     46              sql = " where fav = true"; 
     47              break; 
     48            default: 
     49              sql = CommonData.tabmap[tabname].rule; 
     50              break; 
     51           
     52            if (sql == null) continue; 
     53             
     54            var stmt_rep_status : SQLStatement = new SQLStatement(); 
     55            stmt_rep_status.sqlConnection = conn; 
     56            stmt_rep_status.text = sqlpre + sql + sqlsuf; 
     57             
     58            try { 
     59              stmt_rep_status.execute(); 
     60            }catch (e : SQLError) { 
     61              Logger.stacktrace(e); 
     62           
     63         
     64       
     65         
     66        Logger.debug("DBExcite POSTER"); 
     67        var stmt_rep_poster : SQLStatement = new SQLStatement(); 
     68        stmt_rep_poster.sqlConnection = conn; 
     69        stmt_rep_poster.text = "insert into " + CommonData.TABLE_POSTER +  
     70          " select * from disk." + CommonData.TABLE_POSTER; 
     71        try { 
     72          stmt_rep_poster.execute(); 
     73        }catch (e : SQLError) { 
     74          Logger.stacktrace(e); 
     75       
     76         
     77        Logger.debug("DBExcite FOLLOWING"); 
     78        var stmt_rep_following : SQLStatement = new SQLStatement(); 
     79        stmt_rep_following.sqlConnection = conn; 
     80        stmt_rep_following.text = "insert into " +  CommonData.TABLE_FOLLOWING +  
     81          " select * from disk." + CommonData.TABLE_FOLLOWING; 
     82        try { 
     83          stmt_rep_following.execute(); 
     84        }catch (e : SQLError) { 
     85          Logger.stacktrace(e); 
     86       
     87         
     88        Logger.debug("DBExcite END"); 
     89         
     90        conn.commit(); 
     91      }catch (e : SQLError) { 
     92        conn.rollback(); 
     93     
     94       
     95      conn.detach("disk"); 
     96   
     97 
     98   
    9999} 
  • air/TLife/trunk/src/uwi/db/DBOpenThread.as

    r2501 r2634  
    11package uwi.db { 
    2        import flash.data.SQLConnection; 
    3        import flash.events.SQLErrorEvent; 
    4        import flash.events.SQLEvent; 
    5        import flash.filesystem.File; 
    6        import ken39arg.logging.Logger; 
    7        import org.libspark.thread.Thread; 
    8        import org.libspark.thread.utils.EventDispatcherThread; 
    9          
    10        /** 
    11         * ... 
    12         * @author Uwi 
    13         */ 
    14        public class DBOpenThread extends EventDispatcherThread { 
    15                private var path : File; 
    16                public var conn : SQLConnection; 
    17                  
    18                public function DBOpenThread(path : File) { 
    19                        this.path = path; 
    20                
    21                  
    22                protected override function finalize() : void 
    23                
    24                        path = null; 
    25                        conn = null; 
    26                
    27                  
    28                protected override function run() : void 
    29                
    30                        conn = new SQLConnection(); 
    31                        conn.openAsync(path); 
    32                        event(conn, SQLEvent.OPEN, onDBOpen); 
    33                        event(conn, SQLErrorEvent.ERROR, onError); 
    34                
    35                  
    36                private function onDBOpen(e : SQLEvent) : void 
    37                
    38                        Logger.info("DB open succeeded."); 
    39                
    40                  
    41                private function onError(e : SQLErrorEvent) : void 
    42                
    43                        conn = null; 
    44                        Logger.error("DB Error"); 
    45                        Logger.stacktrace(e.error); 
    46                
    47                  
    48                public function get Conn() : SQLConnection { return conn; } 
    49        
    50          
     2  import flash.data.SQLConnection; 
     3  import flash.events.SQLErrorEvent; 
     4  import flash.events.SQLEvent; 
     5  import flash.filesystem.File; 
     6  import ken39arg.logging.Logger; 
     7  import org.libspark.thread.Thread; 
     8  import org.libspark.thread.utils.EventDispatcherThread; 
     9   
     10  /** 
     11  * ... 
     12  * @author Uwi 
     13  */ 
     14  public class DBOpenThread extends EventDispatcherThread { 
     15    private var path : File; 
     16    public var conn : SQLConnection; 
     17     
     18    public function DBOpenThread(path : File) { 
     19      this.path = path; 
     20   
     21     
     22    protected override function finalize() : void 
     23   
     24      path = null; 
     25      conn = null; 
     26   
     27     
     28    protected override function run() : void 
     29   
     30      conn = new SQLConnection(); 
     31      conn.openAsync(path); 
     32      event(conn, SQLEvent.OPEN, onDBOpen); 
     33      event(conn, SQLErrorEvent.ERROR, onError); 
     34   
     35     
     36    private function onDBOpen(e : SQLEvent) : void 
     37   
     38      Logger.info("DB open succeeded."); 
     39   
     40     
     41    private function onError(e : SQLErrorEvent) : void 
     42   
     43      conn = null; 
     44      Logger.error("DB Error"); 
     45      Logger.stacktrace(e.error); 
     46   
     47     
     48    public function get Conn() : SQLConnection { return conn; } 
     49 
     50   
    5151} 
  • air/TLife/trunk/src/uwi/db/DBSelectThread.as

    r2624 r2634  
    11package uwi.db { 
    2        import flash.data.SQLConnection; 
    3        import flash.data.SQLResult; 
    4        import flash.data.SQLStatement; 
    5        import flash.events.Event; 
    6        import flash.events.SQLErrorEvent; 
    7        import flash.events.SQLEvent; 
    8        import ken39arg.logging.Logger; 
    9        import org.libspark.thread.Thread; 
    10          
    11        /** 
    12         * DBに対しselect文を発行するThread 
    13         * @author Uwi 
    14         */ 
    15        public class DBSelectThread extends Thread { 
    16                private var stmt : SQLStatement; 
    17                private var prefetch : int; 
    18                private var result : SQLResult; 
    19                  
    20                public function DBSelectThread(conn : SQLConnection, sqltxt : String, prefetch : int = -1) { 
    21                        this.name = "DBSelect"; 
    22                        stmt = new SQLStatement(); 
    23 //                     Logger.debug("DBSelectThraed sql : " + sqltxt); 
    24                        stmt.sqlConnection = conn; 
    25                        stmt.text = sqltxt; 
    26                        this.prefetch = prefetch; 
    27                
    28                  
    29                protected override function finalize() : void 
    30                
    31                        stmt = null; 
    32                
    33                  
    34                protected override function run() : void 
    35                
    36                        result = null; 
    37                        try { 
    38                                stmt.execute(prefetch); 
    39                                result = stmt.getResult(); 
    40                                stmt.cancel(); 
    41                        }catch (e : Error) { 
    42                                Logger.error("DBSelectThread catch Error : " + e.message); 
    43                        
    44                        next(dummy); 
    45                
    46                  
    47                private function dummy() : void 
    48                
    49                
    50                  
    51                public function get Result() : SQLResult { return result; } 
    52        
    53          
     2  import flash.data.SQLConnection; 
     3  import flash.data.SQLResult; 
     4  import flash.data.SQLStatement; 
     5  import flash.events.Event; 
     6  import flash.events.SQLErrorEvent; 
     7  import flash.events.SQLEvent; 
     8  import ken39arg.logging.Logger; 
     9  import org.libspark.thread.Thread; 
     10   
     11  /** 
     12  * DBに対しselect文を発行するThread 
     13  * @author Uwi 
     14  */ 
     15  public class DBSelectThread extends Thread { 
     16    private var stmt : SQLStatement; 
     17    private var prefetch : int; 
     18    private var result : SQLResult; 
     19     
     20    public function DBSelectThread(conn : SQLConnection, sqltxt : String, prefetch : int = -1) { 
     21      this.name = "DBSelect"; 
     22      stmt = new SQLStatement(); 
     23//      Logger.debug("DBSelectThraed sql : " + sqltxt); 
     24      stmt.sqlConnection = conn; 
     25      stmt.text = sqltxt; 
     26      this.prefetch = prefetch; 
     27   
     28     
     29    protected override function finalize() : void 
     30   
     31      stmt = null; 
     32   
     33     
     34    protected override function run() : void 
     35   
     36      result = null; 
     37      try { 
     38        stmt.execute(prefetch); 
     39        result = stmt.getResult(); 
     40        stmt.cancel(); 
     41      }catch (e : Error) { 
     42        Logger.error("DBSelectThread catch Error : " + e.message); 
     43     
     44      next(dummy); 
     45   
     46     
     47    private function dummy() : void 
     48   
     49   
     50     
     51    public function get Result() : SQLResult { return result; } 
     52 
     53   
    5454} 
  • air/TLife/trunk/src/uwi/db/DBSupplyThread.as

    r2621 r2634  
    11package uwi.db 
    22{ 
    3        import flash.data.SQLConnection; 
    4        import flash.data.SQLResult; 
    5        import org.libspark.thread.Thread; 
    6        import uwi.db.DBSelectThread; 
    7          
    8        /** 
    9         * DBをselectして存在しなかった場合にWebからとってくる・・ということを容易に実現するThread 
    10         * @author Uwi 
    11         */ 
    12        public class DBSupplyThread extends Thread  
    13        
    14                private var dbst : DBSelectThread = null; 
    15                private var loaderthread : Thread = null; 
    16                public var data : Object = null; 
    17                private var nTry : int; 
    18                  
    19                private var conn : SQLConnection; 
    20                private var sqltxt : String; 
    21                private var funcvalid : Function; 
    22                  
    23                public function DBSupplyThread(conn : SQLConnection, sqltxt : String, loaderthread : Thread, funcvalid : Function = null)  
    24                
    25                        nTry = 0; 
    26                        this.conn = conn; 
    27                        this.sqltxt = sqltxt; 
    28                        this.loaderthread = loaderthread; 
    29                        this.funcvalid = funcvalid; 
    30                
    31                  
    32                protected override function run() : void 
    33                
    34                        nTry++; 
    35                        dbst = new DBSelectThread(conn, sqltxt); 
    36                        dbst.start(); 
    37                        dbst.join(); 
    38                        next(onDBComplete); 
    39                        interrupted(onInterrupted); 
    40                
    41                  
    42                private function onDBComplete() : void 
    43                
    44                        var ret : SQLResult = dbst.Result; 
    45                        var ar : Array = ret.data; 
    46                        if (ar != null && (funcvalid == null || funcvalid.apply(null, [ar[0]]))){ 
    47                                data = ar[0]; 
    48                        }else { 
    49                                if (nTry == 1) { 
    50                                        loaderthread.start(); 
    51                                        loaderthread.join(); 
    52                                        next(run); 
    53                                        interrupted(onInterrupted); 
    54                                
    55                        
    56                
    57                  
    58                private function onInterrupted() : void 
    59                
    60                        if (dbst != null) dbst.interrupt(); 
    61 //                     if (loaderthread != null) loaderthread.interrupt(); 
    62                
    63        
    64          
     3  import flash.data.SQLConnection; 
     4  import flash.data.SQLResult; 
     5  import org.libspark.thread.Thread; 
     6  import uwi.db.DBSelectThread; 
     7   
     8  /** 
     9  * DBをselectして存在しなかった場合にWebからとってくる・・ということを容易に実現するThread 
     10  * @author Uwi 
     11  */ 
     12  public class DBSupplyThread extends Thread  
     13 
     14    private var dbst : DBSelectThread = null; 
     15    private var loaderthread : Thread = null; 
     16    public var data : Object = null; 
     17    private var nTry : int; 
     18     
     19    private var conn : SQLConnection; 
     20    private var sqltxt : String; 
     21    private var funcvalid : Function; 
     22     
     23    public function DBSupplyThread(conn : SQLConnection, sqltxt : String, loaderthread : Thread, funcvalid : Function = null)  
     24   
     25      nTry = 0; 
     26      this.conn = conn; 
     27      this.sqltxt = sqltxt; 
     28      this.loaderthread = loaderthread; 
     29      this.funcvalid = funcvalid; 
     30   
     31     
     32    protected override function run() : void 
     33   
     34      nTry++; 
     35      dbst = new DBSelectThread(conn, sqltxt); 
     36      dbst.start(); 
     37      dbst.join(); 
     38      next(onDBComplete); 
     39      interrupted(onInterrupted); 
     40   
     41     
     42    private function onDBComplete() : void 
     43   
     44      var ret : SQLResult = dbst.Result; 
     45      var ar : Array = ret.data; 
     46      if (ar != null && (funcvalid == null || funcvalid.apply(null, [ar[0]]))){ 
     47        data = ar[0]; 
     48      }else { 
     49        if (nTry == 1) { 
     50          loaderthread.start(); 
     51          loaderthread.join(); 
     52          next(run); 
     53          interrupted(onInterrupted); 
     54       
     55     
     56   
     57     
     58    private function onInterrupted() : void 
     59   
     60      if (dbst != null) dbst.interrupt(); 
     61//      if (loaderthread != null) loaderthread.interrupt(); 
     62   
     63 
     64   
    6565} 
  • air/TLife/trunk/src/uwi/db/DBSupplyThread2.as

    r2450 r2634  
    11package uwi.db 
    22{ 
    3        import flash.data.SQLConnection; 
    4        import flash.data.SQLResult; 
    5        import org.libspark.thread.Thread; 
    6        import uwi.db.DBSelectThread; 
    7        import uwi.thread.FollowingCheckThread; 
    8          
    9        /** 
    10         * DBをselectして存在しなかった場合にWebからとってくる・・ということを容易に実現するThread(FollowingCheckつき) 
    11         * TODO? protectedの情報もselectする情報もDB内になかったとき、fctとloaderthreadで2回webにアクセスしないと目的の情報がとれない問題 
    12         * supplyなしfctを先に実行しておいて、あとでもう一度fctを呼び出す?外で? 
    13         * @author Uwi 
    14         */ 
    15        public class DBSupplyThread2 extends Thread  
    16        
    17                private var dbst : DBSelectThread = null; 
    18                private var loaderthread : Thread = null; 
    19                private var fct : FollowingCheckThread = null; 
    20                public var data : Object = null; 
    21                private var nTry : int; 
    22                  
    23                private var conn : SQLConnection; 
    24                private var sqltxt : String; 
    25                  
    26                public function DBSupplyThread2(conn : SQLConnection, sqltxt : String, fct : FollowingCheckThread, loaderthread : Thread)  
    27                
    28                        nTry = 0; 
    29                        this.conn = conn; 
    30                        this.sqltxt = sqltxt; 
    31                        this.fct = fct; 
    32                        this.loaderthread = loaderthread; 
    33                
    34                  
    35                protected override function run() : void 
    36                
    37                        nTry++; 
    38                        dbst = new DBSelectThread(conn, sqltxt); 
    39                        dbst.start(); 
    40                        dbst.join(); 
    41                        next(onDBComplete); 
    42                        interrupted(onInterrupted); 
    43                
    44                  
    45                private function onDBComplete() : void 
    46                
    47                        var ret : SQLResult = dbst.Result; 
    48                        var ar : Array = ret.data; 
    49                        if (ar != null) { 
    50                                data = ar[0]; 
    51                        }else { 
    52                                if (fct == null) onFCTComplete(); 
    53                                if (nTry == 1) { 
    54                                        fct.start(); 
    55                                        fct.join(); 
    56                                        next(onFCTComplete); 
    57                                        interrupted(onInterrupted); 
    58                                
    59                        
    60                
    61                  
    62                private function onFCTComplete() : void 
    63                
    64                        if(fct == null || fct.result == 0){ 
    65                                loaderthread.start(); 
    66                                loaderthread.join(); 
    67                                next(run); 
    68                                interrupted(onInterrupted); 
    69                        
    70                
    71                  
    72                private function onInterrupted() : void 
    73                
    74                        if (dbst != null) dbst.interrupt(); 
    75                        if (fct != null) fct.interrupt(); 
    76                        if (loaderthread != null) loaderthread.interrupt(); 
    77                
    78        
    79          
     3  import flash.data.SQLConnection; 
     4  import flash.data.SQLResult; 
     5  import org.libspark.thread.Thread; 
     6  import uwi.db.DBSelectThread; 
     7  import uwi.thread.FollowingCheckThread; 
     8   
     9  /** 
     10  * DBをselectして存在しなかった場合にWebからとってくる・・ということを容易に実現するThread(FollowingCheckつき) 
     11  * TODO? protectedの情報もselectする情報もDB内になかったとき、fctとloaderthreadで2回webにアクセスしないと目的の情報がとれない問題 
     12  * supplyなしfctを先に実行しておいて、あとでもう一度fctを呼び出す?外で? 
     13  * @author Uwi 
     14  */ 
     15  public class DBSupplyThread2 extends Thread  
     16 
     17    private var dbst : DBSelectThread = null; 
     18    private var loaderthread : Thread = null; 
     19    private var fct : FollowingCheckThread = null; 
     20    public var data : Object = null; 
     21    private var nTry : int; 
     22     
     23    private var conn : SQLConnection; 
     24    private var sqltxt : String; 
     25     
     26    public function DBSupplyThread2(conn : SQLConnection, sqltxt : String, fct : FollowingCheckThread, loaderthread : Thread)  
     27   
     28      nTry = 0; 
     29      this.conn = conn; 
     30      this.sqltxt = sqltxt; 
     31      this.fct = fct; 
     32      this.loaderthread = loaderthread; 
     33   
     34     
     35    protected override function run() : void 
     36   
     37      nTry++; 
     38      dbst = new DBSelectThread(conn, sqltxt); 
     39      dbst.start(); 
     40      dbst.join(); 
     41      next(onDBComplete); 
     42      interrupted(onInterrupted); 
     43   
     44     
     45    private function onDBComplete() : void 
     46   
     47      var ret : SQLResult = dbst.Result; 
     48      var ar : Array = ret.data; 
     49      if (ar != null) { 
     50        data = ar[0]; 
     51      }else { 
     52        if (fct == null) onFCTComplete(); 
     53        if (nTry == 1) { 
     54          fct.start(); 
     55          fct.join(); 
     56          next(onFCTComplete); 
     57          interrupted(onInterrupted); 
     58       
     59     
     60   
     61     
     62    private function onFCTComplete() : void 
     63   
     64      if(fct == null || fct.result == 0){ 
     65        loaderthread.start(); 
     66        loaderthread.join(); 
     67        next(run); 
     68        interrupted(onInterrupted); 
     69     
     70   
     71     
     72    private function onInterrupted() : void 
     73   
     74      if (dbst != null) dbst.interrupt(); 
     75      if (fct != null) fct.interrupt(); 
     76      if (loaderthread != null) loaderthread.interrupt(); 
     77   
     78 
     79   
    8080} 
  • air/TLife/trunk/src/uwi/db/DBTransactionThread.as

    r2501 r2634  
    11package uwi.db { 
    2        import flash.data.SQLConnection; 
    3        import flash.errors.SQLError; 
    4        import ken39arg.logging.Logger; 
    5        import org.libspark.thread.Thread; 
    6          
    7        /** 
    8         * 継承前提 
    9         * @author Uwi 
    10         */ 
    11        public class DBTransactionThread extends Thread { 
    12                protected var conn : SQLConnection; 
    13                  
    14                public function DBTransactionThread(conn : SQLConnection) { 
    15                        this.conn = conn; 
    16                
    17                  
    18                protected override function finalize() : void 
    19                
    20                        conn = null; 
    21                
    22                  
    23                protected override function run() : void 
    24                
    25                        if (!conn.connected) return; 
    26                        try { 
    27                                conn.begin(); 
    28                                execute(); 
    29                                conn.commit(); 
    30                        } catch (e : SQLError) { 
    31                                Logger.stacktrace(e); 
    32                                conn.rollback(); 
    33                        
    34                
    35                  
    36                protected function execute() : void { } 
    37                  
    38        
    39          
     2  import flash.data.SQLConnection; 
     3  import flash.errors.SQLError; 
     4  import ken39arg.logging.Logger; 
     5  import org.libspark.thread.Thread; 
     6   
     7  /** 
     8  * 継承前提 
     9  * @author Uwi 
     10  */ 
     11  public class DBTransactionThread extends Thread { 
     12    protected var conn : SQLConnection; 
     13     
     14    public function DBTransactionThread(conn : SQLConnection) { 
     15      this.conn = conn; 
     16   
     17     
     18    protected override function finalize() : void 
     19   
     20      conn = null; 
     21   
     22     
     23    protected override function run() : void 
     24   
     25      if (!conn.connected) return; 
     26      try { 
     27        conn.begin(); 
     28        execute(); 
     29        conn.commit(); 
     30      } catch (e : SQLError) { 
     31        Logger.stacktrace(e); 
     32        conn.rollback(); 
     33     
     34   
     35     
     36    protected function execute() : void { } 
     37     
     38 
     39   
    4040} 
  • air/TLife/trunk/src/uwi/db/SimpleTransactionThread.as

    r2546 r2634  
    11package uwi.db  
    22{ 
    3        import flash.data.SQLConnection; 
    4        import flash.data.SQLStatement; 
    5        import flash.errors.SQLError; 
    6        import ken39arg.logging.Logger; 
    7        import mx.utils.ObjectUtil; 
    8        import org.libspark.thread.Thread; 
    9          
    10        /** 
    11         * ... 
    12         * @author Uwi 
    13         */ 
    14        public class SimpleTransactionThread extends DBTransactionThread  
    15        
    16                private var basetext : String; 
    17                private var args : Array; // Array<Object> 
    18                  
    19                public function SimpleTransactionThread(conn : SQLConnection, basetext : String, args : Array = null)  
    20                {  
    21                        this.name = "SimpleTransaction"; 
    22                        super(conn); 
    23                        this.basetext = basetext; 
    24                        this.args = args; 
    25                }  
    26                  
    27                protected override function finalize() : void 
    28                
    29                        basetext = null; 
    30                        args = null; 
    31                
    32                  
    33                protected override function execute() : void 
    34                
    35                        var stmt : SQLStatement = new SQLStatement(); 
    36                        stmt.sqlConnection = conn; 
    37                        stmt.text = basetext; 
    38                          
    39                        if (args != null) { 
    40                                for each(var arg : Object in args) { 
    41                                        for (var key : String in arg) { 
    42                                                stmt.parameters[":" + key] = arg[key]; 
    43                                        
    44                                        try { 
    45                                                stmt.execute(); 
    46                                        }catch (e : SQLError) { 
    47                                                Logger.error("SimpleTransactionThread ERROR! SQL : " + stmt.text + " ARG : " + ObjectUtil.toString(arg)); 
    48                                        
    49                                
    50                        }else { 
    51                                try { 
    52                                        stmt.execute(); 
    53                                }catch (e : SQLError) { 
    54                                        Logger.error("SimpleTransactionThread ERROR! SQL : " + stmt.text + " ARG : " + ObjectUtil.toString(arg)); 
    55                                
    56                        
    57                
    58                  
    59        
    60          
     3  import flash.data.SQLConnection; 
     4  import flash.data.SQLStatement; 
     5  import flash.errors.SQLError; 
     6  import ken39arg.logging.Logger; 
     7  import mx.utils.ObjectUtil; 
     8  import org.libspark.thread.Thread; 
     9   
     10  /** 
     11  * ... 
     12  * @author Uwi 
     13  */ 
     14  public class SimpleTransactionThread extends DBTransactionThread  
     15 
     16    private var basetext : String; 
     17    private var args : Array; // Array<Object> 
     18     
     19    public function SimpleTransactionThread(conn : SQLConnection, basetext : String, args : Array = null)  
     20    {  
     21      this.name = "SimpleTransaction"; 
     22      super(conn); 
     23      this.basetext = basetext; 
     24      this.args = args; 
     25    }  
     26     
     27    protected override function finalize() : void 
     28   
     29      basetext = null; 
     30      args = null; 
     31   
     32     
     33    protected override function execute() : void 
     34   
     35      var stmt : SQLStatement = new SQLStatement(); 
     36      stmt.sqlConnection = conn; 
     37      stmt.text = basetext; 
     38       
     39      if (args != null) { 
     40        for each(var arg : Object in args) { 
     41          for (var key : String in arg) { 
     42            stmt.parameters[":" + key] = arg[key]; 
     43         
     44          try { 
     45            stmt.execute(); 
     46          }catch (e : SQLError) { 
     47            Logger.error("SimpleTransactionThread ERROR! SQL : " + stmt.text + " ARG : " + ObjectUtil.toString(arg)); 
     48         
     49       
     50      }else { 
     51        try { 
     52          stmt.execute(); 
     53        }catch (e : SQLError) { 
     54          Logger.error("SimpleTransactionThread ERROR! SQL : " + stmt.text + " ARG : " + ObjectUtil.toString(arg)); 
     55       
     56     
     57   
     58     
     59 
     60   
    6161} 
  • air/TLife/trunk/src/uwi/migemo/AIRMigemo.as

    r2453 r2634  
    77import flash.system.System; 
    88import uwi.util.StringUtility; 
    9          
    10        /** 
    11         * ... 
    12         * AIR版migemoのようなもの。 
    13         * JavaScript版を参考にしている。 
    14         * open->(complement or enumerate)->close の順に呼ばなければならない。 
    15         * @see http://www.oldriver.org/jsmigemo/ 
    16         * @author Uwi 
    17         */ 
    18        public class AIRMigemo { 
    19                private const TABLE : String = "migemodic"; 
    20                  
    21                private var conn : SQLConnection; 
    22                private var stmtS : SQLStatement; // 再利用可能なselectステートメント 
    23                  
    24                public function AIRMigemo() { 
    25                        conn = new SQLConnection(); 
    26                        stmtS = new SQLStatement(); 
    27                        stmtS.sqlConnection = conn; 
    28                        stmtS.text = "select value from " + TABLE + " where key in (:queryraw, :queryhira)"; 
    29                
    30                  
    31                public function open(dicdb : File) : Boolean 
    32                
    33                        if (conn.connected) return false; 
    34                        try { 
    35                                conn.open(dicdb); 
    36                        }catch (err : Error) { 
    37                                return false; 
    38                        
    39                        return true; 
    40                
    41                  
    42                public function close() : void 
    43                
    44                        try { 
    45                                if (conn.connected) conn.close(); 
    46                        }catch (err : Error) { 
    47                        
    48                
    49                  
    50                /** 
    51                 * 正規表現を作成 
    52                 * @param       query 
    53                 * @return 
    54                 */ 
    55                public function complement(query : String) : String 
    56                
    57                        return generateRegExp(enumerate(query)); 
    58                
    59                  
    60                /** 
    61                 * queryを補完したVector.<String>を返す。 
    62                 * @param       query 
    63                 * @return 
    64                 */ 
    65                public function enumerate(query : String) : Vector.<String> 
    66                
    67                        if (!conn.connected) return enumerateSimply(query); 
    68                          
    69                        var ret : Vector.<String> = new Vector.<String>(); 
    70                        ret.push(query); 
    71                        if (query.length == 0) return ret; 
    72                          
    73                        // 英字の半角をexpand 
    74                        ret.push(expandAlphabet(query)); 
    75                          
    76                        query = convertHiraganaToKatakana(query); 
    77                        var expandedRomans : Vector.<String> = expandConsonant(query.replace(/([sktpgdzc]){2,}/g, "xtu$1"));; 
    78                        for each(var eroman : String in expandedRomans) { 
    79                                var kata : String = convertRomanToKatakana(eroman); 
    80                                ret.push(kata); 
    81                                var hira : String = convertKatakanaToHiragana(kata); 
    82                                ret.push(hira); 
    83                                  
    84                                var ar : Array, ar2 : Array; 
    85                                var x : Object, x2 : String; 
     9   
     10  /** 
     11  * ... 
     12  * AIR版migemoのようなもの。 
     13  * JavaScript版を参考にしている。 
     14  * open->(complement or enumerate)->close の順に呼ばなければならない。 
     15  * @see http://www.oldriver.org/jsmigemo/ 
     16  * @author Uwi 
     17  */ 
     18  public class AIRMigemo { 
     19    private const TABLE : String = "migemodic"; 
     20     
     21    private var conn : SQLConnection; 
     22    private var stmtS : SQLStatement; // 再利用可能なselectステートメント 
     23     
     24    public function AIRMigemo() { 
     25      conn = new SQLConnection(); 
     26      stmtS = new SQLStatement(); 
     27      stmtS.sqlConnection = conn; 
     28      stmtS.text = "select value from " + TABLE + " where key in (:queryraw, :queryhira)"; 
     29   
     30     
     31    public function open(dicdb : File) : Boolean 
     32   
     33      if (conn.connected) return false; 
     34      try { 
     35        conn.open(dicdb); 
     36      }catch (err : Error) { 
     37        return false; 
     38     
     39      return true; 
     40   
     41     
     42    public function close() : void 
     43   
     44      try { 
     45        if (conn.connected) conn.close(); 
     46      }catch (err : Error) { 
     47     
     48   
     49     
     50    /** 
     51    * 正規表現を作成 
     52     * @param query 
     53    * @return 
     54    */ 
     55    public function complement(query : String) : String 
     56   
     57      return generateRegExp(enumerate(query)); 
     58   
     59     
     60    /** 
     61    * queryを補完したVector.<String>を返す。 
     62     * @param query 
     63    * @return 
     64    */ 
     65    public function enumerate(query : String) : Vector.<String> 
     66   
     67      if (!conn.connected) return enumerateSimply(query); 
     68       
     69      var ret : Vector.<String> = new Vector.<String>(); 
     70      ret.push(query); 
     71      if (query.length == 0) return ret; 
     72       
     73      // 英字の半角をexpand 
     74      ret.push(expandAlphabet(query)); 
     75       
     76      query = convertHiraganaToKatakana(query); 
     77      var expandedRomans : Vector.<String> = expandConsonant(query.replace(/([sktpgdzc]){2,}/g, "xtu$1"));; 
     78      for each(var eroman : String in expandedRomans) { 
     79        var kata : String = convertRomanToKatakana(eroman); 
     80        ret.push(kata); 
     81        var hira : String = convertKatakanaToHiragana(kata); 
     82        ret.push(hira); 
     83         
     84        var ar : Array, ar2 : Array; 
     85        var x : Object, x2 : String; 
    8686 
    87                                stmtS.parameters[":queryraw"] = sqlescape(eroman); 
    88                                stmtS.parameters[":queryhira"] = sqlescape(hira); 
    89                                stmtS.execute(); 
    90                                var sqlret : SQLResult = stmtS.getResult(); 
    91                                stmtS.cancel(); 
    92                                  
    93                                ar = sqlret.data; 
    94                                if (ar != null) { 
    95                                        for each(x in ar) { 
    96                                                ar2 = (x.value as String).split("|"); 
    97                                                for each(x2 in ar2){ 
    98                                                        ret.push(x2); 
    99                                                
    100                                        
    101                                
    102                        
    103                          
    104                        ret.sort(compstr); // ソート 
    105                        ret = uniq(ret); // 同一表現を除去 
    106                        return ret; 
    107                
    108                  
    109                /** 
    110                 * queryを補完したVector.<String>を返す。(DBを除く) 
    111                 * @param       query 
    112                 * @return 
    113                 */ 
    114                public static function enumerateSimply(query : String) : Vector.<String> 
    115                
    116                        var ret : Vector.<String> = new Vector.<String>(); 
    117                        ret.push(query); 
    118                        if (query.length == 0) return ret; 
    119                          
    120                        // 英字の半角をexpand 
    121                        ret.push(expandAlphabet(query)); 
    122                          
    123                        query = convertHiraganaToKatakana(query); 
    124                        var expandedRomans : Vector.<String> = expandConsonant(query.replace(/([sktpgdzc]){2,}/g, "xtu$1"));; 
    125                        for each(var eroman : String in expandedRomans) { 
    126                                var kata : String = convertRomanToKatakana(eroman); 
    127                                ret.push(kata); 
    128                                var hira : String = convertKatakanaToHiragana(kata); 
    129                                ret.push(hira); 
    130                        
    131                          
    132                        ret.sort(compstr); // ソート 
    133                        ret = uniq(ret); // 同一表現を除去 
    134                        return ret; 
    135                
    136                  
    137                /** 
    138                 * Vector.<String>を整理して正規表現にする。 
    139                 * @param       vec 
    140                 * @return 
    141                 */ 
    142                public static function generateRegExp(vec : Vector.<String>) : String 
    143                
    144                        vec = escapevec(vec); // メタ文字をエスケープ 
    145                          
    146                        // 各項間の先頭からの共通文字数を格納。 
    147                        // solveに使用する。 
    148                        var npfxlist : Vector.<int> = new Vector.<int>(); 
    149                        var prev : String = ""; 
    150                        for each(var str : String in vec) { 
    151                                npfxlist.push(nCoPrefix(prev, str)); 
    152                                prev = str; 
    153                        
    154                          
    155                        return solve(vec, npfxlist, 0, vec.length, 0); 
    156                
    157                  
    158                /** 
    159                 * 正規表現作成アルゴリズム。 
    160                 * 共通文字数の短いところから再帰的に分割していく。 
    161                 * vec, npfxlistは不変 
    162                 * @param       vec 
    163                 * @param       npfxlist 
    164                 * @param       start 
    165                 * @param       end 
    166                 * @param       pos 
    167                 * @return 
    168                 */ 
    169                private static function solve(vec : Vector.<String>, npfxlist : Vector.<int>, start : int, end : int, pos : int) : String 
    170                
    171                        // 1単語だけならそれを返す 
    172                        if (start + 1 == end) { 
    173                                return vec[start].substring(pos); 
    174                        
    175                          
    176                        // 最小共通文字数を得る。 
    177                        var p : int; 
    178                        var min : int = 0x7fff; 
    179                        var minp : int; 
    180                        for (p = start + 1; p < end; p++) { 
    181                                if (npfxlist[p] < min) { 
    182                                        min = npfxlist[p]; 
    183                                        minp = p; 
    184                                
    185                        
    186                          
    187                        // 子を生成 
    188                        var children : Vector.<String> = new Vector.<String>(); 
    189                        var prevstart : int = start; 
    190                        for (p = start + 1; p < end; p++) { 
    191                                if (npfxlist[p] == min) { 
    192                                        children.push(solve(vec, npfxlist, prevstart, p, min)); 
    193                                        prevstart = p; 
    194                                
    195                        
    196                        children.push(solve(vec, npfxlist, prevstart, end, min)); 
    197                          
    198                        // 子がすべて1文字なら[ ]式の正規表現にする。 
    199                        var len1 : Boolean = true; 
    200                        for each(var child : String in children) { 
    201                                if (child.length != 1) { 
    202                                        len1 = false; 
    203                                        break; 
    204                                
    205                        
    206                          
    207                        if (len1) { 
    208                                return vec[minp].substring(pos, min) + "[" + children.join("") + "]"; 
    209                        }else { 
    210                                if (pos == min) { 
    211                                        return children.join("|"); 
    212                                }else{ 
    213                                        return vec[minp].substring(pos, min) + "(" + children.join("|") + ")"; 
    214                                
    215                        
    216                
    217                  
    218                /** 
    219                 * 正規表現のメタ文字をエスケープ 
    220                 * @param       vec 
    221                 * @return 
    222                 */ 
    223                public static function escapevec(vec : Vector.<String>) : Vector.<String> 
    224                
    225                        var ret : Vector.<String> = new Vector.<String>(); 
    226                        for each(var str : String in vec) { 
    227                                str = str.replace(/([\*\+\.\?\{\}\(\)\[\]\^\$\-\|\/\\])/g, "\\$1"); 
    228                                ret.push(str); 
    229                        
    230                        return ret; 
    231                
    232                  
    233                /** 
    234                 * 文字列間の先頭からの共通文字数を得る。 
    235                 * @param       
    236                 * @param       
    237                 * @return 
    238                 */ 
    239                private static function nCoPrefix(a : String, b : String) : int 
    240                
    241                        for (var i : int = 0; i < a.length && i < b.length && a.charCodeAt(i) == b.charCodeAt(i); i++); 
    242                        // エスケープ文字は共通文字とみなさない 
    243                        if (i >= 1 && a.charCodeAt(i - 1) == 0x5c && b.charCodeAt(i - 1) == 0x5c) i--; 
    244                        return i; 
    245                
    246                  
    247                /** 
    248                 * 隣接する共通文字列を除去 
    249                 * @param       vec 
    250                 * @return 
    251                 */ 
    252                private static function uniq(vec : Vector.<String>) : Vector.<String> 
    253                
    254                        var ret : Vector.<String> = new Vector.<String>(); 
    255                          
    256                        var prev : String = null; 
    257                        for each(var str : String in vec) { 
    258                                if (str.length == 0 || prev == str) continue; 
    259                                ret.push(str); 
    260                                prev = str; 
    261                        
    262                          
    263                        return ret; 
    264                
    265                  
    266                /** 
    267                 * 簡単な文字列比較関数 
    268                 * @param       
    269                 * @param       
    270                 * @return 
    271                 */ 
    272                private static function compstr(a : String, b : String) : int 
    273                
    274                        return a < b ? -1 : 1; 
    275                
    276                  
    277                /** 
    278                 * 半角英数を全角英数に変換 
    279                 * @param       src 
    280                 * @return 
    281                 */ 
    282                private static function expandAlphabet(src : String) : String 
    283                
    284                        var vec : Array = new Array(); 
    285                        for (var i : int = 0; i < src.length; i++) { 
    286                                var c : int = src.charCodeAt(i); 
    287                                if (c >= 0x0021 && c <= 0x007e) { 
    288                                        c += (0xff01 - 0x0021); 
    289                                
    290                                vec.push(c); 
    291                        
    292                        return String.fromCharCode.apply(String, vec); 
    293                
    294                  
    295                /** 
    296                 * 全角ひらがなを全角カタカナに変換 
    297                 * @param       kana 
    298                 * @return 
    299                 */ 
    300                private static function convertHiraganaToKatakana(kana : String) : String 
    301                
    302                        kana = StringUtility.replaceAll(kana, "う゛", "ヴ"); 
    303                        var vec : Array = new Array(); 
    304                        for (var i : int = 0; i < kana.length; i++) { 
    305                                var c : int = kana.charCodeAt(i); 
    306                                if (c >= 0x3041 && c <= 0x3093) { 
    307                                        c += (0x30a1 - 0x3041); 
    308                                
    309                                vec.push(c); 
    310                        
    311                        return String.fromCharCode.apply(String, vec); 
    312                
    313                  
    314                /** 
    315                 * 全角カタカナを全角ひらがなに変換 
    316                 * @param       kana 
    317                 * @return 
    318                 */ 
    319                private static function convertKatakanaToHiragana(kana : String) : String 
    320                
    321                        kana = StringUtility.replaceAll(kana, "ヴ", "う゛"); 
    322                        var vec : Array = new Array(); 
    323                        for (var i : int = 0; i < kana.length; i++) { 
    324                                var c : int = kana.charCodeAt(i); 
    325                                if (c >= 0x30a1 && c <= 0x30f3) { 
    326                                        c += (0x3041 - 0x30a1); 
    327                                
    328                                vec.push(c); 
    329                        
    330                        return String.fromCharCode.apply(String, vec); 
    331                
    332                  
    333                /** 
    334                 * ローマ字を全角カタカナに変換 
    335                 * @param       roman 
    336                 * @return 
    337                 */ 
    338                private static function convertRomanToKatakana(roman : String) : String 
    339                
    340                        var ret : String = ""; 
    341                        var p : int = 0; 
    342                        while(true) { 
    343                                for (var q : int = p + 1; q <= roman.length; q++) { 
    344                                        var str : String = roman.substring(p, q); 
    345                                        var kata : String = ROMA2KATA[str]; 
    346                                        if (kata != null) { 
    347                                                ret += kata; 
    348                                                p = q; 
    349                                                break; 
    350                                        
    351                                
    352                                if (q > roman.length)break; 
    353                        
    354                        return ret; 
    355                
    356                  
    357                /** 
    358                 * ローマ字を補完 
    359                 * @param       roman 
    360                 * @return 
    361                 */ 
    362                private static function expandConsonant(roman : String) : Vector.<String> 
    363                
    364                        var ret : Vector.<String> = new Vector.<String>(); 
    365                        if (roman.length == 0) return ret; 
    366                        var lastc : int = roman.charCodeAt(roman.length - 1); 
    367                        switch(lastc){ 
    368                        case 0x63: // 'c' 
    369                                ret.push(roman + "hi"); 
    370                                break; 
    371                        case 0x78: // 'x' 
    372                                ret.push(roman + "tu"); 
    373                                ret.push(roman + "ya"); 
    374                                ret.push(roman + "yu"); 
    375                                ret.push(roman + "yo"); 
    376                                break; 
    377                        case 0x79: // 'y' 
    378                                ret.push(roman + "a"); 
    379                                ret.push(roman + "u"); 
    380                                ret.push(roman + "o"); 
    381                                break; 
    382                        case 0x6e: // 'n' 
    383                                ret.push(roman + "n"); 
    384                        case 0x62: // 'b' 
    385                        case 0x64: // 'd' 
    386                        case 0x66: // 'f' 
    387                        case 0x67: // 'g' 
    388                        case 0x68: // 'h' 
    389                        case 0x6a: // 'j' 
    390                        case 0x6b: // 'k' 
    391                        case 0x6d: // 'm' 
    392                        case 0x70: // 'p' 
    393                        case 0x72: // 'r' 
    394                        case 0x73: // 's' 
    395                        case 0x74: // 't' 
    396                        case 0x77: // 'w' 
    397                        case 0x7a: // 'z' 
    398                                ret.push(roman + "a"); 
    399                                ret.push(roman + "i"); 
    400                                ret.push(roman + "u"); 
    401                                ret.push(roman + "e"); 
    402                                ret.push(roman + "o"); 
    403                                if (roman.slice(-2) != "sh" && lastc != 0x6e) { 
    404                                        var c : String = String.fromCharCode(lastc); 
    405                                        var base : String = roman.slice(0, -1) + "xtu" + c; 
    406                                        ret.push(base + "a"); 
    407                                        ret.push(base + "i"); 
    408                                        ret.push(base + "u"); 
    409                                        ret.push(base + "e"); 
    410                                        ret.push(base + "o"); 
    411                                
    412                                break; 
    413                        default: 
    414                                ret.push(roman); 
    415                                break; 
    416                        
    417                        return ret; 
    418                
    419                  
    420                /** 
    421                 * SQL用エスケープ 
    422                 * @param       str 
    423                 * @return 
    424                 */ 
    425                private static function sqlescape(str : String) : String 
    426                
    427                        str = StringUtility.replaceAll(str, "'", "''"); 
    428                        str = StringUtility.replaceAll(str, "%", "\%"); 
    429                        str = StringUtility.replaceAll(str, "_", "\_"); 
    430                        return str; 
    431                
    432                  
    433                // ローマ字→全角カタカナ変換テーブル 
    434                private static const ROMA2KATA : Object = { 
    435                        "a" : "ア", 
    436                        "i" : "イ", 
    437                        "u" : "ウ", 
    438                        "e" : "エ", 
    439                        "o" : "オ", 
    440                        "ka" : "カ", 
    441                        "ki" : "キ", 
    442                        "ku" : "ク", 
    443                        "ke" : "ケ", 
    444                        "ko" : "コ", 
    445                        "sa" : "サ", 
    446                        "si" : "シ", 
    447                        "su" : "ス", 
    448                        "se" : "セ", 
    449                        "so" : "ソ", 
    450                        "ta" : "タ", 
    451                        "ti" : "チ", 
    452                        "tu" : "ツ", 
    453                        "te" : "テ", 
    454                        "to" : "ト", 
    455                        "na" : "ナ", 
    456                        "ni" : "ニ", 
    457                        "nu" : "ヌ", 
    458                        "ne" : "ネ", 
    459                        "no" : "ノ", 
    460                        "ha" : "ハ", 
    461                        "hi" : "ヒ", 
    462                        "hu" : "フ", 
    463                        "he" : "ヘ", 
    464                        "ho" : "ホ", 
    465                        "ma" : "マ", 
    466                        "mi" : "ミ", 
    467                        "mu" : "ム", 
    468                        "me" : "メ", 
    469                        "mo" : "モ", 
    470                        "ya" : "ヤ", 
    471                        "yi" : "イ", 
    472                        "yu" : "ユ", 
    473                        "ye" : "イェ", 
    474                        "yo" : "ヨ", 
    475                        "ra" : "ラ", 
    476                        "ri" : "リ", 
    477                        "ru" : "ル", 
    478                        "re" : "レ", 
    479                        "ro" : "ロ", 
    480                        "wa" : "ワ", 
    481                        "wi" : "ヰ", 
    482                        "wu" : "ウ", 
    483                        "we" : "ヱ", 
    484                        "wo" : "ヲ", 
    485                        "ga" : "ガ", 
    486                        "gi" : "ギ", 
    487                        "gu" : "グ", 
    488                        "ge" : "ゲ", 
    489                        "go" : "ゴ", 
    490                        "za" : "ザ", 
    491                        "zi" : "ジ", 
    492                        "zu" : "ズ", 
    493                        "ze" : "ゼ", 
    494                        "zo" : "ゾ", 
    495                        "da" : "ダ", 
    496                        "di" : "ヂ", 
    497                        "du" : "ヅ", 
    498                        "de" : "デ", 
    499                        "do" : "ド", 
    500                        "ba" : "バ", 
    501                        "bi" : "ビ", 
    502                        "bu" : "ブ", 
    503                        "be" : "ベ", 
    504                        "bo" : "ボ", 
    505                        "pa" : "パ", 
    506                        "pi" : "ピ", 
    507                        "pu" : "プ", 
    508                        "pe" : "ペ", 
    509                        "po" : "ポ", 
    510                        "la" : "ァ", 
    511                        "li" : "ィ", 
    512                        "lu" : "ゥ", 
    513                        "le" : "ェ", 
    514                        "lo" : "ォ", 
    515                        "lya" : "ャ", 
    516                        "lyi" : "ィ", 
    517                        "lyu" : "ュ", 
    518                        "lye" : "ェ", 
    519                        "lyo" : "ョ", 
    520                        "xa" : "ァ", 
    521                        "xi" : "ィ", 
    522                        "xu" : "ゥ", 
    523                        "xe" : "ェ", 
    524                        "xo" : "ォ", 
    525                        "xya" : "ャ", 
    526                        "xyi" : "ィ", 
    527                        "xyu" : "ュ", 
    528                        "xye" : "ェ", 
    529                        "xyo" : "ョ", 
    530                        "kya" : "キャ", 
    531                        "kyi" : "キィ", 
    532                        "kyu" : "キュ", 
    533                        "kye" : "キェ", 
    534                        "kyo" : "キョ", 
    535                        "gwa" : "グァ", 
    536                        "gwi" : "グィ", 
    537                        "gwu" : "グゥ", 
    538                        "gwe" : "グェ", 
    539                        "gwo" : "グォ", 
    540                        "gya" : "ギャ", 
    541                        "gyi" : "ギィ", 
    542                        "gyu" : "ギュ", 
    543                        "gye" : "ギェ", 
    544                        "gyo" : "ギョ", 
    545                        "sha" : "シャ", 
    546                        "shi" : "シ", 
    547                        "shu" : "シュ", 
    548                        "she" : "シェ", 
    549                        "sho" : "ショ", 
    550                        "swa" : "スァ", 
    551                        "swi" : "スィ", 
    552                        "swu" : "スゥ", 
    553                        "swe" : "スェ", 
    554                        "swo" : "スォ", 
    555                        "sya" : "シャ", 
    556                        "syi" : "シィ", 
    557                        "syu" : "シュ", 
    558                        "sye" : "シェ", 
    559                        "syo" : "ショ", 
    560                        "tha" : "テャ", 
    561                        "thi" : "ティ", 
    562                        "thu" : "テュ", 
    563                        "the" : "テェ", 
    564                        "tho" : "テョ", 
    565                        "tsa" : "ツァ", 
    566                        "tsi" : "ツィ", 
    567                        "tsu" : "ツ", 
    568                        "tse" : "ツェ", 
    569                        "tso" : "ツォ", 
    570                        "twa" : "トァ", 
    571                        "twi" : "トィ", 
    572                        "twu" : "トゥ", 
    573                        "twe" : "トェ", 
    574                        "two" : "トォ", 
    575                        "tya" : "チャ", 
    576                        "tyi" : "チィ", 
    577                        "tyu" : "チュ", 
    578                        "tye" : "チェ", 
    579                        "tyo" : "チョ", 
    580                        "nya" : "ニャ", 
    581                        "nyi" : "ニィ", 
    582                        "nyu" : "ニュ", 
    583                        "nye" : "ニェ", 
    584                        "nyo" : "ニョ", 
    585                        "hya" : "ヒャ", 
    586                        "hyi" : "ヒィ", 
    587                        "hyu" : "ヒュ", 
    588                        "hye" : "ヒェ", 
    589                        "hyo" : "ヒョ", 
    590                        "bya" : "ビャ", 
    591                        "byi" : "ビィ", 
    592                        "byu" : "ビュ", 
    593                        "bye" : "ビェ", 
    594                        "byo" : "ビョ", 
    595                        "pya" : "ピャ", 
    596                        "pyi" : "ピィ", 
    597                        "pyu" : "ピュ", 
    598                        "pye" : "ピェ", 
    599                        "pyo" : "ピョ", 
    600                        "mya" : "ミャ", 
    601                        "myi" : "ミィ", 
    602                        "myu" : "ミュ", 
    603                        "mye" : "ミェ", 
    604                        "myo" : "ミョ", 
    605                        "rya" : "リャ", 
    606                        "ryi" : "リィ", 
    607                        "ryu" : "リュ", 
    608                        "rye" : "リェ", 
    609                        "ryo" : "リョ", 
    610                        "ca" : "カ", 
    611                        "ci" : "シ", 
    612                        "cu" : "ク", 
    613                        "ce" : "セ", 
    614                        "co" : "コ", 
    615                        "cha" : "チャ", 
    616                        "chi" : "チ", 
    617                        "chu" : "チュ", 
    618                        "che" : "チェ", 
    619                        "cho" : "チョ", 
    620                        "fa" : "ファ", 
    621                        "fi" : "フィ", 
    622                        "fu" : "フ", 
    623                        "fe" : "フェ", 
    624                        "fo" : "フォ", 
    625                        "fwa" : "ファ", 
    626                        "fwi" : "フィ", 
    627                        "fwu" : "フゥ", 
    628                        "fwe" : "フェ", 
    629                        "fwo" : "フォ", 
    630                        "fya" : "フャ", 
    631                        "fyi" : "フィ", 
    632                        "fyu" : "フュ", 
    633                        "fye" : "フェ", 
    634                        "fyo" : "フョ", 
    635                        "ja" : "ジャ", 
    636                        "ji" : "ジ", 
    637                        "ju" : "ジュ", 
    638                        "je" : "ジェ", 
    639                        "jo" : "ジョ", 
    640                        "jya" : "ジャ", 
    641                        "jyi" : "ジィ", 
    642                        "jyu" : "ジュ", 
    643                        "jye" : "ジェ", 
    644                        "jyo" : "ジョ", 
    645                        "qa" : "クァ", 
    646                        "qi" : "クィ", 
    647                        "qu" : "ク", 
    648                        "qe" : "クェ", 
    649                        "qo" : "クォ", 
    650                        "qwa" : "クァ", 
    651                        "qwi" : "クィ", 
    652                        "qwu" : "クゥ", 
    653                        "qwe" : "クェ", 
    654                        "qwo" : "クォ", 
    655                        "qya" : "クャ", 
    656                        "qyi" : "クィ", 
    657                        "qyu" : "クュ", 
    658                        "qye" : "クェ", 
    659                        "qyo" : "クョ", 
    660                        "va" : "ヴァ", 
    661                        "vi" : "ヴィ", 
    662                        "vu" : "ヴ", 
    663                        "ve" : "ヴェ", 
    664                        "vo" : "ヴォ", 
    665                        "vya" : "ヴャ", 
    666                        "vyi" : "ヴィ", 
    667                        "vyu" : "ヴュ", 
    668                        "vye" : "ヴェ", 
    669                        "vyo" : "ヴョ", 
    670                        "nn" : "ン", 
    671                        "n'" : "ン", 
    672                        "xn" : "ン", 
    673                        "ltu" : "ッ", 
    674                        "xtu" : "ッ", 
    675                        "lwa" : "ヮ", 
    676                        "xwa" : "ヮ", 
    677                        "lka" : "ヵ", 
    678                        "xka" : "ヵ", 
    679                        "lke" : "ヶ", 
    680                        "xke" : "ヶ", 
    681                        "kwa" : "クァ", 
    682                        "-" : "ー", 
    683                        "~" : "~", 
    684                        "," : "、", 
    685                        "." : "。", 
    686                        "[" : "「", 
    687                        "]" : "」", 
    688                        "mba" : "ンバ", 
    689                        "mbi" : "ンビ", 
    690                        "mbu" : "ンブ", 
    691                        "mbe" : "ンベ", 
    692                        "mbo" : "ンボ", 
    693                        "mpa" : "ンパ", 
    694                        "mpi" : "ンピ", 
    695                        "mpu" : "ンプ", 
    696                        "mpe" : "ンペ", 
    697                        "mpo" : "ンポ", 
    698                        "mma" : "ンマ", 
    699                        "mmi" : "ンミ", 
    700                        "mmu" : "ンム", 
    701                        "mme" : "ンメ", 
    702                        "mmo" : "ンモ", 
    703                        "tcha" : "ッチャ", 
    704                        "tchi" : "ッチ", 
    705                        "tchu" : "ッチュ", 
    706                        "tche" : "ッチェ", 
    707                        "tcho" : "ッチョ" 
    708                }; 
    709        
    710          
     87        stmtS.parameters[":queryraw"] = sqlescape(eroman); 
     88        stmtS.parameters[":queryhira"] = sqlescape(hira); 
     89        stmtS.execute(); 
     90        var sqlret : SQLResult = stmtS.getResult(); 
     91        stmtS.cancel(); 
     92         
     93        ar = sqlret.data; 
     94        if (ar != null) { 
     95          for each(x in ar) { 
     96            ar2 = (x.value as String).split("|"); 
     97            for each(x2 in ar2){ 
     98              ret.push(x2); 
     99           
     100         
     101       
     102     
     103       
     104      ret.sort(compstr); // ソート 
     105      ret = uniq(ret); // 同一表現を除去 
     106      return ret; 
     107   
     108     
     109    /** 
     110    * queryを補完したVector.<String>を返す。(DBを除く) 
     111     * @param query 
     112    * @return 
     113    */ 
     114    public static function enumerateSimply(query : String) : Vector.<String> 
     115   
     116      var ret : Vector.<String> = new Vector.<String>(); 
     117      ret.push(query); 
     118      if (query.length == 0) return ret; 
     119       
     120      // 英字の半角をexpand 
     121      ret.push(expandAlphabet(query)); 
     122       
     123      query = convertHiraganaToKatakana(query); 
     124      var expandedRomans : Vector.<String> = expandConsonant(query.replace(/([sktpgdzc]){2,}/g, "xtu$1"));; 
     125      for each(var eroman : String in expandedRomans) { 
     126        var kata : String = convertRomanToKatakana(eroman); 
     127        ret.push(kata); 
     128        var hira : String = convertKatakanaToHiragana(kata); 
     129        ret.push(hira); 
     130     
     131       
     132      ret.sort(compstr); // ソート 
     133      ret = uniq(ret); // 同一表現を除去 
     134      return ret; 
     135   
     136     
     137    /** 
     138    * Vector.<String>を整理して正規表現にする。 
     139     * @param vec 
     140    * @return 
     141    */ 
     142    public static function generateRegExp(vec : Vector.<String>) : String 
     143   
     144      vec = escapevec(vec); // メタ文字をエスケープ 
     145       
     146      // 各項間の先頭からの共通文字数を格納。 
     147      // solveに使用する。 
     148      var npfxlist : Vector.<int> = new Vector.<int>(); 
     149      var prev : String = ""; 
     150      for each(var str : String in vec) { 
     151        npfxlist.push(nCoPrefix(prev, str)); 
     152        prev = str; 
     153     
     154       
     155      return solve(vec, npfxlist, 0, vec.length, 0); 
     156   
     157     
     158    /** 
     159    * 正規表現作成アルゴリズム。 
     160    * 共通文字数の短いところから再帰的に分割していく。 
     161    * vec, npfxlistは不変 
     162     * @param vec 
     163     * @param npfxlist 
     164     * @param start 
     165     * @param end 
     166     * @param pos 
     167    * @return 
     168    */ 
     169    private static function solve(vec : Vector.<String>, npfxlist : Vector.<int>, start : int, end : int, pos : int) : String 
     170   
     171      // 1単語だけならそれを返す 
     172      if (start + 1 == end) { 
     173        return vec[start].substring(pos); 
     174     
     175       
     176      // 最小共通文字数を得る。 
     177      var p : int; 
     178      var min : int = 0x7fff; 
     179      var minp : int; 
     180      for (p = start + 1; p < end; p++) { 
     181        if (npfxlist[p] < min) { 
     182          min = npfxlist[p]; 
     183          minp = p; 
     184       
     185     
     186       
     187      // 子を生成 
     188      var children : Vector.<String> = new Vector.<String>(); 
     189      var prevstart : int = start; 
     190      for (p = start + 1; p < end; p++) { 
     191        if (npfxlist[p] == min) { 
     192          children.push(solve(vec, npfxlist, prevstart, p, min)); 
     193          prevstart = p; 
     194       
     195     
     196      children.push(solve(vec, npfxlist, prevstart, end, min)); 
     197       
     198      // 子がすべて1文字なら[ ]式の正規表現にする。 
     199      var len1 : Boolean = true; 
     200      for each(var child : String in children) { 
     201        if (child.length != 1) { 
     202          len1 = false; 
     203          break; 
     204       
     205     
     206       
     207      if (len1) { 
     208        return vec[minp].substring(pos, min) + "[" + children.join("") + "]"; 
     209      }else { 
     210        if (pos == min) { 
     211          return children.join("|"); 
     212        }else{ 
     213          return vec[minp].substring(pos, min) + "(" + children.join("|") + ")"; 
     214       
     215     
     216   
     217     
     218    /** 
     219    * 正規表現のメタ文字をエスケープ 
     220     * @param vec 
     221    * @return 
     222    */ 
     223    public static function escapevec(vec : Vector.<String>) : Vector.<String> 
     224   
     225      var ret : Vector.<String> = new Vector.<String>(); 
     226      for each(var str : String in vec) { 
     227        str = str.replace(/([\*\+\.\?\{\}\(\)\[\]\^\$\-\|\/\\])/g, "\\$1"); 
     228        ret.push(str); 
     229     
     230      return ret; 
     231   
     232     
     233    /** 
     234    * 文字列間の先頭からの共通文字数を得る。 
     235     * @param
     236     * @param
     237    * @return 
     238    */ 
     239    private static function nCoPrefix(a : String, b : String) : int 
     240   
     241      for (var i : int = 0; i < a.length && i < b.length && a.charCodeAt(i) == b.charCodeAt(i); i++); 
     242      // エスケープ文字は共通文字とみなさない 
     243      if (i >= 1 && a.charCodeAt(i - 1) == 0x5c && b.charCodeAt(i - 1) == 0x5c) i--; 
     244      return i; 
     245   
     246     
     247    /** 
     248    * 隣接する共通文字列を除去 
     249     * @param vec 
     250    * @return 
     251    */ 
     252    private static function uniq(vec : Vector.<String>) : Vector.<String> 
     253   
     254      var ret : Vector.<String> = new Vector.<String>(); 
     255       
     256      var prev : String = null; 
     257      for each(var str : String in vec) { 
     258        if (str.length == 0 || prev == str) continue; 
     259        ret.push(str); 
     260        prev = str; 
     261     
     262       
     263      return ret; 
     264   
     265     
     266    /** 
     267    * 簡単な文字列比較関数 
     268     * @param
     269     * @param
     270    * @return 
     271    */ 
     272    private static function compstr(a : String, b : String) : int 
     273   
     274      return a < b ? -1 : 1; 
     275   
     276     
     277    /** 
     278    * 半角英数を全角英数に変換 
     279     * @param src 
     280    * @return 
     281    */ 
     282    private static function expandAlphabet(src : String) : String 
     283   
     284      var vec : Array = new Array(); 
     285      for (var i : int = 0; i < src.length; i++) { 
     286        var c : int = src.charCodeAt(i); 
     287        if (c >= 0x0021 && c <= 0x007e) { 
     288          c += (0xff01 - 0x0021); 
     289       
     290        vec.push(c); 
     291     
     292      return String.fromCharCode.apply(String, vec); 
     293   
     294     
     295    /** 
     296    * 全角ひらがなを全角カタカナに変換 
     297     * @param kana 
     298    * @return 
     299    */ 
     300    private static function convertHiraganaToKatakana(kana : String) : String 
     301   
     302      kana = StringUtility.replaceAll(kana, "う゛", "ヴ"); 
     303      var vec : Array = new Array(); 
     304      for (var i : int = 0; i < kana.length; i++) { 
     305        var c : int = kana.charCodeAt(i); 
     306        if (c >= 0x3041 && c <= 0x3093) { 
     307          c += (0x30a1 - 0x3041); 
     308       
     309        vec.push(c); 
     310     
     311      return String.fromCharCode.apply(String, vec); 
     312   
     313     
     314    /** 
     315    * 全角カタカナを全角ひらがなに変換 
     316     * @param kana 
     317    * @return 
     318    */ 
     319    private static function convertKatakanaToHiragana(kana : String) : String 
     320   
     321      kana = StringUtility.replaceAll(kana, "ヴ", "う゛"); 
     322      var vec : Array = new Array(); 
     323      for (var i : int = 0; i < kana.length; i++) { 
     324        var c : int = kana.charCodeAt(i); 
     325        if (c >= 0x30a1 && c <= 0x30f3) { 
     326          c += (0x3041 - 0x30a1); 
     327       
     328        vec.push(c); 
     329     
     330      return String.fromCharCode.apply(String, vec); 
     331   
     332     
     333    /** 
     334    * ローマ字を全角カタカナに変換 
     335     * @param roman 
     336    * @return 
     337    */ 
     338    private static function convertRomanToKatakana(roman : String) : String 
     339   
     340      var ret : String = ""; 
     341      var p : int = 0; 
     342      while(true) { 
     343        for (var q : int = p + 1; q <= roman.length; q++) { 
     344          var str : String = roman.substring(p, q); 
     345          var kata : String = ROMA2KATA[str]; 
     346          if (kata != null) { 
     347            ret += kata; 
     348            p = q; 
     349            break; 
     350         
     351       
     352        if (q > roman.length)break; 
     353     
     354      return ret; 
     355   
     356     
     357    /** 
     358    * ローマ字を補完 
     359     * @param roman 
     360    * @return 
     361    */ 
     362    private static function expandConsonant(roman : String) : Vector.<String> 
     363   
     364      var ret : Vector.<String> = new Vector.<String>(); 
     365      if (roman.length == 0) return ret; 
     366      var lastc : int = roman.charCodeAt(roman.length - 1); 
     367      switch(lastc){ 
     368      case 0x63: // 'c' 
     369        ret.push(roman + "hi"); 
     370        break; 
     371      case 0x78: // 'x' 
     372        ret.push(roman + "tu"); 
     373        ret.push(roman + "ya"); 
     374        ret.push(roman + "yu"); 
     375        ret.push(roman + "yo"); 
     376        break; 
     377      case 0x79: // 'y' 
     378        ret.push(roman + "a"); 
     379        ret.push(roman + "u"); 
     380        ret.push(roman + "o"); 
     381        break; 
     382      case 0x6e: // 'n' 
     383        ret.push(roman + "n"); 
     384      case 0x62: // 'b' 
     385      case 0x64: // 'd' 
     386      case 0x66: // 'f' 
     387      case 0x67: // 'g' 
     388      case 0x68: // 'h' 
     389      case 0x6a: // 'j' 
     390      case 0x6b: // 'k' 
     391      case 0x6d: // 'm' 
     392      case 0x70: // 'p' 
     393      case 0x72: // 'r' 
     394      case 0x73: // 's' 
     395      case 0x74: // 't' 
     396      case 0x77: // 'w' 
     397      case 0x7a: // 'z' 
     398        ret.push(roman + "a"); 
     399        ret.push(roman + "i"); 
     400        ret.push(roman + "u"); 
     401        ret.push(roman + "e"); 
     402        ret.push(roman + "o"); 
     403        if (roman.slice(-2) != "sh" && lastc != 0x6e) { 
     404          var c : String = String.fromCharCode(lastc); 
     405          var base : String = roman.slice(0, -1) + "xtu" + c; 
     406          ret.push(base + "a"); 
     407          ret.push(base + "i"); 
     408          ret.push(base + "u"); 
     409          ret.push(base + "e"); 
     410          ret.push(base + "o"); 
     411       
     412        break; 
     413      default: 
     414        ret.push(roman); 
     415        break; 
     416     
     417      return ret; 
     418   
     419     
     420    /** 
     421    * SQL用エスケープ 
     422     * @param str 
     423    * @return 
     424    */ 
     425    private static function sqlescape(str : String) : String 
     426   
     427      str = StringUtility.replaceAll(str, "'", "''"); 
     428      str = StringUtility.replaceAll(str, "%", "\%"); 
     429      str = StringUtility.replaceAll(str, "_", "\_"); 
     430      return str; 
     431   
     432     
     433    // ローマ字→全角カタカナ変換テーブル 
     434    private static const ROMA2KATA : Object = { 
     435      "a" : "ア", 
     436      "i" : "イ", 
     437      "u" : "ウ", 
     438      "e" : "エ", 
     439      "o" : "オ", 
     440      "ka" : "カ", 
     441      "ki" : "キ", 
     442      "ku" : "ク", 
     443      "ke" : "ケ", 
     444      "ko" : "コ", 
     445      "sa" : "サ", 
     446      "si" : "シ", 
     447      "su" : "ス", 
     448      "se" : "セ", 
     449      "so" : "ソ", 
     450      "ta" : "タ", 
     451      "ti" : "チ", 
     452      "tu" : "ツ", 
     453      "te" : "テ", 
     454      "to" : "ト", 
     455      "na" : "ナ", 
     456      "ni" : "ニ", 
     457      "nu" : "ヌ", 
     458      "ne" : "ネ", 
     459      "no" : "ノ", 
     460      "ha" : "ハ", 
     461      "hi" : "ヒ", 
     462      "hu" : "フ", 
     463      "he" : "ヘ", 
     464      "ho" : "ホ", 
     465      "ma" : "マ", 
     466      "mi" : "ミ", 
     467      "mu" : "ム", 
     468      "me" : "メ", 
     469      "mo" : "モ", 
     470      "ya" : "ヤ", 
     471      "yi" : "イ", 
     472      "yu" : "ユ", 
     473      "ye" : "イェ", 
     474      "yo" : "ヨ", 
     475      "ra" : "ラ", 
     476      "ri" : "リ", 
     477      "ru" : "ル", 
     478      "re" : "レ", 
     479      "ro" : "ロ", 
     480      "wa" : "ワ", 
     481      "wi" : "ヰ", 
     482      "wu" : "ウ", 
     483      "we" : "ヱ", 
     484      "wo" : "ヲ", 
     485      "ga" : "ガ", 
     486      "gi" : "ギ", 
     487      "gu" : "グ", 
     488      "ge" : "ゲ", 
     489      "go" : "ゴ", 
     490      "za" : "ザ", 
     491      "zi" : "ジ", 
     492      "zu" : "ズ", 
     493      "ze" : "ゼ", 
     494      "zo" : "ゾ", 
     495      "da" : "ダ", 
     496      "di" : "ヂ", 
     497      "du" : "ヅ", 
     498      "de" : "デ", 
     499      "do" : "ド", 
     500      "ba" : "バ", 
     501      "bi" : "ビ", 
     502      "bu" : "ブ", 
     503      "be" : "ベ", 
     504      "bo" : "ボ", 
     505      "pa" : "パ", 
     506      "pi" : "ピ", 
     507      "pu" : "プ", 
     508      "pe" : "ペ", 
     509      "po" : "ポ", 
     510      "la" : "ァ", 
     511      "li" : "ィ", 
     512      "lu" : "ゥ", 
     513      "le" : "ェ", 
     514      "lo" : "ォ", 
     515      "lya" : "ャ", 
     516      "lyi" : "ィ", 
     517      "lyu" : "ュ", 
     518      "lye" : "ェ", 
     519      "lyo" : "ョ", 
     520      "xa" : "ァ", 
     521      "xi" : "ィ", 
     522      "xu" : "ゥ", 
     523      "xe" : "ェ", 
     524      "xo" : "ォ", 
     525      "xya" : "ャ", 
     526      "xyi" : "ィ", 
     527      "xyu" : "ュ", 
     528      "xye" : "ェ", 
     529      "xyo" : "ョ", 
     530      "kya" : "キャ", 
     531      "kyi" : "キィ", 
     532      "kyu" : "キュ", 
     533      "kye" : "キェ", 
     534      "kyo" : "キョ", 
     535      "gwa" : "グァ", 
     536      "gwi" : "グィ", 
     537      "gwu" : "グゥ", 
     538      "gwe" : "グェ", 
     539      "gwo" : "グォ", 
     540      "gya" : "ギャ", 
     541      "gyi" : "ギィ", 
     542      "gyu" : "ギュ", 
     543      "gye" : "ギェ", 
     544      "gyo" : "ギョ", 
     545      "sha" : "シャ", 
     546      "shi" : "シ", 
     547      "shu" : "シュ", 
     548      "she" : "シェ", 
     549      "sho" : "ショ", 
     550      "swa" : "スァ", 
     551      "swi" : "スィ", 
     552      "swu" : "スゥ", 
     553      "swe" : "スェ", 
     554      "swo" : "スォ", 
     555      "sya" : "シャ", 
     556      "syi" : "シィ", 
     557      "syu" : "シュ", 
     558      "sye" : "シェ", 
     559      "syo" : "ショ", 
     560      "tha" : "テャ", 
     561      "thi" : "ティ", 
     562      "thu" : "テュ", 
     563      "the" : "テェ", 
     564      "tho" : "テョ", 
     565      "tsa" : "ツァ", 
     566      "tsi" : "ツィ", 
     567      "tsu" : "ツ", 
     568      "tse" : "ツェ", 
     569      "tso" : "ツォ", 
     570      "twa" : "トァ", 
     571      "twi" : "トィ", 
     572      "twu" : "トゥ", 
     573      "twe" : "トェ", 
     574      "two" : "トォ", 
     575      "tya" : "チャ", 
     576      "tyi" : "チィ", 
     577      "tyu" : "チュ", 
     578      "tye" : "チェ", 
     579      "tyo" : "チョ", 
     580      "nya" : "ニャ", 
     581      "nyi" : "ニィ", 
     582      "nyu" : "ニュ", 
     583      "nye" : "ニェ", 
     584      "nyo" : "ニョ", 
     585      "hya" : "ヒャ", 
     586      "hyi" : "ヒィ", 
     587      "hyu" : "ヒュ", 
     588      "hye" : "ヒェ", 
     589      "hyo" : "ヒョ", 
     590      "bya" : "ビャ", 
     591      "byi" : "ビィ", 
     592      "byu" : "ビュ", 
     593      "bye" : "ビェ", 
     594      "byo" : "ビョ", 
     595      "pya" : "ピャ", 
     596      "pyi" : "ピィ", 
     597      "pyu" : "ピュ", 
     598      "pye" : "ピェ", 
     599      "pyo" : "ピョ", 
     600      "mya" : "ミャ", 
     601      "myi" : "ミィ", 
     602      "myu" : "ミュ", 
     603      "mye" : "ミェ", 
     604      "myo" : "ミョ", 
     605      "rya" : "リャ", 
     606      "ryi" : "リィ", 
     607      "ryu" : "リュ", 
     608      "rye" : "リェ", 
     609      "ryo" : "リョ", 
     610      "ca" : "カ", 
     611      "ci" : "シ", 
     612      "cu" : "ク", 
     613      "ce" : "セ", 
     614      "co" : "コ", 
     615      "cha" : "チャ", 
     616      "chi" : "チ", 
     617      "chu" : "チュ", 
     618      "che" : "チェ", 
     619      "cho" : "チョ", 
     620      "fa" : "ファ", 
     621      "fi" : "フィ", 
     622      "fu" : "フ", 
     623      "fe" : "フェ", 
     624      "fo" : "フォ", 
     625      "fwa" : "ファ", 
     626      "fwi" : "フィ", 
     627      "fwu" : "フゥ", 
     628      "fwe" : "フェ", 
     629      "fwo" : "フォ", 
     630      "fya" : "フャ", 
     631      "fyi" : "フィ", 
     632      "fyu" : "フュ", 
     633      "fye" : "フェ", 
     634      "fyo" : "フョ", 
     635      "ja" : "ジャ", 
     636      "ji" : "ジ", 
     637      "ju" : "ジュ", 
     638      "je" : "ジェ", 
     639      "jo" : "ジョ", 
     640      "jya" : "ジャ", 
     641      "jyi" : "ジィ", 
     642      "jyu" : "ジュ", 
     643      "jye" : "ジェ", 
     644      "jyo" : "ジョ", 
     645      "qa" : "クァ", 
     646      "qi" : "クィ", 
     647      "qu" : "ク", 
     648      "qe" : "クェ", 
     649      "qo" : "クォ", 
     650      "qwa" : "クァ", 
     651      "qwi" : "クィ", 
     652      "qwu" : "クゥ", 
     653      "qwe" : "クェ", 
     654      "qwo" : "クォ", 
     655      "qya" : "クャ", 
     656      "qyi" : "クィ", 
     657      "qyu" : "クュ", 
     658      "qye" : "クェ", 
     659      "qyo" : "クョ", 
     660      "va" : "ヴァ", 
     661      "vi" : "ヴィ", 
     662      "vu" : "ヴ", 
     663      "ve" : "ヴェ", 
     664      "vo" : "ヴォ", 
     665      "vya" : "ヴャ", 
     666      "vyi" : "ヴィ", 
     667      "vyu" : "ヴュ", 
     668      "vye" : "ヴェ", 
     669      "vyo" : "ヴョ", 
     670      "nn" : "ン", 
     671      "n'" : "ン", 
     672      "xn" : "ン", 
     673      "ltu" : "ッ", 
     674      "xtu" : "ッ", 
     675      "lwa" : "ヮ", 
     676      "xwa" : "ヮ", 
     677      "lka" : "ヵ", 
     678      "xka" : "ヵ", 
     679      "lke" : "ヶ", 
     680      "xke" : "ヶ", 
     681      "kwa" : "クァ", 
     682      "-" : "ー", 
     683      "~" : "~", 
     684      "," : "、", 
     685      "." : "。", 
     686      "[" : "「", 
     687      "]" : "」", 
     688      "mba" : "ンバ", 
     689      "mbi" : "ンビ", 
     690      "mbu" : "ンブ", 
     691      "mbe" : "ンベ", 
     692      "mbo" : "ンボ", 
     693      "mpa" : "ンパ", 
     694      "mpi" : "ンピ", 
     695      "mpu" : "ンプ", 
     696      "mpe" : "ンペ", 
     697      "mpo" : "ンポ", 
     698      "mma" : "ンマ", 
     699      "mmi" : "ンミ", 
     700      "mmu" : "ンム", 
     701      "mme" : "ンメ", 
     702      "mmo" : "ンモ", 
     703      "tcha" : "ッチャ", 
     704      "tchi" : "ッチ", 
     705      "tchu" : "ッチュ", 
     706      "tche" : "ッチェ", 
     707      "tcho" : "ッチョ" 
     708    }; 
     709 
     710   
    711711} 
  • air/TLife/trunk/src/uwi/migemo/SocialIMEAPIThread.as

    r2453 r2634  
    5656                                var regexpstr : String = ""; 
    5757                                for each(var line : String in src.split("\r\n")) { 
    58                                         regexpstr += "(" + line.replace(/\t/g, "|") + ")"; 
     58                                        regexpstr += "(" + line.replace(/  /g, "|") + ")"; 
    5959                                } 
    6060                                dstlist.push(regexpstr); 
  • air/TLife/trunk/src/uwi/regexp/RegExpParser.as

    r2501 r2634  
    11package uwi.regexp 
    22{ 
    3        import ken39arg.logging.Logger; 
    4        import uwi.regexp.bean.BeginNode; 
    5        import uwi.regexp.bean.ConcatNode; 
    6        import uwi.regexp.bean.EndNode; 
    7        import uwi.regexp.bean.QuesNode; 
    8        import uwi.regexp.bean.SelectNode; 
    9        import uwi.regexp.bean.StrNode; 
    10        import uwi.regexp.bean.UnionNode; 
    11          
    12        /** 
    13         * ... 
    14         * @author Uwi 
    15         */ 
    16        public class RegExpParser  
    17        
    18                private var str : String; 
    19                private var pos : int; 
    20                  
    21                public static function parse(str : String) : Object 
    22                
    23                        if (str == "") return null; 
    24                        var p : RegExpParser = new RegExpParser(); 
    25                          
    26                        p.str = str; 
    27                        p.pos = 0; 
    28                          
    29                        return p.b(); 
    30                
    31                  
    32                  
    33                /** 
    34 //                     A:= B EOS 
    35                        B:= C '|' B | C 
    36                        C:= C1 | '' 
    37                        C1 := '^'C2 | C2 
    38                        C2 := D'$' | D 
    39                        D:= ED | E 
    40                        E:= F'?' | F 
    41                        F:= '(' B ')' | [G] | Character 
    42                        G := Character G | Character 
    43                 *  
    44                 * @param       
    45                 * @param       state 
    46                 * @return 
    47                 */ 
    48                  
    49                private function match(c : String) : void 
    50                
    51                        if (str.charAt(pos) != c) { 
    52                                Logger.error("RegExpParser Match Error"); 
    53                                throw pos; 
    54                        }else { 
    55                                pos++; 
    56                        
    57                
    58                // []()^$?| 
    59                  
    60                private function g() : StrNode 
    61                
    62                        if (pos == str.length) { 
    63                                Logger.error("RegExpParser g Error"); 
    64                                throw pos; 
    65                        
    66                        var s : String = ""; 
    67                          
    68                        for(;pos < str.length;pos++) { 
    69                                var c : String = str.charAt(pos); 
    70                                if (c == "[" || c == "]" || c == "(" || c == ")" || c == "^" || c == "$" || c == "?" || c == "|") { 
    71                                        break; 
    72                                
    73                                // エスケープ文字 
    74                                if (c == "\\"){ 
    75                                        pos++; 
    76                                        if (pos == str.length) throw pos; 
    77                                        c = str.charAt(pos); 
    78                                
    79                                s += c; 
    80                        
    81                        // 空文字列はエラー 
    82                        if (s.length == 0) throw pos; 
    83                        return new StrNode(s); 
    84                
    85                  
    86                private function f() : Object 
    87                
    88                        if (pos == str.length) { 
    89                                Logger.error("RegExpParser f Error"); 
    90                                throw pos; 
    91                        
    92                        var s : String = ""