チェンジセット 2634
- コミット日時:
- 2009/05/14 12:35:25 (3 年前)
- ファイル:
-
- air/TLife/trunk/application.xml (更新) (1 diff)
- air/TLife/trunk/bin/TLife.swf (更新) (変更前)
- air/TLife/trunk/bin/lang-config.xml (更新) (1 diff)
- air/TLife/trunk/obj/TLifeConfig.old (更新) (1 diff)
- air/TLife/trunk/obj/TLifeConfig.xml (更新) (1 diff)
- air/TLife/trunk/src/Main.mxml (更新) (5 diffs)
- air/TLife/trunk/src/uwi/bean/Status.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/bean/TabRule.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/db/DB.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/db/DBExcite.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/db/DBOpenThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/db/DBSelectThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/db/DBSupplyThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/db/DBSupplyThread2.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/db/DBTransactionThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/db/SimpleTransactionThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/migemo/AIRMigemo.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/migemo/SocialIMEAPIThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/regexp/RegExpParser.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/regexp/bean/BeginNode.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/regexp/bean/ConcatNode.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/regexp/bean/EndNode.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/regexp/bean/QuesNode.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/regexp/bean/SelectNode.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/regexp/bean/StrNode.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/regexp/bean/UnionNode.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/search/Searcher.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/shortening/URLExpandThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/shortening/URLShortenThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/FollowingCheckThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/InitialMovementThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/LinkResolveThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/MainThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/NotifyNewThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/ReloadThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/ReloadTimerThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/ReplyGetThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/StatusGetBaseThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/StatusInsertThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/TimelineThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/event/ContextMenuItemEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/event/DataGridEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/event/DataGridRoutineThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/event/IncrementalSearchThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/event/PostEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/event/TabBarEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/thread/event/UndoThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/tinysegmenter/TinySegmenter.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterAPI.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterBitScrapeThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterBitStatusGetThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterBitUserInfoGetThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterDirectMessageGetThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterFriendsInfoGetThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterLoginThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterLogoutThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterMobileLoginThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterMobileLogoutThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterOAuthAccessThread.as (追加)
- air/TLife/trunk/src/uwi/twitter/TwitterOAuthRequestThread.as (追加)
- air/TLife/trunk/src/uwi/twitter/TwitterPostThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterRateLimitStatusGetThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterScrapeThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterShadowGetThread.as (追加)
- air/TLife/trunk/src/uwi/twitter/TwitterTestThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/twitter/TwitterTimelineGetThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/ComboBoxEx.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/DataGridEx.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/ImageEx.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/TextAreaEditor.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/TextAreaEx.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/TimelineRenderer.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/answer/Answer.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/balloon/Balloon.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/complete/CompleteThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/complete/CompletionList.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/complete/UserIDCompleteThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/complete/UserIDCompletionListSupplyThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/dbsearch/DBSearchWindow.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/dbsearch/DBSearchWindowEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/friends/FetchBar.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/friends/Friends.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/friends/FriendsEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/globalconfig/GlobalConfigEventThread.as (更新) (3 diffs)
- air/TLife/trunk/src/uwi/ui/mainmenu/MainMenu.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/mainmenu/MainMenuEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/mainstatusbar/MainStatusBar.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/multipletabbar/MultipleTabBar.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/multipletabbar/MultipleTabBarDragEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/multipletabbar/MultipleTabBarEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/search/SearchWindow.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/search/SearchWindowEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/tabconfig/TabConfig.mxml (更新) (1 diff)
- air/TLife/trunk/src/uwi/ui/tabconfig/TabConfigEventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/CommonData.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/Counter.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/EventThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/FileIO.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/FrameTimerThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/KeyBind.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/LazyExecutor.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/OAuthUtility.as (追加)
- air/TLife/trunk/src/uwi/util/StatusScraper.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/StatusScraperEn.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/StatusUtility.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/StringUtility.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/TabRuleUtility.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/TimerThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/URLOverLoaderThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/URLPostThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/util/Utility.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/wassr/WassrLoginThread.as (更新) (1 diff)
- air/TLife/trunk/src/uwi/wassr/WassrTimelineGetThread.as (更新) (1 diff)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
air/TLife/trunk/application.xml
r2628 r2634 1 1 <?xml version="1.0" encoding="utf-8" ?> 2 2 <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> 28 28 </application> air/TLife/trunk/bin/lang-config.xml
r2533 r2634 1 1 <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> 15 15 <readoldposts>前回起動時の投稿を表示に含める</readoldposts> 16 16 <hammer>同一ユーザーの発言表示件数の上限</hammer> 17 17 <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> 96 96 </tlife> air/TLife/trunk/obj/TLifeConfig.old
r2621 r2634 1 1 <?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.--> 5 3 <!--Any modifications you make may be lost.--> 6 4 <flex-config> air/TLife/trunk/obj/TLifeConfig.xml
r2621 r2634 1 1 <?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.--> 5 3 <!--Any modifications you make may be lost.--> 6 4 <flex-config> air/TLife/trunk/src/Main.mxml
r2626 r2634 54 54 import mx.utils.ObjectUtil; 55 55 import mx.validators.StringValidator; 56 import org.iotashan.utils.URLEncoding; 56 57 import org.libspark.thread.EnterFrameThreadExecutor; 57 58 import org.libspark.thread.Thread; … … 128 129 postvalidator.maxLength = CommonData.LIMLEN_POST; 129 130 postvalidator.tooLongError = "長すぎですよー"; 130 131 var tf : TextField = new TextField();132 tf.type = "input";133 stage.addChild(tf);134 131 135 132 new MainThread().start(); … … 280 277 Logger.errorLevel = Class(Logger).hasOwnProperty(level) ? Logger[level] : Logger.INFO; 281 278 282 CommonData. incrementalSearchJudgers= [279 CommonData.judgers_incrementalsearch = [ 283 280 null, 284 281 KeyBind.makeJudger(CommonData.configxml.keybind.isearchcontent), … … 343 340 private function onFPMouseMove(event : MouseEvent) : void 344 341 { 345 if (CommonData. FPATagData== null) return;342 if (CommonData.atagdata_friendpost == null) return; 346 343 347 344 // XXX too dangerous! 348 345 // TextArea.textField 349 346 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) { 354 351 if (tag.start <= pos && pos < tag.end) { 355 352 CommonData.mainstatusbar.write(tag.href, DEPTH_FP); … … 368 365 private function onRPMouseMove(event : MouseEvent) : void 369 366 { 370 if (CommonData. RPATagData== null) return;367 if (CommonData.atagdata_replypost == null) return; 371 368 372 369 // XXX too dangerous! 373 370 // Text.textField 374 371 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) { 379 376 if (tag.start <= pos && pos < tag.end) { 380 377 CommonData.mainstatusbar.write(tag.href, DEPTH_RP); air/TLife/trunk/src/uwi/bean/Status.as
r2218 r2634 1 1 package uwi.bean { 2 3 /**4 * ...5 * @author Uwi6 */7 public class Status {8 private var _postid : String; // postID9 private var _postername : String; // 発言者名10 private var _posterid : String; // 発言者ID11 private var _content : String; // post本文12 private var _replyto : String; // postのreply先ID13 private var _postedtime : Date; // postされた時刻14 private var _iconurl : String; // iconのURL15 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; 17 17 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() : String30 {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):void44 {45 _postid = value;46 }47 48 public function get postername():String { return _postername; }49 50 public function set postername(value:String):void51 {52 _postername = value;53 }54 55 public function get posterid():String { return _posterid; }56 57 public function set posterid(value:String):void58 {59 _posterid = value;60 }61 62 public function get content():String { return _content; }63 64 public function set content(value:String):void65 {66 _content = value;67 }68 69 public function get replyid():String { return _replyto; }70 71 public function set replyid(value:String):void72 {73 _replyto = value;74 }75 76 public function get postedtime():Date { return _postedtime; }77 78 public function set postedtime(value:Date):void79 {80 _postedtime = value;81 }82 83 public function get iconurl():String { return _iconurl; }84 85 public function set iconurl(value:String):void86 {87 _iconurl = value;88 }89 90 public function get fav():Boolean { return _fav; }91 92 public function set fav(value:Boolean):void93 {94 _fav = value;95 }96 97 public function get tag():String { return _tag; }98 99 public function set tag(value:String):void100 {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 106 106 } air/TLife/trunk/src/uwi/bean/TabRule.as
r2501 r2634 1 1 package uwi.bean 2 2 { 3 import ken39arg.logging.Logger;4 import uwi.regexp.RegExpParser;5 6 /**7 * ...8 * @author Uwi9 */10 public class TabRule11 {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 : int28 )29 {30 _tabname = tabname;31 _reqid = reqid;32 _reqcontent = reqcontent;33 _operation = operation;34 generateRegExp();35 }36 37 public function deepcopy() : TabRule38 {39 return new TabRule(_tabname, _reqid, _reqcontent, _operation);40 }41 42 public function toXML() : XML43 {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) : TabRule53 {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() : void62 {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):void77 {78 _tabname = value;79 }80 81 public function get reqid():String { return _reqid; }82 83 public function set reqid(value:String):void84 {85 _reqid = value;86 }87 88 public function get reqcontent():String { return _reqcontent; }89 90 public function set reqcontent(value:String):void91 {92 _reqcontent = value;93 }94 95 public function get operation():int { return _operation; }96 97 public function set operation(value:int):void98 {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 105 105 } air/TLife/trunk/src/uwi/db/DB.as
r2621 r2634 1 1 package 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 Uwi13 */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() : void24 {25 try {26 if (_conn.connected) _conn.close();27 }catch (e : Error) {28 }29 }30 31 public function createTables() : void32 {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) : void70 {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 85 85 } air/TLife/trunk/src/uwi/db/DBExcite.as
r2533 r2634 1 1 package uwi.db 2 2 { 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 Uwi15 */16 public class DBExcite17 {18 public static function excite(readoldposts : Boolean) : void19 {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 99 99 } air/TLife/trunk/src/uwi/db/DBOpenThread.as
r2501 r2634 1 1 package 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 Uwi13 */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() : void23 {24 path = null;25 conn = null;26 }27 28 protected override function run() : void29 {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) : void37 {38 Logger.info("DB open succeeded.");39 }40 41 private function onError(e : SQLErrorEvent) : void42 {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 51 51 } air/TLife/trunk/src/uwi/db/DBSelectThread.as
r2624 r2634 1 1 package 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文を発行するThread13 * @author Uwi14 */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() : void30 {31 stmt = null;32 }33 34 protected override function run() : void35 {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() : void48 {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 54 54 } air/TLife/trunk/src/uwi/db/DBSupplyThread.as
r2621 r2634 1 1 package uwi.db 2 2 { 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からとってくる・・ということを容易に実現するThread10 * @author Uwi11 */12 public class DBSupplyThread extends Thread13 {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() : void33 {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() : void43 {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() : void59 {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 65 65 } air/TLife/trunk/src/uwi/db/DBSupplyThread2.as
r2450 r2634 1 1 package uwi.db 2 2 { 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 Uwi14 */15 public class DBSupplyThread2 extends Thread16 {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() : void36 {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() : void46 {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() : void63 {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() : void73 {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 80 80 } air/TLife/trunk/src/uwi/db/DBTransactionThread.as
r2501 r2634 1 1 package 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 Uwi10 */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() : void19 {20 conn = null;21 }22 23 protected override function run() : void24 {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 40 40 } air/TLife/trunk/src/uwi/db/SimpleTransactionThread.as
r2546 r2634 1 1 package uwi.db 2 2 { 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 Uwi13 */14 public class SimpleTransactionThread extends DBTransactionThread15 {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() : void28 {29 basetext = null;30 args = null;31 }32 33 protected override function execute() : void34 {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 61 61 } air/TLife/trunk/src/uwi/migemo/AIRMigemo.as
r2453 r2634 7 7 import flash.system.System; 8 8 import 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 Uwi17 */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) : Boolean32 {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() : void43 {44 try {45 if (conn.connected) conn.close();46 }catch (err : Error) {47 }48 }49 50 /**51 * 正規表現を作成52 * @paramquery53 * @return54 */55 public function complement(query : String) : String56 {57 return generateRegExp(enumerate(query));58 }59 60 /**61 * queryを補完したVector.<String>を返す。62 * @paramquery63 * @return64 */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 // 英字の半角をexpand74 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; 86 86 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 * @paramquery112 * @return113 */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 // 英字の半角をexpand121 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 * @paramvec140 * @return141 */142 public static function generateRegExp(vec : Vector.<String>) : String143 {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 * @paramvec163 * @paramnpfxlist164 * @paramstart165 * @paramend166 * @parampos167 * @return168 */169 private static function solve(vec : Vector.<String>, npfxlist : Vector.<int>, start : int, end : int, pos : int) : String170 {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 * @paramvec221 * @return222 */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 * @parama236 * @paramb237 * @return238 */239 private static function nCoPrefix(a : String, b : String) : int240 {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 * @paramvec250 * @return251 */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 * @parama269 * @paramb270 * @return271 */272 private static function compstr(a : String, b : String) : int273 {274 return a < b ? -1 : 1;275 }276 277 /**278 * 半角英数を全角英数に変換279 * @paramsrc280 * @return281 */282 private static function expandAlphabet(src : String) : String283 {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 * @paramkana298 * @return299 */300 private static function convertHiraganaToKatakana(kana : String) : String301 {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 * @paramkana317 * @return318 */319 private static function convertKatakanaToHiragana(kana : String) : String320 {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 * @paramroman336 * @return337 */338 private static function convertRomanToKatakana(roman : String) : String339 {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 * @paramroman360 * @return361 */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 * @paramstr423 * @return424 */425 private static function sqlescape(str : String) : String426 {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 a 236 * @param b 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 a 269 * @param b 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 711 711 } air/TLife/trunk/src/uwi/migemo/SocialIMEAPIThread.as
r2453 r2634 56 56 var regexpstr : String = ""; 57 57 for each(var line : String in src.split("\r\n")) { 58 regexpstr += "(" + line.replace(/ \t/g, "|") + ")";58 regexpstr += "(" + line.replace(/ /g, "|") + ")"; 59 59 } 60 60 dstlist.push(regexpstr); air/TLife/trunk/src/uwi/regexp/RegExpParser.as
r2501 r2634 1 1 package uwi.regexp 2 2 { 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 Uwi15 */16 public class RegExpParser17 {18 private var str : String;19 private var pos : int;20 21 public static function parse(str : String) : Object22 {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 EOS35 B:= C '|' B | C36 C:= C1 | ''37 C1 := '^'C2 | C238 C2 := D'$' | D39 D:= ED | E40 E:= F'?' | F41 F:= '(' B ')' | [G] | Character42 G := Character G | Character43 *44 * @paramc45 * @paramstate46 * @return47 */48 49 private function match(c : String) : void50 {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() : StrNode61 {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() : Object87 {88 if (pos == str.length) {89 Logger.error("RegExpParser f Error");90 throw pos;91 }92 var s : String = ""