diff -urN /non-existant-dir/.svnversion tiarra-20080510/.svnversion --- /non-existant-dir/.svnversion 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20080510/.svnversion 2008-05-11 00:25:24.000000000 +0900 @@ -0,0 +1 @@ +11365 \ No newline at end of file diff -urN /non-existant-dir/AUTHORS tiarra-20080510/AUTHORS --- /non-existant-dir/AUTHORS 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20080510/AUTHORS 2008-05-11 00:25:24.000000000 +0900 @@ -0,0 +1,64 @@ +-*- text -*- +$Id: AUTHORS,v 1.1 2004/02/14 08:44:24 admin Exp $ +プログラム: Tiarra +オリジナル開発者: phonohawk + +Authors (敬称略) +=============== + +* tiarra, main/* + +phonohawk: 設計, 殆どのクラスの実装 +Topia: 幾つかのクラスの設計と実装, 多数の改良とバグ修正 + +* module/下、Auto関連 + +Topia: ほぼ全て +phonohawk: (初期バージョンのみ)設計と実装 + +* module/下、Auto以外 + +phonohawk: ほぼ全て +Topia: 幾つかのクラスの設計と実装, 多数の改良とバグ修正 + +* module/System/SendMessage.pm + +Yoichi Imai: 初期設計と実装。 +Topia: 改良 + +* bundle/IO/Socket/INET6.pm + +phonohawk + +* tiarra-conf.el + +phonohawk + +* tiarra-conf.l + +Noboruhi: tiarra-conf.elからの移植 + +* doc/*, doc-src/* + +phonohawk: ほぼ全て +other: モジュールから ./makedoc により自動生成。 + +* アーカイブの作成と配布 + +Topia (2004年10月現在) + +* bundle/ にバンドルされている外部モジュール + (IO/Socket/INET6.pm は除きます。) + +Unicode::Japanese(PurePerl): + Copyright 2001-2004 + SANO Taku (SAWATARI Mikage) and YAMASHINA Hio. + All right reserved. + +=============== +その他、多数の方々よりバグ報告や改良案等を頂き、Tiarraは改善されております。 +この場を借りて感謝の意を申し上げます。 + +- phonohawk - http://ccm.sherry.jp/ +OpenPGP public key: 1024D/1A86EF72 +Fpr: 5F3E 5B5F 535C CE27 8254 4D1A 14E7 9CA7 1A86 EF72 diff -urN /non-existant-dir/ChangeLog tiarra-20080510/ChangeLog --- /non-existant-dir/ChangeLog 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20080510/ChangeLog 2008-05-11 00:25:24.000000000 +0900 @@ -0,0 +1,1999 @@ +2004-08-22 Topia + + * HACKING: + - ModuleManager/*_blacklist, Multicast/attach_for_client, + remark/IRCMessage/always-use-colon-on-last-param, + Hook の使い方を追加。 + + * tiarra: + (shutdown): + - runloop->terminate を使った shutdown を行うようにした。 + - runloop->terminate が失敗した時のために、2度以上 shutdown が + 呼ばれれば強制終了する。 + + * doc-src/conf-main.tdoc, main/Configuration.pm: + - general/messages/quit/netconf-changed-{re,dis}connect を追加。 + + * main/IrcIO.pm: + (disconnect): + - runloop->unregister_receive_socket を呼ぶ。 + + * main/IRCMessage.pm: + (serialize): + - remark/always-use-colon-on-last-param 追加。最後のパラメータの + シリアライズ時に必ずコロンを使うようにする。 + 主にクライアント対策用。 + + * main/ModuleManager.pm: + (add_to_blacklist, remove_from_blacklist, check_blacklist, _set_blacklist): + - blacklist の実装。 + (_clear_module_cache, get_modules): + - blacklist を除いた、使用可能モジュールのキャッシュを作る。 + (terminate): + - mod_timestamp にあるモジュールも destruct/_unload する。 + (check_timestamp_update): + - 共通ルーチンとしてメソッドにした。 + (update_modules): + - blacklist 関連処理と、設定は変更されていないがアップデート + されていて、前回ロード失敗しているモジュールの再試行を追加した。 + (reload_modules_if_modified, _unload): + - blacklist 関連処理の追加。 + + * main/Multicast.pm: + (_NOTICE_from_server): + - 追加。 MODE で代用していると、メッセージとして global nick + のみが送られてきたときに、改変してしまう。 + ($server_sent): + - NOTICE と PRIVMSG を _NOTICE_from_server へ変更。 + (attach_for_client): + - 追加。multi-server-mode のときのみ attach する。 + + * main/RunLoop.pm: + - set-current-nick フックを追加した。 + (_new): + - 一時変数として $conf を追加して見やすくする。 + - terminated_networks, terminating を追加。 + (network): + - networks, disconnected_networks, terminated_networks の各 + ジャンルを順に検索して、最初に見つかったものとジャンル名を返す。 + (set_current_nick): + - set-current-nick フックを呼ぶようにした。 + (_conf, _conf_{general,networks,messages}): + - Configuration::shared_conf->... の短縮形として追加。 + (_cleanup_closed_link): + - unregister_receive_socket を使うようにした。 + - state として reconnecting/terminating/finalizing を受け入れる。 + (_action_{part_and_join,message_for_each}): + - Multicast::attach_for_client を使うようにした。 + (update_networks): + - ->_conf* を使うようにした。 + - state として reconnecting/finalizing を使う。 + (terminate_server): + - 追加。 quit し、 conf 変更がない限り自動再接続しない。 + - state として terminating を使う。 + (reconnect_server): + - 何らかのジャンルにあるネットワークを再接続する。 + (disconnect_server): + - セレクタからの削除は IO->disconnect に任せる。 + (close_client): + - ERROR を送信してクライアントを切断する。 + ({,un}install_socket): + - ->{,un}register_receive_socket を使うようにした。 + ({,un}register_receive_socket): + - 追加。 ->{receive_selector}->{add,remove} を呼ぶだけ。 + (run): + - ->_conf* を使うようにした。 + - ->{,un}register_receive_socket を使うようにした。 + - 終了処理中はクライアントからの接続を受けても即切断する。 + - 終了処理を追加。また、 400 回以上ループを回ったら強制終了する。 + (terminate): + - 全てのサーバ・クライアントを切断する。 + - 終了処理フラグを立てる。 + (apply_filters): + - エラーメッセージを表示するときに、再帰を防ぐために一時的に + ブラックリストに入れる。 + - 処理がまわってきているということはブラックリストにないという + ことなので、そのまま解除しても大丈夫なはず。 + (_apply_filters): + - バージョン管理もしているし、いらないコメントを削除する。 + (notify_msg): + - ->_conf* を使うようにした。 + + * main/TiarraDoc.pm: + (_makeconf): + - 空行のときはインデントしないようにした。 + + * main/Configuration/Preprocessor.pm: + - 解説コメントが間違っているので訂正。 + + * main/IrcIO/Client.pm: + (new): + - runloop->register_receive_socket を呼ぶようにした。 + (username, client_host): + - 追加。プロパティ取得専用。 + (do_namreply): + - ->inform_joinning_channels の中の names 関連処理だけ分けた。 + (inform_joinning_channels): + - ->do_namreply を使うようにした。 + + * main/IrcIO/Server.pm: + - RunLoop 用の ->state を追加。 + (connect): + - runloop->register_receive_socket を呼ぶようにした。 + (quit): + - quit メッセージを送信する。 + + * module/Skelton.pm: + (message_io_hook): + - 過去から現在進行へ修正。 + + * module/Auto/Utils.pm: + (sendto_channel_closure): + - Multicast::attach_for_client を使うようにした。 + + * module/Client/Cache.pm: + - network が存在しないのはあまり特別な事態ではなくなったので、 + debug 時でさえも表示しないようにした。 + + * module/Client/Eval.pm: + - 無意味なリスト生成をやめて、配列をそのまま使うようにした。 + + * module/Client/Rehash.pm: + - 追加。 nick と names による rehash を行う。 + + * module/Log/Channel.pm: + - Log::Writer フレームワークを使うようにした。 + - always-flush 設定を追加。 + - 現在、 dir の都合によりプロトコルを混ぜることはできません。 + + * module/Log/Writer.pm: + - 追加。ログ記録に必要なメソッド(reserve, flush)に限った + マルチプロトコル対応可能なフレームワーク。 + + * module/Log/Writer/Base.pm: + - Log::Writer のプロトコルプラグインのベースクラス。 + + * module/Log/Writer/File.pm: + - Log::Writer の File プロトコルプラグイン。 + - fallback として動作するため、プロトコルを省略したときも + (そして他の fallback によってハンドルされなかったときも) + このプロトコルで処理する。 + - ないディレクトリは勝手に作るので注意。 + + * module/System/Error.pm: + - 追加。 ERROR メッセージをクライアントに送る前に NOTICE に埋め込む。 + - デフォルトオンです。機構的に以前からの conf は救済できません(^^;; + + * module/System/Shutdown.pm: + - シャットダウンメッセージを受け入れるようにした。 + + * module/System/NotifyIcon/Win32.pm: + - iconfile と hide-console-on-load 設定を追加。 + - 他の雑多な機能は 128 文字対応が全然動いてくれない上に、 + 実装自体も全然進んでいないので見送りです。 + + * module/Tools/FileCache.pm: + - use Carp を追加。 + - shared で __PACKAGE__ を使うようにした。 + + * module/Tools/FileCache/EachFile.pm: + - ->{add,del}_refcount を ->{add_ref,release} に変更。 + 内部 API だから影響はないはず。 + +2004-07-29 Topia + + * main/ModuleManager.pm: + - ->notify_error(...) を ->notify_error->(...) と間違えていた + ので修正。 + (reload_modules_if_modified): + - USED に対してメッセージは出しても実際にはリロードして + いなかったので修正。 + (_unload): + - 自分でシンボルテーブルをクリアする代わりに、 Symbol::delete_package を + 使うようにした。ただしサブパッケージは退避している。 + + * main/Timer.pm: + (reset): + - 追加。現在の時刻を元に fire_time を設定しなおす。 + + * main/Module/Use.pm: + (import): + - @USE にそのまま設定する代わりに push をするようにした。 + + * module/Client/Eval.pm: + - いくつか関数を追加。 + (conf, module_manager, module, shutdown, reload) + + * module/System/NotifyIcon/Win32.pm: + - 追加。タスクバーの通知領域にアイコンを表示し、コンソールの + 表示・非表示、 conf リロード、終了などができる。 + +2004-07-24 Topia + + * HACKING: + - Auto::Utils::sendto_channel_closure の説明を追加。 + - remark の説明をいくつか追加。 + - Emacs で自動的に text-mode になるようにした。 + (Local variables) + + * Makefile: + - 間違っているコメントを削除した(etags/update もするし)。 + - ターゲット名を clean に変えた。 + - clean の一行目だけでも sh で通るようにした。 + + * main/ControlPort.pm: + - SelfLoader が動作しない例の一つだった。修正もれ。 + コメントアウトして対処した。 + + * module/Auto/Utils.pm: + - いくつか説明コメントを修正。 + (sendto_channel_closure): + - $sender が省略されれば自分で調査して送信する。 + ($sendto, $command) だけで呼べるようになった。 + - シングルサーバモード時の処理をしていなかったので修正。 + +2004-07-09 phonohawk + + * module/Auto/Reply.pm, + module/User/ServerOper.pm, + module/User/Vanish.pm: + typoの訂正。動作に変更は無い。 + +2004-07-08 Topia + + * main/Configuration.pm: + - include されたファイルの更新も感知するようにした。 + + * main/Mask.pm: + (_split): + - $mask が未定義の時に warning がでるのを防止した。 + + * main/ModuleManager.pm: + (reload_modules_if_modified): + - エラー通知に notify_error を使うようにした。 + + * main/ReloadTrigger.pm: + - Configuration::Hook/reloaded について追記。 + + * main/Timer.pm: + - notify_error の発行対象にしているパッケージの間違いを修正。 + + * main/Configuration/Preprocessor.pm: + - ->included_files を追加。 + + * main/IrcIO/Client.pm: + (_receive_while_logging_in): + - $network が未定義(未接続)の時にエラーがでていたので修正。 + (inform_joinning_channels): + - 固定チャンネルの mask は一致した分を全部飲み込むように変更。 + #*@ircnet,#*@ircnet:* のようなことが出来るようになるはず。 + + * module/System/Reload.pm: + - conf-reloaded-notify を追加。 + +2004-06-19 Topia + + * doc-src/conf-main.tdoc: + - ./tiarra --make-password のことを書き加えた。 + + * main/Timer.pm: + - code 中で die が起こっても abort しないようにした。 + + * module/Channel/Mode/Oper/Grant.pm: + - $myself が undef でないかチェックするようにした。 + + * module/Client/Cotton.pm: + - 追加。いくつかの Cotton の不具合を回避する(予定)。 + - 今は network rejoin 時の自動 part を無視する。 + + * module/Client/Eval.pm: + - runloop に括弧を付け(て関数形式に認識させ)るのを + 忘れていたので修正。 + + * module/Client/GetVersion.pm: + - 追加。クライアントの接続時に CTCP Version を発行して + クライアントのバージョンを取得する。 + +2004-06-09 Topia + + * main/IrcIO/Server.pm: + (_receive_while_logging_in): + - PING に対応した。 + - RPL_WELCOME / NOTICE / PRIVMSG 以外で無視することになった場合、 + 警告を出す。 + +2004-06-04 Topia + + * main/IRCMessage.pm: + - MAX_PARAMS(= 14) 定数を追加した。 + (params): + - 呼び出し時に未定義なら強制的に初期化するようにした。 + (n_params): + - params を使用するようにした。 + (_parse): + - $this->push を使用するようにした。 + (length, push, pop): + - 追加した。 + + * main/IrcIO/Client.pm: + (_receive_while_logging_in): + - シングルサーバモード時にサーバから RPL_ISUPPORT が提供されていれば、 + それを送信するようにした。 + + * module/Client/Cache.pm: + - MODE キャッシュ、 WHO キャッシュともに、取得中フラグに有効期限を + つけるようにした。デフォルトで 5 分、 conf では指定できない。 + - 念のため RPL_ENDOFWHO もハンドリング。 + + * module/Client/Eval.pm: + - メッセージを再構築して、 : をつけなくても良いようにした。 + もちろん ::shutdown を実行するには /eval :::shutdown と + しなければならない(笑)。 + - $err を初期化して warning が出ないようにした。 + (network, runloop): + - eval 内部からよく使いそうなものを function 化した。 + + * module/System/Raw.pm: + - 配列の最後の要素は (n_params - 1) なので修正して warning が + でないようにした。 + +2004-06-04 phonohawk + + * main/Unicode/Japanese.pm: + Unicode::Japanese 0.22に更新。 + +2004-05-26 phonohawk + + * main/Unicode/Japanese.pm: + Unicode::Japanese 0.21に更新。 + +2004-05-09 phonohawk + + * main/IrcIO.pm (receive): + サーバーやクライアントから空行を送られた場合に、エラーが出る問題を修正。 + +2004-05-09 Topia + + * main/Multicast.pm: + (nick_p): + - 省略可能な nicklen を引数に追加した。 + (channel_p): + - 省略可能な chantypes を引数に追加した。 + + * main/IrcIO/Server.pm: + - isupport を remark からインスタンス変数に変更した。 + (nick_p, channel_p): + - 追加した。 ISUPPORT として NICKLEN, CHANTYPES が指定されていた + 場合にそれを使って検査する。 + (_set_to_next_nick): + - 簡略化した。 + +2004-05-08 Topia + + * HACKING: + - typo を修正した。 + - IrcIO::Server->remark に isupport と uid を追加した。 + - ChannelInfo->remark に creation-time を追加した。 + + * main/Multicast.pm: + - $server_sent, $client_sent: RPL_CREATIONTIME へ対応した。 + - $client_sent: admin コマンドを追加した。 + + * main/NumericReply.pm: + - RPL_BOUNCE を RPL_REDIR に変更。 RPL_BOUNCE はエイリアスとして + そのまま残すようにした。 + - RPL_CREATIONTIME を追加した。 + - RPL_TOPICWHOTIME を RPL_TOPIC_WHO_TIME に変更した。 + RPL_TOPICWHOTIME はエイリアスとしてそのまま残すようにした。 + - irc2.11 なものをいくつか追加した。 + + RPL_HELLO(020) + + RPL_YOURID(042) + + RPL_SAVENICK(043) + + RPL_REOPLIST(344) + + RPL_ENDOFREOPLIST(345) + + * main/IrcIO/Server.pm: + - RPL_{CREATIONTIME,ISUPPORT,YOURID} に対応した。 + (_receive_while_logging_in): + - RPL_HELLO 対策を追加した。 + (modify_nick): + - 第二引数で nicklen を指定できるようにした。 + (_set_to_next_nick): + - ISUPPORT に NICKLEN が含まれていれば、それを使うようにした。 + + * module/Client/Cache.pm: + (_send_mode_cache): + - creation-time が存在すれば、それも返すようにした。 + +2004-04-18 Topia + + * HACKING: + - BulletinBoard と remark についてを追記。 + - こまかい修正。 + + * main/IrcIO/Client.pm, module/Client/Cache.pm: + - __PACKAGE__ がダブルクォートの中では展開されないことを + 忘れていたので修正。 + + * module/Channel/Rejoin.pm: + - 自分自身がいないチャンネル(そもそもふつうはこんなことには + ならないのだが)の rejoin 判定時に error が起きるのを修正。 + +2004-04-18 phonohawk + + * main/ControlPort.pm (ControlPort::Session::main): + 誤字修正。 NOTIFT => NOTIFY + +2004-04-07 phonohawk + + * main/IrcIO/Server.pm (new): + $this->{channels}のキーを、小文字に変換しておく。 + + 大文字小文字に一貫性の無いチャンネル名をクライアントに送る、 + EFnetやFreenet(IRC)のようなircdに接続していると、しばしば + Tiarraは混乱する。この問題を回避するため、チャンネル名同士の + 比較は一旦小文字に変換した上で行うようにする。 + + (channel): + 大文字小文字を無視してチャンネルを探索するように変更。 + $server->channel($name)のようにしてChannelInfoを得ている + 場合には、何ら変更は必要無い。 + + チャンネル名 => ChannelInfoのハッシュを返す、$server->channels + を使っている場合は、そのキーが小文字に変換されている事に注意しなければ + ならない。 + + * main/Multicast.pm (lc, uc): 追加 + IRC方式で大文字と小文字の変換を行う。IRC方式とは、[]\がそれぞれ{}|の + 大文字であると定義されている方式である。 + + * main/Mask.pm (compile): 追加 + マスクからコンパイル済み正規表現を生成する部分を、独立した関数にした。 + 大量のマッチングを高速に行う場合は、Mask::の関数を何度も呼ぶ代わりに + マスクを一度だけコンパイルする事を考えた方が良い。 + Mask.pm内でコンパイル済みマスクはキャッシュしているが、それでも速度は違う。 + + +2004-04-01 Topia + + * module/Client/Cache.pm: + - single-server-mode 時の不具合をいろいろ修正。 + - mode/who に共通な一部のコードを関数リファレンスの形でまとめた。 + +2004-04-01 phonohawk + + * tiarra: + confファイルが読み込まれる前に::printmsgを実行するとdieする問題を回避。 + そのような場合には、文字コード変換を行わない。 + +2004-03-27 Topia + + * tiarra: + - quiet モード時に STDIN を閉じないと握りっぱなしになって + (sshd が落ちないなどの)不具合が発生するようなので閉じる。 + - STDERR を何かにリダイレクトするのは、とりあえずは保留。 + +2004-03-27 phonohawk + + * main/LinedINETSocket.pm (recvbuf): + 追加。通信終了後に改行が付かなかった行の内容を取り出すために使う。 + + * main/RunLoop.pm (run): + select前フックは、タイマーの次回発動時刻を計算する前に呼ぶ。 + フック内でタイマーの状態を変更しても問題を起こさないため。 + + * main/Timer.pm (time_to_fire): + 引数を指定した場合、タイマーの発動時刻を変更できるように。 + + * module/Tools/HTTPClient.pm: + 追加。 + HTTP/1.0専用のhttpクライアント。手抜き。 + +2004-03-19 Topia + + * main/IrcIO.pm, main/LinedINETSocket.pm: + - IO::Handle 1.21 において、 LEN が存在しないと croak がでる bug + の回避。 + + * main/ModuleManager.pm: + - モジュールの destruct を呼ぶ際に、 $show_msg でなく + RunLoop->shared_loop->notify_error を使うように。 + + * main/IrcIO/Client.pm: + (inform_joinning_channels): + - フックの引数を変更。 + - フックコール中にエラーが発生しても + 最低限すべてのチャンネル情報だけは送信するように。 + + * module/Client/Cache.pm: + - IrcIO::Client::Hook/channel-info を使用して、 + 知っているチャンネルモードを強制的に先行して送るようにした。 + + * module/Log/Recent.pm: + (IrcIO::Client::Hook/channel-info): + - 引数変更に同期。 + - クライアントオプション no-recent-logs をみるようにした。 + +2004-03-13 phonohawk + + * main/Hook.pm (Hook::call, HookTarget::call_hooks): + フック関数に引数を渡せるように変更。 + + * main/RunLoop.pm: + Hook.pmで一般化したためにコメントアウトしてあったフック関連のコードを削除。 + + * main/IrcIO/Client.pm (inform_joinning_channels): + チャンネル情報一つ転送される度に呼ばれるフック channel-info を定義。 + このフックには引数としてIrcIO::Client自身とチャンネル名が渡される。 + フッククラスは同ファイルで定義されるIrcIO::Client::Hook。 + + * module/Log/Recent/pm: + クライアントに送られるチャンネルと同じ順番でログも送るように変更。 + この動作はIrcIO::Clientのフックを利用している。 + + * main/RunLoop.pm (run): + Tiarra暴走検出のコードにバグがあったので修正。 + 0秒selectに2秒以上の間隔が開いた場合にはカウンタをリセットする意図があったと思うが + 2秒*以下*の間隔でリセットしていた。 + ついでなので警告の閾値も300まで引き上げ。 + +2004-03-09 Topia + + * module/Client/Cache.pm: + - destruct において、呼ぶメソッドを勘違いしていたのを修正。 + +2004-03-08 phonohawk + + * module/Unicode/Japanese.pm: + UniJP 0.20に置換え。 + +2004-03-07 Topia + + * tiarra: + - untaint を行うようにした。 + + * main/Configuration.pm: + - 呼び出す関数名を間違えていた bug を修正。 + + * main/Mask.pm: + - untaint を行うようにした。 + + * main/Multicast.pm: + - ERR_NOTONCHANNEL, ERR_NOSUCHCHANNEL を *_sent に追加。 + + * main/IrcIO/Server.pm: + - nick 変更の prefix category を nick::system にした。 + - _START_WHOIS_REPLY を呼ぶときに defined check をしてない bug + を修正。 + + * module/Client/Cache.pm: + - destruct を追加。 + - ChannelInfo につける remark にパッケージ名をつけて、 + 他のモジュールとかぶらないようにした。 + + * module/Client/Eval.pm: + - untaint を行うようにした。 + - 複数行の出力をちゃんと処理するようにした。 + +2004-02-23 Topia + + * module/Debug/RawLog.pm: + - 追加。生の IRC メッセージ(のようなもの?)を ::printmsg を使って + 表示する。 + + * main/IrcIO/Client.pm: + - RunLoop を Runloop と typo していたのを修正。 + + * main/IrcIO/Server.pm: + (_received_after_logged_in, _set_to_next_nick): + - sysmsg_prefix を使うようにした。 + (_RPL_CHANNELMODEIS): + - 存在しないチャンネルが対象だったときにエラーがでるという + どうしようもないミスを修正。 + + * main/RunLoop.pm: + (_multi_server_mode_changed): + - sysmsg_prefix を使うようにした。 + + * makedoc: + - sample.conf を出力するようにした。 + - 全体にわたってモジュール名のソートを行うようにした。 + - block 構文への暫定対応。 + - #key:value という *コメント* をきちんと認識していなかったのを fix + - グループ名に説明が定義されていなかったときに警告を出すようにした。 + + * tiarra: + - --enable-debug 時にも、 couldn't connect 関連のメッセージなら + スタックトレースを省略するようにした。 + + * sample.conf: + - TiarraDoc を使用するようになった。 + + * doc/module-toc.html, doc/module/*.html: + - regen. + + * doc-src/conf-main.tdoc: + - general/omit-sysmsg-prefix-when-possible 削除。 + - general/sysmsg-prefix-use-masks ブロック追加。 + - 書かれていなかった networks/multi-server-mode の解説を + sample.conf から持ってきて追加。 + - typo したままだった networks/channel-network-separator の + コメントを sample.conf に従って修正。 + - ircnet/host を irc.nara.wide.ad.jp に変更。 + いまは停止しているのだが、復活を願うということで。 + + * doc-src/module-group.tdoc: + - Channel の最後が typo していたのを修正。 + - Client, CTCP, Debug を追加。 + とはいえ Debug はまだ cvs repo. には存在していないが…。 + + * doc-src/sample.conf.in: + - RCS Tag 'Id' を追加。 + + * main/Configuration.pm: + - general/omit-sysmsg-prefix-when-possible のデフォルト値を消して、 + general/sysmsg-prefix-use-masks のデフォルトブロックを追加。 + (_complete_table_with_defaults): + - _complete_{table,block}_with_defaults に分割。 + (_complete_table_with_defaults): + - Block を使った実装に変更。 + - Configuration::Block->table の追加が必須。 + (_complete_block_with_defaults): + - block(hash_ref) と array_ref のデフォルト値に対応。 + + * main/ModuleManager.pm: + (update_modules): + - %loaded_mods に古いモジュールが無かった場合は無視するようにした。 + (_unload): + - デバッグモード時でも、同じモジュールからの 11 以上の export は表示しない。 + + * main/Multicast.pm: + - $server_sent, $client_sent: NumericReply 化。 + ERR_TOOMANYCHANNELS と RPL_WHOISCHANNELS を追加。 + (_NJOIN_from_server, _RPL_NAMREPLY): + - /[@+]/ が変数展開されているようなので /[\@+]/ に変更。 + (_WHOIS_from_client): + - RunLoop->shared_loop->sysmsg_prefix を使用するようにした。 + (_{attach,detach}_RPL_WHOISCHANNELS): + - 追加。 WHOIS で表示されるチャンネル名に network をつける。 + + * main/RunLoop.pm: + - sysmsg_prefix を追加。 + (_action_one_message, _action_message_for_each, notify_msg): + - RunLoop->shared_loop->sysmsg_prefix を使用するようにした。 + + * main/TiarraDoc.pm: + (_makeconf): + - block への暫定対応。 + + * main/Configuration/Block.pm: + - ->table を追加。 + (eval_code): + - original の typo を修正。 + + * main/IrcIO/Client.pm: + - RunLoop->shared_loop->sysmsg_prefix を使用するようにした。 + (inform_joinning_channels): + - 暫定的に networks/fixed-channels ブロックに channel の mask を + 書くことで、送信順を指定できるようにしたが、 conf エントリ名が + 気に入らないため、名前が決まるまでは sample.conf に + 書かないことにする。 + + * main/IrcIO/Server.pm: + - ->server_hostname を追加。 RPL_WELCOME(001) で送られてきた + サーバ名を保持する。 + - サーバで nick 変更が起こったときに、以前の nick も表示するようにした。 + + * module/Auto/Reply.pm: + - 返答時に mask をチェックするようにした。 + + * module/Channel/Freeze.pm: + - RunLoop->shared_loop->sysmsg_prefix を使用するようにした。 + - 不要になった use Configuration; を削除。 + + * module/Client/Cache.pm: + - RunLoop->shared_loop->sysmsg_prefix を使用するようにした。 + - WHO キャッシュ送信時において、 Multicast::global_to_local を + 使って nick を変換していなかった bug を修正。 + - 不要になった use Configuration; を削除。 + + * module/Client/Eval.pm: + - RunLoop->shared_loop->sysmsg_prefix を使用するようにした。 + - 無用な remark('fill-prefix-when-sending-to-client') をなくした。 + + * module/Log/Recent.pm: + - no-recent-logs クライアントオプションを追加。 + - RunLoop->shared_loop->sysmsg_prefix を使用するようにした。 + - 不要になった use Configuration; を削除。 + + * module/System/Pong.pm: + - NumericReply 化。 ERR_NOORIGIN を返せるようにした。 + - PING もここで破棄するようにした。 + (message_arrived): + - $sender->server_hostname を使用して正確なホスト名に返す。 + + * module/System/Raw.pm: + - RunLoop->shared_loop->sysmsg_prefix を使用するようにした。 + - NumericReply 化。 NOTICE の代わりに ERR_NEEDMOREPARAMS を返す。 + - 不要になった use Configuration; を削除。 + + * module/User/Ignore.pm: + - sample conf の mask に例示用ドメインを使用するようにした。 + + * module/Auto/Alias.pm, module/Auto/Answer.pm, + module/Auto/ChannelWithoutOper.pm, module/Auto/Joined.pm, + module/Auto/MesMail.pm, module/Auto/Oper.pm, + module/Auto/Random.pm, module/Auto/Reply.pm, + module/Auto/Response.pm, module/CTCP/*.pm, + module/Channel/*.pm, module/Channel/Join/Invite.pm, + module/Channel/Join/Kicked.pm, module/Channel/Mode/*.pm, + module/Channel/Mode/Oper/Grant.pm, module/Log/Recent.pm, + module/System/Macro.pm, module/System/Pong.pm, + module/System/Raw.pm, module/System/RemoteControl.pm, + module/System/Shutdown.pm, module/User/Filter.pm, + module/User/ServerOper.pm, module/User/Vanish.pm, + module/User/Away/Client.pm, module/User/Away/Nick.pm, + module/User/Nick/Detached.pm: + - TiarraDoc 化。 sample.conf から取ってきて一部まずいところは + 変更している。 + +2004-02-21 phonohawk + + * module/Channel/Freeze.pm: + freezeコマンドの引数は、これまでは完全なチャンネル名であったが、 + これはマスクに変更。その時にJOINしている全てのチャンネルの中から + マスクに一致した全てのチャンネルを凍結する。 + + * sample.conf, doc-src/conf-main.tdoc: + 設定 general/omit-sysmsg-prefix-when-possible 追加。 + これが1である時、sysmsg-prefixはチャンネルに対してのメッセージ + でなければ省略する。デフォルトは1。 + + * main/Configuration.pm: + general/omit-sysmsg-prefix-when-possible のデフォルト値を追加。 + + * main/Multicast.pm, main/RunLoop.pm, + main/IrcIO/Client.pm, module/Channel/Freeze.pm, + main/Log/Recent.pm, module/System/Raw.pm: + omit-sysmsg-prefix-when-possibleを反映。 + +2004-02-15 Topia + + * module/Client/Cache.pm: + - message_io_hook を追加。サーバとの通信を監視して、 + MODE や WHO を発行(して返答をもらっている)途中かどうかを + 記憶しておくように。 + - message_io_hook で記憶した情報を使って、 + (ほかのクライアントなどによって)サーバに情報を問い合わせている + 途中の時も、メッセージを破棄するようにした。 + 2つ以上のクライアントが同時につながったときに効果が出るはず。 + テストには LimeChat を 3 つ同時に接続させたが、 + サーバへの問い合わせは各チャンネルにつき1回までに抑えられていた。 + - クライアントに伝達される必要のあるメッセージではないので、 + RunLoop->shared_loop->notify_warn() if ::debug_mode; から + ::debug_printmsg(); に変更。 + - WHO キャッシュにおいて、 + データ不足であきらめたときのメッセージ表示をやめた。 + +2004-02-14 Topia + + * 全般: + (a) NumericReply を使うようにした。 + (b) general/sysmsg-prefix を使うようにした。 + + * doc-src/conf-main.tdoc, sample.conf: + - sysmsg-prefix を追加。 + + * sample.conf: + - Client::Eval と Client::Cache を追加。 + + * main/ChannelInfo.pm: + - mode_string method を追加。 + + * main/Configuration.pm: + - general/sysmsg-prefix のデフォルト値を追加。 + + * main/IRCMessage.pm: + - clone(deep => 1) を追加。 + - s/unvalid/invalid/; fix typo. + - $this->[PARAMS] がそもそも未定義なときは、 + n_params は中身なし配列の長さ(=0)を返すようにした。 + + * main/ModuleManager.pm: + - module の reload の時に、一時的に $this->{modules} の + 該当箇所に undef を入れて実行されないようにした。 + (main/RunLoop.pm の変更とセットです。) + + * main/Multicast.pm: (b) + - シングルサーバモードで、どこのネットワークにも + 繋がっていないときは、デフォルトネットワークに + $networks->default を使うようにした。 + + * main/NumericReply.pm: + - irc2.10.3p5+hemp2 に合わせた。 + ISUPPORT は使用する設定。 + - fetch_number(名前から番号), fetch_name(番号から名前) + のそれぞれを得る関数を追加した。 + + * main/PersonInChannel.pm: + - priv_symbol method (privilege symbol) を追加。 + has_[ov] の状態によって、 @, +, 空文字列のどれかを返す。 + + * main/PersonalInfo.pm: + - AWAY を追加。できるだけ更新しますが、 + 性質上情報の正確さは保証できません。 + + * main/RunLoop.pm: (b) + - single-server-mode 時に、切断・接続のアナウンスの + 送信先チャンネル名からネットワーク名をはずすようにした。 + - サーバへの接続処理時に、 couldn't connect to 以外の + エラーメッセージ表示には notify_error を使うようにした。 + - クライアントからの接続処理時は、エラーメッセージ表示に + notify_msg を使うようにした。 + - apply_filters で、 modules_list の中に undef が出てきたら、 + それを無視するようにした。 + (main/ModuleManager.pm の変更も参照。) + + * main/IrcIO/Client.pm: (a)(b) + - credit を RPL_YOURHOST でなく MOTD として表示するようにした。 + - RPL_YOURHOST では、 Tiarra のバージョンを表示する。 + + * main/IrcIO/Server.pm: (a) + - _RPL_* の処理を NumericReply::fetch_name を使ってまとめた。 + - _START_WHOIS_REPLY, _RPL_ENDOFWHOIS, _RPL_AWAY を追加。 + - _RPL_WHOREPLY + + 空白を含む realname に関するバグを修正。 + + away 情報を記憶するようにした。 + + server hop 情報を network の 'server-hops' remark に保存。 + - _RPL_CHANNELMODEIS で、 switches と parameters の情報は + この reply で得られると決めつけて、クリア処理を行う。 + + * module/Channel/Freeze.pm: (b) + + * module/Channel/Rejoin.pm: (a) + - ChannelInfo->mode_string を使用するようにした。 + + * module/Channel/Join/Connect.pm: + - コンマの直後にスペースがあった場合、削除する処理が、 + 最初の一つに対してしか実行されていなかったのを修正…(^^;;; + + * module/Client/Cache.pm: + - 追加。いまのところ MODE キャッシュと、 WHO キャッシュを実装。 + + * module/Client/Eval.pm: + - 追加。クライアントからのコマンドしか受け付けないが、 + その代わりすべてのコマンドを実行できる。 + 事実上 IRC パスワードがわかれば Tiarra が動いているホスト上で + 動作しているアカウントの権限で何でもできる、 + ということに注意すること。 + + * module/Log/Recent.pm: (b) + - network name が不正な場合は、 notify_warn で警告して、 + エラーなしに抜けるようにした。 + + * module/System/Pong.pm: + - prefix がついているのは不自然だったので、削った。 + + * module/System/Raw.pm: (b) + + * module/Tools/LinedDB.pm: + - ファイルが存在しない場合に、 + 更新チェック部分でエラーが発生していたのを修正。 + +2004-02-04 phonohawk + + * main/IrcIO.pm, main/IrcIO/*.pm, main/Module.pm: + notification_of_message_ioを削除。 + + * main/Module.pm (message_io_hook): + 追加。これはnotification_of_message_ioの代わりに呼ばれる。 + このメソッドはメッセージを改変する事が出来る。詳しくはコメントに。 + + * main/IrcIO.pm (send_message, receive): + 各モジュールのmessage_io_hookを呼ぶ。 + + * main/RunLoop.pm (apply_filters): + 追加。モジュールによるメッセージフィルタリングの一般形。 + +2004-01-27 phonohawk + + * main/NumericReply.pm: 追加 + ニューメリックリプライをシンボルとして定義するクラス。 + useで全シンボルをエクスポート。 + + * main/IrcIO.pm: + CRが無く、LFだけで終わっているメッセージも受け入れる。 + +2004-01-23 Topia + + * tiarra: $0 自体が symlink だったときに、@INC に symlink 先の + main/module を含めるようにした。 + カレントディレクトリ・$0 のディレクトリは常に含むようにした。 + (make_password): --make-password=password を可能にした。 + +2004-01-23 phonohawk + + * tiarra: 起動時オプション --make-password 追加。 + make-passwordの機能をtiarra本体に移した。 + + * make-password: 削除 + +2004-01-20 phonohawk + + * main/Unicode/Japanese.pm: + 同梱のUniJPを0.18から0.19に。JISの問題は解決。 + +2004-01-14 phonohawk + + * main/Mask.pm: + マスクから作った正規表現をqrでコンパイルする際、 + iフラグを付け忘れて大文字小文字の区別が*されていた*ので修正。 + + * main/IRCMessage.pm (_parse): + 空文字列については文字コード変換処理を明示的に省略する。 + Unicode::JapaneseにはISO-2022-JP→UTF-8変換において空文字列を"\x00"にしてしまう問題あり。 + +2003-11-17 Topia + + * tiarra: enhancement. + パッケージ用にいくつかのバージョン変数を追加した。 + + * module/Log/Channel.pm: enhancement/need reload. + + デフォルトのログファイルパーミッションを 644 から 600 にした。 + ディレクトリ作成時のパーミッションを指定できるようにした。(dir-mode) + デフォルトは 700 。 + + * tiarra: enhancement. + + --dumpversion を追加した。 + パッケージ作成時にバージョン情報を得るため等に使う予定。 + +2003-11-09 Topia + + * module/System/Reload.pm (message_arrived): bugfix/need reload. + + Timer を使って遅延処理することによって、reload command での + 自分自身のリロードを可能にした。 + + * main/RunLoop.pm (run): bugfix(single-server-mode)/need reboot. + + single-server-mode 時の、クライアントから送られて来た + PRIVMSG/NOTICE のブロードキャストで、 network-suffix 付きの + チャンネルに送信してしまっていた。 + +2003-11-09 phonohawk + + * tiarra (help): + メッセージ中のstdinとstderrの間違いを修正。 + +2003-11-08 Topia + + * make-password: enhancement. + + パスワードの入力に、 Term::ReadLine を使用するようにした。 + + * module/Log/Recent.pm (client_attached): bugfix(single-server-mode)/need reload. + + single-server-mode 時に、送信チャンネル名から network-suffix + をはずす。 + + * main/RunLoop.pm (run): bugfix(single-server-mode)/need reboot. + + single-server-mode 時に、クライアントから送られて来るメッセージに + network-suffix を付けるようにした。 + +2003-10-25 phonohawk + + * main/IRCMessage.pm (serialize): + 最後のパラメータが空文字列だった場合、コロンを残さない為に + シリアライズ後のパラメタが減ってしまう問題を解決。 + + * main/IrcIO/Server.pm (_receive_while_logging_in): + サーバーがERRORを返した時、その内容でdieするように。 + +2003-10-24 phonohawk + + * main/Configuration/Block.pm: + $block->foo_bar('block') とした時、戻り値が常にブロックとなる。 + 未定義であれば空のブロックを、既定義かつ値がブロックであれば + そのブロックを、既定義かつ値がブロックでなければキーと値のペアを + 一つだけ含むブロックを生成して返す。 + +2003-10-19 Topia + + * HACKING: + モジュール作成者向けのドキュメントを書いた。 + まだ、Timer / Hook / Socket I/O 関連の記述がない。 + + * module/Skelton.pm: + 新規モジュールのスケルトン。中身のほとんどは main/Module.pm と同一。 + + * module/Auto/Alias.pm (message_arrived): + 返り値がおかしかったのを修正。 + +2003-10-19 phonohawk + + * main/IrcIO/Server.pm + (person_if_exists): + 追加。指定されたnickを持つ人物が居れば、そのPersonalInfoを返す。 + (_RPL_WHOREPLY): + サーバー名とnickの位置を間違えていたので修正。 + +2003-10-16 phonohawk + + * module/System/Raw.pm: + 追加。Tiarraに改変されない生のメッセージをサーバーに送るためのモジュール。 + + * main/RunLoop.pm (update_networks): + confからサーバー名を削除する事でサーバーから切断した時に、 + そのサーバーで入っていた全てのチャンネルに対するPARTを全クライアントへ送る。 + +2003-10-14 Topia + + * main/Multicast.pm (distribute_to_servers): + hijack_forward_to_server を適用(nickで使う) + + * main/RunLoop.pm (_multi_server_mode_changed): + nick 変更を追加。 + + * main/IrcIO/Server.pm (_receive_while_logging_in): + single-server-mode 時の NICK 処理を追加。 + + * main/IrcIO/Server.pm (_receive_after_logged_in): + single-server-mode 時の NICK 処理に RunLoop/set_current_nick を追加。 + 437 での if 条件であほなミスをしていたので修正。 + +2003-10-12 phonohawk + + * main/IRCMessage.pm (serialize): + 最後のパラメータがコロンを含んでいる時に、間違った文字列化をする問題を解決。 + +2003-09-28 phonohawk + + * tiarra-conf.el: + mmm-modeがインストールされていて、(require 'mmm-mode)または + (require 'mmm-auto)されている場合に、tiarra-conf用の設定を + 行った後、それを有効にする。 + + mmm-modeのサイトは次のURLに。 + http://mmm-mode.sourceforge.net/ + + * main/PersonalInfo.pm (remark): + 追加。 + これを保存するためのhashは、必要になった時まで作られない。 + +2003-09-26 Topia + + * tiarra: + --debug 時に warn と die に長いスタックトレースを表示する。 + + * main/ChannelInfo.pm: + topic_who と topic_time を追加。 + エラーメッセージのミスを修正。 + + * main/Multicast.pm: + RPL_TOPICWHOTIME の追加。 + hijack_local_to_global 時のフォールバック条件を訂正。 + + * main/IrcIO/Client.pm: + 431 No nickname given の実装。 + multi-server-mode でないときには nick 関連の特殊処理をしないように。 + RPL_TOPICWHOTIME の実装。 + + * main/IrcIO/Server.pm: + 437 nick/channel is temporarily unavailable に対応。 + multi-server-mode でないときには nick 関連の特殊処理をしないように。 + RPL_TOPICWHOTIME の実装。 + 9文字以上のnickが来たときに、可能な限り必要以上短くしないように。 + +2003-09-25 Topia + + * tiarra: + --version と --debug の実装。 + ::debug_printmsg(...), ::debug_mode を使用できます。 + ::printmsg への autoflash 指定を追加。 + + * main/ModuleManager.pm: + (update_modules): $this->{modules} の再構成を、アンロード前に移動。 + notification_of_message_io の呼び出しでエラーが発生するのを回避。 + (_load): デバッグモード時に UNIVERSAL::isa が嘘を付いた場合、 + 標準出力に出力する。 + (_unload): + no strict の場所を変更。 + シンボルテーブル内に存在する関数のうち、 + 自分自身が定義した訳ではない関数は undef しないようにした。 + デバッグモードなら、 undef したスカラ・配列・シンボルテーブル・関数、 + undef しなかった関数、に付いてそれぞれ標準出力に出力する。 + + * module/Channel/Join/Connect.pm: + コンマの直後にあるスペースは削除するようにした。 + TiarraDoc を追加。 + + * module/Tools/FileCache.pm: + destruct メソッドを実装。 + RCSタグを標準のものにした。 + + * module/Tools/GroupDB.pm: + Module::Use が抜けていたので追加。 + RCSタグを標準のものにした。 + + * sample.conf: + Channel::Join::Connect の ブロックを TiarraDoc から再生成。 + 指定項目の変化はありません。 + +2003-09-24 phonohawk + + * main/Multicast.pm (nick_p): + 「|」を含むnickをnickと認識していなかったので修正。 + + * module/Log/Recent.pm: + configのcommandを小文字で書くとログが取られない問題を解決。 + +2003-09-23 phonohawk + + * main/ModuleManager.pm: + use Module::Useされたサブモジュールが破棄される時に、 + そのパッケージの destruct メソッドを引数無しで呼ぶ。 + + * main/Mask.pm: + メモリを食い過ぎるので、コンパイル済み正規表現の + キャッシュ保存数を150個に減少。 + + * main/PersonalInfo.pm: + メソッドinfoに引数として真偽値を渡した時、 + それが真であればnickとnameとhostの配列を返す。 + wantarrayにすると互換性が失われるため。 + + * main/PersonalInfo.pm: + 動作速度向上のため、AUTOLOADを廃止。 + + * module/Log/Channel.pm: + configのcommandを小文字で書くとログが取られない問題を解決。 + +2003-09-20 phonohawk + + * main/ChannelInfo.pm, main/IRCMessage.pm, + main/PersonInChannel.pm, main/PersonalInfo.pm, + main/Configuration/Block.pm: + これらのクラスはオブジェクトが大量に作られるので、 + メモリの節約のためにインスタンス型を配列に変更。 + + * main/IrcIO.pm: + メソッド remarks を remark のエイリアスに。 + $io->remark(foo => undef); のように明示的にundefを設定すると + その註釈を削除。 + + * IrcIO/Server.pm: + remarkをIrcIO.pmに移動したので、こちらは削除。 + + * main/L10N.pm: + * main/LocalChannelManager.pm: + 未完成であり、まだ使われてもいないが、存在しても害は無い。 + それぞれ多言語メッセージとTiarra内部チャンネルを扱う。 + + * main/Mask.pm: + マスク文字列から変換した正規表現のコンパイル結果をキャッシュとして保存するように。 + 大量のマスクを扱う条件下で動作が非常に重くなる問題を回避する。 + ベンチマークの結果では、62.5%のマッチング速度の向上が見られた。 + +2003-08-18 Topia + + * main/Multicast.pm: + ${server,client}_sent に ENDOFWHO を追加。 + これで LimeChat などのクライアントで、 + アドレスコピーなどの機能が使えない症状が無くなった。 + $client_sent の numeric reply にコメントを補完。 + +2003-08-12 phonohawk + + * main/FunctionalVariable.pm: + 追加。与えられた任意のハンドラを変数にtieする。 + 通常のtieとの違いは、ハンドラを変数毎に関数リファで指定する点。 + + * main/Hook.pm: + フックの一般的な定義。このファイルはクラスHookとクラスHookTargetを定義する。 + + * main/Configuration.pm: + リロードした時、フック`reloaded'を呼ぶ。 + + * main/Multicast.pm: + シングルサーバーモード対応。 + forward_to_serverやlocal_to_globalを動的スコープのフラグで乗っ取る等、 + 最早スパゲティどころではない。ジャングル。 + + * main/RunLoop.pm: + シングルサーバーモード対応。 + このモードでは、同時に接続出来るサーバーの数が一つに限定され、 + チャンネル名等にネットワーク名が付加されなくなる。 + + * main/IrcIO/Client.pm: + _inform_joinning_channelsをプライベートメソッドでなくした。 + 新しいメソッド名はinform_joinning_channels。 + +2003-08-04 phonohawk + + * makedoc: + 追加。このスクリプトはdoc-src下のファイルとmodule下のモジュール、 + main下のモジュールを読み、tdoc形式で書かれたドキュメントを認識し、 + sample.confおよびdoc下のhtmlドキュメントを生成する。 + tdocについてはdoc-src/READMEを参照。 + 尚、各モジュールへのtdocの記述が完了していない為、 + 完全なsample.confは生成出来ない。完了するまではsample.confでなく + sample.conf.tmpに書き出す。 + + * doc-src/README: 追加。tdocについての説明。 + + * doc-src/conf-main.tdoc: 追加。generalやnetworksのドキュメント。 + + * doc-src/contents.html: 追加。htmlドキュメントのテンプレート。 + + * doc-src/module-group.tdoc: 追加。モジュールの分類情報。 + + * doc-src/module-toc.html: 追加。モジュールの目次のhtmlテンプレート。 + + * doc-src/sample.conf.in: 追加。sample.confのテンプレート。 + + * main/Template.pm: 追加。テンプレートを扱うクラス。 + + * main/TiarraDoc.pm: 追加。tdocパーサ。 + + * module/System/PrivTranslator.pm + * module/User/Ignore.pm: tdoc追加。 + +2003-07-31 Topia + + * 全般: + ・インデントの変更 + ・コメントの整備 + ・mask で使うチャンネル名をネットワーク付きに修正(a) + ・不要な use のクリーンアップ(b) + ・不要な変数のクリーンアップ(c) + + * Auto/Oper.pm: + (a) + + * Auto/Random.pm: + (a)(b) + + * Auto/Reply.pm: + (a)(b)(c) + + * Auto/MesMail.pm: + (b)(c) + + * Auto/Alias.pm: + (c) + + * Auto/Response.pm: + (a)(c) + + * Auto/Utils.pm: + get_ch_name -> (get_raw_ch_name): ネットワーク名無しの(server 的に raw な)チャンネル名 or undef を得る。 + (get_full_ch_name): ネットワーク名付きのチャンネル名 or undef を得る。 + (generate_reply_closures): 返り値に $get_full_ch_name を追加。 + 中身としては、$msg->param(place) 以上の意味は無いが、値の指定場所は一ヶ所にした方が良い。 + + * Tools/DateConvert.pm: + use_posix を import/unimport を使って再実装した。 + + * Tools/FileCache/EachFile.pm: + (can_remove): 実装。 + (AUTOLOAD): eval して関数コールするのではなく、その場でメソッドを定義して飛ぶようにした。 + + * Tools/FileCache.pm: + (main_loop): refcount を使ったチェックの代わりに、 can_remove を使ったチェックにした。 + + * Tools/HashDB.pm: + Module::Use を追加。 + + * Tools/HashTools.pm: + (get_array): 見付からなかった場合に () を返していたが、 undef を返すべきなので修正。 + (replace_recursive): こっかの補完処理を修正 + (_format): regexp の修正( %. -> %(.) )。バグでした。 + + * Tools/MailSend/EachServer.pm + ::printmsg -> RunLoop->shared->notify_warn 。 + LinedINETSocket を生成するときに $E_MAIL_EOL を使っていなかった。修正。 + MessageID の作られ方をコメントとして記述。 + + * Tools/MailSend.pm + (b) + + * Mask.pm: + s/exclude/include/ 。無意味な三項演算子を消した。 + + * sample.conf: + mask 関連を修正。 + +2003-07-28 phonohawk + + * main/IrcIO/Server.pm (person_list): + 追加。覚えている全てのPersonalInfoのリストを返す。 + +2003-07-26 phonohawk + + * tiarra: + 起動時に`-Dfoo'や`-Dfoo=bar'を指定すると、confに`@define foo'や + `@define foo bar'が書かれているものと見做す。 + + * module/Configuration/Preprocessor.pm + (initial_define): + @defineの初期設定の為の静的メソッド。 + + (_eval_at): + @ifdef文、@ifndef文を処理可能に。 + +2003-07-24 Topia + + * tiarra, make-password: + require 5.6.0 は古いバージョンだと解釈されないようなので require 5.006 に。 + lib, module を tiarra からの相対パスで解釈するように。 + + * main/Multicast.pm: + 352(WHOREPLY)のチャンネル名にネットワーク名をアタッチするようにした。 + +2003-07-23 phonohawk + + * main/InstantCapsule.pm: + SelfLoader使用中止。SelfLoaderでDESTROYが定義されると + カプセル内にDESTROYを定義出来なくなってしまう。 + + * module/User/Vanish.pm: + コマンド「/VANISHDEBUG 1」でメッセージの改変される様子が見えるように。 + 現在残っている妙な不具合の原因が解り次第削除。 + +2003-07-22 phonohawk + + * module/Channel/Freeze.pm + (freeze): + カンマで区切られた複数のチャンネル名を認識。 + + (defrost): + 凍結していないチャンネルをdefrostするとエラーが起こる問題を解決。 + チャンネル名をマスクとして扱うように変更。 + +2003-07-20 phonohawk + + * main/IrcIO/Server.pm (_PART): + PART受信時、入っているどのチャンネルにも最早その人物が + 居なくなった場合は、その人物についてのPersonalInfoを削除する。 + +2003-07-19 phonohawk + + * main/ChannelInfo.pm (remark): + remarks()のエイリアスとしてremark()を使用可能に。 + + * main/Timer.pm (interval): + 明示的にundefを渡す事で、リピート終了可能に。 + uninstallすれば一緒なので大した意味は無い。 + + * main/IrcIO/Server.pm (_TOPIC): + TOPICメッセージを受信した時、古いトピックを'old-topic'として註釈を付ける。 + +2003-07-17 phonohawk + + * tiarra-conf.el (tiarra-conf-jump-to-block): + ブロック名を入力し、その位置へジャンプするコマンド。 + デフォルトでは C-c C-. 及び C-c . に割当てられている。 + +2003-07-16 phonohawk + + * tiarra-conf.el (tiarra-conf-next-token): + 追加。カレントバッファの現在のカーソル位置の次にあるトークンを返す。 + カーソルはそのトークンの終わりの位置へ移動する。 + + * tiarra-conf.el + (tiarra-conf-next-block), + (tiarra-conf-prev-block): + 追加。それぞれ現在のカーソル位置の次や前にあるブロックへカーソルを飛ばす。 + プリプロセッサ指令があると変な動作をするバグ有り。 + nextは M-n に、prevは M-p に割当てた。 + +2003-07-10 phonohawk + + * module/Channel/Freeze.pm: + 追加。特定のチャンネルのNOTICEやPRIVMSGの中継を + 一時的に中断するためのモジュール。 + 発言を見たくないがPARTはしたくない、といった場合に有効。 + +2003-07-03 phonohawk + + * main/Configuration/Block.pm (get): + $config->foo('random')のような呼出しを可能に。 + 複数の定義があればランダムに一つ選んで返す。 + + * main/IrcIO/Server.pm (new, reload_config, connect): + 切断された後に再接続すると、以前のNICKが引継がれるように。 + + * module/Auto/Oper.pm: + 複数の応答が定義されていれば、ランダムに一つ選んで発言する。省略も可能。 + + * module/Auto/Utils.pm + (sendto_channel_closure, generate_reply_closures): + 作成されたクロージャに、発言内容としてundefを渡した場合、 + 何もせずに処理を終える。 + +2003-06-21 phonohawk + + * tiarra: + ActivePerlで起動時に出ていた警告を出ないように変更。 + SIGHUPのハンドラをインストールする際の警告だった。 + +2003-06-19 phonohawk + + * Multicast.pm (attach,detach) : + チャンネル/nickとネットワーク名の区切り文字として、二文字以上の文字列も使用可能に。 + つまり、今後は区切り文字として「空白を含まない1文字以上の任意の文字列」を使う事が出来ます。 + +2003-06-06 phonohawk + + * PersonInChannel.pm (remark) : + 明示的に二番目の引数にundefを渡すと、その註釈が削除される。 + + * RunLoop.pm (update_networks) : + 同一ホストへの複数の接続には、それぞれ時間差を設ける。 + + * RunLoop.pm (run) : + 既に始動時刻が過ぎているタイマーが存在すると、タイムアウト無期限のselectを行なうバグを修正。 + + * Configuration/Block.pm (eval_code) : + %CODE{...}EDOC%ブロックを、パッケージConfiguration::Implanted内で実行する。 + + * Configuration/Preprocessor.pm (_eval_pre) : + %PRE{...}ERP%ブロックを、パッケージConfiguration::Implanted内で実行する。 + + * IrcIO/Server.pm (reload_config) : + general/nickを、それぞれのネットワーク設定ブロックのnickでオーバーライド可能に。 + +2003-06-04 Topia + + * RunLoop.pm (run) : can_read を先に処理する。少しでも send で切断された状況をなくすため。 + 意味があるのかは不明だが、実害は無いはず。 + + * IrcIO.pm (send) : 接続チェックの対象に $this->{sock}->connected も追加。 + これが接続されてない状態で書き込もうとすると perl 自体がエラー落ちすることがあるらしい。 + +2003-06-04 phonohawk + + * tiarra (ipv6_enabled) : IPv6が有効かどうかを真偽値で返す。 + + * IrcIO.pm: 閉じられたソケットに対して書き込みを行なう可能性のある問題を(多分)解決。 + + * CTCP.pm, ControlPort.pm, Crypt.pm, ExternalSocket.pm, + InstantCapsule.pm, LinedINETSocket.pm: これらは一度も使われない可能性があるため、SelfLoaderを用いて遅延ロード。 + + * ChannelInfo.pm, PersonalInfo.pm: DESTROY時にエラーが起こる問題を解決。 + +2003-05-27 phonohawk + + * RunLoop.pm: + (notify_warn): 追加。全クライアントとコンソールに警告文を出力する。 + (run): 経過時間ゼロ秒のselectを連続で100回以上検出すると、10秒ごとに、CPU時間を食い潰している可能性を警告する。 + + * ControlPort.pm: + ソケットの作成に失敗した時に出たエラーが表示されなかったのを修正。 + + * ExternalSocket.pm: + WantToWriteが返した真偽値によらず、常に「書き込みが必要」として処理していた問題を解決。 + +2003-05-26 phonohawk + + * Timer.pm (new): + AtとAfter(又はInterval)が、両方とも指定されていなければcroakする。 + + * Configuration/Preprocessor.pm: + elseifやelseの解釈が正しくなかったのを修正。 + %PREの評価結果がundefになった時に警告が出ていたのを修正。 + @if文や@elsif文の評価結果がエラーになった時、そのエラー内容を表示していなかったので修正。 + +2003-05-24 phonohawk + + * IO/Socket/INET6.pm: 追加。 + IO::Socket::INETをIPv6に移植。Socket6.pmが必要。 + + * RunLoop.pm, IrcIO/Server.pm: IPv6対応。 + general/tiarra-ip-versionに'v6'を指定する事で、IPv6でのリスニングを行なう。 + また、サーバーには最初にIPv6での接続を試みてからIPv4にフォールバックする。 + 詳細はsample.confに。 + +2003-05-23 Topia + + * sample.conf: Auto::Random の説明中の 確立 を 確率 に修正した。 + + * Auto/Reply.pm: 追加。 + + * Auto/Alias.pm (message_arrived/remove): #(count) を使用可能にした。 + value が省略された場合はキーごと削除するようにした。 + + * Tools/HashDB.pm: 追加。 + + * Tools/HashTools.pm: Tools/GroupDB.pm, Tools/HashDB.pm の共通部分を取り出したモジュール。 + + * Tools/GroupDB.pm: キー名にコロンを使用可能にした。使用不能な半角スペースが来た場合は拒否する。 + コメントを修正し、詳細にした。 + 無視する行を指定するクロージャを引数に取れるようになった。省略された場合は # で始まる行を無視する。(従来) + del_value は削除出来た値の数を返すようになった。また、 value が未指定ならキーごと削除する。 + +2003-05-21 phonohawk + + * tiarra-conf.l: 追加。 + Noboruhiさんによるxyzzy用tiarra.conf編集モード。 + インストール方法はtiarra-conf.l内に記述されています。 + +2003-05-17 Topia + + * Auto/Utils.pm: sendto_channel_closure 関数追加。 + NOTICE/PRIVMSG の処理は面倒なので、これを自動的に処理する。 + sendto_channel_closure, generate_reply_closures に使用方法のコメントを追加。 + +2003-05-15 phonohawk + + * conf: + general/control-socket-nameを定義すると、外部プログラムからtiarraをコントロールする為の + UNIXドメインソケットを作成する。詳しくはsample.confに。 + + * ControlPort.pm: 追加。外部コントロール用。 + + * IRCMessage.pm: dieメッセージのtypoを修正。 + + * IrcIO.pm,LinedINETSocket.pm: sendの代わりにsyswriteを使う。 + + * Module.pm: メソッドcontrol_requested追加 + + * ModuleManager.pm: メソッドget追加 + + * RunLoop.pm: ControlPortを起動する為のコードを追加。 + + * Log/Channel.pm: "ID: synchronize"で外部からのログの同期を可能に。 + +2003-04-29 phonohawk + + * IrcIO/Server.pm: ログイン時、サーバーから送られてきたニューメリックリプライ以外のメッセージを無視する。 + ログイン前にNOTICEを送るようなサーバーに繋げられない問題を解決。 + + * RunLoop.pm: IrcIO->pop_queueがdieした時のメッセージを表示せずに捨てていたのを修正。 + + * Channel/Join/Kicked.pm: 追加。チャンネルから蹴られた時に、自動JOINするモジュール。 + + * IrcIO/Server.pm: 自分がチャンネルから蹴られた場合、そのチャンネル情報を消さずに + ChannelInfoに'kicked-out' => 1というremarkを付ける。 + + * RunLoop.pm: サーバーへの再接続時、+kされたチャンネルへの再JOINに失敗していたのを修正。 + +2003-04-25 phonohawk + + * main/Configuration.pm: general/client-allowedが省略された場合、 + 間違った値をデフォルト値として設定していたので修正。 + + * main/Configuration.pm: channel-network-separatorが未定義だった場合に + 正しくデフォルト値を設定しないミスがあったので修正。 + + * Configuration.pm: networksのnameで列挙されたネットワーク名に対応する + ブロックの定義が無かった場合、適切なエラーメッセージを出さずに処理を止めていたので修正。 + +2003-04-18 phonohawk + + * tiarra: SIGHUPを受信した時の動作を変更。 + これまではシャットダウンしていたが、以後は設定をリロードする。 + + * ChannelInfo.pm (fullname): 追加 + + * RunLoop.pm: 各ネットワークの設定を変更した後リロードすると、 + そのネットワークとの接続を一旦切ってから繋ぎ直す。 + + * IrcIO/Server.pm (config): 追加。 + コンストラクタの引数をネットワーク名のみに変更。 + + * IrcIO.pm (server_p,client_p): 追加。 + それぞれIrcIO::Serverであれば1を返すメソッドと + IrcIO::Clientであれば1を返すメソッド。 + +2003-04-13 phonohawk + + * User/Vanish.pm: 追加 + 特定のチャンネルでの特定の人物の存在をクライアントに隠すモジュール。 + JOINやPART、QUIT等を消去する。 + + * IrcIO/Server.pm (channels_list): 追加 + + * RunLoop.pm (networks_list,channel): 追加 + + * ChannelInfo.pm (AUTOLOAD): ハッシュマップの操作コマンドとして'keys'と'values'を追加。 + +2003-04-10 phonohawk + + * RunLoop.pm: 切断に気付かない場合があるので、3分毎に各サーバーにPINGを発行する。 + PING自動発行後にサーバーから来た最初のPONGは破棄される。 + + * IrcIO/Server.pm: メソッドremark追加。使い方は他のクラスのremarkと同じ。 + + * LinedINETSocket.pm: メソッドconnectの動作をconnectとattachの二つに分けた。 + これにより予め開かれたIO::Socket::INETに対してLinedINETSocketの機能を適用可能。 + +2003-04-05 phonohawk + + * Auto/Joined.pm: 追加。 + 特定のチャンネルに誰かがJOINする度に特定の発言を行なうモジュール。 + チャンネル移転通知以外に使うのはやめた方が良い。 + +2003-03-28 Topia + + * sample.conf (Auto/Random.pm): mention mask property. + + * Auto/Random.pm: use array_or_all on mask. + + * Auto/Alias.pm: use array_or_all on modifier. + + * Mask.pm: add array_or_(all|all_chan), (all|all_chan)_mask. + for not known maskmode, use Tiarra mode; and do warn. + +2003-03-23 phonohawk + + * IrcIO/Server.pm: general/bind-addrでサーバーへの接続時のローカルアドレスを指定可能に。 + また、各ネットワーク設定でbind-addrはオーバーライドできる。 + +2003-03-23 Topia + + * tiarra: ソースの判別部分自体が展開されていた…ので修正。 + + * ChangeLog: Id/Author/Date/RevisionのRCSタグを末尾に追加した。 + + * tiarra: ChangeLogからDateとRevisionを読んでバージョン情報に付加するようにした。 + +2003-03-23 phonohawk + + * User/Filter.pm: 追加。特定のユーザーの発言にフィルタをかけるモジュール。 + +2003-03-23 Topia + + * CTCP/Version.pm: add perl version infomation. + + * CTCP/ClientInfo.pm: separate ' ' instead of '/'. (ref. TAGGED DATA) + + * CTCP/{ClientInfo|Ping|Time|UserInfo|Version}.pm>: reply to channel CTCP. + + * CTCP.pm: fix wrong-quote dequoting. + + * sample.conf (Channel/Join/Invite.pm): add Channel/Join/Invite.pm sample configuration. + + * NEWS: add. news for non-developer. please write major changes, and so on. + if developer, see ChangeLog and check NEWS, please :-) + + * Channel/Join/Invite.pm: add. + + * Auto/Utils.pm (get_ch_name): add. + (generate_reply_closures): + add param ch_place(6th). default:0. + place of channel name in msg->params. + $get_ch_name closure return static string. + + * Auto/Response.pm: use register_extcallbacks. + generate_reply_closures's 3rd param(use_alias) to undef.(use default) + + * Auto/AliasDB/CallbackUtils.pm: add register_extcallbacks. + (for regist insecure callbacks) + +2003-03-19 Topia + + * sample.conf: change sample configuration. + + * Auto/Random.pm: can use multiple random datas. + +2003-03-17 Topia + + * Tools/MailSend/EachServer.pm (clean): fix cleaning code. + (DESTROY): unnesessary; remove. + + * sample.conf: mention Auto::Random/(mask|count-query|count-format), and format change. + mention Auto::Response's DB format. + + * sample.conf (Auto/Alias.pm): s/#(message)/#(value)/ at sample config. sorry. + + * Tools/FileCache.pm, Tools/FileCache/EachFile.pm: add. Tools::LinedDB based cached file i/o. + + * Tools/LinedDB.pm: add. line based i/o framework. + + * Tools/GroupDB.pm (add_group): add $this->synchronize. + + * Log/DateTime.pm: this module is obsolete. remove. + + * Log/Channel.pm, Log/Recent.pm: use Tools::DateConvert instead Log::DateTime. + + * Auto/Response.pm: add callback: read_file/file_lines. + add mask check in database 'mask' entry. + + * Auto/Random.pm: use Tools::FileCache. + add count query. + + * Auto/AliasDB/CallbackUtils.pm: add #(read_file:fpath:mode:charset). + add #(file_lines:fpath:mode:charset). + (register_callback): $reg_callback accept scalar function name. + +2003-03-15 phonohawk + + * BulletinBoard.pm: + ・AUTOLOAD経由で値を設定可能に。 + ・メソッドkeys()を追加。 + + * CTCP.pm: 追加。CTCPエンコード/デコードを行なうモジュール。 + + * IrcIO.pm: メソッドremark()追加。 + + * CTCP/ClientInfo.pm, + CTCP/Ping.pm, + CTCP/Time.pm, + CTCP/UserInfo.pm, + CTCP/Version.pm : 追加。 + +2003-03-10 phonohawk + + * IrcIO/Server.pm: ネットワーク毎の設定でin-encoding,out-encodingを定義する事により + 文字エンコーディングの設定をオーバーライド可能に。 + +2003-03-09 Topia + + * Auto/Response.pm: plum でのキー名が response だったのを勘違いして reply にしていた。 + (りんりんさんバグレポートありがとうございます) + +2003-03-09 phonohawk + + * Configuration/Block.pm: %CODE{ }EDOC%の解釈でメモリリークを起こす不具合を回避。 + +2003-03-09 Topia + + * Auto/AliasDB/CallbackUtils.pm: register_RandomNickConvertでメッセージがIrcIO::Client + 発信だった場合に登録しないようにした。 (りんりんさんバグレポートありがとうございます) + +2003-03-08 phonohawk + + * IrcIO/Server.pm: オプションnetworks/always-notify-new-nickが設定されていたら + nickを変更する度に、変更したサーバーの新しいグローバルnickをNOTICEで通知する。 + + * IrcIO/Client.pm: ログイン時に本名として渡された$key=value;key=value...$のオプションを + パースする部分を書き直し。$ key =value ;key = value$のような設定でも + 期待された通りに解釈する。 + また、メソッドoption追加。このようにして渡されたオプションを取得する。 + + * tiarra, Configuration.pm, Configuration/Preprocessor.pm: + 起動時にオプション--configを省略された場合の動作を変更。 + ターミナル上から起動した場合は従来のようにデフォルトのファイル名であるtiarra.confを読むが、 + 標準入力がターミナルに接続されていなかった場合、つまりパイプ経由でリダイレクトされている場合は + tiarra.confでなく標準入力から設定を読む。この場合は設定のリロードは不可能となる。 + 例: cat tiarra.conf | sed -e 's/Tiarra/arraiT/g' | ./tiarra --quiet + + * Configuration/Block.pm: + %CODE{ ... }EDOC%で挟まれた部分を、値の取得時に毎回評価する。 + +2003-03-04 Topia + + * Tools/MailSend/EachServer.pm: RunLoop::Hookを使用するように変更。 + ループをなるべく回すように変更。flushはclose時とDATA時に行うことにした。 + フェイルセーフの為に5sec間隔のTimerも使うことにする。 + + * Tools/GroupDB.pm: fpathで指定されたファイルが存在しないときにエラーとなるのを修正。 + + * Auto/Alias.pm: 配列の参照を渡すべきところを配列を渡してしまっていた。修正。 + + * LinedINETSocket.pm: ExternalSocketのuninstall等も必要かも知れないので + DESTROYを復活させる。 + +2003-03-04 phonohawk + + * ExternalSocket.pm: read/write/want_to_writeで、callerをチェックする位置を変更。 + + * Configuration/Block.pm: 文字コードの再解釈に失敗する不具合を解決。 + + * RunLoop.pm: クラスRunLoop::Hook追加。 + RunLoopのループが一回実行される度に呼ばれるフック。 + 呼ばれるタイミングとしてはselect実行直前または直後。どちらかを選択可能。 + 詳しくはRunLoop::Hookの先頭のコメントを参照の事。 + +2003-03-04 Topia + + * Auto/MesMail.pm: Tools/MailSend.pmを使うように修正。 + + * Tools/MailSend/EachServer.pm: 新規追加。SMTPサーバ毎に具体的なメール送信を行う。 + POP before SMTPの場合はexpireまで待って、そうでない場合はすぐにオブジェクトを破棄する。 + + * Tools/MailSend.pm: 新規追加。メール送信を行う。 + 複数のサーバと同時に通信するためにTools/MailSend/EachServer.pmを管理している。 + + * Auto/Response.pm: rateを使えるようにした。 + +2003-03-03 phonohawk + + * Configuration/Block.pm: ブロック内ブロックを扱えるように。 + + * Configuration/LexicalAnalyzer.pm: 新規追加。confの字句解析器。 + + * Configuration/Parser.pm: 新規追加。confの構文解析器。 + + * Configuration.pm: パーサを書き直し。上記二つのクラス、及びプリプロセッサを使用。 + +2003-03-02 Topia + + * Auto/Response.pm: 新規追加。plumのauto/response.plmの動作をする。 + + * Auto/AliasDB/CallbackUtils.pm: 存在してはいけないuninstallがあったので削除。 + + * Auto/Utils.pm: コールバックを追加できる引数の追加。 + + * Tools/GroupDB.pm: regexpを利用できるようにする引数の追加。 + find_groups/find_groups_with_primaryの追加。 + + * Channel/Mode/Oper/Grant.pm: Auto/Oper.pmとmask処理を統一した。 + + * sample.conf: maskの説明が変わってしまうので書き換えた。 + + * sample.conf: '-*- tiarra-conf -*-' を一行目に追加した。Auto/MesMailのエントリ追加。 + + * Auto/MesMail.pm: 新規追加。伝言をメールとして送信する。メール送信部分は分けられてTools下に + 行く可能性もある。 + + * Auto/Utils.pm: AliasDBの変更に同期。'(nick|user|host).now'はAliasDB内部に移動している。 + + * Auto/Oper.pm: AliasDBの変更に同期。Mask::match_deep_chanを使用するように。 + + * Auto/Alias.pm: AliasDBはオートフラッシュなのでデストラクタを消した。 + + * Auto/AliasDB/CallbackUtils.pm: RandomAliasConvert, JoinedListConvertを追加。 + MessageReplaceにmessage_replace_lastを追加。 + + * Auto/AliasDB.pm: GroupDBを使用するように変更。関数名を一部変更した。 + confでprivateとreadonlyなキーの指定が出来る。readonlyはまだ対応モジュールが存在しない。 + + * Tools/GroupDB.pm: 新規追加。AliasDBから独立させた。 + +2003-03-02 phonohawk + + * Configuration/Preprocessor.pm: 新規追加。 + confファイルのプリプロセッサとして使用する。 + +2003-03-01 phonohawk + + * ConfigBlock.pm: 削除。Configuration::Blockに移動。 + + * InstantCapsule.pm: 新規追加。 + フィールドとメソッドを持つオブジェクトを一時的に生成するクラス。 + サンプルコードはInstantCapsule.pm内にあります。 + +2003-02-27 Topia + + * Mask.pm: チャンネルとユーザのマスクをconfで切替え可能にした。 + sample.confにも説明を追加している。 + + * Mask.pm: mask_chanで[+-]を使用可能にした。+channelは++channelまたは + -+channelと表記する必要がある。 + _split_with_chanのsplit処理を_splitに委託した。 + + * Mask.pm: channelを含めたmaskを処理する関数を追加した。 + mask_chan, mask_deep_chanはstrの次にchanが追加されているだけで仕様は同じ。 + mask_array_chanはstr_masks, chan_masks, str, chanと言う引数になっている。 + 次にcommitされる予定のAuto::Oper辺りがサンプルコードになるはず。 + +2003-02-26 Topia + + * Multicast.pm: channel_pを追加した。 + nick_pに文字数チェック(length != 0)とdetachの処理を追加した。 + + * LinedINETSocket.pm: デストラクタを実行するより前にsocketが開放されているようだ。 + デストラクタをコメントアウトした。 + + * LinedINETSocket.pm: 新規追加。行単位のキューを使用した入出力を行う。 + +2003-02-26 phonohawk + + * ExternalSocket.pm: 新規追加。 + + * RunLoop.pm: RunLoopが任意のソケットを監視出来るように。 + ソケットの監視にはExternalSocketを用いる。使い方はExternalSocket.pmにある。 + + * Timer.pm: uninstallした時はrunloopにundefを代入する。 + +2003-02-20 phonohawk + + * Module.pm (notification_of_message_io) : 新規追加。 + サーバーやクライアントと実際に送受信したメッセージが通知されるメソッド。デバッグ用。 + + * IrcIO/(Client/Server).pm : notification_of_message_ioを呼ぶための修正。 + + * IrcIO/Client.pm : 複数のクライアントを接続している際、 + NICKの変更が他のクライアントへ伝わっていなかったので修正。 + +2003-02-19 phonohawk + + * tiarra-conf.el: 新規追加。confファイルのEmacs用モード。試作品。 + このファイルが置かれている場所をload-pathに追加し、次のようなautoloadを実行すれば良い。 + (autoload 'tiarra-conf-mode "tiarra-conf" "tiarra.conf editing mode" t) + +2003-02-17 phonohawk + + * Configuration.pm: + ・@includeで他のファイルをインクルード可能に。 + 但し一つのファイルを複数回@includeする事は出来ない。 + ・ブロックの{}の位置をある程度自由に。 + ・ブロックの中身が空で良ければ{}を省略可能に。 + sample.confに詳しい説明があります。 + + * IrcIO/Client.pm: $key=value;key=value;...$形式の本名でログインすると、 + 特定のクライアントの間においてのみconfで設定された項目をオーバーライドする。 + 現在有効なキーはencodingで、これはクライアントとの通信に用いる文字コードである。 + 例: + $encoding=euc$ この本名でログインした場合、EUC-JPで通信を行なう。 + +2003-02-17 Topia + + * System/RemoteControl.pm: 複数行のmaskを使えるようにした。 + + * Mask.pm: コメント中の例が間違っていたので修正。 + + * Mask.pm: 正規表現マッチと+-機能のオン/オフを可能にした。 + comma-separeted mask arrayを渡せる関数を追加した。 + 単純にmask arrayを渡せる関数を追加した。 + wild cardを正規表現にするmake_regexを別関数として独立させた。 + + * Auto/Utils.pm: $get_ch_nameでparam(0)が無い場合undefを返すようにした。 + +2003-02-15 phonohawk + + * RunLoop.pm: Time::HiResがインストールされている環境では + Timerの精度がミリ秒に上がる。入っていなければ秒のまま。 + + * PersonInChannel.pm: メソッドremark,delete-remark追加。 + 註釈を付ける事が出来る。 + + * Multicast.pm: attach/detachでエラーチェックを行なう。 + +2003-02-13 Topia + + * Auto/AliasDB/CallbackUtils.pm: MessageReplace callback を追加しました。 + #(message_replace:[split_regexp]:[place]) です。placeはzero originとなっています。 + ex. test alias -> #(message_replace: :1) -> alias + また、この変更でregister_stdcallbacksの引数が$ch_name -> $msgとなり、 + その変更をAuto/AliasDB.pm, Auto/Utils.pmに反映させています。 + + * Auto/Answer.pm: 返答に$reply_anywhereを使うようにした。 + + * Auto/Random.pm: オートリロードと追加/削除の返答を追加しています。 + + * Auto/Alias.pm: Auto/AliasDB.pmに追加と削除を移しています。 + 追加/削除出来た場合に返答できるようにしました。 + + * Auto/Utils.pm: 返り値に、$reply_anywhere + (場合によってチャンネルに返したりprivで返したりする)を追加しました。 + $reply_as_privがextra_replacesを付けられるようにしました。 + reply_with_stdcallbacksを使用するようにしました。 + reply_with_stdcallbacksはrandomやdate、randomnick、randomselectなどのcallbackを + 登録します。 + user.now, host.now などのエイリアスを追加するようにしました。 + + * Auto/AliasDB.pm: Auto/Alias.pmから追加と削除機能を移しました。 + オートリロードするようにしました。 + 渡されたエイリアスからキーを見つけ出せなかった場合、callbackを呼ぶようにしました。 + #(name;%s さん) などの表記をサポートしました。 + サブフォーマット中に対応する括弧を含めます。 + #(namesuf;#(name)%s)のような表記ができます。 + + * Auto/AliasDB/CallbackUtils.pm: AliasDBのCallback機能を使った標準的な拡張です。 + + * Tools/DateConvert.pm: 新規追加。plumの&'dateに相当。 + + * System/Pong.pm: xchat対策に、pingの代わりにpongを消滅させるようにした。 + +2003-02-13 phonohawk + + * Multicast.pm: nick_pでのnicklen制限をやめた。 + +2003-02-12 phonohawk + + * RunLoop.pm: $(network)/userでgeneral/userをオーバーライド可能に。 + + * System/RemoteControl.pm: 新規追加 + + * これ以前のログは書いていません。 + +# Id: $Id: ChangeLog,v 1.158 2004/08/22 11:28:41 topia Exp $ +# Author: $Author: topia $ +# Date: $Date: 2004/08/22 11:28:41 $ +# Revision: $Revision: 1.158 $ diff -urN /non-existant-dir/ChangeLog.svn tiarra-20080510/ChangeLog.svn --- /non-existant-dir/ChangeLog.svn 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20080510/ChangeLog.svn 2008-05-11 00:25:46.000000000 +0900 @@ -0,0 +1,1378 @@ +------------------------------------------------------------------------ +r11365 | topia | 2008-05-10 23:58:28 +0900 (Sat, 10 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk + M /lang/perl/tiarra/trunk/AUTHORS + M /lang/perl/tiarra/trunk/ChangeLog + M /lang/perl/tiarra/trunk/HACKING + M /lang/perl/tiarra/trunk/INSTALL + M /lang/perl/tiarra/trunk/LICENSE + M /lang/perl/tiarra/trunk/NEWS + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/default.css + M /lang/perl/tiarra/trunk/doc/module/Auto.html + M /lang/perl/tiarra/trunk/doc/module/CTCP.html + M /lang/perl/tiarra/trunk/doc/module/Channel.html + M /lang/perl/tiarra/trunk/doc/module/Client.html + M /lang/perl/tiarra/trunk/doc/module/Debug.html + M /lang/perl/tiarra/trunk/doc/module/Log.html + M /lang/perl/tiarra/trunk/doc/module/System.html + M /lang/perl/tiarra/trunk/doc/module/UNCLASSIFIED.html + M /lang/perl/tiarra/trunk/doc/module/User.html + M /lang/perl/tiarra/trunk/doc/module-toc.html + M /lang/perl/tiarra/trunk/doc-src/README + M /lang/perl/tiarra/trunk/doc-src/all.conf.in + M /lang/perl/tiarra/trunk/doc-src/conf-main.tdoc + M /lang/perl/tiarra/trunk/doc-src/contents.html + M /lang/perl/tiarra/trunk/doc-src/module-group.tdoc + M /lang/perl/tiarra/trunk/doc-src/module-toc.html + M /lang/perl/tiarra/trunk/doc-src/sample.conf.in + M /lang/perl/tiarra/trunk/main/BulletinBoard.pm + M /lang/perl/tiarra/trunk/main/CTCP.pm + M /lang/perl/tiarra/trunk/main/ChannelInfo.pm + M /lang/perl/tiarra/trunk/main/Configuration/Block.pm + M /lang/perl/tiarra/trunk/main/Configuration/LexicalAnalyzer.pm + M /lang/perl/tiarra/trunk/main/Configuration/Parser.pm + M /lang/perl/tiarra/trunk/main/Configuration/Preprocessor.pm + M /lang/perl/tiarra/trunk/main/Configuration.pm + M /lang/perl/tiarra/trunk/main/ControlPort.pm + M /lang/perl/tiarra/trunk/main/Crypt.pm + M /lang/perl/tiarra/trunk/main/Exception.pm + M /lang/perl/tiarra/trunk/main/ExternalSocket.pm + M /lang/perl/tiarra/trunk/main/FunctionalVariable.pm + M /lang/perl/tiarra/trunk/main/Hook.pm + M /lang/perl/tiarra/trunk/main/IRCMessage.pm + M /lang/perl/tiarra/trunk/main/InstantCapsule.pm + M /lang/perl/tiarra/trunk/main/IrcIO/Client.pm + M /lang/perl/tiarra/trunk/main/IrcIO/Server.pm + M /lang/perl/tiarra/trunk/main/IrcIO.pm + M /lang/perl/tiarra/trunk/main/Iterator/ArrayIterator.pm + M /lang/perl/tiarra/trunk/main/Iterator/BackwardIterator.pm + M /lang/perl/tiarra/trunk/main/Iterator/BidirectionalIterator.pm + M /lang/perl/tiarra/trunk/main/Iterator/ForwardIterator.pm + M /lang/perl/tiarra/trunk/main/Iterator/RandomAccessIterator.pm + M /lang/perl/tiarra/trunk/main/Iterator/RoundIterator.pm + M /lang/perl/tiarra/trunk/main/Iterator.pm + M /lang/perl/tiarra/trunk/main/L10N.pm + M /lang/perl/tiarra/trunk/main/LinedINETSocket.pm + M /lang/perl/tiarra/trunk/main/LocalChannelManager.pm + M /lang/perl/tiarra/trunk/main/Mask.pm + M /lang/perl/tiarra/trunk/main/Module/Use.pm + M /lang/perl/tiarra/trunk/main/Module.pm + M /lang/perl/tiarra/trunk/main/ModuleManager.pm + M /lang/perl/tiarra/trunk/main/Multicast.pm + M /lang/perl/tiarra/trunk/main/NumericReply.pm + M /lang/perl/tiarra/trunk/main/PersonInChannel.pm + M /lang/perl/tiarra/trunk/main/PersonalInfo.pm + M /lang/perl/tiarra/trunk/main/ReloadTrigger.pm + M /lang/perl/tiarra/trunk/main/RunLoop.pm + M /lang/perl/tiarra/trunk/main/Template.pm + M /lang/perl/tiarra/trunk/main/Tiarra/Encoding/UniJP.pm + M /lang/perl/tiarra/trunk/main/Tiarra/IRC/Message.pm + M /lang/perl/tiarra/trunk/main/Tiarra/Socket/Buffered.pm + M /lang/perl/tiarra/trunk/main/Tiarra/Socket/Lined.pm + M /lang/perl/tiarra/trunk/main/Tiarra/Socket.pm + M /lang/perl/tiarra/trunk/main/Tiarra/Utils.pm + M /lang/perl/tiarra/trunk/main/TiarraDoc.pm + M /lang/perl/tiarra/trunk/main/Timer.pm + M /lang/perl/tiarra/trunk/makedoc + M /lang/perl/tiarra/trunk/module/Auto/Alias.pm + M /lang/perl/tiarra/trunk/module/Auto/AliasDB/CallbackUtils.pm + M /lang/perl/tiarra/trunk/module/Auto/AliasDB.pm + M /lang/perl/tiarra/trunk/module/Auto/Answer.pm + M /lang/perl/tiarra/trunk/module/Auto/CacheManager.pm + M /lang/perl/tiarra/trunk/module/Auto/Calc.pm + M /lang/perl/tiarra/trunk/module/Auto/ChannelWithoutOper.pm + M /lang/perl/tiarra/trunk/module/Auto/Im.pm + M /lang/perl/tiarra/trunk/module/Auto/Joined.pm + M /lang/perl/tiarra/trunk/module/Auto/MesMail.pm + M /lang/perl/tiarra/trunk/module/Auto/Oper.pm + M /lang/perl/tiarra/trunk/module/Auto/Random.pm + M /lang/perl/tiarra/trunk/module/Auto/Reply.pm + M /lang/perl/tiarra/trunk/module/Auto/Response.pm + M /lang/perl/tiarra/trunk/module/Auto/Utils.pm + M /lang/perl/tiarra/trunk/module/CTCP/ClientInfo.pm + M /lang/perl/tiarra/trunk/module/CTCP/Ping.pm + M /lang/perl/tiarra/trunk/module/CTCP/Time.pm + M /lang/perl/tiarra/trunk/module/CTCP/UserInfo.pm + M /lang/perl/tiarra/trunk/module/CTCP/Version.pm + M /lang/perl/tiarra/trunk/module/Channel/Freeze.pm + M /lang/perl/tiarra/trunk/module/Channel/Join/Connect.pm + M /lang/perl/tiarra/trunk/module/Channel/Join/Invite.pm + M /lang/perl/tiarra/trunk/module/Channel/Join/Kicked.pm + M /lang/perl/tiarra/trunk/module/Channel/Mode/Get.pm + M /lang/perl/tiarra/trunk/module/Channel/Mode/Oper/Grant.pm + M /lang/perl/tiarra/trunk/module/Channel/Mode/Set.pm + M /lang/perl/tiarra/trunk/module/Channel/Rejoin.pm + M /lang/perl/tiarra/trunk/module/Client/Cache.pm + M /lang/perl/tiarra/trunk/module/Client/Conservative.pm + M /lang/perl/tiarra/trunk/module/Client/Cotton.pm + M /lang/perl/tiarra/trunk/module/Client/Eval.pm + M /lang/perl/tiarra/trunk/module/Client/GetVersion.pm + M /lang/perl/tiarra/trunk/module/Client/PatchworkMessage.pm + M /lang/perl/tiarra/trunk/module/Client/ProtectMyself.pm + M /lang/perl/tiarra/trunk/module/Client/Rehash.pm + M /lang/perl/tiarra/trunk/module/Client/ShowNick.pm + M /lang/perl/tiarra/trunk/module/Debug/AliasTest.pm + M /lang/perl/tiarra/trunk/module/Debug/Core.pm + M /lang/perl/tiarra/trunk/module/Debug/RawLog.pm + M /lang/perl/tiarra/trunk/module/Log/Channel.pm + M /lang/perl/tiarra/trunk/module/Log/ChannelList.pm + M /lang/perl/tiarra/trunk/module/Log/Logger.pm + M /lang/perl/tiarra/trunk/module/Log/Raw.pm + M /lang/perl/tiarra/trunk/module/Log/Recent.pm + M /lang/perl/tiarra/trunk/module/Log/Writer/File.pm + M /lang/perl/tiarra/trunk/module/Log/Writer.pm + M /lang/perl/tiarra/trunk/module/Skelton.pm + M /lang/perl/tiarra/trunk/module/System/Error.pm + M /lang/perl/tiarra/trunk/module/System/LivePatch.pm + M /lang/perl/tiarra/trunk/module/System/Macro.pm + M /lang/perl/tiarra/trunk/module/System/NotifyIcon/Win32.pm + M /lang/perl/tiarra/trunk/module/System/Pong.pm + M /lang/perl/tiarra/trunk/module/System/PrivTranslator.pm + M /lang/perl/tiarra/trunk/module/System/Raw.pm + M /lang/perl/tiarra/trunk/module/System/Reload.pm + M /lang/perl/tiarra/trunk/module/System/RemoteControl.pm + M /lang/perl/tiarra/trunk/module/System/SendMessage.pm + M /lang/perl/tiarra/trunk/module/System/Shutdown.pm + M /lang/perl/tiarra/trunk/module/Tools/DateConvert.pm + M /lang/perl/tiarra/trunk/module/Tools/FileCache/EachFile.pm + M /lang/perl/tiarra/trunk/module/Tools/FileCache.pm + M /lang/perl/tiarra/trunk/module/Tools/GroupDB.pm + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + M /lang/perl/tiarra/trunk/module/Tools/Hash.pm + M /lang/perl/tiarra/trunk/module/Tools/HashDB.pm + M /lang/perl/tiarra/trunk/module/Tools/HashTools.pm + M /lang/perl/tiarra/trunk/module/Tools/LinedDB.pm + M /lang/perl/tiarra/trunk/module/Tools/MailSend/EachServer.pm + M /lang/perl/tiarra/trunk/module/Tools/MailSend.pm + M /lang/perl/tiarra/trunk/module/User/Away/Client.pm + M /lang/perl/tiarra/trunk/module/User/Away/Nick.pm + M /lang/perl/tiarra/trunk/module/User/Filter.pm + M /lang/perl/tiarra/trunk/module/User/Ignore.pm + M /lang/perl/tiarra/trunk/module/User/Kick.pm + M /lang/perl/tiarra/trunk/module/User/Nick/Detached.pm + M /lang/perl/tiarra/trunk/module/User/ServerOper.pm + M /lang/perl/tiarra/trunk/module/User/Vanish.pm + M /lang/perl/tiarra/trunk/sample.conf + M /lang/perl/tiarra/trunk/tiarra + M /lang/perl/tiarra/trunk/tiarra-conf.el + +* merge UTF-8 branch. +------------------------------------------------------------------------ +r11355 | topia | 2008-05-10 22:18:03 +0900 (Sat, 10 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/Auto.html + M /lang/perl/tiarra/trunk/doc/module/CTCP.html + M /lang/perl/tiarra/trunk/doc/module-toc.html + M /lang/perl/tiarra/trunk/sample.conf + +* regen documentation. +------------------------------------------------------------------------ +r11354 | topia | 2008-05-10 22:13:40 +0900 (Sat, 10 May 2008) | 4 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/Im.pm + +* support password. +* support mask. +* explain default value of format. + +------------------------------------------------------------------------ +r11353 | topia | 2008-05-10 21:01:26 +0900 (Sat, 10 May 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/Im.pm + +* fix keyword splitting bug. +* small style change. + +------------------------------------------------------------------------ +r11347 | topia | 2008-05-10 19:15:42 +0900 (Sat, 10 May 2008) | 5 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/Im.pm + +* support im.kayac.com secret mode. +* use Tools::HTTPClient (require r11345 or later). +* add regex-keyword configuration. +* add format configuration. + +------------------------------------------------------------------------ +r11346 | topia | 2008-05-10 17:46:51 +0900 (Sat, 10 May 2008) | 4 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + +HTTP::Request support: + * set correct type scalar. + * style fix. + +------------------------------------------------------------------------ +r11345 | topia | 2008-05-10 17:20:26 +0900 (Sat, 10 May 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + +* support request information fetching from HTTP::Request. + Tools::HTTPClient->new(Request => $http_request_object. + +------------------------------------------------------------------------ +r11344 | topia | 2008-05-10 16:36:53 +0900 (Sat, 10 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/Im.pm + +* set properties. +------------------------------------------------------------------------ +r11341 | ha1t | 2008-05-10 15:06:08 +0900 (Sat, 10 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/Im.pm + +てきとーなpod追加 +------------------------------------------------------------------------ +r11340 | ha1t | 2008-05-10 14:52:44 +0900 (Sat, 10 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/Im.pm + +チャンネル名が出るようにした +------------------------------------------------------------------------ +r11339 | ha1t | 2008-05-10 14:12:47 +0900 (Sat, 10 May 2008) | 1 line +Changed paths: + A /lang/perl/tiarra/trunk/module/Auto/Im.pm + +ぺるる使いが綺麗にしてくれる事を信じてコミット +------------------------------------------------------------------------ +r11256 | topia | 2008-05-08 00:50:47 +0900 (Thu, 08 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Log/Writer.pm + +* trivial message fix. + +------------------------------------------------------------------------ +r11255 | topia | 2008-05-08 00:47:49 +0900 (Thu, 08 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/CTCP.pm + M /lang/perl/tiarra/trunk/main/Crypt.pm + M /lang/perl/tiarra/trunk/main/ExternalSocket.pm + M /lang/perl/tiarra/trunk/main/LinedINETSocket.pm + +* disable SelfLoader to work under taint check. +------------------------------------------------------------------------ +r11254 | topia | 2008-05-08 00:25:16 +0900 (Thu, 08 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Utils/DefineHelper.pm + +* kill redefine and prototype warning, instead of undef funcname GLOB. + +------------------------------------------------------------------------ +r11253 | topia | 2008-05-08 00:24:16 +0900 (Thu, 08 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/ExternalSocket.pm + +* fix bug. + +------------------------------------------------------------------------ +r11251 | topia | 2008-05-07 23:58:02 +0900 (Wed, 07 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/tiarra + +* drop IO::Socket::INET6 from bundle list. + +------------------------------------------------------------------------ +r11250 | topia | 2008-05-07 23:55:56 +0900 (Wed, 07 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/tiarra + +* mention about --show-env. + +------------------------------------------------------------------------ +r11203 | topia | 2008-05-06 17:34:36 +0900 (Tue, 06 May 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Socket/Connect.pm + +* fix default option handling. +* add documentation about unix domain socket. + +------------------------------------------------------------------------ +r11202 | topia | 2008-05-06 17:13:24 +0900 (Tue, 06 May 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Resolver.pm + +* support threads <= 1.33. +* trivial change of resolved data handling. + +------------------------------------------------------------------------ +r11201 | topia | 2008-05-06 17:11:07 +0900 (Tue, 06 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Socket/Connect.pm + +* fix bug on unix connector. + +------------------------------------------------------------------------ +r11200 | topia | 2008-05-06 16:53:23 +0900 (Tue, 06 May 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/ControlPort.pm + +* set sticky bit to /tmp/tiarra-control. +* try unlink ControlPort if cannot connect. + +------------------------------------------------------------------------ +r11199 | topia | 2008-05-06 16:35:55 +0900 (Tue, 06 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/OptionalModules.pm + +* add Socket6 module to ipv6 support, explicitly. + +------------------------------------------------------------------------ +r11198 | topia | 2008-05-06 16:31:39 +0900 (Tue, 06 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/IrcIO/Client.pm + +* trivial message fix. + +------------------------------------------------------------------------ +r11197 | topia | 2008-05-06 16:26:45 +0900 (Tue, 06 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/IrcIO/Client.pm + +* more verbose log message on client acception sequence. + +------------------------------------------------------------------------ +r11164 | topia | 2008-05-05 17:59:02 +0900 (Mon, 05 May 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/CTCP/DCC/RewriteAddress.pm + +* rename closure to callback. +* fix documentation. + +------------------------------------------------------------------------ +r11131 | topia | 2008-05-05 02:22:08 +0900 (Mon, 05 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/CTCP.html + M /lang/perl/tiarra/trunk/sample.conf + +* regenerate documentation. +------------------------------------------------------------------------ +r11130 | topia | 2008-05-05 02:20:34 +0900 (Mon, 05 May 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/CTCP/DCC/RewriteAddress.pm + +* more refactored. +* add documentation. + +------------------------------------------------------------------------ +r11129 | topia | 2008-05-05 01:58:04 +0900 (Mon, 05 May 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Resolver.pm + +* more efficient error handling. +* re-run resolver thread on dead. + +------------------------------------------------------------------------ +r11126 | topia | 2008-05-05 00:00:33 +0900 (Mon, 05 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/DateConvert.pm + +* cosmetic fixes. + +------------------------------------------------------------------------ +r11125 | topia | 2008-05-04 23:56:12 +0900 (Sun, 04 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/MailSend/EachServer.pm + +* use Tools::DateConvert::expand to set locale. + +------------------------------------------------------------------------ +r11123 | topia | 2008-05-04 23:54:30 +0900 (Sun, 04 May 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/DateConvert.pm + +* fix %O bug. +* add new interface: expand. + +------------------------------------------------------------------------ +r11121 | topia | 2008-05-04 23:41:38 +0900 (Sun, 04 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/CTCP/DCC/RewriteAddress.pm + +* refactored. + +------------------------------------------------------------------------ +r11117 | topia | 2008-05-04 23:23:06 +0900 (Sun, 04 May 2008) | 4 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Resolver.pm + +* support threading on QUERY_NAMEINFO. +* disable threading on QUERY_NAMEINFO. +* make error handling more efficient. + +------------------------------------------------------------------------ +r11101 | topia | 2008-05-04 20:05:35 +0900 (Sun, 04 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/RunLoop.pm + +* use lazy loading for ControlPort. +------------------------------------------------------------------------ +r11099 | topia | 2008-05-04 20:04:39 +0900 (Sun, 04 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/ControlPort.pm + +* use Tiarra::TerminateManager. +------------------------------------------------------------------------ +r11049 | topia | 2008-05-04 03:35:00 +0900 (Sun, 04 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/CTCP.html + M /lang/perl/tiarra/trunk/doc/module/System.html + M /lang/perl/tiarra/trunk/doc/module-toc.html + M /lang/perl/tiarra/trunk/sample.conf + +* regenerate documentation. +------------------------------------------------------------------------ +r11048 | topia | 2008-05-04 03:20:06 +0900 (Sun, 04 May 2008) | 1 line +Changed paths: + A /lang/perl/tiarra/trunk/module/CTCP/DCC + A /lang/perl/tiarra/trunk/module/CTCP/DCC/RewriteAddress.pm + +* add cTCP::DCC::RewriteAddress. +------------------------------------------------------------------------ +r11043 | topia | 2008-05-04 02:02:38 +0900 (Sun, 04 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/tiarra + +* drop cvsversion scanner. +* minor behavior fixes. +------------------------------------------------------------------------ +r11017 | hio | 2008-05-03 15:45:50 +0900 (Sat, 03 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/System/WebClient.pm + +WebClient, 入退室やトピックなんかも実装. + +------------------------------------------------------------------------ +r11016 | hio | 2008-05-03 15:43:45 +0900 (Sat, 03 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPParser.pm + +HTTP ステータスをすこし追加. + +------------------------------------------------------------------------ +r11015 | hio | 2008-05-03 15:42:38 +0900 (Sat, 03 May 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/FetchTitle.pm + +チャンネル別に明示的に使わないが出来なかったのを修正. +LANアドレス判定を毎回やってたのを修正. + +------------------------------------------------------------------------ +r11014 | hio | 2008-05-03 15:40:52 +0900 (Sat, 03 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + +HTTPClient, 正常終了判定の修正. shutdown処理をコメントアウト. + +------------------------------------------------------------------------ +r10996 | topia | 2008-05-03 05:47:32 +0900 (Sat, 03 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/Auto.html + +* regenerate documentation. +------------------------------------------------------------------------ +r10983 | topia | 2008-05-03 01:53:53 +0900 (Sat, 03 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Socket/Connect.pm + +* partially rewrite select result processing code in socket connector. +------------------------------------------------------------------------ +r10982 | topia | 2008-05-03 01:49:32 +0900 (Sat, 03 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Socket.pm + M /lang/perl/tiarra/trunk/main/Timer.pm + +* use lazy loading for RunLoop. +------------------------------------------------------------------------ +r10977 | topia | 2008-05-03 01:14:16 +0900 (Sat, 03 May 2008) | 4 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Resolver.pm + +* make timer mainloop interval to a second. +* add hook mainloop (to quick response). +* some informational comment added. +* fix some behavior on error. +------------------------------------------------------------------------ +r10975 | topia | 2008-05-03 01:09:53 +0900 (Sat, 03 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/WrapMainLoop.pm + +* fix minor bug. +------------------------------------------------------------------------ +r10974 | topia | 2008-05-03 01:08:19 +0900 (Sat, 03 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/ModuleManager.pm + +* use eval for ->destruct. +------------------------------------------------------------------------ +r10973 | topia | 2008-05-03 01:06:53 +0900 (Sat, 03 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/Calc.pm + +* fix documentation bug. +------------------------------------------------------------------------ +r10972 | topia | 2008-05-03 00:49:49 +0900 (Sat, 03 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/DateConvert.pm + +* Tools::DateConvert::replace: fix minor bug. +------------------------------------------------------------------------ +r10971 | topia | 2008-05-03 00:43:52 +0900 (Sat, 03 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/MailSend/EachServer.pm + M /lang/perl/tiarra/trunk/module/Tools/MailSend.pm + +* get rid of dependency to getpwuid (support win32). +* use pureperl dateconvert (fix locale related issue). +------------------------------------------------------------------------ +r10970 | topia | 2008-05-03 00:41:37 +0900 (Sat, 03 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/DateConvert.pm + +* Tools::DateConvert::replace: add pureperl argument. +------------------------------------------------------------------------ +r10954 | hio | 2008-05-02 22:24:15 +0900 (Fri, 02 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/FetchTitle.pm + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient/SSL.pm + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + +lang/perl/tiarra: FetchTitle他, IPアドレスチェックがちゃんとできてなかったのを修正. + +------------------------------------------------------------------------ +r10908 | hio | 2008-05-02 01:57:24 +0900 (Fri, 02 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/FetchTitle/Plugin/Mixi.pm + M /lang/perl/tiarra/trunk/module/Auto/FetchTitle.pm + +lang/perl/tiarra: plugin単位での設定に対応. Privateアドレスのアクセス拒否を実装. + +------------------------------------------------------------------------ +r10907 | hio | 2008-05-02 01:52:07 +0900 (Fri, 02 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + +lang/perl/tiarra: HTTPClient, Tiarra::Resolverを使ってDNS解決をおこなうように. + +------------------------------------------------------------------------ +r10893 | hio | 2008-05-01 21:42:29 +0900 (Thu, 01 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/FetchTitle.pm + +lang/perl/tiarra: FetchTitle, DEBUGモードのままだった><。 + +------------------------------------------------------------------------ +r10891 | hio | 2008-05-01 21:18:10 +0900 (Thu, 01 May 2008) | 4 lines +Changed paths: + A /lang/perl/tiarra/trunk/module/Auto/FetchTitle + A /lang/perl/tiarra/trunk/module/Auto/FetchTitle/Plugin + A /lang/perl/tiarra/trunk/module/Auto/FetchTitle/Plugin/ExtractHeading.pm + A /lang/perl/tiarra/trunk/module/Auto/FetchTitle/Plugin/Mixi.pm + A /lang/perl/tiarra/trunk/module/Auto/FetchTitle/Plugin/TouhouReplay.pm + A /lang/perl/tiarra/trunk/module/Auto/FetchTitle/Plugin.pm + M /lang/perl/tiarra/trunk/module/Auto/FetchTitle.pm + +lang/perl/tiarra: FetchTitle, カスタマイズ部分を独立モジュールでかけるように. +POSTでの再問い合わせに対応. +Cookieの対応. + +------------------------------------------------------------------------ +r10890 | hio | 2008-05-01 20:13:21 +0900 (Thu, 01 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPParser.pm + +lang/perl/tiarra: HTTPParser, 複数回でてきたヘッダもひとまず保持できるように. + +------------------------------------------------------------------------ +r10889 | hio | 2008-05-01 20:07:47 +0900 (Thu, 01 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + +lang/perl/tiarra: HTTPClient, リクエスト送信後, shutdownを発行するように修正. + +------------------------------------------------------------------------ +r10848 | topia | 2008-05-01 01:14:33 +0900 (Thu, 01 May 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/RunLoop.pm + +* support new irc message remarks: do-not-broadcast-to-clients and do-not-send-to-server. +------------------------------------------------------------------------ +r10846 | topia | 2008-05-01 01:06:02 +0900 (Thu, 01 May 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Resolver.pm + +* add nameinfo query type. +* add informational comments. +------------------------------------------------------------------------ +r10231 | topia | 2008-04-24 02:38:16 +0900 (Thu, 24 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Socket/Lined.pm + +* Tiarra::Socket::Lined を EOL を無視して使えるようにした。 + send_reserve を使いたい時は eol を一時的に書き換えてください。 +------------------------------------------------------------------------ +r9987 | hio | 2008-04-20 16:52:19 +0900 (Sun, 20 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/FetchTitle.pm + +lang/perl/tiarra: 見出し抽出の追加, 200以外でも抽出を行えるように. + +------------------------------------------------------------------------ +r9947 | drry | 2008-04-20 08:43:24 +0900 (Sun, 20 Apr 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Resolver.pm + +lang/perl/tiarra/trunk/main/Tiarra/Resolver.pm: + * ワイの環境ではこの部分で止まってしまったとばい。ワークアラウンドや。 + +------------------------------------------------------------------------ +r9724 | mumumu | 2008-04-18 23:03:21 +0900 (Fri, 18 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/IrcIO/Client.pm + +- fixed bug server numeric reply included user fullname. + +------------------------------------------------------------------------ +r9215 | hio | 2008-04-09 23:37:50 +0900 (Wed, 09 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/System.html + M /lang/perl/tiarra/trunk/module/System/WebClient.pm + M /lang/perl/tiarra/trunk/module/Tools/HTTPParser.pm + M /lang/perl/tiarra/trunk/module/Tools/HTTPServer/Client.pm + M /lang/perl/tiarra/trunk/module/Tools/HTTPServer.pm + +lang/perl/tiarra: HTTPオブジェクトにRemoteAddrを持たせるように. X-Forwarded-For の展開をサポート. + +------------------------------------------------------------------------ +r9107 | hio | 2008-04-08 02:25:45 +0900 (Tue, 08 Apr 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/System/WebClient.pm + +lang/perl/tiarra: use しないで使ってるモジュールがあった. +------------------------------------------------------------------------ +r9106 | hio | 2008-04-08 02:07:34 +0900 (Tue, 08 Apr 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPServer/Client.pm + M /lang/perl/tiarra/trunk/module/Tools/HTTPServer.pm + +lang/perl/tiarra: デバッグメッセージの抑制 +------------------------------------------------------------------------ +r9104 | hio | 2008-04-08 01:22:54 +0900 (Tue, 08 Apr 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Resolver.pm + +lang/perl/tiarra: Win2kでlocalhostを解決できない現象の回避 +------------------------------------------------------------------------ +r9103 | hio | 2008-04-08 01:12:43 +0900 (Tue, 08 Apr 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/RunLoop.pm + +lang/perl/tiarra: Win32/select()+Ctrl-C挙動のメモ追加 +------------------------------------------------------------------------ +r9023 | hio | 2008-04-06 23:36:56 +0900 (Sun, 06 Apr 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/System/WebClient.pm + +lang/perl/tiarra: owner-mode/shared-modeの設定を追加 +------------------------------------------------------------------------ +r9021 | hio | 2008-04-06 22:17:41 +0900 (Sun, 06 Apr 2008) | 3 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/System/WebClient.pm + +lang/perl/tiarra: System::WebClient, topicとメンバの表示を追加, +ログのページ分けを実装. + +------------------------------------------------------------------------ +r9012 | hio | 2008-04-06 19:55:41 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/Auto.html + M /lang/perl/tiarra/trunk/module/Auto/FetchTitle.pm + +lang/perl/tiarra: System::WebClient, config-reload のチェックを追加. + +------------------------------------------------------------------------ +r9011 | hio | 2008-04-06 19:45:27 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/System.html + M /lang/perl/tiarra/trunk/module/System/WebClient.pm + +lang/perl/tiarra: System::WebClient, ドキュメント加筆. + +------------------------------------------------------------------------ +r9010 | hio | 2008-04-06 19:42:15 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Mask.pm + +lang/perl/tiarra: Mask#match_chan, コメント加筆. + +------------------------------------------------------------------------ +r9005 | hio | 2008-04-06 17:12:28 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/doc/default.css + +lang/perl/tiarra: モジュール一覧HTMLのスタイル調整. + +------------------------------------------------------------------------ +r8998 | hio | 2008-04-06 16:32:26 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/System.html + M /lang/perl/tiarra/trunk/doc/module-toc.html + M /lang/perl/tiarra/trunk/module/System/WebClient.pm + +lang/perl/tiarra: System::WebClient, ドキュメント加筆. + +------------------------------------------------------------------------ +r8995 | hio | 2008-04-06 16:27:40 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/doc/module/Auto.html + M /lang/perl/tiarra/trunk/doc/module/Channel.html + M /lang/perl/tiarra/trunk/doc/module/Log.html + M /lang/perl/tiarra/trunk/doc/module/System.html + M /lang/perl/tiarra/trunk/doc/module/User.html + M /lang/perl/tiarra/trunk/doc/module-toc.html + M /lang/perl/tiarra/trunk/makedoc + +lang/perl/tiarra: モジュール一覧のHTMLがescapeされていなかったので修正. + +------------------------------------------------------------------------ +r8988 | hio | 2008-04-06 15:26:43 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + A /lang/perl/tiarra/trunk/module/System/WebClient.pm + +lang/perl/tiarra: System::WebClient, HTTPでのIRCインターフェースを追加. + +------------------------------------------------------------------------ +r8985 | hio | 2008-04-06 15:17:58 +0900 (Sun, 06 Apr 2008) | 4 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + A /lang/perl/tiarra/trunk/module/Tools/HTTPParser.pm + A /lang/perl/tiarra/trunk/module/Tools/HTTPServer + A /lang/perl/tiarra/trunk/module/Tools/HTTPServer/Client.pm + A /lang/perl/tiarra/trunk/module/Tools/HTTPServer.pm + +lang/perl/tiarra: HTTP通信解釈モジュール Tools::HTTPParser を追加. +Tools::HTTPServer追加. +Tools::HTTPClientをTools::HTTPParserを使うように修正. + +------------------------------------------------------------------------ +r8984 | hio | 2008-04-06 15:07:22 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient/SSL.pm + +lang/perl/tiarra: Tools::HTTPClient::SSL, こまごま調整. + +------------------------------------------------------------------------ +r8983 | hio | 2008-04-06 15:01:08 +0900 (Sun, 06 Apr 2008) | 7 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/FetchTitle.pm + +lang/perl/tiarra: cookie指定の対応. +ドキュメント取得パラメータの調整. +複数のフィルタを呼べるように修正. +不完全なLocation(相対指定)に対応. +警告抑制, デバッグメッセージ追加. + + +------------------------------------------------------------------------ +r8981 | hio | 2008-04-06 14:53:10 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/System/LivePatch.pm + +lang/perl/tiarra: 条件判定が逆だったo__)o + +------------------------------------------------------------------------ +r8978 | hio | 2008-04-06 14:06:08 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/Debug.html + M /lang/perl/tiarra/trunk/doc/module-toc.html + A /lang/perl/tiarra/trunk/module/Debug/Core.pm + +lang/perl/tiarra: Debug::Core, Tiarra の内部構造追跡モジュールを追加. + +------------------------------------------------------------------------ +r8977 | hio | 2008-04-06 14:00:17 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Log/Logger.pm + +lang/perl/tiarra: TALK時の整形をLog::Channelから拝借. + +------------------------------------------------------------------------ +r8976 | hio | 2008-04-06 13:48:46 +0900 (Sun, 06 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/System.html + M /lang/perl/tiarra/trunk/module/System/LivePatch.pm + +lang/perl/tiarra: System::LivePatch, /livepatch apply されるまで適用は行わないように変更. + +------------------------------------------------------------------------ +r8939 | topia | 2008-04-05 23:17:51 +0900 (Sat, 05 Apr 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/AUTHORS + M /lang/perl/tiarra/trunk/main/Tiarra/IRC/Message.pm + M /lang/perl/tiarra/trunk/module/System/PrivTranslator.pm + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + M /lang/perl/tiarra/trunk/tiarra + +lang/perl/tiarra: * change copyright style. +------------------------------------------------------------------------ +r8937 | topia | 2008-04-05 23:10:50 +0900 (Sat, 05 Apr 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/tiarra + +lang/perl/tiarra: * change copyright style. +------------------------------------------------------------------------ +r8930 | hio | 2008-04-05 22:27:12 +0900 (Sat, 05 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/LinedINETSocket.pm + +lang/perl/tiarra: LinedINETSocket が接続失敗時もinstallされていたバグの修正. + +------------------------------------------------------------------------ +r8826 | topia | 2008-04-04 09:37:47 +0900 (Fri, 04 Apr 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/System/LivePatch.pm + +lang/perl/tiarra: * set mime-type for System::LivePatch. +------------------------------------------------------------------------ +r8825 | hio | 2008-04-04 09:06:31 +0900 (Fri, 04 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/System.html + M /lang/perl/tiarra/trunk/doc/module-toc.html + A /lang/perl/tiarra/trunk/module/System/LivePatch.pm + +lang/perl/tiarra: add System::LivePatch. + +------------------------------------------------------------------------ +r8810 | topia | 2008-04-03 23:48:46 +0900 (Thu, 03 Apr 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/GroupDB.pm + +lang/perl/tiarra: * use dup_group instead of clone object method. +------------------------------------------------------------------------ +r8809 | topia | 2008-04-03 23:47:41 +0900 (Thu, 03 Apr 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/ModuleManager.pm + +lang/perl/tiarra: * destruct modules before unloading it. +------------------------------------------------------------------------ +r8622 | hio | 2008-04-02 00:26:23 +0900 (Wed, 02 Apr 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/FetchTitle.pm + +コードの整理と見出し抽出の抽象化. + +------------------------------------------------------------------------ +r8620 | hio | 2008-04-02 00:16:24 +0900 (Wed, 02 Apr 2008) | 2 lines +Changed paths: + A /lang/perl/tiarra/trunk/module/Tools/HTTPClient + A /lang/perl/tiarra/trunk/module/Tools/HTTPClient/SSL.pm + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + +かなり適当なHTTPClientのSSLサポート. + +------------------------------------------------------------------------ +r8435 | elim | 2008-03-27 12:20:36 +0900 (Thu, 27 Mar 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/tiarra-conf.el + M /lang/perl/tiarra/trunk/tiarra-conf.l + +lang/perl/tiarra: set svn:mime-type. + +------------------------------------------------------------------------ +r8273 | hio | 2008-03-22 20:45:17 +0900 (Sat, 22 Mar 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/Auto.html + A /lang/perl/tiarra/trunk/doc/module/UNCLASSIFIED.html + M /lang/perl/tiarra/trunk/doc/module-toc.html + +lang/perl/tiarra: update documents +------------------------------------------------------------------------ +r8272 | hio | 2008-03-22 20:41:58 +0900 (Sat, 22 Mar 2008) | 1 line +Changed paths: + A /lang/perl/tiarra/trunk/module/Auto/FetchTitle.pm + +lang/perl/tiarra: new module, Auto::FetchTitle +------------------------------------------------------------------------ +r8271 | hio | 2008-03-22 20:18:21 +0900 (Sat, 22 Mar 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/Mask.pm + +lang/perl/tiarra: add comment +------------------------------------------------------------------------ +r8220 | hio | 2008-03-21 01:11:22 +0900 (Fri, 21 Mar 2008) | 4 lines +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/HTTPClient.pm + +lang/perl/tiarra: add ProgressCallback, and documents. +fix, error handring on connect/disconnect failure. +fix, content body after last CR-LF was lost. + +------------------------------------------------------------------------ +r8219 | hio | 2008-03-21 00:59:13 +0900 (Fri, 21 Mar 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/Socket/Buffered.pm + +lang/perl/tiarra: fix, do not clear recvbuf on detach, it cause data lost +------------------------------------------------------------------------ +r8217 | hio | 2008-03-21 00:57:24 +0900 (Fri, 21 Mar 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/Mask.pm + +lang/perl/tiarra: add comment for usage of Mask::match +------------------------------------------------------------------------ +r8216 | hio | 2008-03-21 00:55:04 +0900 (Fri, 21 Mar 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/doc-src/module-group.tdoc + +lang/perl/tiarra: add description for unclassified modules +------------------------------------------------------------------------ +r8215 | hio | 2008-03-21 00:54:28 +0900 (Fri, 21 Mar 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/TiarraDoc.pm + +lang/perl/tiarra: fix, show UNCLASSIFIED modules in module-toc.html +------------------------------------------------------------------------ +r8214 | hio | 2008-03-21 00:52:58 +0900 (Fri, 21 Mar 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Skelton.pm + +lang/perl/tiarra: add document for skelton +------------------------------------------------------------------------ +r8213 | hio | 2008-03-21 00:46:14 +0900 (Fri, 21 Mar 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/makedoc + +lang/perl/tiarra: add, =begin tiarra-doc ... =end tiarra-doc style document. +------------------------------------------------------------------------ +r8081 | hio | 2008-03-18 19:46:39 +0900 (Tue, 18 Mar 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/Answer.pm + +lang/perl/tiarra: new parameter channel-reply and answer-to-myself for Auto::Answer +------------------------------------------------------------------------ +r7640 | otsune | 2008-03-08 01:21:17 +0900 (Sat, 08 Mar 2008) | 2 lines +Changed paths: + A /lang/perl (from /lang/perl:7636) + +Resurrected lang/perl from revision 7636 + +------------------------------------------------------------------------ +r5918 | topia | 2008-01-31 04:00:25 +0900 (Thu, 31 Jan 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/AliasDB.pm + +lang/perl/tiarra: * bugfix: use Tools::Hash instance instead of plain hash. +------------------------------------------------------------------------ +r5917 | topia | 2008-01-31 03:59:36 +0900 (Thu, 31 Jan 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Auto/MesMail.pm + +lang/perl/tiarra: * support smtp-auth, and small bugfixes. +------------------------------------------------------------------------ +r5916 | topia | 2008-01-31 03:58:33 +0900 (Thu, 31 Jan 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/module/Tools/MailSend/EachServer.pm + M /lang/perl/tiarra/trunk/module/Tools/MailSend.pm + +lang/perl/tiarra: * implement SMTP-Auth, but supports PLAIN and LOGIN only. +------------------------------------------------------------------------ +r5911 | topia | 2008-01-31 01:06:47 +0900 (Thu, 31 Jan 2008) | 1 line +Changed paths: + D /dan/perl/tiarra + A /lang/perl/tiarra (from /dan/perl/tiarra:5910) + +ふっかつのじゅもんをまちがえていたので、わすれないうちになおす +------------------------------------------------------------------------ +r5905 | topia | 2008-01-31 00:05:09 +0900 (Thu, 31 Jan 2008) | 2 lines +Changed paths: + A /dan/perl/tiarra (from /lang/perl/tiarra:5903) + +なにもおもしろいことが起きなかったので復活の呪文 + +------------------------------------------------------------------------ +r5680 | drry | 2008-01-28 18:37:58 +0900 (Mon, 28 Jan 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/tiarra + +lang/perl/tiarra/trunk/tiarra: removed a mixed revision number. fixed a white space. + +------------------------------------------------------------------------ +r5636 | topia | 2008-01-27 17:52:28 +0900 (Sun, 27 Jan 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/main/Multicast.pm + +lang/perl/tiarra/trunk: * BUGFIX: do not global/local nick convertion for TOPIC content. +------------------------------------------------------------------------ +r4748 | drry | 2008-01-17 04:22:16 +0900 (Thu, 17 Jan 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/tiarra + +lang/perl/tiarra/trunk/tiarra: system() が返すのは終了ステータスでした……。うわーん。 + +------------------------------------------------------------------------ +r4411 | topia | 2008-01-11 12:15:24 +0900 (Fri, 11 Jan 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/all.conf + M /lang/perl/tiarra/trunk/doc/module/Auto.html + M /lang/perl/tiarra/trunk/doc/module/CTCP.html + M /lang/perl/tiarra/trunk/doc/module/Channel.html + M /lang/perl/tiarra/trunk/doc/module/Client.html + M /lang/perl/tiarra/trunk/doc/module/Debug.html + M /lang/perl/tiarra/trunk/doc/module/Log.html + M /lang/perl/tiarra/trunk/doc/module/System.html + M /lang/perl/tiarra/trunk/doc/module/User.html + M /lang/perl/tiarra/trunk/doc/module-toc.html + M /lang/perl/tiarra/trunk/sample.conf + +lang/perl/tiarra/trunk: * re-generate documentation. +------------------------------------------------------------------------ +r4410 | topia | 2008-01-11 12:14:37 +0900 (Fri, 11 Jan 2008) | 1 line +Changed paths: + M /lang/perl/tiarra/trunk/doc-src/conf-main.tdoc + M /lang/perl/tiarra/trunk/module/System/PrivTranslator.pm + +lang/perl/tiarra/trunk: * add caution for bad network-separator to use System::PrivTranslator. +------------------------------------------------------------------------ +r4404 | drry | 2008-01-11 08:37:30 +0900 (Fri, 11 Jan 2008) | 2 lines +Changed paths: + M /lang/perl/tiarra/trunk/main/Tiarra/IRC/Message.pm + M /lang/perl/tiarra/trunk/module/Client/Guess.pm + M /lang/perl/tiarra/trunk/tiarra + +lang/perl/tiarra/trunk: use system() instead of a backtick oper, etc. + +------------------------------------------------------------------------ +r3010 | topia | 2007-12-10 22:36:55 +0900 (Mon, 10 Dec 2007) | 1 line +Changed paths: + D /lang/perl/tiarra/AUTHORS + D /lang/perl/tiarra/ChangeLog + D /lang/perl/tiarra/ChangeLog.svn + D /lang/perl/tiarra/HACKING + D /lang/perl/tiarra/INSTALL + D /lang/perl/tiarra/LICENSE + D /lang/perl/tiarra/Makefile + D /lang/perl/tiarra/NEWS + D /lang/perl/tiarra/all.conf + A /lang/perl/tiarra/branches + D /lang/perl/tiarra/bundle + D /lang/perl/tiarra/common + D /lang/perl/tiarra/doc + D /lang/perl/tiarra/doc-src + D /lang/perl/tiarra/main + D /lang/perl/tiarra/makedoc + D /lang/perl/tiarra/module + D /lang/perl/tiarra/run + D /lang/perl/tiarra/run-main + D /lang/perl/tiarra/run-subr + D /lang/perl/tiarra/runtiarra.perl + D /lang/perl/tiarra/sample.conf + D /lang/perl/tiarra/tiarra + D /lang/perl/tiarra/tiarra-conf.el + D /lang/perl/tiarra/tiarra-conf.l + A /lang/perl/tiarra/trunk + A /lang/perl/tiarra/trunk/AUTHORS (from /lang/perl/tiarra/AUTHORS:3009) + A /lang/perl/tiarra/trunk/ChangeLog (from /lang/perl/tiarra/ChangeLog:3009) + A /lang/perl/tiarra/trunk/ChangeLog.svn (from /lang/perl/tiarra/ChangeLog.svn:3009) + A /lang/perl/tiarra/trunk/HACKING (from /lang/perl/tiarra/HACKING:3009) + A /lang/perl/tiarra/trunk/INSTALL (from /lang/perl/tiarra/INSTALL:3009) + A /lang/perl/tiarra/trunk/LICENSE (from /lang/perl/tiarra/LICENSE:3009) + A /lang/perl/tiarra/trunk/Makefile (from /lang/perl/tiarra/Makefile:3009) + A /lang/perl/tiarra/trunk/NEWS (from /lang/perl/tiarra/NEWS:3009) + A /lang/perl/tiarra/trunk/all.conf (from /lang/perl/tiarra/all.conf:3009) + A /lang/perl/tiarra/trunk/bundle (from /lang/perl/tiarra/bundle:3009) + A /lang/perl/tiarra/trunk/common (from /lang/perl/tiarra/common:3009) + A /lang/perl/tiarra/trunk/doc (from /lang/perl/tiarra/doc:3009) + A /lang/perl/tiarra/trunk/doc-src (from /lang/perl/tiarra/doc-src:3009) + A /lang/perl/tiarra/trunk/main (from /lang/perl/tiarra/main:3009) + A /lang/perl/tiarra/trunk/makedoc (from /lang/perl/tiarra/makedoc:3009) + A /lang/perl/tiarra/trunk/module (from /lang/perl/tiarra/module:3009) + A /lang/perl/tiarra/trunk/run (from /lang/perl/tiarra/run:3009) + A /lang/perl/tiarra/trunk/run-main (from /lang/perl/tiarra/run-main:3009) + A /lang/perl/tiarra/trunk/run-subr (from /lang/perl/tiarra/run-subr:3009) + A /lang/perl/tiarra/trunk/runtiarra.perl (from /lang/perl/tiarra/runtiarra.perl:3009) + A /lang/perl/tiarra/trunk/sample.conf (from /lang/perl/tiarra/sample.conf:3009) + A /lang/perl/tiarra/trunk/tiarra (from /lang/perl/tiarra/tiarra:3009) + A /lang/perl/tiarra/trunk/tiarra-conf.el (from /lang/perl/tiarra/tiarra-conf.el:3009) + A /lang/perl/tiarra/trunk/tiarra-conf.l (from /lang/perl/tiarra/tiarra-conf.l:3009) + +lang/perl/tiarra: migrate to trunk/branches. +------------------------------------------------------------------------ +r3009 | topia | 2007-12-10 22:35:53 +0900 (Mon, 10 Dec 2007) | 1 line +Changed paths: + M /lang/perl/tiarra/module/System/Inflate.pm + M /lang/perl/tiarra/tiarra + +lang/perl/tiarra: fix typo. +------------------------------------------------------------------------ +r3008 | tokuhirom | 2007-12-10 22:33:19 +0900 (Mon, 10 Dec 2007) | 1 line +Changed paths: + M /lang/perl/tiarra/HACKING + +lang/perl/tiarra: fixed typo +------------------------------------------------------------------------ +r3007 | topia | 2007-12-10 22:22:05 +0900 (Mon, 10 Dec 2007) | 1 line +Changed paths: + M /lang/perl/tiarra/doc/default.css + +lang/perl/tiarra: fix import url. +------------------------------------------------------------------------ +r3004 | topia | 2007-12-10 21:45:39 +0900 (Mon, 10 Dec 2007) | 1 line +Changed paths: + A /lang/perl/tiarra + A /lang/perl/tiarra/AUTHORS + A /lang/perl/tiarra/ChangeLog + A /lang/perl/tiarra/ChangeLog.svn + A /lang/perl/tiarra/HACKING + A /lang/perl/tiarra/INSTALL + A /lang/perl/tiarra/LICENSE + A /lang/perl/tiarra/Makefile + A /lang/perl/tiarra/NEWS + A /lang/perl/tiarra/all.conf + A /lang/perl/tiarra/bundle + A /lang/perl/tiarra/bundle/Unicode + A /lang/perl/tiarra/bundle/Unicode/Japanese.pm + A /lang/perl/tiarra/bundle/enum.pm + A /lang/perl/tiarra/common + A /lang/perl/tiarra/common/run-script + A /lang/perl/tiarra/common/run-script/add-rc-once.sh + A /lang/perl/tiarra/common/run-script/rc-onces + A /lang/perl/tiarra/common/run-script/rc-onces/remove-log.sh + A /lang/perl/tiarra/doc + A /lang/perl/tiarra/doc/default.css + A /lang/perl/tiarra/doc/module + A /lang/perl/tiarra/doc/module/Auto.html + A /lang/perl/tiarra/doc/module/CTCP.html + A /lang/perl/tiarra/doc/module/Channel.html + A /lang/perl/tiarra/doc/module/Client.html + A /lang/perl/tiarra/doc/module/Debug.html + A /lang/perl/tiarra/doc/module/Log.html + A /lang/perl/tiarra/doc/module/System.html + A /lang/perl/tiarra/doc/module/User.html + A /lang/perl/tiarra/doc/module-toc.html + A /lang/perl/tiarra/doc-src + A /lang/perl/tiarra/doc-src/README + A /lang/perl/tiarra/doc-src/all.conf.in + A /lang/perl/tiarra/doc-src/conf-main.tdoc + A /lang/perl/tiarra/doc-src/contents.html + A /lang/perl/tiarra/doc-src/module-group.tdoc + A /lang/perl/tiarra/doc-src/module-toc.html + A /lang/perl/tiarra/doc-src/sample.conf.in + A /lang/perl/tiarra/main + A /lang/perl/tiarra/main/BulletinBoard.pm + A /lang/perl/tiarra/main/CTCP.pm + A /lang/perl/tiarra/main/ChannelInfo.pm + A /lang/perl/tiarra/main/Configuration + A /lang/perl/tiarra/main/Configuration/Block.pm + A /lang/perl/tiarra/main/Configuration/LexicalAnalyzer.pm + A /lang/perl/tiarra/main/Configuration/Parser.pm + A /lang/perl/tiarra/main/Configuration/Preprocessor.pm + A /lang/perl/tiarra/main/Configuration.pm + A /lang/perl/tiarra/main/ControlPort.pm + A /lang/perl/tiarra/main/Crypt.pm + A /lang/perl/tiarra/main/Exception.pm + A /lang/perl/tiarra/main/ExternalSocket.pm + A /lang/perl/tiarra/main/FunctionalVariable.pm + A /lang/perl/tiarra/main/Hook.pm + A /lang/perl/tiarra/main/IRCMessage.pm + A /lang/perl/tiarra/main/InstantCapsule.pm + A /lang/perl/tiarra/main/IrcIO + A /lang/perl/tiarra/main/IrcIO/Client.pm + A /lang/perl/tiarra/main/IrcIO/Server.pm + A /lang/perl/tiarra/main/IrcIO.pm + A /lang/perl/tiarra/main/Iterator + A /lang/perl/tiarra/main/Iterator/ArrayIterator.pm + A /lang/perl/tiarra/main/Iterator/BackwardIterator.pm + A /lang/perl/tiarra/main/Iterator/BidirectionalIterator.pm + A /lang/perl/tiarra/main/Iterator/ForwardIterator.pm + A /lang/perl/tiarra/main/Iterator/RandomAccessIterator.pm + A /lang/perl/tiarra/main/Iterator/RoundIterator.pm + A /lang/perl/tiarra/main/Iterator.pm + A /lang/perl/tiarra/main/L10N.pm + A /lang/perl/tiarra/main/LinedINETSocket.pm + A /lang/perl/tiarra/main/LocalChannelManager.pm + A /lang/perl/tiarra/main/Mask.pm + A /lang/perl/tiarra/main/Module + A /lang/perl/tiarra/main/Module/Use.pm + A /lang/perl/tiarra/main/Module.pm + A /lang/perl/tiarra/main/ModuleManager.pm + A /lang/perl/tiarra/main/Multicast.pm + A /lang/perl/tiarra/main/NumericReply.pm + A /lang/perl/tiarra/main/PersonInChannel.pm + A /lang/perl/tiarra/main/PersonalInfo.pm + A /lang/perl/tiarra/main/ReloadTrigger.pm + A /lang/perl/tiarra/main/RunLoop.pm + A /lang/perl/tiarra/main/Template.pm + A /lang/perl/tiarra/main/Tiarra + A /lang/perl/tiarra/main/Tiarra/DefineEnumMixin.pm + A /lang/perl/tiarra/main/Tiarra/Encoding + A /lang/perl/tiarra/main/Tiarra/Encoding/Encode + A /lang/perl/tiarra/main/Tiarra/Encoding/Encode/CP932JIS.pm + A /lang/perl/tiarra/main/Tiarra/Encoding/Encode.pm + A /lang/perl/tiarra/main/Tiarra/Encoding/UniJP.pm + A /lang/perl/tiarra/main/Tiarra/Encoding.pm + A /lang/perl/tiarra/main/Tiarra/IRC + A /lang/perl/tiarra/main/Tiarra/IRC/Message.pm + A /lang/perl/tiarra/main/Tiarra/IRC/NewMessageMixin.pm + A /lang/perl/tiarra/main/Tiarra/IRC/Prefix.pm + A /lang/perl/tiarra/main/Tiarra/Mixin + A /lang/perl/tiarra/main/Tiarra/Mixin/AttachPackage.pm + A /lang/perl/tiarra/main/Tiarra/Mixin/NewIRCMessage.pm + A /lang/perl/tiarra/main/Tiarra/ModifiedFlagMixin.pm + A /lang/perl/tiarra/main/Tiarra/OptionalModules.pm + A /lang/perl/tiarra/main/Tiarra/Resolver.pm + A /lang/perl/tiarra/main/Tiarra/SessionMixin.pm + A /lang/perl/tiarra/main/Tiarra/SharedMixin.pm + A /lang/perl/tiarra/main/Tiarra/ShorthandConfMixin.pm + A /lang/perl/tiarra/main/Tiarra/Socket + A /lang/perl/tiarra/main/Tiarra/Socket/Buffered.pm + A /lang/perl/tiarra/main/Tiarra/Socket/Connect.pm + A /lang/perl/tiarra/main/Tiarra/Socket/Lined.pm + A /lang/perl/tiarra/main/Tiarra/Socket/Win32Errno.pm + A /lang/perl/tiarra/main/Tiarra/Socket.pm + A /lang/perl/tiarra/main/Tiarra/TerminateManager.pm + A /lang/perl/tiarra/main/Tiarra/Utils + A /lang/perl/tiarra/main/Tiarra/Utils/CallWrapper.pm + A /lang/perl/tiarra/main/Tiarra/Utils/Core.pm + A /lang/perl/tiarra/main/Tiarra/Utils/DefineHelper.pm + A /lang/perl/tiarra/main/Tiarra/Utils.pm + A /lang/perl/tiarra/main/Tiarra/WrapMainLoop.pm + A /lang/perl/tiarra/main/TiarraDoc.pm + A /lang/perl/tiarra/main/Timer.pm + A /lang/perl/tiarra/makedoc + A /lang/perl/tiarra/module + A /lang/perl/tiarra/module/Auto + A /lang/perl/tiarra/module/Auto/Alias.pm + A /lang/perl/tiarra/module/Auto/AliasDB + A /lang/perl/tiarra/module/Auto/AliasDB/CallbackUtils.pm + A /lang/perl/tiarra/module/Auto/AliasDB.pm + A /lang/perl/tiarra/module/Auto/Answer.pm + A /lang/perl/tiarra/module/Auto/CacheManager.pm + A /lang/perl/tiarra/module/Auto/Calc.pm + A /lang/perl/tiarra/module/Auto/ChannelWithoutOper.pm + A /lang/perl/tiarra/module/Auto/Joined.pm + A /lang/perl/tiarra/module/Auto/MesMail.pm + A /lang/perl/tiarra/module/Auto/Oper.pm + A /lang/perl/tiarra/module/Auto/Random.pm + A /lang/perl/tiarra/module/Auto/Reply.pm + A /lang/perl/tiarra/module/Auto/Response.pm + A /lang/perl/tiarra/module/Auto/Utils.pm + A /lang/perl/tiarra/module/CTCP + A /lang/perl/tiarra/module/CTCP/ClientInfo.pm + A /lang/perl/tiarra/module/CTCP/Ping.pm + A /lang/perl/tiarra/module/CTCP/Time.pm + A /lang/perl/tiarra/module/CTCP/UserInfo.pm + A /lang/perl/tiarra/module/CTCP/Version.pm + A /lang/perl/tiarra/module/Channel + A /lang/perl/tiarra/module/Channel/Freeze.pm + A /lang/perl/tiarra/module/Channel/Ignore.pm + A /lang/perl/tiarra/module/Channel/Join + A /lang/perl/tiarra/module/Channel/Join/Connect.pm + A /lang/perl/tiarra/module/Channel/Join/Invite.pm + A /lang/perl/tiarra/module/Channel/Join/Kicked.pm + A /lang/perl/tiarra/module/Channel/Mode + A /lang/perl/tiarra/module/Channel/Mode/Get.pm + A /lang/perl/tiarra/module/Channel/Mode/Oper + A /lang/perl/tiarra/module/Channel/Mode/Oper/Grant.pm + A /lang/perl/tiarra/module/Channel/Mode/Set.pm + A /lang/perl/tiarra/module/Channel/Rejoin.pm + A /lang/perl/tiarra/module/Client + A /lang/perl/tiarra/module/Client/Cache.pm + A /lang/perl/tiarra/module/Client/Conservative.pm + A /lang/perl/tiarra/module/Client/Cotton.pm + A /lang/perl/tiarra/module/Client/Eval.pm + A /lang/perl/tiarra/module/Client/GetVersion.pm + A /lang/perl/tiarra/module/Client/Guess.pm + A /lang/perl/tiarra/module/Client/PatchworkMessage.pm + A /lang/perl/tiarra/module/Client/ProtectMyself.pm + A /lang/perl/tiarra/module/Client/Rehash.pm + A /lang/perl/tiarra/module/Client/ShowNick.pm + A /lang/perl/tiarra/module/Debug + A /lang/perl/tiarra/module/Debug/AliasTest.pm + A /lang/perl/tiarra/module/Debug/RawLog.pm + A /lang/perl/tiarra/module/Log + A /lang/perl/tiarra/module/Log/Channel.pm + A /lang/perl/tiarra/module/Log/ChannelList.pm + A /lang/perl/tiarra/module/Log/Logger.pm + A /lang/perl/tiarra/module/Log/Raw.pm + A /lang/perl/tiarra/module/Log/Recent.pm + A /lang/perl/tiarra/module/Log/Writer + A /lang/perl/tiarra/module/Log/Writer/Base.pm + A /lang/perl/tiarra/module/Log/Writer/File.pm + A /lang/perl/tiarra/module/Log/Writer.pm + A /lang/perl/tiarra/module/Skelton.pm + A /lang/perl/tiarra/module/System + A /lang/perl/tiarra/module/System/Error.pm + A /lang/perl/tiarra/module/System/Inflate + A /lang/perl/tiarra/module/System/Inflate/Gzip.pm + A /lang/perl/tiarra/module/System/Inflate/Zlib.pm + A /lang/perl/tiarra/module/System/Inflate.pm + A /lang/perl/tiarra/module/System/Macro.pm + A /lang/perl/tiarra/module/System/NotifyIcon + A /lang/perl/tiarra/module/System/NotifyIcon/Win32.pm + A /lang/perl/tiarra/module/System/Pong.pm + A /lang/perl/tiarra/module/System/PrivTranslator.pm + A /lang/perl/tiarra/module/System/Raw.pm + A /lang/perl/tiarra/module/System/Reload.pm + A /lang/perl/tiarra/module/System/RemoteControl.pm + A /lang/perl/tiarra/module/System/SendMessage.pm + A /lang/perl/tiarra/module/System/Shutdown.pm + A /lang/perl/tiarra/module/Tools + A /lang/perl/tiarra/module/Tools/DateConvert.pm + A /lang/perl/tiarra/module/Tools/FileCache + A /lang/perl/tiarra/module/Tools/FileCache/EachFile.pm + A /lang/perl/tiarra/module/Tools/FileCache.pm + A /lang/perl/tiarra/module/Tools/GroupDB.pm + A /lang/perl/tiarra/module/Tools/HTTPClient.pm + A /lang/perl/tiarra/module/Tools/Hash.pm + A /lang/perl/tiarra/module/Tools/HashDB.pm + A /lang/perl/tiarra/module/Tools/HashTools.pm + A /lang/perl/tiarra/module/Tools/LinedDB.pm + A /lang/perl/tiarra/module/Tools/MailSend + A /lang/perl/tiarra/module/Tools/MailSend/EachServer.pm + A /lang/perl/tiarra/module/Tools/MailSend.pm + A /lang/perl/tiarra/module/User + A /lang/perl/tiarra/module/User/Away + A /lang/perl/tiarra/module/User/Away/Client.pm + A /lang/perl/tiarra/module/User/Away/Nick.pm + A /lang/perl/tiarra/module/User/Filter.pm + A /lang/perl/tiarra/module/User/Ignore.pm + A /lang/perl/tiarra/module/User/Kick.pm + A /lang/perl/tiarra/module/User/Nick + A /lang/perl/tiarra/module/User/Nick/Detached.pm + A /lang/perl/tiarra/module/User/ServerOper.pm + A /lang/perl/tiarra/module/User/Vanish.pm + A /lang/perl/tiarra/run + A /lang/perl/tiarra/run-main + A /lang/perl/tiarra/run-subr + A /lang/perl/tiarra/runtiarra.perl + A /lang/perl/tiarra/sample.conf + A /lang/perl/tiarra/status + A /lang/perl/tiarra/status/merged-tag + A /lang/perl/tiarra/test + A /lang/perl/tiarra/test/dateconvert-test.perl + A /lang/perl/tiarra/test/inflate-test.perl + A /lang/perl/tiarra/tiarra + A /lang/perl/tiarra/tiarra-conf.el + A /lang/perl/tiarra/tiarra-conf.l + A /lang/perl/tiarra/tools + A /lang/perl/tiarra/tools/archive.perl + A /lang/perl/tiarra/tools/ezpack.config + A /lang/perl/tiarra/tools/merge.sh + A /lang/perl/tiarra/tools/update.sh + A /lang/perl/tiarra/tools/upload.sh + +lang/perl/tiarra: import. +------------------------------------------------------------------------ diff -urN /non-existant-dir/HACKING tiarra-20080510/HACKING --- /non-existant-dir/HACKING 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20080510/HACKING 2008-05-11 00:25:24.000000000 +0900 @@ -0,0 +1,186 @@ +モジュールについて + +* モジュールの新規作成 +module/Skelton.pm にモジュールのスケルトンがありますので、 +これをコピーして不要な関数を削除すれば、作ることが出来ます。 + +* 注意すべき事項 + - Tiarra はシングルスレッドです。時間がかかる処理をそのままやってはいけません。 + Timer や Hook, ソケット入出力なら ExternalSocket を使って少しずつ処理してください。 + - conf の変更が起きると、モジュールはインスタンスごと再初期化されます。 + 設定変更後にも必要なデータは、適切なオブジェクトの remark か、 BulletinBoard に + 書いてください。 + +* 良く使うモジュール/関数 + - Tiarra::SharedMixin(main/Tiarra/SharedMixin.pm) + インポートするだけで ->shared を簡単に実現する mixin です。 + ->_new(...) がインスタンス初期化に呼ばれ、 ->_initialize(...) が + (->shared を利用する文を含む)初期化用に呼ばれます。 ->_initialize は定義しなくても OK です。 + + $class_or_this->_this $class_or_this がただのパッケージ名だったとしても、 + ->shared を呼び出してインスタンス化します。 + クラスメソッド (package->func(...)) を簡単に実装したいときに + 使えます。 + - Tiarra::Utils(main/Tiarra/Utils.pm) + このモジュールの関数はすべて package->func(...) または package->shared->func(...) で呼んで + ください。 + + define_function($code, $funcname, ...) + 呼び出し元パッケージに $code で指定された関数を $funcname という + 名前で追加します。 + + define_attr_accessor($class_method, $name, ...) + 呼び出し元パッケージに $name で指定された属性アクセサ(値の取得設定 + ともに可能なもの)を定義します。 + $class_method には、この関数を package->name(...) でアクセスできる + ようにするかを指定します。 + $name には無名配列を指定することもでき、その場合は[関数名, 属性名] + と解釈されます。 + + define_attr_getter($class_method, $name, ...) + 呼び出し元パッケージに $name で指定された属性取得関数を定義します。 + 引数の意味は define_attr_accessor と同じです。 + + define_attr_setter($class_method, $name, ...) + 呼び出し元パッケージに $name で指定された属性設定関数を定義します。 + 引数の意味は define_attr_accessor と同じです。 + + get_package($level) 呼び出し元のパッケージ名を取得します。 + $level が省略された場合は 0 で、この値は呼び出し元の呼び出し元(通常 + 欲しいと思われる値)を返します。 + + cond_yesno($str, $default) + $str を yes か no か評価します。他には true と false を受け付け + ます。 $str が未定義だった場合は $default (または 0)を返します。 + + to_str($value, ...) 任意の値を文字化します。特に undef/ininitialized なエラーを無視して + 文字化します。 + + get_first_defined($value, ...) + 引数の中で一番最初に定義されていたものを返します。 + (with defined_or: $a // $b // $c // ...) + - Tiarra::ShorthandConfMixin(main/Tiarra/ShorthandConfMixin.pm) + _runloop を定義した状態でインポートすると、 _conf, _conf_general, _conf_networks, + _conf_messages を定義します。 + - Mask(main/Mask.pm) + 汎用に使えるマスクマッチング関数群が実装してあります。 + 良く使う形は + Mask::match_deep_chan([$this->config->mask('all')], $msg->prefix, $channel_name_with_network) + Mask::match_deep([$this->config->keyword('all')], $keyword) + だと思います。 + + - ModuleManager(main/ModuleManager.pm) + ここで紹介する関数は、全て ModuleManager->shared_manager->function(...) と呼んで下さい。 + + add_to_blacklist($modname) + $modname で指定されたモジュールをブラックリストに入れる。 + ブラックリストに入れられたモジュールは、リロードするか削除される + まで呼び出されない。成功したら正を返す。 + + remove_from_blacklist($modname) + $modname で指定されたモジュールをブラックリストから削除する。 + 成功したら正を返す。 + + check_blacklist($modname) $modname で指定されたモジュールがブラックリストに入っていれば + 正を返す。 + + + - Multicast(main/Multicast.pm) + + detach($str) 文字列 $str からネットワーク名を外す。 + 戻り値: (セパレータ前の文字列,ネットワーク名,ネットワーク名が明示されたかどうか) + ただしスカラーコンテクストではセパレータ前の文字列のみを返す。 + + attach($str, $network_name) + $str にネットワーク名を付ける。 + $strはChannelInfoのオブジェクトでも良い。 + $network_nameは省略可能。IrcIO::Serverのオブジェクトでも良い。 + + attach_for_client($str, $network_name) + クライアント向けに、 multi-server-mode でなければ attach しない。 + + nick_p($str) 文字列 $str が nick name として許される形式なら 1 を返す。 + ネットワーク名は付けたままでも構わない。処理前に detach される。 + + channel_p($str) 文字列 $str が channel name として許される形式なら 1 を返す。 + ネットワーク名は付けたままでも構わない。処理前に detach される。 + + - RunLoop(main/RunLoop.pm) + ここで紹介する関数は、全て RunLoop->shared_loop->function(...) と呼んで下さい。 + + channel($str) チャンネルを探す。 + ネットワーク名付きのチャンネル名が引数です。 + 無ければ undef を返します。 + + broadcast_to_clients(@messages) + メッセージを全てのクライアントに送信する。 + + notify_msg($str) 全てのクライアントと、 STDOUT にメッセージを通知します。 + + notify_error($str) notify_msg を使ってエラーを通知します。 + + notify_warn($str) notify_msg を使って警告を通知します。 + + terminate($message) サーバとクライアントを切断して終了します。 + + - main(tiarra) + + ::printmsg() STDOUT にのみメッセージを通知します。 + + ::debug_printmsg() デバッグモードの時のみメッセージを通知します。 + + ::debug_mode() デバッグモードなら 1 を返します。 + + ::ipv6_enabled() IPv6 が有効なら 1 を返します。 + + - BulletinBoard(main/BulletinBoard.pm) + ここで紹介する関数は、全て BulletinBoard->shared->function(...) と呼んで下さい。 + + set($key, $value) 掲示板に $key という名前で値 $value をセットします。 + $key を __PACKAGE__."/key" という名前にすれば + 被りにくいと思います。 + + get($key) $key でセットした値を得ます。 + + keys BulletinBoard が保持しているテーブルを返します。 + この内容を変更すると、当然 BulletinBoard の内容も変わります。 + + - Auto::Utils(module/Auto/Utils.pm) + + generate_reply_closures(...) + 一般的な自動反応をするのに有用なクロージャを生成する。 + + sendto_channel_closure(...) + チャンネル等に PRIVMSG / NOTICE を送るクロージャを生成する。 + 一般的な使い方は Skelton.pm に書いておきました。 + +* remark のあるオブジェクト + remark とは、オブジェクトに関連づけられた、自由に使える key/value pair です。 + remark 機能の存在するオブジェクトと、(あるなら)広く使われている既定の remark を挙げます。 + - IrcIO::Client + - IrcIO::Server + 再接続時には remark はクリアされません。 + + 情報取得系 + * server_hops 自分のつながっている server と、あるサーバの hop 数の対応を + (情報が得られたときに)記録しています。 + * isupport RPL_ISUPPORT が送ってくる情報を記録しています。 + RPL_ISUPPORT の詳細は http://www.irc.org/tech_docs/005.html 等を + 参照してください。 + 対応していないサーバでは remark は存在しません。 + * uid RPL_YOURID が送ってくる情報を記録しています。 + 対応していないサーバでは remark は存在しません。 + - IRCMessage + + 情報取得系 + * affected-channels NICK や QUIT などの全チャンネルに波及するメッセージのときに + 影響を受けたチャンネルが設定されていることがあります。 + * old-topic TOPIC 時に一つ前のトピックが設定されています。 + + 動作設定系 + * fill-prefix-when-sending-to-client + クライアントに送信するときに prefix (Tiarra が 001(RPL_WELCOME) + で返したもの) を補完します。 + * do-not-send-to-clients このメッセージを(ほかのモジュールで処理する可能性があるために + 残すけれど)クライアントには送信しないようにします。 + * do-not-send-to-servers do-not-send-to-clients と同じような理由で、サーバに送信しない + ようにします。 + * always-use-colon-on-last-param + シリアライズするとき、最終パラメータに常にコロンを使用する + ようにします。 + - ChannelInfo + + 情報取得系 + * kicked-out そのチャンネルから蹴り出されている(すでにそのチャンネルに + いない)かどうか。 + * switches-are-known チャンネルモードを取得済みかどうか。 + * creation-time RPL_CREATIONTIME が返した値。 + - PersonInChannel + - PersonalInfo + +* Hook + - 基本的な使い方: + use SomePackage::Hook; + my $hook = SomePackage::Hook->new(sub{ + my $hook = shift; + # do something + })->install('someplace'); + - Hook のあるパッケージ、 Hook 名と簡単な説明 + + RunLoop + * before-select select 前 + * after-select select 後 + * set-current-nick set_current_nick が呼ばれたとき + + Configuration + * reloaded conf が再読込されたとき + + IrcIO::Client + * channel-info($client, $ch_name, $network, $ch) + 接続時に Join しているチャンネルごとに呼ばれる。 + チャンネル情報とともに recent log を送ったりする場合に使える。 + +Local variables: +mode: text +End: diff -urN /non-existant-dir/INSTALL tiarra-20080510/INSTALL --- /non-existant-dir/INSTALL 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20080510/INSTALL 2008-05-11 00:25:24.000000000 +0900 @@ -0,0 +1,65 @@ +-*- text -*- +$Id: INSTALL 11365 2008-05-10 14:58:28Z topia $ + +必要なもの +========== +* Perl: + 5.6.0 以上。 + +あるとよいもの +============== +* IO::Socket::INET6 または Socket6: + インストールすると IPv6 のサポートが追加されます。 +* Unicode::Japanese: + 特に XS モジュールをインストールすると性能が改善されます。 +* ithreads: + 5.8.0 以上で ithreads を有効にした場合に、 DNS 解決時の性能低下がなくなります。 +* Win32::GUI: + System::NotifyIcon:Win32 を使う場合に必須です。 + +手順 +==== +1. 必要なものをインストールしたら、 sample.conf をファイル名を変えてコピーします。 + $ cp sample.conf foo.conf + +2. コピーした conf ファイルを編集します。 + $ vi foo.conf + 最低でも main, network, そして network/name で指定したネットワークのブロック + (指定してないブロックは無視されるので書き換えていなくても大丈夫です) + を書き換えてください。 + 自動 Join 設定は Channel::Join::Connect に、ログ取り設定は Log::Channel にあります。 + 使うときはブロックの先頭の - を + に変えるのを忘れずに。 + +3. 起動します。 + $ ./tiarra --config=foo.conf --quiet + (これで起動しないときは perl ./tiarra ... で試す) + +TIPS +==== +* ログファイルなどのパスは起動時のディレクトリからの相対になります。 + (絶対指定も可能です) + たとえば: + | tiarra/test/tiarra.conf + | tiarra/tiarra + | tiarra/main/... + | tiarra/... + なディレクトリ構成の時に + $ cd tiarra/test + $ ../tiarra --config=tiarra.conf + とすれば、 + | tiarra/test/log/others/... + | tiarra/test/log/priv/... + といった感じになります。 + +* --config を省略した場合は、標準入力か tiarra.conf を読みます。 + +* シンボリックリンクを張った場合でも問題なく運用できます。 + たとえば: + | /home/foo/tiarra/test/tiarra -> /usr/share/tiarra/tiarra + | /usr/share/tiarra/main/... + | /usr/share/tiarra/... + という構成( -> はシンボリックリンク)でも問題ありません。 + その場合、 + | /home/foo/tiarra/test/module/Auto/Reply.pm + などを置いた場合は /usr/share/tiarra/module/Auto/Reply.pm より + 優先されます。 diff -urN /non-existant-dir/LICENSE tiarra-20080510/LICENSE --- /non-existant-dir/LICENSE 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20080510/LICENSE 2008-05-11 00:25:24.000000000 +0900 @@ -0,0 +1,2 @@ +This is free software; you can redistribute it and/or modify it + under the same terms as Perl itself. diff -urN /non-existant-dir/NEWS tiarra-20080510/NEWS --- /non-existant-dir/NEWS 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20080510/NEWS 2008-05-11 00:25:24.000000000 +0900 @@ -0,0 +1,292 @@ +2004-08-22 Topia + + * Client::Rehash + - 追加。クライアントの nick と names を訂正する。 + + * System::Error + - 追加。クライアントに送信するときに ERROR メッセージを + NOTICE に埋め込む。 + - このモジュールはデフォルトオンです。アップデートの際は忘れずに + 追加するようにしてください。 + + * Log::Channel + - Log::Writer フレームワークを使うようにしました。 + - file system full 等で書き込みに失敗しても、出来る限りログを + 保持します。 + +2004-07-29 Topia + + * System::NotifyIcon::Win32 + - 追加。タスクバーの通知領域にアイコンを表示し、コンソールの + 表示・非表示、 conf リロード、終了などができます。 + +2004-07-09 Topia + + * System::Reload + - conf-reloaded-notify を追加。(デフォルトで有効) + conf ファイルが再読込された場合に通知します。 + +2004-06-19 Topia + + * Client::Cotton + - 追加。いくつかの Cotton の不具合を回避する(予定)。 + 今は network rejoin 時の自動 part を無視します。 + Client::GetVersion と組み合わせると良いと思います。 + + * Client::GetVersion + - 追加。クライアントの接続時に CTCP Version を発行して + クライアントのバージョンを取得します。 + +2004-06-04 Topia + + * 全般 + - 今回の変更は RPL_ISUPPORT のクライアントへの送信が必要なければ、 + 再起動する必要はありません。 + 再起動せずにリロードしてもエラーが起こることはないと思います。 + - 書き忘れていましたが Unicode::Japanese 0.21 (の PurePerl) にて + SI/SO な jis への対応が行われています。(2004-05-26 の update) + +2004-03-07 Topia + + * 全般 + - taint check モードで動作するようになりました(多分)。 + +2004-02-23 Topia + + * Debug::RawLog + - 追加。生の IRC メッセージ(のようなもの?)を ::printmsg を使って + 表示する。 + + * sample.conf + - 順序が変わっています。注意してください。 + - general/omit-sysmsg-prefix-when-possible 削除。 + - general/sysmsg-prefix-use-masks ブロック追加。 + + * Log::Recent + - no-client-logs クライアントオプションが追加されました。 + クライアントオプションの使い方は、 + realname 部分に $no-client-logs=1$ を指定します。 + 複数ある場合は $no-client-logs=1;a=1;...$ のように指定できます。 + + * 全般 + - クライアントとの接続時にチャンネルの送出順を指定する patch を + 暫定的に取り込みました。 networks に fixed-channels ブロックを + 作り、中に channel をキー名としてマスクを列挙します。 + 例: + fixed-channels { + channel: #てすとちゃんねる@ircnet + channel: #てすと@localserver + channel: *@localserver + channel: *@localserver:*.jp + } + マッチしなかったチャンネルについては最後にまとめて + (順番がごちゃごちゃになって)送られてきます。 + conf の設定場所は暫定です。変わる可能性があるので注意してください。 + - doc/ 以下に HTML でのドキュメントが生成されていますが、 + まだ未調整な部分も多くあるので、正確な記述は sample.conf を参照してください。 + +2004-02-21 phonohawk + + * Channel::Freeze + freezeコマンドの引数は、これまでは完全なチャンネル名であったが、 + これはマスクに変更。その時にJOINしている全てのチャンネルの中から + マスクに一致した全てのチャンネルを凍結する。 + + * 設定 general/omit-sysmsg-prefix-when-possible 追加。 + これが1である時、sysmsg-prefixはチャンネルに対してのメッセージ + でなければ省略する。デフォルトは1。 + +2004-02-15 Topia + + * Client::Cache + - 昨日の分だけでは Excess Flood/Max SendQ Exceeded 対策として + 不十分だったので、アップデートを推奨します。 + - 2つ以上のクライアントが同時に同じ動作をする場合に、 + 今回の変更で効果が出ます。 + 長すぎず短すぎずの絶妙な差で同じ動作をされた場合には + 効きませんが、滅多にそんなことはない(と思いたい)です。 + +2004-02-14 Topia + + * Log::Recent, System::Raw, Channel::Freeze, Channel::Rejoin + - これらのモジュールのうち一つでも組み込んでいる場合は、 + リロードする前に Tiarra を再起動させてください。 + 新たに入った機能を使っています。 + + * Client::Cache + - 新規追加。クライアントからの問い合わせのうち、 + Tiarra が情報を持っていて、 + サーバに問い合わせる必要がないものをキャッシュとして返します。 + - いまのところ MODE キャッシュと、 WHO キャッシュを実装していて、 + どちらも、クライアントからの最初の問い合わせのときにのみ + キャッシュを使います。 + - LimeChat(1.18 で WHO 機能を切れるようになりましたが) や、 + X-Chat などのクライアントを使用されている場合は、 + 組み込むと便利です。 + + * Client::Eval + - 追加。クライアントからのコマンドしか受け付けませんが、 + その代わりすべてのコマンドを実行できます。 + 事実上 IRC パスワードがわかれば Tiarra が動いているホスト上で + 動作しているアカウントの権限で何でもできる、 + ということに注意してください。 + - 意味がわからなければ組み込まないことを推奨します。 + 必要な時だけ組み込んで、すぐはずす、というのも良いかもしれません。 + +2004-01-27 phonohawk + + * 行の終わりにCRLFでなくLFを付けるようなクライアントでも + 正しく動作するようになりました。 + +2004-01-23 phonohawk + + * tiarra: 起動時オプション --make-password 追加。 + make-passwordの機能をtiarra本体に移した。 + + * make-password: 削除 + +2003-11-17 Topia + + * Log::Channel + mode のデフォルトが 644 から 600 に変更されました。 + mode をコメントアウトしている場合は注意してください。 + dir-mode が追加され、デフォルトが 700 です。 + これも、必要に応じて 755 を指定するようにしてください。 + +2003-11-09 Topia + + * System::Reload + 自分自身がリロードできないバグの修正。 + kill -HUP pid は出来るので、これを使ってリロードしてください。 + + * single-server-mode の bugfix です。 + single-server-mode を使う予定が無い場合は再起動は不要です。 + single-server-mode を使っている方は、アップデートして再起動して下さい。 + +2003-11-08 Topia + + * single-server-mode の bugfix です。 + single-server-mode を使う予定が無い場合は再起動は不要です。 + single-server-mode を使っている方は、アップデートして再起動して下さい。 + +2003-10-16 phonohawk + + * System::Raw + 追加。Tiarraに改変されない生のメッセージをサーバーに送るためのモジュール。 + +2003-10-14 Topia + + * single-server-mode の bugfix です。 + single-server-mode を使う予定が無い場合は再起動は不要です。 + +2003-09-28 phonohawk + + * tiarra-conf.el: + mmm-modeがインストールされていて、(require 'mmm-mode)または + (require 'mmm-auto)されている場合に、tiarra-conf用の設定を + 行った後、それを有効にする。 + + mmm-modeのサイトは次のURLに。 + http://mmm-mode.sourceforge.net/ + +2003-09-25 Topia + + * このバージョン以前の Tiarra には、 + モジュールのアンロードをすると原因不明のエラーが起こるバグがあります。 + また、アップグレードの際には再起動が必要です。 + +2003-08-12 phonohawk + + * シングルサーバーモードを実装。 + networks/multi-server-modeを0に設定すると、シングルサーバーモードになります。 + この状態では同時に接続出来るサーバーの数が一つに制限され、クライアントから見た + チャンネル名にネットワーク名が付かなくなります。 + +2003-07-31 Topia + + * mask のチャンネル名にネットワーク名を必要とするように修正した。 + 影響を受けるモジュールは + - Auto::Oper + - Auto::Random + - Auto::Reply + - Auto::MesMail + - Auto::Alias + - Auto::Response + です。変更よろしくお願いします。(^^;; + +2003-07-10 phonohawk + + * Channel::Freeze + 追加。特定のチャンネルのNOTICEやPRIVMSGの中継を + 一時的に中断するためのモジュール。 + 発言を見たくないがPARTはしたくない、といった場合に有効。 + +003-07-03 phonohawk + + * Auto::Oper + 複数の応答が定義されていれば、ランダムに一つ選んで発言する。省略も可能。 + +2003-06-06 phonohawk + + * general/nickを、それぞれのネットワーク設定ブロックのnickでオーバーライド可能に。 + +2003-05-27 phonohawk + + * Tiarra本体の誤動作によりCPU時間を食い潰している可能性を検出して警告する。 + +2003-05-24 phonohawk + + * IPv6対応 + general/tiarra-ip-versionに'v6'を指定する事で、IPv6でのリスニングを行なう。 + また、サーバーには最初にIPv6での接続を試みてからIPv4にフォールバックする。 + 詳細はsample.confに。 + +2003-05-23 Topia + + * Auto/Reply.pm: 追加。 + plum の auto/reply.plm に相当する。 + + * Auto/Alias.pm: キーを指定しての値削除、削除した個数の表示が可能になったため、 + サンプルの removed-format が変更されています。好みに合わせて変更してください。 + +2003-05-21 phonohawk + + * tiarra-conf.l: 追加。 + Noboruhiさんによるxyzzy用tiarra.conf編集モード。 + インストール方法はtiarra-conf.l内に記述されています。 + +2003-04-29 phonohawk + + * Channel/Join/Kicked.pm: 追加。チャンネルから蹴られた時に、自動JOINするモジュール。 + +2003-04-13 phonohawk + + * User/Vanish.pm: 追加 + 特定のチャンネルでの特定の人物の存在をクライアントに隠すモジュール。 + JOINやPART、QUIT等を消去する。 + +2003-04-05 phonohawk + + * モジュール Auto::Joined 追加。 + 特定のチャンネルに誰かがJOINする度に特定の発言を行なうモジュール。 + チャンネル移転通知以外に使うのはやめた方が良い。 + +2003-03-28 Topia + + * sample.conf (Auto/Random.pm): 設定に mask プロパティが抜けていました。 + Auto/Random.pm を使っていた方は、 sample.conf にしたがって適当なところに追加してください。 + +2003-03-23 phonohawk + + * User/Filter.pm: 新規追加。 特定の人物の発言にフィルタをかける。 + + * general/bind-addrでサーバーへの接続時のローカル側アドレスを指定可能になりました。 + +2003-03-23 Topia + + * Channel/Join/Invite.pm: 新規追加。 Invite されたチャンネルに Join する。 + +2003-03-19 Topia + + * Auto/Random.pm: 設定ファイルの形式がかなり変わっています。 + sample.conf を参照して書き換えをお願いします。 diff -urN /non-existant-dir/all.conf tiarra-20080510/all.conf --- /non-existant-dir/all.conf 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20080510/all.conf 2008-05-11 00:25:27.000000000 +0900 @@ -0,0 +1,1781 @@ +# -*- tiarra-conf -*- +# ----------------------------------------------------------------------------- +# $Id: all.conf.in 11365 2008-05-10 14:58:28Z topia $ +# ----------------------------------------------------------------------------- +# tiarra.conf サンプル +# このファイルにはすべてのブロックの解説があります。 +# 必要なブロックがあればここからコピーしていってください。 +# ----------------------------------------------------------------------------- + +# ----------------------------------------------------------------------------- +# generalブロック +# +# tiarra.conf自身の文字コードやユーザー情報などを指定するブロックです。 +# ----------------------------------------------------------------------------- +general { + # tiarra.conf自身の文字コード + # コード名はjis,sjis,euc,utf8,utf16,utf32等。(この値はUnicode::Japaneseにそのまま渡されます) + # autoが指定された、または省略された場合は自動判別します。 + conf-encoding: utf8 + + # ユーザー情報 + # 省略不能です。 + nick: tiarra + user: tiarra + name: Tiarra the "Aeon" + + # どのようなユーザーモードでログインするか。+iwや+iのように指定する。 + # 省略された場合はユーザーモードを特に設定しない。 + #user-mode: +i + + # Tiarraへの接続を許可するホスト名を表わすマスク。 + # 制限をしないのであれば"*"を指定するか省略する。 + client-allowed: * + + # Tiarraが開くポート。ここに指定したポートへクライアントに接続させる。 + # 省略されたらポートを開かない。 + tiarra-port: 6667 + + # Tiarraがポートtiarra-portを開く際、IPv6とIPv4のどちらでリスニングを行なうか。 + # 'v4'または'v6'で指定します。デフォルトは'v4'です。 + # IPv6を使うためにはSocket6.pmが利用可能である必要があります。 + #tiarra-ip-version: v4 + + # Tiarraがポートtiarra-portを開く際のローカルアドレス。 + # 意味が分からなければ省略して下さい。 + # デフォルトは、IPv4のはINADDR_ANY、IPv6のはin6addr_anyになります。 + #tiarra-ipv4-bind-addr: 0.0.0.0 + #tiarra-ipv6-bind-addr: ::0 + + # Tiarraにクライアントが接続する際に要求するパスワードをcryptした文字列。 + # 空の文字列が指定されたり省略された場合はパスワードを要求しない。 + # crypt は ./tiarra --make-password で行えます。 + tiarra-password: xl7cflIcH9AwE + + # 外部プログラムからtiarraをコントロールする為のUNIXドメインソケットの名前。 + # 例えば"foo"を指定した場合、ソケット/tmp/tiarra-control/fooが作られる。 + # 省略された場合はこの機能を無効とする。 + # また、非UNIX環境ではそもそもUNIXドメインソケットが利用可能でないため、 + # そのような場合にもこの機能は無効となる。 + #control-socket-name: test + + # IRCサーバーから送られる文字のコードと、IRCサーバーへ送る文字のコード + # どちらも省略された場合はjis。 + server-in-encoding: jis + server-out-encoding: jis + + # クライアントから受け取る文字のコードと、クライアントへ伝える文字のコード + # どちらも省略された場合はjis。 + client-in-encoding: jis + client-out-encoding: jis + + # Tiarraは標準出力に様々なメッセージを出力するが、その文字コードを指定する。省略時にはeucとなる。 + # ただしtiarra.confのパースが完了するまでは文字コードの変換は行なわれない(つまりこの設定が有効にならない)ことに注意して下さい。 + stdout-encoding: utf8 + + # Tiarraはエラーメッセージを標準出力に出力するが、その時に接続しているクライアントがあればクライアントにもNOTICEで送る事が出来る。 + # この値を1にすると、その機能が有効になる。省略するか0を指定するとこの機能は無効になる。 + notice-error-messages: 1 + + # Tiarraでチャンネルとユーザーのマスクを指定するときの形式。 + # plum形式とTiarra形式が選択できます。 + #----------------- + # plum形式: (channelには+や-は使えない。channelは省略すると*とみなす。) + # + syntax: user[ channel[ channel[ ...]]] + # + # mask: +*!*@*.example.com #{example}@ircnet +{example3}@ircnet + # mask: -*!*@*.example.com #{example2}@2ch,+{example4}@2ch + # mask: -*!*@* + #----------------- + # Tiarra形式: (channelにも+や-を使える。) + # + syntax: channel user + # + # mask: #{example}@ircnet,-#{example2}@2ch +*!*@*.example.com + # mask: ++{example3}@ircnet,-+{example4}@2ch +*!*@*.example.com # +で始まるチャンネル。 + # mask: * -*!*@* + #----------------- + # となります。 この二つはまったく同じマスクを表しています。 + + # この値をplumにすると、plum形式、省略するかtiarraを指定すると、Tiarra形式になります。 + chanmask-mode: tiarra + + # サーバーに接続する際、ローカル側のどのアドレスにバインドするか。 + # 意味が分からなければ省略して下さい。 + # デフォルトは、IPv4のはINADDR_ANY、IPv6のはin6addr_anyになります。 + #ipv4-bind-addr: 0.0.0.0 + #ipv6-bind-addr: ::0 + + # tiarra が、 001 や 002 や、 recent log を送信するときなどに使う prefix + # を指定します。 hostname や fqdn っぽいものを指定すると良いかもしれません。 + # デフォルトは tiarra です。普通変える必要はありません。 + #sysmsg-prefix: tiarra + + sysmsg-prefix-use-masks { + # sysmsg-prefix を使用する場所を指定する。 + + # システムメッセージ(NumericReply など)。デフォルトは * です。 + # ふつうこれを変更する必要はありません。 + system: * + + # 個人宛メッセージ(Notice,Privmsg の中で)。デフォルトはなし。 + #priv: + + # チャンネル宛メッセージ(Notice,Privmsg の中で)。デフォルトは * です。 + # Ziciz などのクライアントを接続する場合は、 + # -*::log を指定しておくといいかもしれません。 + channel: * + } + + # Tiarra が nick 変更時の衝突等を処理するモードを指定します。 + # 0: Tiarra が接続時と同様に自動処理します。 + # 1: クライアントにそのまま投げます。 + # 複数のクライアントが nick 重複を処理する場合は非常に危険です。 + # (設定不足の IRC クライアントが複数つながっている場合も含みます) + # 2: 対応するエラーメッセージ付きの NOTICE に変換して、 + # クライアントに投げます。 + # multi-server-mode 時のデフォルトは 0 、 single-server-mode 時のデフォルトは 1 です。 + #nick-fix-mode: 0 + + messages { + # Tiarra が使用する、いくつかのメッセージを指定する。 + + quit { + # ネットワーク設定が変更され、再接続する場合の切断メッセージ + netconf-changed-reconnect: Server Configuration changed; reconnect + + # ネットワーク設定が変更され、切断する場合の切断メッセージ + netconf-changed-disconnect: Server Configuration changed; disconnect + } + } +} + +# ----------------------------------------------------------------------------- +# networksブロック +# +# Tiarraから接続するIRCネットワークの名称です。 +# 一つも定義しなかった場合やこのブロックを省略した場合は、 +# "main"というネットワークが一つだけ指定されたものと見做します。 +# ----------------------------------------------------------------------------- +networks { + # 複数のサーバーへの接続を可能にするかどうか。1(オン)と0(オフ)で指定。 + # これを1にすると、次のnameを複数個定義する事が可能になり、 + # 複数のサーバーに同時に接続出来るようになります。 + # その一方、これを1にしている時は、チャンネル名にネットワーク名が付加される等、 + # IRCの大部分のメッセージがTiarraによる改変を受けます。 + # これを0にしている間は、次のnameを複数個定義する事は出来なくなります。 + # マルチサーバーモードの設定を起動中に変えると、クライアントから見たチャンネル名が + # 変更になる為、全クライアントが一時的に全てのチャンネルからpartしたように見え、 + # その直後にjoinし直したように見えます。 + # デフォルトでは1です。 + multi-server-mode: 1 + + # 接続するIRCネットワークに名前を付けます。この名前は後で使用します。 + # 複数のネットワークに接続したい場合は多重定義して下さい。 + name: ircnet + name: 2ch + + # 通常Tiarraではチャンネル名を「#Tiarra@ircnet」のように表現します。 + # これはネットワークircnet内の#Tiarraというチャンネルを表わします。 + # @以降は省略可能ですが、省略された場合のデフォルトのネットワーク名をここで指定します。 + # 省略した場合は最も始めに定義されたnameがデフォルトになります。 + # (そしてnameが一つも無かった場合はmainがデフォルトになります) + #default: ircnet + + # 上に述べた通り、デフォルトではTiarraはチャンネル名とネットワーク名を@で区切ります。 + # この区切り文字は任意の文字に変更する事が出来ます。省略された場合は@になります。 + # + # System::PrivTranslator モジュールを利用している場合、 prefix の nick 部分にも + # 利用されます。そのため、 ! や @ を含む文字列を利用するとクライアントが誤作動する + # 場合がありますので注意してください。 + channel-network-separator: @ + + # 接続先のサーバーから切断された時に、joinしていたそのサーバーのチャンネルをどうするか。 + # 1. "part-and-join"の場合は、切断されるとクライアントにはチャンネルからpartしたように見せ掛け、 + # 再接続に成功すると再びjoinしたように見せ掛ける。最も負荷が高い。(これはplumに似た動作である) + # 2. "one-message"の場合は、切断されるとクライアントに宛ててTiarraがNOTICEでその旨を報告する。 + # 再接続に成功すると再びNOTICEで報告する。JOINやPARTはしないので、 + # クライアントからはまだそのチャンネルに残っているかのように見える。 + # 3. "message-for-each"の場合は、切断されるとクライアントに宛ててTiarraが + # 到達不能になった全てのチャンネルにNOTICEでその旨を報告する。 + # 再接続に成功すると再びNOTICEで報告する。JOINやPARTはしない。 + # デフォルトはpart-and-joinです。 + action-when-disconnected: message-for-each + + # NICKを変更する度に、変更したサーバーでの新しいNICKをNOTICEで常に通知するかどうか。 + # 1なら必ず通知し、0なら変更後のnickがローカルnick(クライアントが見る事の出来るnick)と違っている場合のみ通知する。 + # デフォルトは0です。 + always-notify-new-nick: 0 + + fixed-channels { + # Tiarra がクライアント接続時にチャンネル情報を送る順番を指定する。 + # マッチしなかったチャンネルについては最後にまとめて + # (順番がごちゃごちゃになって)送られてきます。 + channel: #てすとちゃんねる@ircnet + channel: #てすと@localserver + channel: *@localserver + channel: *@localserver:*.jp + } +} + +# ----------------------------------------------------------------------------- +# 各ネットワークの設定 +# +# networksブロックで定義した全てのネットワークについて、 +# そのアドレス、ポート、(必要なら)パスワードを定義します。 +# ----------------------------------------------------------------------------- +ircnet { + # サーバーのホストとポート。省略不可。 + host: irc.nara.wide.ad.jp + port: 6663 + + # general/userで設定したユーザ名を使わずに、各ネットワークで独自のユーザ名を使用する事も可能。 + # 省略されたら当然、general/userで設定したものが使われる。 + #user: hoge + + # general/nameで設定した本名(建前上)を使わずに、各ネットワークで独自の本名を使用可能。 + #name: hoge + + # このサーバーの要求するパスワード。省略可能。 + #password: hoge + + # general/setver-in/out-encodingで設定したエンコーディングを使わずに、 + # 各ネットワークで独自のエンコーディングを使用する事も可能。 + # 省略されたら当然、generalで設定したものが使われる。 + #in-encoding: jis + #out-encoding: jis + + # general/(ipv4|ipv6)bind-addrで設定したローカルアドレスを使わずに、 + # 各ネットワークで独自のbind_addrを使用する事も可能。 + # 省略されたらgeneralで設定したものが使われる。 + #ipv4-bind-addr: 0.0.0.0 + #ipv6-bind-addr: ::0 +} + +2ch { + host: irc.2ch.net + port: 6667 +} + +# ----------------------------------------------------------------------------- +# 必須の設定は以上です。以下はモジュール(プラグイン)の設定です。 +# ----------------------------------------------------------------------------- + +# +または-で始まる行はモジュール設定行と見做されます。 +# +で記述されたモジュールが使用され、-で記述されたモジュールは使用されません。 +# +や-の後の空白は幾つあっても無視されます。 + +# メッセージが各モジュールを通過する順番は、このconfファイルで記述された +# 順番の通りになります。ログを取るモジュールなどはconfでも後の方に +# 記述した方が良いということになります。 + +# モジュール名はperlのそれと同じようにディレクトリ区切り文字を「::」としたパスで表現されます。 +# 例えばモジュールChannel::Auto::Operの実体はファイルmodule/Channel/Auto/Oper.pm +# でなければならず、そのpackage宣言もChannel::Auto::Operでなければなりません。 +# Tiarraモジュールの名称は、perl標準モジュール群やmain/下の.pmファイルと重複しないように +# 気を付けて下さい。Tiarraはモジュールが本当にModuleのサブクラスかどうかをチェックするので +# 例えばIO::Socket::INETといったモジュールを置いても誤動作はしませんが、 +# そのようなモジュールはロード時にエラーを出して使用中止になります。 + +# 一つのモジュールを複数回定義して、何度も同じモジュールをメッセージが通過するようには出来ません。 + +# 幾つかのモジュールはパラメータとしてチャンネル名を必要とします。 +# ここで指定するチャンネル名は、ネットワーク名も含めた文字列でなければなりません。 +# 「#チャンネル」では駄目で「#チャンネル@ネットワーク」などとする必要があります。 + +# マスクの書式: +# ['+' / '-'] ( <マスク文字列> / "re:" 正規表現 ) +# これはカンマで幾つでも継ぐ事が出来ます。"\,"でカンマそのものを表します。 +# 先頭が+なら、それに続く部分にマッチするものが選ばれ、-なら除外されます。省略されたら+と見做されます。 +# マスク文字列とは"*"で0文字以上の任意の文字列を、"?"で1文字の任意の文字列を表す文字列です。 +# 例: +# tiarra* これはtiarraで始まる文字列を表す。 +# +*!*tiarra@*.jp,-re:\d これは*!*tiarra@*.jpにマッチして、かつ文字列中に数字を含まないものを表す。 + + +- Auto::Alias { + # ユーザエイリアス情報の管理を行ないます。 + + # エイリアスは基本的にname,userの二つのフィールドから成っており、 + # それぞれユーザー名、ユーザーマスクを表します。 + + # エイリアス定義ファイルのパスと、そのエンコーディング。 + # このファイルは次のようなフォーマットである。 + # 1. それぞれの行は「<キー>: <値>」の形式である。 + # 2. 空の行で、各ユーザーを区切る。 + # 3. <値>はカンマで区切られて複数の値とされる。 + # + # エイリアス定義ファイルの例: + # + # name: sample + # user: *!*sample@*.sample.net + # + # name: sample2,[sample2] + # user: *!sample2@*.sample.net,*!sample2@*.sample2.net + # + alias: alias.txt + alias-encoding: euc + + # この発言をした人のエイリアスが登録されていれば、それをprivで送る。 + confirm: エイリアス確認 + + # 「 user *!*user@*.user.net」のようにして情報を追加。 + # 発言をした人のエイリアスが未登録だった場合は、userのみ受け付けて新規追加とする。 + add: エイリアス追加 + + # 「 name ユーザー」のようにして情報を削除。 + # userを全て削除されたエイリアスは他の情報(name等)も含めて消滅する。 + remove: エイリアス削除 + + # メッセージが追加されたときの反応を指定します。 + # ランダムなメッセージを発言する際のフォーマットを指定します。 + # エイリアス置換が有効です。#(nick.now)、#(channel)は + # それぞれ相手のnick、チャンネル名に置換されます。 + # #(key)、#(value)は、追加されたキーと値に置換されます。 + added-format: #(name|nick.now): エイリアス #(key) に #(value) を追加しました。 + add-failed-format: #(name|nick.now): エイリアス #(key) の追加に失敗しました。 + + # メッセージが削除されたときの反応を指定します。 + # added-formatで指定できるものと同じです。 + removed-format: #(name|nick.now): エイリアス #(key) から #(value) を削除しました。 + remove-failed-format: #(name|nick.now): エイリアス #(key) からの削除に失敗しました。 + + # エイリアスの追加や削除が許されている人。省略された場合は「*!*@*」と見做される。 + modifier: *!*@* +} + +- Auto::Answer { + # 特定の発言に反応して対応する発言をする。 + + # Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。 + + # 反応する発言と、それに対する返事を定義します。 + # エイリアス置換が有効です。#(nick.now)と$(channel)はそれぞれ + # 相手の現在のnickとチャンネル名に置換されます。 + # + # コマンド: reply + # 書式: <反応する発言のマスク> <それに対する返事> + # 例: + #reply: こんにちは* こんにちは、#(name|nick.now)さん。 + # この例では誰かが「こんにちは」で始まる発言をすると、 + # 発言した人のエイリアスを参照して「こんにちは、○○さん。」のように発言します。 + # + # コマンド: channel-reply + # 書式: <反応するチャンネルのマスク> <反応する発言のマスク> <それに対する返事> + # 例: + #channel-reply: #あいさつ@ircnet こんにちは* こんにちは、#(name|nick.now)さん。 + # この例では#あいさつ@ircnetで誰かが「こんにちは」で始まる発言をすると、 + # 発言した人のエイリアスを参照して「こんにちは、○○さん。」のように発言します。 + # + # コマンド: answer-to-myself + # 書式: <真偽値> + # 例: + #answer-to-myself: on + # 自分の発言にも反応するようになります。 + # デフォルトは off です。 +} + +- Auto::Calc { + # Perlの式を計算させるモジュール。 + + # 反応する発言を指定します。 + request: 計算 + + # 使用を許可する人&チャンネルのマスク。 + # 例はTiarraモード時。 [default: なし] + mask: * +*!*@* + # [plum-mode] mask: +*!*@* + + # 結果が未定義だったときに置き換えられる文字列。省略されると undef 。 + #undef: (未定義) + + # 正常に計算できたときのフォーマット + # method: 計算式, result: 結果, error: エラー, signal: シグナル + reply-format: #(method): #(result) + + # エラーが起きたときのフォーマット + # method: 計算式, result: 結果, error: エラー, signal: シグナル + error-format: #(method): エラーです。(#(error)) + + # シグナルが発生したときのフォーマット + #signal-format: #(method): シグナルです。(#(signal)) + + # signal-$SIGNALNAME-format 形式。 + # $SIGNALNAME には現状 alarm/sigfpe があります。 + # 該当がなければ signal-format にフォールバックします。 + + # いくつかの例を挙げます。 + #signal-alarm-format: #(method): 時間切れです。 + #signal-sigfpe-format: #(method): 浮動小数点計算例外です。 + + # タイムアウトする秒数を指定します。 alarm に渡されます。 + # 再帰を止めるのに使えますが、どうもメモリリークしていそうな雰囲気です。 + timeout: 1 + + # サブルーチン定義を許可するかどうかを指定する。 + # 再帰定義が可能なので、許可する場合はこのモジュール専用の + # Tiarra を動かすことをお勧めします。 + permit-sub: 0 + + # 初期化する発言を指定します。 + # このモジュールでは現状変数や関数定義などを行えます。 + # このコマンドが発行されるとそれらをクリアします。 + init: 計算初期化 + + # 初期化を許可する人&チャンネルのマスク。 + # 例はTiarraモード時。 [default: なし] + init-mask: * +*!*@* + # [plum-mode] mask: +*!*@* + + # 再初期化したときの発言を指定します。 + init-format: 初期化しました。 +} + +- Auto::ChannelWithoutOper { + # チャンネルオペレータ権限がなくなってしまったときに発言する。 + + # +で始まらない特定のチャンネルで、+aモードでも+rモードでもないのに + # 誰もチャンネルオペレータ権限を持っていない状態になっている時、 + # そこに誰かがJOINする度に特定のメッセージを発言するモジュールです。 + + # 書式: <チャンネル名> <メッセージ> + #channel: #IRC談話室@ircnet なると消失しました。 +} + +- Auto::FetchTitle { + # 発言に含まれるURLからタイトルを取得. + + # リクエストタイムアウトまでの時間(秒). + timeout: 3 + + # 有効にするチャンネルとオプションとURLの設定. + # 書式: mask: [...] + # + # mask: #test@ircnet &test http://* + # mask: * http://* + mask: * http://* + + # &test と設定すると conf-test ブロックの中身が使われる. + #conf-test { + # auth-test1 { + # url: http://example.com/* + # url: http://example.org/* + # user: test + # #pass: test + # pass: {BASE64}dGVzdAo= + # } + # filter-xx { + # url: http://example.com/*/xx/* + # type: xx + # } + #} + + # お返事の前や後ろにつける字句. + reply-prefix: "(FetchTitle) " + reply-suffix: " [AR]" + + # デバッグフラグ. + #debug: 0 + #debug-mask: #debug-chan your_nick!~you@example.com + #debug-dumpfile: fetchtitle.log + + # NOTE: + # 利用するにはcodereposから + # module/Tools/HTTPClient.pm rev.8220 + # main/Tiarra/Socket/Buffered.pm rev.8219 + # 以降が必要です. +} + +- Auto::Im { + # 名前が呼ばれると、その発言をim.kayac.comに送信する + + # 反応する人のマスクを指定します。 + # 省略すると全員に反応します。 + mask: * *!*@* + + # 反応するキーワードを正規表現で指定します。 + # 複数指定したい時は複数行指定してください。 + #regex-keyword: (?i:fugahoge) + + # 反応するキーワードを指定します。 + # 複数指定したい時は,(コンマ)で区切るか、複数行指定してください。 + keyword: hoge + + # im.kayac.com に送るメッセージのフォーマットを指定します。 + # デフォルト値: [tiarra][#(channel):#(nick.now)] #(text) + format: [tiarra][#(channel):#(nick.now)] #(text) + + # im.kayac.comで登録したユーザ名を入力します。 + # im.kayac.comについては http://im.kayac.com/#docs を参考にしてください。 + user: username + + # im.kayac.comで秘密鍵認証を選択した場合は設定してください。 + # 省略すると認証なしになります。 + #secret: some secret + + # im.kayac.comでパスワード認証を選択した場合は設定してください。 + # 省略すると認証なしになります。 + # secret と両方指定した場合は secret が優先されています。 + #password: some password +} + +- Auto::Joined { + # 特定のチャンネルに誰かがJOINする度に特定のメッセージを発言する。 + + # Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。 + + # 発言を行なうチャンネルと、その内容を定義します。 + # #(nick.now)と$(channel)は、それぞれ相手の現在のnickとチャンネル名に置換されます。 + # + # 書式: <チャンネル名> <発言内容> + #channel: #チャンネル@ircnet 「#ちゃんねる」に移転しました。 +} + +- Auto::MesMail { + # 伝言をメールとして送信する。 + + # メールアドレスはエイリアスの mail を参照します。 + + # Fromアドレス。[default: OSのユーザ名] + from: example1@example.jp + + # 送信用のキーワード [default: mesmail_send] + send: 速達伝言 + + # 使用を許可する人&チャンネルのマスク。 + # 例はTiarraモード時。 [default: なし] + mask: * +*!*@* + # [plum-mode] mask: +*!*@* + + # maskで拒否されたときのメッセージ [default: なし] + deny: 伝言したくない。 + + # 一度に送れる宛先の量 [default: 無制限] + max-send-address: 5 + + # 宛先を探すエイリアスエントリ [default: なし] + alias-key: name + alias-key: nick + + # 宛先の人を判別出来なかったときのメッセージ [default: なし] + unknown: #(who)さんと言うのは誰ですか? + + # メールの日付形式 + date: %H:%M:%S + + # エイリアスは見付かったけれどメールアドレスが登録されていなかったときのメッセージ。 [default: なし] + #none-address: #(who)さんはアドレスを登録していません。 + + # SMTPのホスト [default: localhost] + #smtphost: localhost + + # SMTPのポート [default: smtp(25)] + #smtpport: 25 + + # SMTPで自ホストのFQDN [default: localhost] + #smtpfqdn: localhost + + # SMTPのユーザ。指定されれば SMTP Auth を行う [default: なし] + #smtpuser: example1 + + # SMTPのパスワード [default: 空パスワード('')] + #smtppass: test-password + + # 送信するメールの既定件名(エイリアス使用不可) [default: Message from IRC] + #subject: Message from IRC + + # 送信するメールの本文 [default: #(date) << #(from.name|from.nick|from.nick.now) >> #(message)] + #format: #(date)に#(from.name|from.nick|from.nick.now)さんから#(message)という伝言です。 + + # 送信したときのメッセージ。 [default: なし] + accept: #(who)さんに#(message)と伝言しておきました。 + + # ---- POP before SMTP の指定 ---- + # POP before SMTPを使う。 [default: no] + #use-pop3: yes + + # POP before SMTPのタイムアウト時間(分)。分からない場合は指定しなくて良い。 [default: 0] + #pop3-expire: 4 + + # POPのホスト。 [default: localhost] + #pop3host: localhost + + # POPのポート。 [default: pop(110)] + #pop3port: 110 + + # POPのユーザ [default: OSのユーザ名] + #pop3user: example1 + + # POPのパスワード [default: 空パスワード('')] + #pop3pass: test-password + + # ---- エラーメッセージの設定 ---- + + # 一般エラー。 + # error-[state] と言う形式で詳細エラーメッセージを指定できる。 + # [state]は、 + # * mailfrom(メールの送信者を指定しようとしてエラー) + # * rcptto(メールの送信先を指定しようとしてエラー) + # * norcptto(メールの送信先が全部無くなった) + # * data(メールの中身を送信しようとしてエラー) + # * finish(メールの中身を送信したらエラー) + # がある。特に欲しくなければerror-[state]は指定しなくても構わない。 + # メッセージを出したくないなら中身の無いエントリを指定すれば良い。 + # error-[state]が指定されてない場合は代わりに error を使う。 [default: 未定義] + + #error-rcptto: + #error-norcptto: #(who)さんには送れませんでした。送信できるメールアドレスがありません。 + #error-data: メールが送信できません。DATAコマンドに失敗しました。#(line;サーバ応答:%s|;) + #error: メール送信エラーです。#(line;サーバ応答:%s|;)#(state; on %s|;) + + # 致命的なエラー。メールに個別なエラーではないので送信者(のprefix)毎に1メッセージ送られる。 + # fatalerror-[state] + # [state]: + # * first(接続エラー) + # * helo(SMTPセッションを開始出来ない) + # がある。特に欲しくなければfatalerror-[state]は指定しなくても構わない。 + # メッセージを出したくないなら中身の無いエントリを指定すれば良い。 + # fatalerror-[state]が指定されてない場合は代わりに fatalerror を使う。 [default: 未定義] + + #fatalerror-first: SMTPサーバに接続できません。 + #fatalerror: SMTPセッションで致命的なエラーがありました。#(line; サーバ応答:%s|;)#(state; on %s|;) +} + +- Auto::Oper { + # 特定の文字列を発言した人を+oする。 + + # Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。 + + # +oを要求する文字列(マスク)を指定します。 + request: なると寄越せ + + # チャンネルオペレータ権限を要求した人と要求されたチャンネルが + # ここで指定したマスクに一致しなかった場合は + # denyで指定した文字列を発言し、+oをやめます。 + # 省略された場合は誰にも+oしません。 + # 書式は「チャンネル 発言者」です。 + # マッチングのアルゴリズムは次の通りです。 + # 1. チャンネル名にマッチするmask定義を全て集める + # 2. 集まった定義の発言者マスクを、定義された順にカンマで結合する + # 3. そのようにして生成されたマスクで発言者のマッチングを行ない、結果を+o可能性とする。 + # 例1: + # mask: *@2ch* *!*@* + # mask: #*@ircnet* *!*@*.hoge.jp + # この例ではネットワーク 2ch の全てのチャンネルで誰にでも +o し、 + # ネットワーク ircnet の # で始まる全てのチャンネルでホスト名 *.hoge.jp の人に+oします。 + # #*@ircnetだと「#hoge@ircnet:*.jp」などにマッチしなくなります。 + # 例2: + # mask: #hoge@ircnet -*!*@*,+*!*@*.hoge.jp + # mask: * +*!*@* + # 基本的に全てのチャンネルで誰にでも +o するが、例外的に#hoge@ircnetでは + # ホスト名 *.hoge.jp の人にしか +o しない。 + # この順序を上下逆にすると、全てのチャンネルで全ての人を +o する事になります。 + # 何故なら最初の* +*!*@*が全ての人にマッチするからです。 + mask: * *!*@* + + # +oを要求した人を実際に+oする時、ここで指定した発言をしてから+oします。 + # #(name|nick)のようなエイリアス置換を行います。 + # エイリアス以外でも、#(nick.now)を相手のnickに、#(channel)を + # そのチャンネル名にそれぞれ置換します。 + message: 了解 + + # +oを要求されたが+oすべき相手ではなかった場合の発言。 + # 省略されたら何も喋りません。 + deny: 断わる + + # +oを要求されたが相手は既にチャンネルオペレータ権限を持っていた場合の発言。 + # 省略されたらdenyに設定されたものを使います。 + oper: 既に@を持っている + + # +oを要求されたが自分はチャンネルオペレータ権限を持っていなかった場合の発言。 + # 省略されたらdenyに設定されたものを使います。 + not-oper: @が無い + + # チャンネルに対してでなく自分に対して+oの要求を行なった場合の発言。 + # 省略されたらdenyに設定されたものを使います。 + private: チャンネルで要求せよ + + # チャンネルの外から+oを要求された場合の発言。+nチャンネルでは起こりません。 + # 省略されたらdenyに設定されたものを使います。 + out: チャンネルに入っていない +} + +- Auto::Random { + # 特定の発言に反応してランダムな発言をします。 + + # Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。 + + # 使用するブロックの定義。 + blocks: wimikuji + + wimikuji { + # ランダムに発言するメッセージの書かれたファイルと、その文字コードを指定します。 + # ファイルの中では一行に一つのメッセージを書いて下さい。 + file: random.txt + file-encoding: euc + + # 反応する発言を表すマスクを指定します。 + request: ゐみくじ + + # メッセージの登録数を返答するキーワードを指定します。 + count-query: ゐみくじ登録数 + + # メッセージの登録数を返答するときの反応を指定します。 + # formatで指定できるものと同じです。#(count)は登録数になります。 + count-format: ゐみくじは#(count)件登録されています。 + + # ランダムなメッセージを発言する際のフォーマットを指定します。 + # エイリアス置換が有効です。#(message)、#(nick.now)、#(channel)は + # それぞれメッセージ内容、相手のnick、チャンネル名に置換されます。 + # 何も登録されていないときのために、#(message|;無登録)のように指定すると良いでしょう。 + format: #(name|nick.now)の運命は#(message) + + # 反応する人のマスク。 + mask: * *!*@* + # plum: mask: *!*@* + + # メッセージが追加されたときの反応を指定します。 + # formatで指定できるものと同じです。#(message)は追加されたメッセージになります。 + added-format: #(name|nick.now): ゐみくじ #(message) を追加しました。 + + # メッセージが削除されたときの反応を指定します。 + # formatで指定できるものと同じです。#(message)は削除されたメッセージになります。 + removed-format: #(name|nick.now): ゐみくじ #(message) を削除しました。 + + # 発言に反応する確率を指定します。百分率です。省略された場合は100と見做されます。 + rate: 100 + + # メッセージを追加するキーワードを指定します。 + # ここで指定したキーワードを発言すると、新しいメッセージを追加します。 + # 実際の追加方法は「 <追加するメッセージ>」です。 + add: ゐみくじ追加 + + # メッセージを削除するキーワードを指定します。 + # 実際の削除方法は「 <削除するキーワード>」です。 + remove: ゐみくじ削除 + + # addとremoveを許可する人。省略された場合は誰も変更できません。 + modifier: * *!*@* + # plum: modifier: *!*@* + } +} + +- Auto::Reply { + # 特定の発言に反応して発言をします。 + + # Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。 + + # 使用するブロックの定義。 + blocks: std + + std { + # データファイルと文字コードを指定します。 + # ファイルの中では一行に一つの"反応:メッセージ"を書いて下さい。 + file: reply.txt + file-encoding: euc + + # 反応チェックを行うキーワードを指定します。 + # 実際の指定方法は、「 <チェックしたい発言>」です。 + request: 反応チェック + + # request に反応するときのフォーマットを指定します。 + # #(key) がキーワード、 #(message) が発言に置換されます。 + reply-format: 「#(key)」という発言に「#(message)」と反応します。 + + # request に反応する最大個数を指定します。 + # あまり大きな値を指定すると、アタックが可能になったり、ログが流れて邪魔なので注意してください。 + max-reply: 5 + + # メッセージの登録数を返答するキーワードを指定します。 + count-query: 反応登録数 + + # メッセージの登録数を返答するときの反応を指定します。 + # formatで指定できるものと同じです。#(count)は登録数になります。 + count-format: 反応は#(count)件登録されています。 + + # 反応する人のマスク。 + mask: * *!*@* + # plum: mask: *!*@* + + # 反応が追加されたときの反応を指定します。 + # formatで指定できるものと同じです。#(message)は追加されたメッセージになります。 + added-format: #(name|nick.now): #(key) に対する反応 #(message) を追加しました。 + + # メッセージが削除されたときの反応を指定します。 + # formatで指定できるものと同じです。#(message)は削除されたメッセージになります。 + removed-format: #(name|nick.now): #(key) #(message;に対する反応 %s|;) を #(count) 件削除しました。 + + # 発言に反応する確率を指定します。百分率です。省略された場合は100と見做されます。 + rate: 100 + + # メッセージを追加するキーワードを指定します。 + # ここで指定したキーワードを発言すると、新しいメッセージを追加します。 + # 実際の追加方法は「 <追加するメッセージ>」です。 + add: 反応追加 + + # メッセージを削除するキーワードを指定します。 + # 実際の削除方法は「 <削除するキーワード>」です。 + remove: 反応削除 + + # addとremoveを許可する人。省略された場合は「* *!*@*」と見做します。 + modifier: * *!*@* + + # 正規表現拡張を許可するか。省略された場合は禁止します。 + use-re: 1 + } +} + +- Auto::Response { + # データファイルの指定にしたがって反応する。 + + # 大量の反応データを定義するのに向いています。 + + # データファイルのフォーマット + # | pattern: re:^(こん(に)?ちは) + # | rate: 90 + # | mask: * *!*@* + # | #plum: mask: *!*@* + # | response: こんにちは。 + # | response: いらっしゃいませ。 + # | + # | pattern: おやすみ + # | rate: 20 + # | response: おやすみなさい。 + # patternは一行しか書けません。(手抜き + # maskもrateも省略できます。省略した場合はmaskは全員、rateは100となります。 + # responseは複数書いておけばランダムに選択されます。 + + # データファイル + file: response.txt + + # 文字コード + charset: euc + + # 使用を許可する人&チャンネルのマスク。 + mask: * *!*@* + # plum: mask: +*!*@* +} + +- CTCP::ClientInfo { + # CTCP CLIENTINFOに応答する。 + + # CTCP::Versionのintervalと同じ。 + interval: 3 +} + +- CTCP::DCC::RewriteAddress { + # クライアントが送信した CTCP DCC のアドレスを変換する。 + + # CTCP DCC に指定されているアドレスを、 tiarra で取得したものに + # 書き換えます。(EXPERIMENTAL) + # + # IPv4 のみサポートしています。 + # + # このモジュールは一旦 CTCP DCC メッセージを破棄するので、 + # 別のクライアントには送信されません。 + + # 変換する DCC タイプ。 [デフォルト値: CHAT SEND] + type: CHAT SEND + + # 変換用アドレスの取得方法を選択する。デフォルト値はありません。 + # 以下の取得方法(server-socket client-socket dns http)から + # 必要なもの(複数可)を指定してください。 + resolver: client-socket server-socket dns http + + + # 取得方法と設定 + # なにも設定がないときはブロック自体を省略することもできます。 + + server-socket { + # サーバソケットのローカルアドレスを取ります。 + # client <-> tiarra[this address] <-> server + } + + client-socket { + # クライアントソケットのリモートアドレスを取ります。 + # client [this address]<-> tiarra <-> server + } + + dns { + # DNS を引いて決定します。IPアドレスの指定も可能です。 + host: example.com + } + + http { + # 現状では単純な GET しかサポートしていません。 + + # アクセス先 URL + url: http://checkip.dyndns.org/ + + # IP アドレス取得用 regex + regex: Current IP Address: (\d+\.\d+\.\d+\.\d+) + } + + # リゾルバの選び方 + # + # * tiarra を動作させているサーバとインターネットの間にルータ等があり、 + # グローバルアドレスがない場合 + # *-socket は役に立ちません。 http を利用してください。 + # 適当な DDNS を持っていればdns も良いでしょう。 + # + # * tiarra がレンタルサーバなどLAN上にないサーバで動作している場合 + # server-socket, http は役に立ちません。 + # client-socket がお勧めです。 + # + # * tiarra がLAN上にあり、グローバルアドレスのついているホストで + # 動作している場合 + # client-socket は役に立ちません。 + # server-socket がお勧めです。 +} + +- CTCP::Ping { + # CTCP PINGに応答する。 + + # CTCP::Versionのintervalと同じ。 + interval: 3 +} + +- CTCP::Time { + # CTCP TIMEに応答する。 + + # CTCP::Versionのintervalと同じ。 + interval: 3 +} + +- CTCP::UserInfo { + # CTCP USERINFOに応答する。 + + # CTCP::Versionのintervalと同じ。 + interval: 3 + + # USERINFOとして返すメッセージ。 + message: テスト +} + ++ CTCP::Version { + # CTCP VERSIONに応答する。 + + # 連続したCTCPリクエストに対する応答の間隔。単位は秒。 + # 例えば3秒に設定した場合、一度応答してから3秒間は + # CTCPに一切応答しなくなる。デフォルトは3。 + # + # なお、CTCP受信時刻の記録は、全てのCTCPモジュールで共有される。 + # 例えばCTCP VERSIONを送った直後にCTCP CLIENTINFOを送ったとしても、 + # CTCP::ClientInfoのintervalで設定された時間を過ぎていなければ + # 後者は応答しない。 + interval: 3 +} + +- Channel::Freeze { + # 特定のチャンネルの発言を、一時的に受信するのをやめる。 + + # ログを取っているなら、ログには記録される。 + + # チャンネルの凍結に用いるコマンド名。 + # 省略時は freeze であり、/freeze #channel@network のように使う。 + # チャンネル名を省略すると、現在フリーズされているチャンネルのリストを表示する。 + freeze-command: freeze + + # 凍結解除に用いるコマンド名。 + # 省略時は defrost であり、/defrost #channel@network のように使う。 + defrost-command: defrost + + # 凍結しているチャンネルが存在する時、一定時間毎にその旨を報告する事も可能。 + # この機能は凍結した事を忘れないようにする為にある。 + # 単位は分、デフォルトはゼロ(報告しない)。 + reminder-interval: 30 +} + +- Channel::Ignore { + # 指定されたチャンネルの存在を、様々なメッセージから消去する。 + + # 対象となったチャンネルのJOIN、PART、INVITE、QUIT、NICK、NAMES、NJOINは消去される。 + + # 注意点 + # - この機能はまだ実装途中です。いろいろな不具合があるかもしれません。むしろきっとあります。 + # - サーバがわとの通信に割り込みますのでログにもとられません。 + # - この機能を使っている tiarra より上流に multi-server-mode な tiarra を置かないでください。 + + # チャンネルの定義。 + # また、privの場合は「priv@ネットワーク名」という文字列をチャンネル名の代わりとしてマッチングを行なう。 + # 書式: mask: <チャンネルのマスク> + mask: #example@example +} + +- Channel::Join::Connect { + # サーバーに初めて接続した時、指定したチャンネルに入るモジュール。 + + # 書式: <チャンネル1>[,<チャンネル2>,...] [<チャンネル1のキー>,...] + # コンマの直後のスペースは無視されます。 + # + # 例: + # 「#aaaaa@ircnet」に「aaaaa」というキーで入る。 + #channel: #aaaaa@ircnet aaaaa + # + # 「#aaaaa@ircnet」、「#bbbbb@ircnet:*.jp」、「#ccccc@ircnet」、「#ddddd@ircnet」の4つのチャンネルに入る。 + #channel: #aaaaa@ircnet,#bbbbb@ircnet:*.jp, #ccccc@ircnet + #channel: #ddddd@ircnet +} + +- Channel::Join::Invite { + # 招待されたらそのチャンネルに入る。 + + # 許可するユーザ/チャンネルのマスク。 + mask: * *!*@* + # plum: *!*@* + + # 招待されたチャンネルに流すメッセージのフォーマット。 + #message: こんばんわ〜。 +} + +- Channel::Join::Kicked { + # 特定のチャンネルからkickされた時に、自動で入りなおす。 + + # 対象となるチャンネル名のマスク + channel: * +} + +- Channel::Mode::Get { + # チャンネルにJOINした時、そのチャンネルのモードを取得します。 + + # Channel::Mode::Set等が正しく動くためには + # チャンネルのモードをTiarraが把握しておく必要があります。 + # 自動的にモードを取得するクライアントであれば必要ありませんが、 + # そうでなければこのモジュールを使うべきです。 + + # 設定項目は無し。 +} + +- Channel::Mode::Oper::Grant { + # 特定のチャンネルに特定の人間がjoinした時に、自分がチャンネルオペレータ権限を持っていれば+oする。 + + # splitからの復帰などで+o対象の人が一度に大量に入って来ても+oは少しずつ実行します。 + # Excess Floodにはならない筈ですが、本格的な防衛BOTに使える程の物ではありません。 + + # 対象の人間がjoinしてから実際に+oするまで何秒待つか。 + # 省略されたら待ちません。 + # 5-10 のように指定されると、その値の中でランダムに待ちます。 + wait: 2-5 + + # チャンネルと人間のマスクを定義。Auto::Operと同様。 + #mask: * example!~example@*.example.ne.jp +} + +- Channel::Mode::Set { + # チャンネルを作成した時に自動的にモードを設定するモジュール。 + + # 書式は<チャンネル名にマッチするマスク> <設定するモード>[,<設定するモード>,...]です。 + # #IRC談話室@ircnetなら+t+nを、それ以外なら+nを設定する例。 + #channel: #IRC談話室@ircnet +t + #channel: * +n + # LimeChat 標準設定を模倣する設定例。 + #channel: * +sn +} + +- Channel::Rejoin { + # チャンネルオペレータ権限を無くしたとき、一人ならjoinし直す。 + + # +チャンネルや+aされているチャンネル以外でチャンネルオペレータ権限を持たずに + # 一人きりになった時、そのチャンネルの@を復活させるために自動的にjoinし直すモジュール。 + # トピック、モード、banリスト等のあらゆるチャンネル属性をも保存します。 + + # +b,+I,+eリストの復旧を行なうかどうか。 + # あまりに長いリストを取得するとMax Send-Q Exceedで落とされるかも知れません。 + save-lists: 1 +} + +- Client::Cache { + # データをキャッシュしてサーバに問い合わせないようにする + + # キャッシュを使用しても、使われるのは接続後最初の一度だけです。 + # 二度目からは通常通りにサーバに問い合わせます。 + # また、クライアントオプションの no-cache を指定すれば動きません。 + + # mode キャッシュを使用するか + use-mode-cache: 1 + + # who キャッシュを使用するか + use-who-cache: 1 +} + ++ Client::Conservative { + # サーバが送信するような IRC メッセージを作成するようにする + + # サーバが実際に送信しているようなメッセージにあわせるようにします。 + # 多くのクライアントの設計ミスを回避でき(ると思われ)ます。 +} + +- Client::Cotton { + # Cotton の行うおかしな動作のいくつかを無視する + + # 該当クライアントのオプション client-type に cotton や unknown と指定するか、 + # Client::GetVersion を利用してクライアントのバージョンを取得するように + # してください。 + + # part shield (rejoin 時に自動で行われる part の無視)を使用するか + use-part-shield: 1 +} + +- Client::Eval { + # クライアントから Perl 式を実行できるようにする。 + + # eval を実行するコマンド名。省略されるとコマンドを追加しません。 + # この時コマンドはTiarraが握り潰すので、IRCプロトコル上で定義された + # コマンド名を設定すべきではありません。 + command: eval + + # hex eval を実行するコマンド名。省略されるとコマンドを追加しません。 + # この時コマンドはTiarraが握り潰すので、IRCプロトコル上で定義された + # コマンド名を設定すべきではありません。 + hex-command: hexeval + + # 表示する最大行数を指定します。省略するとすべての行を表示します。 + max-line: 30 +} + ++ Client::GetVersion { + # クライアントに CTCP Version を発行してバージョン情報を得る + + # オプションはいまのところありません。 + # (開発者向け情報: 取得した情報は remark の client-version に設定され、 + # Client::Guess から使用されます。) +} + +- Client::PatchworkMessage { + # IRC メッセージにちょっと変更を加えて、クライアントのバグを抑制する + + # 特に注意書きがない場合はデフォルトで有効です。 + # また、 Client::GetVersion も同時に入れておくと便利です。 + # とりあえず obsolete です。このモジュールで実装されていた機能は + # Client::Conservative によって実現できます。 + # Client::Conservative で実装してはいけないようなものがあった場合のみ + # このモジュールで対処します。 + + # WoolChat: + # 対応しているメッセージ: + # NICK(コロンが必須) + # 説明: + # NICK は接続直後にも発行されるため、 Client::GetVersion での判別まで + # 待てません。該当クライアントのオプション client-type に woolchat と + # 指定してください。実名欄に $client-type=woolchat$ と書けば OK です。 + enable-woolchat: 1 + + # X-Chat: + # 対応しているメッセージ: + # RPL_WHOISUSER(コロンが必須) + # 説明: + # WHOIS の realname にスペースが入っていないと最初の一文字が削られます。 + enable-xchat: 1 +} + +- Client::ProtectMyself { + # 意図せず自分のニックが変わってしまうのを防止する + + # {nick,part,quit,join}-format: それぞれのメッセージのフォーマットを指定します。 + # {nick,user,host,prefix}.now などはどこでも使えます。 + # そのほかには + # target : 表示するチャンネル(またはニック)。 + # nick.new : nick-format のみ。新しいニック。 + # message : part と quit 。メッセージ。 + + nick-format: Nick changed #(nick.now) -> #(nick.new) + part-format: Part #(nick.now) (#(message)) from #(target) + quit-format: Quit #(nick.now) (#(message)) + join-format: Join #(nick.now) (#(prefix.now)) to #(target) +} + +- Client::Rehash { + # 全チャンネル分の names の内部キャッシュをクライアントに送信する。 + + # もともとはクライアントの再初期化目的に作ったのですが、 names を送信しても + # 更新されないクライアントが多いので、主に multi-server-mode な Tiarra の + # 下にさらに Tiarra をつないでいる人向けにします。 + + # names でニックリストを更新してくれるクライアント: + # Tiarra + # してくれないクライアント: (括弧内は確認したバージョンまたは注釈) + # LimeChat(1.18) + + # nick rehash に使うコマンドを指定します。 + # 第二パラメータとして現在クライアントが認識している nick を指定してください。 + command-nick: rehash-nick + + # names rehash に使うコマンドを指定します。 + command-names: rehash-names + + # チャンネルとチャンネルの間のウェイトを指定します。 + interval: 2 +} + +- Client::ShowNick { + # show network + +} + +- Debug::Core { + # Tiarra の内部構造の追跡. + + # Tiarra の内部構造を出力します. + + # トリガー用コマンド. + # デフォルトは debugcore + command: debugcore + + # [top commands] + # help - show this usage. + # bbs - show BulletinBoard info. + # socket - show internal sockets. + # module - show module info. + + # [sub commands] + # help: + # bbs: + # keys - show keys in BulletinBoard. + # socket: + # help - show this usage. + # list - show installed socket. + # get - show socket in detail. + # uninstall - uninstall detached socket. + # module: + # help - show this usage. + # summary - show module summary. + # list - show module list in detail. + # dep - show module dependency. +} + +- Debug::RawLog { + # 標準出力にクライアントやサーバとの通信をダンプする。 + + # 0 または省略で表示しない。 1 で表示する。 + # クライアントオプションの logname によって、ダンプに使う名前を指定できます。 + + # サーバからの入力 + enable-server-in: 1 + + # サーバへの出力 + enable-server-out: 1 + + # クライアントからの入力 + enable-client-in: 0 + + # クライアントへの出力 + enable-client-out: 0 + + # PING/PONG を無視する + ignore-ping: 1 + + # NumericReply の名前を解決して表示する(ちゃんとした dump では無くなります) + resolve-numeric: 1 +} + +- Log::Channel { + # チャンネルやprivのログを取るモジュール。 + + # Log系のモジュールでは、以下のように日付や時刻の置換が行なわれる。 + # %% : % + # %Y : 年(4桁) + # %m : 月(2桁) + # %d : 日(2桁) + # %H : 時間(2桁) + # %M : 分(2桁) + # %S : 秒(2桁) + + # ログを保存するディレクトリ。Tiarraが起動した位置からの相対パス。~指定は使えない。 + directory: log + + # ログファイルの文字コード。省略されたらjis。 + charset: utf8 + + # 各行のヘッダのフォーマット。省略されたら'%H:%M'。 + header: %H:%M:%S + + # ファイル名のフォーマット。省略されたら'%Y.%m.%d.txt' + filename: %Y.%m.%d.txt + + # ログファイルのモード(8進数)。省略されたら600 + mode: 600 + + # ログディレクトリのモード(8進数)。省略されたら700 + dir-mode: 700 + + # ログを取るコマンドを表すマスク。省略されたら記録出来るだけのコマンドを記録する。 + command: privmsg,join,part,kick,invite,mode,nick,quit,kill,topic,notice + + # PRIVMSGとNOTICEを記録する際に、自分の発言と他人の発言でフォーマットを変えるかどうか。1/0。デフォルトで1。 + distinguish-myself: 1 + + # 各ログファイルを開きっぱなしにするかどうか。 + # このオプションは多くの場合、ディスクアクセスを抑えて効率良くログを保存しますが + # ログを記録すべき全てのファイルを開いたままにするので、50や100のチャンネルを + # 別々のファイルにログを取るような場合には使うべきではありません。 + # 万一 fd があふれた場合、クライアントから(またはサーバへ)接続できない・ + # 新たなモジュールをロードできない・ログが全然できないなどの症状が起こる可能性が + # あります。limit の詳細については OS 等のドキュメントを参照してください。 + #keep-file-open: 1 + + # keep-file-open 時に各行ごとに flush するかどうか。 + # open/close の負荷は気になるが、ログは失いたくない人向け。 + # keep-file-open が有効でないなら無視され(1になり)ます。 + #always-flush: 0 + + # keep-file-openを有効にした場合、発言の度にログファイルに追記するのではなく + # 一定の分量が溜まってから書き込まれる。そのため、ファイルを開いても + # 最近の発言はまだ書き込まれていない可能性がある。 + # syncを設定すると、即座にログをディスクに書き込むためのコマンドが追加される。 + # 省略された場合はコマンドを追加しない。 + sync: sync + + # 各チャンネルの設定。チャンネル名の部分はマスクである。 + # 個人宛てに送られたPRIVMSGやNOTICEはチャンネル名"priv"として検索される。 + # 記述された順序で検索されるので、全てのチャンネルにマッチする"*"などは最後に書かなければならない。 + # 指定されたディレクトリが存在しなかったら、Log::Channelはそれを勝手に作る。 + # フォーマットは次の通り。 + # channel: <ディレクトリ名> (<チャンネル名> / 'priv') + # 例: + # filename: %Y.%m.%d.txt + # channel: IRCDanwasitu #IRC談話室@ircnet + # channel: others * + # この例では、#IRC談話室@ircnetのログはIRCDanwasitu/%Y.%m.%d.txtに、 + # それ以外(privも含む)のログはothers/%Y.%m.%d.txtに保存される。 + channel: priv priv + channel: others * +} + +- Log::ChannelList { + # チャンネルリストをテンプレートに沿って HTML 化します。 + + # list コマンドが実行された際に動作します。 + + # 出力したいファイル名、ネットワーク名、使う設定のブロックを指定します。。 + networks: ircnet.html ircnet ircnet + + + ircnet { + # テンプレートファイルを指定します。 + template: channellist.html.tmpl + + # 出力とテンプレートファイルの文字コードを指定します。 + charset: euc + + # 取得を開始/終了した時刻のフォーマットを指定します。 + fetch-starttime: %Y年%m月%d日 %H時%M分(日本時間) + fetch-endtime: %Y年%m月%d日 %H時%M分(日本時間) + + # 表示するチャンネルの mask を指定します。 + mask: * + mask: -re:^\&(AUTH|SERVICES|LOCAL|HASH|SERVERS|NUMERICS|CHANNEL|KILLS|NOTICES|ERRORS) + + # 出力するファイルのモードを指定します。 + mode: 644 + } +} + +- Log::Raw { + # サーバとの生の通信を保存する + + # Log系のモジュールでは、以下のように日付や時刻の置換が行なわれる。 + # %% : % + # %Y : 年(4桁) + # %m : 月(2桁) + # %d : 日(2桁) + # %H : 時間(2桁) + # %M : 分(2桁) + # %S : 秒(2桁) + + # ログを保存するディレクトリ。Tiarraが起動した位置からの相対パス。~指定は使えない。 + directory: rawlog + + # 各行のヘッダのフォーマット。省略されたら'%H:%M'。 + header: %H:%M:%S + + # ファイル名のフォーマット。省略されたら'%Y.%m.%d.txt' + filename: %Y-%m-%d.txt + + # ログファイルのモード(8進数)。省略されたら600 + mode: 600 + + # ログディレクトリのモード(8進数)。省略されたら700 + dir-mode: 700 + + # 使っている文字コードがよくわからなかったときの文字コード。省略されたらutf8。 + # たぶんこの指定が生きることはないと思いますが……。 + charset: jis + + # NumericReply の名前を解決して表示する(ちゃんとした dump では無くなります) + resolve-numeric: 1 + + # ログを取るコマンドを表すマスク。省略されたら記録出来るだけのコマンドを記録する。 + command: *,-ping,-pong + + # 各ログファイルを開きっぱなしにするかどうか。 + # このオプションは多くの場合、ディスクアクセスを抑えて効率良くログを保存しますが + # ログを記録すべき全てのファイルを開いたままにするので、50や100のチャンネルを + # 別々のファイルにログを取るような場合には使うべきではありません。 + # 万一 fd があふれた場合、クライアントから(またはサーバへ)接続できない・ + # 新たなモジュールをロードできない・ログが全然できないなどの症状が起こる可能性が + # あります。limit の詳細については OS 等のドキュメントを参照してください。 + #keep-file-open: 1 + + # keep-file-open 時に各行ごとに flush するかどうか。 + # open/close の負荷は気になるが、ログは失いたくない人向け。 + # keep-file-open が有効でないなら無視され(1になり)ます。 + #always-flush: 0 + + # keep-file-openを有効にした場合、発言の度にログファイルに追記するのではなく + # 一定の分量が溜まってから書き込まれる。そのため、ファイルを開いても + # 最近の発言はまだ書き込まれていない可能性がある。 + # syncを設定すると、即座にログをディスクに書き込むためのコマンドが追加される。 + # 省略された場合はコマンドを追加しない。 + sync: sync + + # 各サーバの設定。サーバ名の部分はマスクである。 + # 記述された順序で検索されるので、全てのサーバにマッチする"*"などは最後に書かなければならない。 + # 指定されたディレクトリが存在しなかったら、勝手に作られる。 + # フォーマットは次の通り。 + # channel: <ディレクトリ名> <サーバ名マスク> + # 例: + # filename: %Y-%m-%d.txt + # server: ircnet ircnet + # server: others * + # この例では、ircnetのログはircnet/%Y.%m.%d.txtに、 + # それ以外のログはothers/%Y.%m.%d.txtに保存される。 + server: ircnet ircnet + server: others * +} + +- Log::Recent { + # クライアントを接続した時に、保存しておいた最近のメッセージを送る。 + + # クライアントオプションの no-recent-logs が指定されていれば送信しません。 + + # 各行のヘッダのフォーマット。省略されたら'%H:%M'。 + header: %H:%M:%S + + # ログをチャンネル毎に何行まで保存するか。省略されたら10。 + line: 15 + + # PRIVMSGとNOTICEを記録する際に、自分の発言と他人の発言でフォーマットを変えるかどうか。1/0。デフォルトで1。 + distinguish-myself: 1 + + # どのメッセージを保存するか。省略されたら保存可能な全てのメッセージを保存する。 + command: privmsg,notice,topic,join,part,quit,kill +} + +- Skelton { + # Skelton for tiarra-module. + + # モジュールの説明をこのあたりに書く. + # 詳細はこのソースみれば分かると思われ. + # 書式は tiarra.conf にそのままコピーできる形式. + + # もにゅもにゅ + mask: *!*@* + mask: ... +} + ++ System::Error { + # サーバーからのERRORメッセージをNOTICEに埋め込む + + # これをoffにするとクライアントにERRORメッセージがそのまま送られます。 + # クライアントとの間ではERRORメッセージは主に切断警告に使われており、 + # そのまま流してしまうとクライアントが混乱する可能性があります。 + # 設定項目はありません。 + + # このモジュールを回避してERRORメッセージをクライアントに送りたい場合は、 + # remarkのsend-error-as-is-to-clientを指定してください。 +} + +- System::LivePatch { + # Live Patch. + + # main/* に対する実行時パッチ + # 起動/ロード時に確認は行われるが, 実際の適用は指示があるまで行われない. + + # 対応している箇所. + # ModuleManager / reload_modules_if_modified / r3004 => r8809 + + # /livepatch check で確認. + # /livepatch apply で適用. + command: livepatch +} + +- System::Macro { + # 新規にコマンドを追加し、そのコマンドが使われた時に特定の動作をまとめて実行します。 + + # 書式: <コマンド> <動作> + # コマンド"switch"を追加して、それが使われると + # #a@ircnet,#b@ircnet,#c@ircnetにjoinして、 + # #d@ircnet,#e@ircnet,#f@ircnetからpartする例。 + #macro: switch join #a@ircnet,#b@ircnet,#c@ircnet + #macro: switch part #d@ircnet,#e@ircnet,#f@ircnet +} + +- System::NotifyIcon::Win32 { + # タスクトレイにアイコンを表示する。 + + # タスクトレイにアイコンを表示します。 + # クリックすると表示非表示を切り替えることができ、右クリックすると + # Reload と Exit ができるコンテキストメニューを表示します。 + # 多少反応が鈍いかもしれませんがちょっと待てば出てくると思います。 + + # Win32::GUI を必要とします。 + # コンテキストメニューは表示している間処理をブロックしています。 + + # Win32 イベントループを処理する最大間隔を指定します。 + #interval: 2 + + # 通知領域に表示するアイコンを指定します。 + # Win32::GUI の制限でちゃんとしたアイコンファイルしか指定できません。 + iconfile: guiperl.ico + + # モジュールが読み込まれたときにコンソールウィンドウを隠すかどうかを + # 指定します。 + hide-console-on-load: 1 +} + ++ System::Pong { + # サーバーからのPINGメッセージに対し、自動的にPONGを返す。 + + # これをoffにするとクライアントが自らPINGに応答せざるを得なくなりますが、 + # クライアントからのPONGメッセージはデフォルトのサーバーへ送られるので + # デフォルト以外のサーバーからはPing Timeoutで落とされるなど + # 全く良い事がありません。 + # 設定項目はありません。 +} + ++ System::PrivTranslator { + # クライアントからの個人的なprivが相手に届かなくなる現象を回避する。 + + # このモジュールは個人宛てのprivmsgの送信者のnickにネットワーク名を付加します。 + # また、最後に声をかけられてから5分以内の nick 変更をクライアントに伝えます。 + # 設定項目はありませんが、 networks/channel-network-separator を ! や @ 以外に + # 変更することをおすすめします。 +} + +- System::Raw { + # マスクで指定したサーバーにIRCメッセージを加工せずに直接送る。 + + # 例えばQUITを送る事で一時的な切断が可能。 + + # この機能を利用するためのコマンド名。デフォルトは「raw」。 + # 「/raw ircnet quit」のようにして使う。 + # 一つ目のパラメータは送り先のネットワーク名。ワイルドカード使用可能。 + # CHOCOA の場合、 raw がクライアントで使われてしまうので、 + # コマンド名を変えるか、 /raw raw ircnet quit のようにする必要がある。 + command: raw +} + ++ System::Reload { + # confファイルやモジュールの更新をリロードするコマンドを追加する。 + + # リロードを実行するコマンド名。省略されるとコマンドを追加しません。 + # 例えば"load"を設定すると、"/load"と発言しようとした時にリロードを実行します。 + # この時コマンドはTiarraが握り潰すので、IRCプロトコル上で定義された + # コマンド名を設定すべきではありません。 + command: load + + # command と同じですが、サーバにもブロードキャストします。 + #broadcast-command: load-all + + # confファイルをリロードしたときに通知します。 + # モジュールの設定が変更されていた場合は、ここでの設定にかかわらず、 + # モジュールごとに表示されます。1または省略された場合は通知します。 + conf-reloaded-notify: 1 +} + +- System::RemoteControl { + # 特定の発言が送られてきたとき、それに反応してIRCコマンドを実行します。 + + # 実行を許可する人間を表すマスク。 + #mask: *!*example@example.net + + # 構文: + + # は反応するbotのnickを表すマスク。 + # はサーバーに向けて発行するIRCメッセージ。 + # + # 例: + # + hoge NICK [hoge] + # hogeというBOTが[hoge]にnickを変更する。 +} + +- System::Shutdown { + # Tiarraを終了させる。 + + # クライアントから特定のコマンドが実行された時や、 + # 誰かから個人的に(privで)特定の発言が送られた時に + # Tiarra を終了させます。 + + # 追加するコマンド。省略された場合はコマンドでのシャットダウンは無効になります。 + #command: shutdown + + # Tiarraをシャットダウンさせるprivの発言。 + # 省略された場合はprivでのシャットダウンは無効になります。 + # パラメータとして shutdown メッセージを指定できます。 + #message: shutdown + + # privでのシャットダウンを許可する人。 + # 省略された場合はprivでのシャットダウンは無効になります。 + # 複数のマスクを指定した場合は、一つでもマッチするものがあればシャットダウンします。 + #mask: example!example@*.example.jp +} + +- System::WebClient { + # ブラウザ上でログを見たり発言したりできます. + + # WebClient を起動させる場所の指定. + bind-addr: 127.0.0.1 + bind-port: 8668 + path: /irc + css: /style/irc-style.css + # 上の設定をapacheでReverseProxyさせる場合, httpd.conf には次のように設定. + # ProxyPass /irc/ http://localhost:8667/irc/ + # ProxyPassReverse /irc/ http://localhost:8667/irc/ + # + # ... + # + + # ReverseProxy 利用時の追加設定. + # 接続元が全部プロキシサーバになっちゃうのでその対応. + #extract-forwarded-for: 127.0.0.1 + + # 利用する接続設定の一覧. + # + # 空白区切りで評価する順に記述. + # 使われる設定は, + # - 接続元 IP が一致する物. + # - user/passが送られてきていない(認証前/anonymous): + # - 認証不要の設定があればその設定を利用. + # - 認証不要の設定がなければ 401 Unauthorized. + # - user/passが送られてきている. + # - 一致する設定を利用. + # - 一致する設定がなければ 401 Unauthorized. + allow: private public + + # 許可する接続の設定. + allow-private { + # 接続元IPアドレスの制限. + host: 127.0.0.1 + # 認証設定. + auth: user pass + # 公開するチャンネルの指定. + mask: #*@* + mask: *@* + } + allow-public { + host: * + auth: user2 pass2 + mask: #公開チャンネル@ircnet + } + + # デバッグフラグ. + #debug: 0 + + # 保存する最大行数. + #max-lines: 100 + + # クライアントモード. + # owner か shared. + # mode: owner + + # ログの方向. + # asc (旧->新) か desc (新->旧). + # sort-order: asc + + # 発言BOXで名前指定しなかったときのデフォルトの名前. + # mode: shared の時に使われる. + #name-default: (noname) +} + +- User::Away::Client { + # クライアントが一つも接続されていない時にAWAYを設定します。 + + # どのようなAWAYメッセージを設定するか。省略された場合はAWAYを設定しません。 + #away: 居ない。 +} + +- User::Away::Nick { + # ニックネーム変更に応じて AWAY を設定します。 + + # ニックネームを変更したときに、そのニックネームに対応するAWAYが + # 設定されていれば、そのAWAYを設定します。そうでなければAWAYを取り消します。 + + # 書式: <設定するAWAYメッセージ> + # + # nickをhoge_zzzに変更すると、「寝ている」というAWAYを設定する。 + # hoge_workまたはhoge_zzzに変更した場合は、「仕事中」というAWAYを設定する。 + # それ以外のnickに変更した場合はAWAYを取り消す。 + # 後者は正規表現を利用して「away: re:hoge_(work|zzz) 仕事中」としても良い。 + #away: hoge_zzz 寝ている + #away: hoge_work,hoge_zzz 仕事中 +} + +- User::Filter { + # 指定された人物からのPRIVMSGやNOTICEを書き換える。 + + # 人物のマスクと、置換パターンを定義。 + # 置換パターン中の#(message)は、発言内容に置換されます。 + # 人物が複数のマスクに一致する場合は、最初に一致したものが使われます。 + pattern: *!*@* #(message) +} + +- User::Ignore { + # 指定された人間からのPRIVMSGやNOTICEを破棄してクライアントへ送らないようにするモジュール。 + + # 対象となるコマンドのマスク。省略時には"privmsg,notice"が設定されている。 + # ただしprivmsgとnotice以外を破棄してしまうと、(Tiarraは平気でも)クライアントが混乱する。 + command: privmsg,notice + + # maskは複数定義可能。定義された順番でマッチングが行なわれます。 + mask: example!*@*.example.net +} + +- User::Nick::Detached { + # クライアントが接続されていない時に、特定のnickに変更します。 + + # クライアントが接続されていない時のnick。 + # このnickが既に使われていたら、適当に変更が加えられて使用されます。 + # クライアントが再び接続されると、切断前のローカルnickに戻ります。 + detached: PHO_d +} + +- User::ServerOper { + # 特定のネットワークに接続した時、OPERコマンドを発行します。 + + # 書式: <ネットワーク名> <オペレータ名> <オペレータパスワード> + # + # ネットワーク"local"に接続した時、オペレータ名oper、 + # オペレータパスワードoper-passでOPERコマンドを発行する例。 + #oper: local oper oper-pass +} + +- User::Vanish { + # 指定された人物の存在を、様々なメッセージから消去する。 + + # 対象となった人物の発行したJOIN、PART、INVITE、QUIT、NICKは消去され、NAMESの返すネームリストからも消える。 + # また、対象となった人物のNJOINも消去される。 + + # Vanish対象が発行したMODEを消去するかどうか。デフォルトで0。 + # 消去するとは云え、本当にMODEそのものを消してしまうのではなく、 + # そのユーザーの代わりに"HIDDEN!HIDDEN@HIDDEN.BY.USER.VANISH"がMODEを実行した事にする。 + drop-mode-by-target: 1 + + # Vanish対象を対象とするMODE +o/-o/+v/-vを消去するかどうか。デフォルトで1。 + drop-mode-switch-for-target: 1 + + # Vanish対象が発行したKICKを消去するかどうか。デフォルトで0。 + # 本当に消すのではなく、"HIDDEN!HIDDEN@HIDDEN.BY.USER.VANISH"がKICKを実行した事にする。 + drop-kick-by-target: 1 + + # Vanish対象を対象とするKICKを消去するかどうか。デフォルトで0。 + drop-kick-for-target: 0 + + # Vanish対象が発行したTOPICを消去するかどうか。デフォルトで0。 + # 本当に消すのでは無いが、他の設定と同じ。 + drop-topic-by-target: 1 + + # チャンネルとVanish対象の定義。 + # 特定のチャンネルでのみ対象とする、といった事が可能。 + # また、privの場合は「#___priv___@ネットワーク名」という文字列をチャンネル名の代わりとしてマッチングを行なう。 + # 書式: mask: <チャンネルのマスク> <ユーザーのマスク> + mask: #example@example example!exapmle@example.com +} + diff -urN /non-existant-dir/bundle/Unicode/Japanese.pm tiarra-20080510/bundle/Unicode/Japanese.pm --- /non-existant-dir/bundle/Unicode/Japanese.pm 1970-01-01 09:00:00.000000000 +0900 +++ tiarra-20080510/bundle/Unicode/Japanese.pm 2008-05-11 00:25:24.000000000 +0900 @@ -0,0 +1,5173 @@ +# ----------------------------------------------------------------------------- +# Unicode::Japanese +# Unicode::Japanese::PurePerl +# ----------------------------------------------------------------------------- +# $Id: Japanese.pm,v 1.24 2007/09/14 05:28:43 hio Exp $ +# ----------------------------------------------------------------------------- +package Unicode::Japanese::PurePerl; +package Unicode::Japanese; + +use strict; +use vars qw($VERSION $PurePerl $xs_loaderror); +$VERSION = '0.44'; + +# `use bytes' and `use Encode' if on perl-5.8.0 or later. +if( $] >= 5.008 ) +{ + my $evalerr; + { + local($SIG{__DIE__}) = 'DEFAULT'; + local($@); + eval 'use bytes;use Encode;'; + $evalerr = $@; + } + $evalerr and CORE::die($evalerr); +} + +# ----------------------------------------------------------------------------- +# import +# +sub import +{ + my $pkg = shift; + my ($callerpkg) = caller; + my %exp = + ( + '&unijp' => \&unijp, + ); + my @na; + my @add = (grep{$_ eq ':all'} @_) ? keys %exp : (); + foreach(@_, @add) + { + $_ eq 'PurePerl' and $PurePerl=1, next; + if( $exp{$_} || $exp{'&'.$_} ) + { + no strict 'refs'; + (my $name = $_) =~ s/^\W//; + my $obj = $exp{$_} || $exp{'&'.$_}; + *{$callerpkg.'::'.$name} = $obj; + }elsif( $_ eq 'no_I18N_Japanese' ) + { + $^H &= ~0x0f00_0000; + package Unicode::Japanese::PurePerl; + $^H &= ~0x0f00_0000; + package Unicode::Japanese; + next; + } + push(@na,$_); + } + if( @na ) + { + #use Carp; + #croak("invalid parameter (".join(',',@na).")"); + } +} + +# ----------------------------------------------------------------------------- +# DESTROY +# +sub DESTROY +{ +} + +# ----------------------------------------------------------------------------- +# load_xs. +# loading xs-subs. +# this method is called from new (through new=>_init_table=>load_xs) +# +sub load_xs +{ + #print STDERR "load_xs\n"; + if( $PurePerl ) + { + #print STDERR "PurePerl mode\n"; + $xs_loaderror = 'disabled'; + return; + } + #print STDERR "XS mode\n"; + + my $use_xs; + LoadXS: + { + + #print STDERR "* * bootstrap...\n"; + eval q + { + use strict; + require DynaLoader; + use vars qw(@ISA); + @ISA = qw(DynaLoader); + local($SIG{__DIE__}) = 'DEFAULT'; + Unicode::Japanese->bootstrap($VERSION); + }; + #print STDERR "* * try done.\n"; + #undef @ISA; + if( $@ ) + { + #print STDERR "failed.\n"; + #print STDERR "$@\n"; + $use_xs = 0; + $xs_loaderror = $@; + undef $@; + last LoadXS; + } + #print STDERR "succeeded.\n"; + $use_xs = 1; + eval q + { + #print STDERR "over riding _s2u,_u2s\n"; + do_memmap(); + #print STDERR "memmap done\n"; + END{ do_memunmap(); } + #print STDERR "binding xsubs done.\n"; + }; + if( $@ ) + { + #print STDERR "error on last part of load XS.\n"; + $xs_loaderror = $@; + CORE::die($@); + } + + #print STDERR "done.\n"; + } + + if( $@ ) + { + $xs_loaderror = $@; + CORE::die("Cannot Load Unicode::Japanese either XS nor PurePerl\n$@"); + } + if( !$use_xs ) + { + #print STDERR "no xs.\n"; + eval q + { + sub do_memmap($){} + sub do_memunmap($){} + }; + } + $xs_loaderror = '' if( !defined($xs_loaderror) ); + #print STDERR "load_xs done.\n"; +} + +# ----------------------------------------------------------------------------- +# Unicode::Japanese->new(); +# cache for char convert. +# 2bytes. +# JIS C 6226-1979 \e$@ +# JIS X 0208-1983 \e$B +# JIS X 0208-1990 \e&@\e$B +# JIS X 0212-1990 \e$(D +# 1byte. +# JIS ROMAN \e(J +# JIS ROMAN \e(H +# ASCII \e(B +# JIS KANA \e(I +# ----------------------------------------------------------------------------- +# $unijp = Unicode::Japanese->new([$str,[$icode]]); +# +sub new +{ + my $pkg = shift; + my $this = {}; + + if( defined($pkg) ) + { + bless $this, $pkg; + $this->_init_table; + }else + { + bless $this; + $this->_init_table; + } + + @_ and $this->set(@_); + + $this; +} + + +# ----------------------------------------------------------------------------- +# _got_undefined_subroutine +# die with message 'undefiend subroutine'. +# +sub _got_undefined_subroutine +{ + my $subname = pop; + CORE::die "Undefined subroutine \&$subname called.\n"; +} + +# ----------------------------------------------------------------------------- +# AUTOLOAD +# AUTOLOAD of Unicode::Japanese. +# imports PurePerl methods. +# +AUTOLOAD +{ + # load pure perl subs. + use vars qw($AUTOLOAD); + my ($pkg,$subname) = $AUTOLOAD =~ /^(.*)::(\w+)$/ + or got_undefined_subroutine($AUTOLOAD); + no strict 'refs'; + if(!defined($Unicode::Japanese::xs_loaderror) ) + { + Unicode::Japanese::PurePerl::_init_table(); + if( defined(&$AUTOLOAD) ) + { + return &$AUTOLOAD; + } + } + my $ppsubname = "$pkg\:\:PurePerl\:\:$subname"; + my $sub = \&$ppsubname; + *$AUTOLOAD = $sub; # copy. + goto &$sub; +} + +# ----------------------------------------------------------------------------- +# Unicode::Japanese::PurePerl +# ----------------------------------------------------------------------------- +package Unicode::Japanese::PurePerl; + + +use strict; +use vars qw(%CHARCODE %ESC %RE); + +use vars qw(@J2S @S2J @S2E @E2S @U2T %T2U %S2U %U2S %SA2U1 %U2SA1 %SA2U2 %U2SA2); + +%CHARCODE = ( + UNDEF_EUC => "\xa2\xae", + UNDEF_SJIS => "\x81\xac", + UNDEF_JIS => "\xa2\xf7", + UNDEF_UNICODE => "\x20\x20", + ); + +%ESC = ( + JIS_0208 => "\e\$B", + JIS_0212 => "\e\$(D", + ASC => "\e\(B", + KANA => "\e\(I", + E_JSKY_START => "\e\$", + E_JSKY_END => "\x0f", + ); + +%RE = + ( + ASCII => '[\x00-\x7f]', + EUC_0212 => '\x8f[\xa1-\xfe][\xa1-\xfe]', + EUC_C => '[\xa1-\xfe][\xa1-\xfe]', + EUC_KANA => '\x8e[\xa1-\xdf]', + JIS_0208 => '\e\$\@|\e\$B|\e&\@\e\$B', + JIS_0212 => "\e" . '\$\(D', + JIS_ASC => "\e" . '\([BJ]', + JIS_KANA => "\e" . '\(I', + SJIS_DBCS => '[\x81-\x9f\xe0-\xef\xfa-\xfc][\x40-\x7e\x80-\xfc]', + SJIS_KANA => '[\xa1-\xdf]', + UTF8 => '[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5}', + BOM2_BE => '\xfe\xff', + BOM2_LE => '\xff\xfe', + BOM4_BE => '\x00\x00\xfe\xff', + BOM4_LE => '\xff\xfe\x00\x00', + UTF32_BE => '\x00[\x00-\x10][\x00-\xff]{2}', + UTF32_LE => '[\x00-\xff]{2}[\x00-\x10]\x00', + E_IMODEv1 => '\xf8[\x9f-\xfc]|\xf9[\x40-\x49\x50-\x52\x55-\x57\x5b-\x5e\x72-\x7e\x80-\xb0]', + E_IMODEv2 => '\xf9[\xb1-\xfc]', + E_IMODE => '\xf8[\x9f-\xfc]|\xf9[\x40-\x49\x50-\x52\x55-\x57\x5b-\x5e\x72-\x7e\x80-\xfc]', + E_JSKY1 => '[EFGOPQ]', + E_JSKY1v1 => '[EFG]', + E_JSKY1v2 => '[OPQ]', + E_JSKY2 => '[\!-z]', + E_DOTI => '\xf0[\x40-\x7e\x80-\xfc]|\xf1[\x40-\x7e\x80-\xd6]|\xf2[\x40-\x7e\x80-\xab\xb0-\xd5\xdf-\xfc]|\xf3[\x40-\x7e\x80-\xfa]|\xf4[\x40-\x4f\x80\x84-\x8a\x8c-\x8e\x90\x94-\x96\x98-\x9c\xa0-\xa4\xa8-\xaf\xb4\xb5\xbc-\xbe\xc4\xc5\xc8\xcc]', + E_JIS_AU => '[\x75-\x7b][\x21-\x7e]', + E_SJIS_AU => '[\xf3\xf4\xf6\xf7][\x40-\xfc]', + E_ICON_AU_START => '', + E_JSKY_START => quotemeta($ESC{E_JSKY_START}), + E_JSKY_END => '(?:'.quotemeta($ESC{E_JSKY_END}).'|\z)', + E_JSKYv1_UTF8 => qr/\xee(?:\x80[\x81-\xbf]|\x81[\x80-\x9a]|\x84[\x81-\xbf]|\x85[\x80-\x9a]|\x88[\x81-\xbf]|\x89[\x80-\x9a])/, + E_JSKYv2_UTF8 => qr/\xee(?:\x8c[\x81-\xbf]|\x8d[\x80-\x8d]|\x90[\x81-\xbf]|\x91[\x80-\x8c]|\x94[\x81-\xb7])/, + ); + +$RE{E_JSKY} = $RE{E_JSKY_START} + . $RE{E_JSKY1} . $RE{E_JSKY2} . '+' + . $RE{E_JSKY_END}; +$RE{E_JSKYv1} = $RE{E_JSKY_START} + . $RE{E_JSKY1v1} . $RE{E_JSKY2} . '+' + . $RE{E_JSKY_END}; +$RE{E_JSKYv2} = $RE{E_JSKY_START} + . $RE{E_JSKY1v2} . $RE{E_JSKY2} . '+' + . $RE{E_JSKY_END}; + +our @CHARSET_LIST = qw( + utf8 + ucs2 + ucs4 + utf16 + + sjis + sjis-imode + sjis-doti + sjis-jsky + sjis-icon-au + cp932 + + jis + jis-jsky + jis-au + jis-icon-au + + euc + euc-jp + euc-icon-au + + utf8-jsky + utf8-icon-au +); + +use vars qw($s2u_table $u2s_table); +use vars qw($ei2u1 $ei2u2 $ed2u $ej2u1 $ej2u2 $ea2u1 $ea2u2 $ea2u1s $ea2u2s); +use vars qw($eu2i1 $eu2i2 $eu2d $eu2j1 $eu2j2 $eu2a1 $eu2a2 $eu2a1s $eu2a2s); + +use vars qw(%_h2zNum %_z2hNum %_h2zAlpha %_z2hAlpha %_h2zSym %_z2hSym %_h2zKanaK %_z2hKanaK %_h2zKanaD %_z2hKanaD %_hira2kata %_kata2hira); + + + +use vars qw($FH $TABLE $HEADLEN $PROGLEN); + +# ----------------------------------------------------------------------------- +# AUTOLOAD +# AUTOLOAD of Unicode::Japanese::PurePerl. +# load PurePerl methods from embeded data. +# +AUTOLOAD +{ + use strict; + use vars qw($AUTOLOAD); + + #print STDERR "AUTOLOAD... $AUTOLOAD\n"; + + my $save = $@; + my @BAK = @_; + + my $subname = $AUTOLOAD; + $subname =~ s/^Unicode\:\:Japanese\:\:(?:PurePerl\:\:)?//; + + #print "subs..\n",join("\n",keys %$TABLE,''); + + # check + if(!defined($TABLE->{$subname}{offset})) + { + _init_table(); + if( !defined($TABLE->{$subname}{offset}) ) + { + if( substr($AUTOLOAD,-9) eq '::DESTROY' ) + { + { + no strict; + *$AUTOLOAD = sub {}; + } + $@ = $save; + @_ = @BAK; + goto &$AUTOLOAD; + } + + CORE::die "Undefined subroutine \&$AUTOLOAD called.\n"; + } + } + if($TABLE->{$subname}{offset} == -1) + { + CORE::die "Double loaded \&$AUTOLOAD. It has some error.\n"; + } + + seek($FH, $PROGLEN + $HEADLEN + $TABLE->{$subname}{offset}, 0) + or die "Can't seek $subname. [$!]\n"; + + my $sub; + read($FH, $sub, $TABLE->{$subname}{length}) + or die "Can't read $subname. [$!]\n"; + + if( $]>=5.008 ) + { + $sub = 'use bytes;'.$sub; + } + + CORE::eval(($sub=~/(.*)/s)[0]); + if ($@) + { + CORE::die $@; + } + $DB::sub = $AUTOLOAD; # Now debugger know where we are. + + # evaled + $TABLE->{$subname}{offset} = -1; + + $@ = $save; + @_ = @BAK; + goto &$AUTOLOAD; +} + +# ----------------------------------------------------------------------------- +# Unicode::Japanese::PurePerl->new() +# +sub new +{ + goto &Unicode::Japanese::new; +} + +# ----------------------------------------------------------------------------- +# DESTROY +# +sub DESTROY +{ +} + +# ----------------------------------------------------------------------------- +# gensym +# +sub gensym { + package Unicode::Japanese::Symbol; + no strict; + $genpkg = "Unicode::Japanese::Symbol::"; + $genseq = 0; + my $name = "GEN" . $genseq++; + my $ref = \*{$genpkg . $name}; + delete $$genpkg{$name}; + $ref; +} + +# ----------------------------------------------------------------------------- +# _init_table +# +sub _init_table { + + if(!defined($HEADLEN)) + { + $FH = gensym; + + my $file = "Unicode/Japanese.pm"; + OPEN: + { + if( $INC{$file} ) + { + open($FH,$INC{$file}) || CORE::die("could not open file [$INC{$file}] for input : $!"); + last OPEN; + } + foreach my $path (@INC) + { + my $mypath = $path; + $mypath =~ s#/$##; + if (-f "$mypath/$file") + { + open($FH,"$mypath/$file") || CORE::die("could not open file [$INC{$file}] for input : $!"); + last OPEN; + } + } + CORE::die "Can't find Japanese.pm in \@INC\n"; + } + binmode($FH); + + local($/) = "\n"; + my $line; + while($line = <$FH>) + { + last if($line =~ m/^__DATA__/); + } + $PROGLEN = tell($FH); + + read($FH, $HEADLEN, 4) + or die "Can't read table. [$!]\n"; + $HEADLEN = unpack('N', $HEADLEN); + read($FH, $TABLE, $HEADLEN) + or die "Can't seek table. [$!]\n"; + $TABLE =~ /(.*)/s; + $TABLE = eval(($TABLE=~/(.*)/s)[0]); + if($@) + { + die "Internal Error. [$@]\n"; + } + if(!defined($TABLE)) + { + die "Internal Error.\n"; + } + $HEADLEN += 4; + + # load xs. + Unicode::Japanese::load_xs(); + } +} + +# ----------------------------------------------------------------------------- +# _getFile +# load embeded file data. +# +sub _getFile { + my $this = shift; + + my $file = shift; + + exists($TABLE->{$file}) + or die "no such file [$file]\n"; + + #my $offset16 = $TABLE->{$file}{offset} % 16; + #print STDERR "_getFile($file, $TABLE->{$file}{offset}, $TABLE->{$file}{length}, $offset16)\n"; + seek($FH, $PROGLEN + $HEADLEN + $TABLE->{$file}{offset}, 0) + or die "Can't seek $file. [$!]\n"; + + my $data; + read($FH, $data, $TABLE->{$file}{length}) + or die "Can't read $file. [$!]\n"; + + $data; +} + +# ----------------------------------------------------------------------------- +# use_I18N_Japanese +# copy from I18N::Japanese in jperl-5.5.3 +# +sub use_I18N_Japanese +{ + shift; + if( @_ ) + { + my $bits = 0; + foreach( @_ ) + { + $bits |= 0x1000000 if $_ eq 're'; + $bits |= 0x2000000 if $_ eq 'tr'; + $bits |= 0x4000000 if $_ eq 'format'; + $bits |= 0x8000000 if $_ eq 'string'; + } + $^H |= $bits; + }else + { + $^H |= 0x0f00_0000; + } +} + +# ----------------------------------------------------------------------------- +# no_I18N_Japanese +# copy from I18N::Japanese in jperl-5.5.3 +# +sub no_I18N_Japanese +{ + shift; + if( @_ ) + { + my $bits = 0; + foreach( @_ ) + { + $bits |= 0x1000000 if $_ eq 're'; + $bits |= 0x2000000 if $_ eq 'tr'; + $bits |= 0x4000000 if $_ eq 'format'; + $bits |= 0x8000000 if $_ eq 'string'; + } + $^H &= ~$bits; + }else + { + $^H &= ~0x0f00_0000; + } +} + +1; + +=encoding utf-8 + +=head1 NAME + +Unicode::Japanese - Japanese Character Encoding Handler + + +=head1 SYNOPSIS + + use Unicode::Japanese; + use Unicode::Japanese qw(unijp); + + # convert utf8 -> sjis + + print Unicode::Japanese->new($str)->sjis; + print unijp($str)->sjis; # same as avobe. + + # convert sjis -> utf8 + + print Unicode::Japanese->new($str,'sjis')->get; + + # convert sjis (imode_EMOJI) -> utf8 + + print Unicode::Japanese->new($str,'sjis-imode')->get; + + # convert ZENKAKU (utf8) -> HANKAKU (utf8) + + print Unicode::Japanese->new($str)->z2h->get; + +=head1 DESCRIPTION + +Module for conversion among Japanese character encodings. + + +=head2 FEATURES + +=over 2 + +=item * + + + +The instance stores internal strings in UTF-8. + + +=item * + + + +Supports both XS and Non-XS. +Use XS for high performance, +or No-XS for ease to use (only by copying Japanese.pm). + + +=item * + + + +Supports conversion between ZENKAKU and HANKAKU. + + +=item * + + + +Safely handles "EMOJI" of the mobile phones (DoCoMo i-mode, ASTEL dot-i +and J-PHONE J-Sky) by mapping them on Unicode Private Use Area. + + +=item * + + + +Supports conversion of the same image of EMOJI +between different mobile phone's standard mutually. + + +=item * + + + +Considers Shift_JIS(SJIS) as MS-CP932. +(Shift_JIS on MS-Windows (MS-SJIS/MS-CP932) differ from +generic Shift_JIS encodings.) + + +=item * + + + +On converting Unicode to SJIS (and EUC-JP/JIS), those encodings that cannot +be converted to SJIS (except "EMOJI") are escaped in "&#dddd;" format. +"EMOJI" on Unicode Private Use Area is going to be '?'. +When converting strings from Unicode to SJIS of mobile phones, +any characters not up to their standard is going to be '?' + + +=item * + + + +On perl-5.8.0 and later, setting of utf-8 flag is performed properly. +utf8() method returns utf-8 `bytes' string and +getu() method returns utf-8 `char' string. + + +get() method returns utf-8 `bytes' string in current release. +in future, the behavior of get() maybe change. + + +sjis(), jis(), utf8(), etc.. methods return bytes string. +The input of new, set, and a getcode method is not asked about utf8-flaged/bytes. + + +=back + +=head1 METHODS + +=over 4 + +=item $s = Unicode::Japanese->new($str [, $icode [, $encode]]) + +Creates a new instance of Unicode::Japanese. + + +If arguments are specified, passes through to set method. + + +=item unijp($str [, $icode [, $encode]]) + +Same as Unicode::Janaese->new(...). + + +=item $s->set($str [, $icode [, $encode]]) + +=over 2 + +=item $str: string + +=item $icode: character encodings, may be omitted (default = 'utf8') + +=item $encode: ASCII encoding, may be omitted. + +=back + +Set a string in the instance. +If '$icode' is omitted, string is considered as UTF-8. + + +To specify a encodings, choose from the following; +'auto', 'utf8', 'ucs2', 'ucs4', 'utf16-be', 'utf16-le', 'utf16', +'utf32-be', 'utf32-le', 'utf32', 'jis', 'euc', 'euc-jp', +'sjis', 'cp932', 'sjis-imode', 'sjis-imode1', 'sjis-imode2', +'sjis-doti', 'sjis-doti1', 'sjis-jsky', 'sjis-jsky1', 'sjis-jsky2', +'jis-jsky', 'jis-jsky1', 'jis-jsky2', 'jis-au', 'jis-au1', 'jis-au2', +'sjis-au', 'sjis-au1', 'sjis-au2', 'sjis-icon-au', 'sjis-icon-au1', 'sjis-icon-au2', +'euc-icon-au', 'euc-icon-au1', 'euc-icon-au2', 'jis-icon-au', 'jis-icon-au1', 'jis-icon-au2', +'utf8-icon-au', 'utf8-icon-au1', 'utf8-icon-au2', 'ascii', 'binary' + + +For auto encoding detection, you MUST specify 'auto' +so as to call getcode() method automatically. + + +For ASCII encoding, only 'base64' may be specified. +With it, the string will be decoded before storing. + + +To decode binary, specify 'binary' as the encoding. + + +'&#dddd' will be converted to "EMOJI", when specified 'sjis-imode' +or 'sjis-doti'. + + +In some cases, character encoding detection is +misleaded because more than one encodings have +same code points. + + +sjis is returned if a string is valid for both sjis and utf8. +And sjis-au is return if a string is valid for both +sjis-au and sjis-doti. + + +=item $str = $s->get + +=over 2 + +=item $str: string (UTF-8) + +=back + +Gets a string with UTF-8. + + +return `bytes' string in current release, +this behavior will be changed. + + +utf8() method for `character' string or +getu() method for `bytes' string seems better. + + +=item $str = $s->getu + +=over 2 + +=item $str: string (UTF-8) + +=back + +Gets a string with UTF-8. + + +On perl-5.8.0 and later, return value is with utf-8 flag. + + +=item $code = $s->getcode($str) + +=over 2 + +=item $str: string + +=item $code: character encoding name + +=back + +Detects the character encodings of I<$str>. + + +Notice: This method detects B encoding of the string in the instance +but I<$str>. + + +Character encodings are distinguished by the following algorithm: + + +(In case of PurePerl) + + +=over 4 + +=item 1 + + + +If BOM of UTF-32 is found, the encoding is utf32. + + +=item 2 + + + +If BOM of UTF-16 is found, the encoding is utf16. + + +=item 3 + + + +If it is in proper UTF-32BE, the encoding is utf32-be. + + +=item 4 + + + +If it is in proper UTF-32LE, the encoding is utf32-le. + + +=item 5 + + + +Without NON-ASCII characters, the encoding is ascii. +(control codes except escape sequences has been included in ASCII) + + +=item 6 + + + +If it includes ISO-2022-JP(JIS) escape sequences, the encoding is jis. + + +=item 7 + + + +If it includes "J-PHONE EMOJI", the encoding is sjis-sky. + + +=item 8 + + + +If it is in proper EUC-JP, the encoding is euc. + + +=item 9 + + + +If it is in proper SJIS, the encoding is sjis. + + +If it is in proper SJIS and "EMOJI" of au, the encoding is sjis-au. + + +=item 10 + + + +If it is in proper SJIS and "EMOJI" of i-mode, the encoding is sjis-imode. + + +=item 11 + + + +If it is in proper SJIS and "EMOJI" of dot-i,the encoding is sjis-doti. + + +=item 12 + + + +If it is in proper UTF-8, the encoding is utf8. + + +=item 13 + + + +If none above is true, the encoding is unknown. + + +=back + +(In case of XS) + + +=over 4 + +=item 1 + + + +If BOM of UTF-32 is found, the encoding is utf32. + + +=item 2 + + + +If BOM of UTF-16 is found, the encoding is utf16. + + +=item 3 + + + +String is checked by State Transition if it is applicable +for any listed encodings below. + + +ascii / euc-jp / sjis / jis / utf8 / utf32-be / utf32-le / sjis-jsky / +sjis-imode / sjis-au / sjis-doti + + +=item 4 + + + +The listed order below is applied for a final determination. + + +utf32-be / utf32-le / ascii / jis / euc-jp / sjis / sjis-jsky / sjis-imode / +sjis-au / sjis-doti / utf8 + + +=item 5 + + + +If none above is true, the encoding is unknown. + + +=back + +Regarding the algorithm, pay attention to the following: + + +=over 2 + +=item * + + + +UTF-8 is occasionally detected as SJIS. + + +=item * + + + +Can NOT detect UCS2 automatically. + + +=item * + + + +Can detect UTF-16 only when the string has BOM. + + +=item * + + + +Can detect "EMOJI" when it is stored in binary, not in "&#dddd;" +format. (If only stored in "&#dddd;" format, getcode() will +return incorrect result. In that case, "EMOJI" will be crashed.) + + +=back + +Because each of XS and PurePerl has a different algorithm, A result of +the detection would be possibly different. In case that the string is +SJIS with escape characters, it would be considered as SJIS on +PurePerl. However, it can't be detected as S-JIS on XS. This is +because by using Algorithm, the string can't be distinguished between +SJIS and SJIS-Jsky. This exclusion of escape characters on XS from +the detection is suppose to be the same for EUC-JP. + + +=item $code = $s->getcodelist($str) + +=over 2 + +=item $str: string + +=item $code: character encoding name + +=back + +Detects the character encodings of I<$str>. + + +This function returns all acceptable character encodings. + + +=item $str = $s->conv($ocode, $encode) + +This function returns copy of contained string in $ocode encoding. + + +=over 2 + +=item $ocode: output character encoding (Choose from 'utf8', 'euc', 'euc-jp', 'jis', 'sjis', 'cp932', +'sjis-imode', 'sjis-imode1', 'sjis-imode2', 'sjis-doti', 'sjis-doti1', 'sjis-jsky', 'sjis-jsky1', 'sjis-jsky2', +'jis-jsky', 'jis-jsky1', 'jis-jsky2', 'jis-au', 'jis-au1', 'jis-au2', 'sjis-au', 'sjis-au1', 'sjis-au2', +'sjis-icon-au', 'sjis-icon-au1', 'sjis-icon-au2', 'euc-icon-au', 'euc-icon-au1', 'euc-icon-au2', +'jis-icon-au', 'jis-icon-au1', 'jis-icon-au2', 'utf8-icon-au', 'utf8-icon-au1', 'utf8-icon-au2', +'ucs2', 'ucs4', 'utf16', 'binary') + +Number at end of encoding names means emoji set version. +Larger number is newer set. +No number is same as newest set. +Generally you may use without digits. + + +=item $encode: encoding, may be omitted. + +=item $str: string + +=back + +Gets a string converted to I<$ocode>. + + +For ASCII encoding, only 'base64' may be specified. With it, the string +encoded in base64 will be returned. + + +On perl-5.8.0 and later, return value is not with utf-8 flag, and is +bytes string. + + +=item $s->tag2bin + +Replaces the substrings "&#dddd;" in the string with the binary entity +they mean. + + +=item $s->z2h + +Converts ZENKAKU to HANKAKU. + + +=item $s->h2z + +Converts HANKAKU to ZENKAKU. + + +=item $s->hira2kata + +Converts HIRAGANA to KATAKANA. + + +=item $s->kata2hira + +Converts KATAKANA to HIRAGANA. + + +=item $str = $s->jis + +$str: string (JIS) + + +Gets the string converted to ISO-2022-JP(JIS). + + +=item $str = $s->euc + +$str: string (EUC-JP) + + +Gets the string converted to EUC-JP. + + +=item $str = $s->utf8 + +$str: `bytes' string (UTF-8) + + +Gets the string converted to UTF-8. + + +On perl-5.8.0 and later, return value is not with utf-8 flag, and is +bytes string. + + +=item $str = $s->ucs2 + +$str: string (UCS2) + + +Gets the string converted to UCS2. + + +=item $str = $s->ucs4 + +$str: string (UCS4) + + +Gets the string converted to UCS4. + + +=item $str = $s->utf16 + +$str: string (UTF-16) + + +Gets the string converted to UTF-16(big-endian). +BOM is not added. + + +=item $str = $s->sjis + +$str: string (SJIS) + + +Gets the string converted to Shift_JIS(MS-SJIS/MS-CP932). + + +=item $str = $s->sjis_imode + +$str: string (SJIS/imode_EMOJI) + + +Gets the string converted to SJIS for i-mode. +This method is alias of sjis_imode2. + + +=item $str = $s->sjis_imode1 + +$str: string (SJIS/imode_EMOJI) + + +Gets the string converted to SJIS for i-mode. +$str includes only basic pictgraphs, and is without extended pictgraphs. + + +=item $str = $s->sjis_imode2 + +$str: string (SJIS/imode_EMOJI) + + +Gets the string converted to SJIS for i-mode. +$str includes both basic pictgraphs, and extended ones. + + +=item $str = $s->sjis_doti + +$str: string (SJIS/dot-i_EMOJI) + + +Gets the string converted to SJIS for dot-i. + + +=item $str = $s->sjis_jsky + +$str: string (SJIS/J-SKY_EMOJI) + + +Gets the string converted to SJIS for j-sky. +This method is alias of sjis_jsky2 on VERSION 0.15. + + +=item $str = $s->sjis_jsky1 + +$str: string (SJIS/J-SKY_EMOJI) + + +Gets the string converted to SJIS for j-sky. +$str includes from Page 1 to Page 3. + + +=item $str = $s->sjis_jsky + +$str: string (SJIS/J-SKY_EMOJI) + + +Gets the string converted to SJIS for j-sky. +$str includes from Page 1 to Page 6. + + +=item $str = $s->sjis_icon_au + +$str: string (SJIS/AU-ICON-TAG) + + +Gets the string converted to SJIS for au. + + +=item @str = $s->strcut($len) + +=over 2 + +=item $len: number of characters + +=item @str: strings + +=back + +Splits the string by length(I<$len>). + + +On perl-5.8.0 and later, each element in return array +is with utf-8 flag. + + +=item $len = $s->strlen + +$len: `visual width' of the string + + +Gets the length of the string. This method has been offered to +substitute for perl build-in length(). ZENKAKU characters are +assumed to have lengths of 2, regardless of the coding being +SJIS or UTF-8. + + +=item $s->join_csv(@values); + +@values: data array + + +Converts the array to a string in CSV format, then stores into the instance. +In the meantime, adds a newline("\n") at the end of string. + + +=item @values = $s->split_csv; + +@values: data array + + +Splits the string, accounting it is in CSV format. +Each newline("\n") is removed before split. + + +on perl-5.8.0 and later, utf-8 flag of return value depends on +icode of set method. if $s contains binary, return value is bytes +too. if $s contains any string, return value is with utf-8 flag. + + +=back + +=head1 DESCRIPTION OF UNICODE MAPPING + +Translation is proceedede as follows. + + +=over 2 + +=item SJIS + +Mapped as MS-CP932. Mapping table in the following URL is used. + + +ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT + + +If a character cannot be mapped to SJIS from Unicode, +it will be converted to &#dddd; format. +Pictgraphs are converted to "?"; + + +Also, any unmapped character will be converted into "?" when converting +to SJIS for mobile phones. + + +=item EUC-JP/JIS + +Converted to SJIS and then mapped to Unicode. Any non-SJIS character +in the string will not be mapped correctly. + + +=item DoCoMo i-mode + +Portion of involving "EMOJI" in F800 - F9FF is maapped + to U+0FF800 - U+0FF9FF. + + +=item ASTEL dot-i + +Portion of involving "EMOJI" in F000 - F4FF is mapped + to U+0FF000 - U+0FF4FF. + + +=item J-PHONE J-SKY + +"J-SKY EMOJI" are mapped down as follows: "\e\$"(\x1b\x24) escape +sequences, the first byte, the second byte and "\x0f". +With sequential "EMOJI"s of identical first bytes, +it may be compressed by arranging only the second bytes. + + +4500 - 47FF is mapped to U+0FFB00 - U+0FFDFF, accounting the first +and the second bytes make one EMOJI character. + + +Unicode::Japanese will compress "J-SKY_EMOJI" automatically when +the first bytes of a sequence of "EMOJI" are identical. + + +=item AU + +Portion of involving "EMOJI" is mapped to U+0FF500 - U+0FF6FF. + + +=back + +=head1 PurePerl mode + + use Unicode::Japanese qw(PurePerl); + +If module was loaded with 'PurePerl' keyword, +it works on Non-XS mode. + + +=head1 BUGS + +=over 2 + +=item * + + + +EUC-JP, JIS strings cannot be converted correctly when they include +non-SJIS characters because they are converted to SJIS before +being converted to UTF-8. + + +=item * + + + +When using XS, character encoding detection of EUC-JP and +SJIS(included all EMOJI) strings when they include "\e" will +fail. Also, getcode() and all convert method will not work. + + +=item * + + + +The Japanese.pm file will collapse if sent via ASCII mode of FTP, +as it has a trailing binary data. + + +=back + +=head1 AUTHOR INFORMATION + +Copyright 2001-2007 +SANO Taku (SAWATARI Mikage) and YAMASHINA Hio. +All right reserved. + + +This library is free software; you can redistribute it +and/or modify it under the same terms as Perl itself. + + +=head1 BUGS + +Bug reports and comments to: mikage@cpan.org. +Thank you. + + +Or, report any bugs or feature requests to +C, or through the web interface at +L. +I will be notified, and then you'll automatically be notified of progress on +your bug as I make changes. + + +=head1 SUPPORT + +You can find documentation for this module with the perldoc command. + + + perldoc Unicode::Japanese + +You can also look for information at: + + +=over 4 + +=item * AnnoCPAN: Annotated CPAN documentation + +L + + +=item * CPAN Ratings + +L + + +=item * RT: CPAN's request tracker + +L + + +=item * Search CPAN + +L + + +=back + +=head1 CREDITS + +Thanks very much to: + + +NAKAYAMA Nao + + +SUGIURA Tatsuki & Debian JP Project + + +=head1 COPYRIGHT & LICENSE + +Copyright 2001-2007 +SANO Taku (SAWATARI Mikage) and YAMASHINA Hio, +all rights reserved. + + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + + + +=cut + + + +__DATA__ +{'joinCsv'=>{'length'=>939,'offset'=>0},'_decodeBase64'=>{'length'=>609,'offset'=>939},'z2hNum'=>{'length'=>284,'offset'=>1548},'_utf16le_utf16'=>{'length'=>179,'offset'=>3074},'kata2hira'=>{'length'=>1242,'offset'=>1832},'jcode/emoji2/ea2u.dat'=>{'length'=>1320,'offset'=>372976},'_u2ai2'=>{'length'=>1062,'offset'=>3253},'z2hAlpha'=>{'length'=>836,'offset'=>4315},'_ucs4_utf8'=>{'length'=>936,'offset'=>5151},'h2zSym'=>{'length'=>316,'offset'=>6087},'utf8_icon_au1'=>{'length'=>73,'offset'=>6403},'h2z'=>{'length'=>114,'offset'=>6476},'jcode/emoji2/ea2u2s.dat'=>{'length'=>4096,'offset'=>430848},'sjis'=>{'length'=>177,'offset'=>6590},'euc_icon_au2'=>{'length'=>98,'offset'=>6767},'_u2si1'=>{'length'=>1619,'offset'=>6865},'_sj2u1'=>{'length'=>1144,'offset'=>8484},'euc_icon_au'=>{'length'=>97,'offset'=>9956},'tag2bin'=>{'length'=>328,'offset'=>9628},'z2hSym'=>{'length'=>596,'offset'=>10053},'ucs2'=>{'length'=>183,'offset'=>10649},'jis_au2'=>{'length'=>80,'offset'=>10832},'jcode/emoji2/ei2u2.dat'=>{'length'=>2048,'offset'=>244976},'_si2u1'=>{'length'=>1228,'offset'=>10912},'_utf8_utf16'=>{'length'=>950,'offset'=>12140},'jis_icon_au1'=>{'length'=>98,'offset'=>13090},'sjis_icon_au1'=>{'length'=>86,'offset'=>13188},'sjis_jsky2'=>{'length'=>70,'offset'=>13274},'jcode/emoji2/ei2u.dat'=>{'length'=>2048,'offset'=>226544},'getcode'=>{'length'=>2026,'offset'=>13344},'_j2s2'=>{'length'=>469,'offset'=>15370},'jcode/emoji2/ea2us.dat'=>{'length'=>4096,'offset'=>410368},'sjis_au2'=>{'length'=>95,'offset'=>15839},'h2zKanaD'=>{'length'=>810,'offset'=>15934},'sjis_imode1'=>{'length'=>71,'offset'=>16744},'eucjp'=>{'length'=>32,'offset'=>16815},'utf8'=>{'length'=>187,'offset'=>16847},'_s2e'=>{'length'=>244,'offset'=>17034},'jcode/emoji2/ea2u2.dat'=>{'length'=>3288,'offset'=>390688},'utf8_jsky'=>{'length'=>189,'offset'=>17278},'_uj2u2'=>{'length'=>874,'offset'=>17467},'utf8_jsky1'=>{'length'=>70,'offset'=>18341},'jcode/emoji2/eu2a2.dat'=>{'length'=>16384,'offset'=>393984},'jcode/s2u.dat'=>{'length'=>48573,'offset'=>177968},'conv'=>{'length'=>3663,'offset'=>18411},'_utf16be_utf16'=>{'length'=>71,'offset'=>22074},'jcode/emoji2/eu2j.dat'=>{'length'=>40960,'offset'=>266480},'hira2kata'=>{'length'=>1242,'offset'=>22145},'splitCsvu'=>{'length'=>197,'offset'=>23387},'sjis_doti1'=>{'length'=>69,'offset'=>23584},'_s2j'=>{'length'=>272,'offset'=>23653},'_sa2j2'=>{'length'=>384,'offset'=>23925},'_j2sa'=>{'length'=>179,'offset'=>24309},'sjis_au1'=>{'length'=>95,'offset'=>24488},'join_csv'=>{'length'=>29,'offset'=>24583},'_ai2u1'=>{'length'=>458,'offset'=>24612},'jcode/emoji2/eu2as.dat'=>{'length'=>16384,'offset'=>414464},'_s2u'=>{'length'=>988,'offset'=>25070},'jis_jsky1'=>{'length'=>82,'offset'=>26058},'jis_icon_au2'=>{'length'=>98,'offset'=>26140},'_j2sa3'=>{'length'=>434,'offset'=>26238},'sjis_jsky'=>{'length'=>189,'offset'=>26672},'_u2uj2'=>{'length'=>788,'offset'=>26861},'jis'=>{'length'=>179,'offset'=>27649},'jis_au1'=>{'length'=>80,'offset'=>27828},'_utf8_ucs4'=>{'length'=>1149,'offset'=>27908},'get'=>{'length'=>162,'offset'=>29057},'z2h'=>{'length'=>114,'offset'=>29219},'getu'=>{'length'=>266,'offset'=>29333},'_loadConvTable'=>{'length'=>18009,'offset'=>29599},'unijp'=>{'length'=>137,'offset'=>47608},'_u2uj1'=>{'length'=>806,'offset'=>47745},'jcode/emoji2/eu2a2s.dat'=>{'length'=>16384,'offset'=>434944},'_u2ja1'=>{'length'=>1639,'offset'=>48551},'_j2s'=>{'length'=>177,'offset'=>50190},'utf16'=>{'length'=>187,'offset'=>50367},'utf8_jsky2'=>{'length'=>70,'offset'=>50554},'_u2ai1'=>{'length'=>1203,'offset'=>50624},'sjis_icon_au2'=>{'length'=>86,'offset'=>51827},'_u2si2'=>{'length'=>1620,'offset'=>51913},'jcode/emoji2/eu2i.dat'=>{'length'=>16384,'offset'=>228592},'splitCsv'=>{'length'=>350,'offset'=>53533},'jcode/emoji2/eu2i2.dat'=>{'length'=>16384,'offset'=>247024},'sjis_jsky1'=>{'length'=>70,'offset'=>53883},'_s2j3'=>{'length'=>355,'offset'=>53953},'_sa2u1'=>{'length'=>1137,'offset'=>54308},'_u2s'=>{'length'=>2320,'offset'=>55445},'_sa2j3'=>{'length'=>455,'offset'=>57765},'_utf16_utf8'=>{'length'=>769,'offset'=>58220},'h2zNum'=>{'length'=>174,'offset'=>58989},'h2zKanaK'=>{'length'=>979,'offset'=>59163},'strlen'=>{'length'=>360,'offset'=>60142},'strcutu'=>{'length'=>195,'offset'=>60502},'sjis_imode2'=>{'length'=>71,'offset'=>60697},'_validate_utf8'=>{'length'=>855,'offset'=>60768},'jcode/emoji2/eu2a.dat'=>{'length'=>16384,'offset'=>374304},'set'=>{'length'=>5325,'offset'=>61623},'_ucs2_utf8'=>{'length'=>549,'offset'=>66948},'_utf16_utf16'=>{'length'=>300,'offset'=>67497},'h2zAlpha'=>{'length'=>264,'offset'=>67797},'z2hKanaK'=>{'length'=>979,'offset'=>68061},'getcodelist'=>{'length'=>2241,'offset'=>69040},'_sj2u2'=>{'length'=>1503,'offset'=>71281},'jcode/emoji2/ed2u.dat'=>{'length'=>5120,'offset'=>351472},'jis_icon_au'=>{'length'=>97,'offset'=>72784},'_utf32_ucs4'=>{'length'=>312,'offset'=>72881},'_ai2u2'=>{'length'=>410,'offset'=>73193},'utf8_icon_au2'=>{'length'=>73,'offset'=>73603},'_uj2u1'=>{'length'=>600,'offset'=>73676},'_sa2j'=>{'length'=>174,'offset'=>74276},'h2zKana'=>{'length'=>185,'offset'=>74450},'z2hKana'=>{'length'=>89,'offset'=>74635},'_si2u2'=>{'length'=>1227,'offset'=>74724},'_u2sj1'=>{'length'=>1772,'offset'=>75951},'_u2sj2'=>{'length'=>1794,'offset'=>77723},'utf8_icon_au'=>{'length'=>72,'offset'=>79517},'jis_jsky2'=>{'length'=>82,'offset'=>79589},'sjis_doti'=>{'length'=>188,'offset'=>79671},'_e2s'=>{'length'=>202,'offset'=>79859},'jcode/emoji2/ej2u2.dat'=>{'length'=>3072,'offset'=>307440},'euc'=>{'length'=>175,'offset'=>80061},'_j2s3'=>{'length'=>337,'offset'=>80236},'jcode/emoji2/ej2u.dat'=>{'length'=>3072,'offset'=>263408},'_j2sa2'=>{'length'=>446,'offset'=>80573},'ucs4'=>{'length'=>183,'offset'=>81019},'_sd2u'=>{'length'=>1221,'offset'=>81202},'_u2ja2'=>{'length'=>1640,'offset'=>82423},'_s2e2'=>{'length'=>446,'offset'=>84063},'z2hKanaD'=>{'length'=>498,'offset'=>84509},'_u2sd'=>{'length'=>1615,'offset'=>85007},'sjis_au'=>{'length'=>94,'offset'=>86622},'jcode/emoji2/eu2j2.dat'=>{'length'=>40960,'offset'=>310512},'jcode/emoji2/eu2d.dat'=>{'length'=>16384,'offset'=>356592},'jcode/u2s.dat'=>{'length'=>85504,'offset'=>92464},'_utf8_ucs2'=>{'length'=>755,'offset'=>86716},'euc_icon_au1'=>{'length'=>98,'offset'=>87471},'jis_au'=>{'length'=>195,'offset'=>87569},'_utf32le_ucs4'=>{'length'=>178,'offset'=>87764},'sjis_imode'=>{'length'=>192,'offset'=>87942},'_e2s2'=>{'length'=>535,'offset'=>88134},'_s2j2'=>{'length'=>377,'offset'=>88669},'_encodeBase64'=>{'length'=>741,'offset'=>89046},'validate_utf8'=>{'length'=>129,'offset'=>89787},'sjis_icon_au'=>{'length'=>85,'offset'=>89916},'split_csv'=>{'length'=>131,'offset'=>90001},'_sa2u2'=>{'length'=>1138,'offset'=>90132},'jis_jsky'=>{'length'=>200,'offset'=>91270},'strcut'=>{'length'=>888,'offset'=>91470},'cp932'=>{'length'=>33,'offset'=>92358},'_utf32be_ucs4'=>{'length'=>70,'offset'=>92391}} sub joinCsv { + my $this = shift; + my $list; + + if(ref($_[0]) eq 'ARRAY') + { + $list = shift; + if( $]>=5.008 ) + { + $list = [ @$list ]; + foreach(@$list) + { + defined($_) and Encode::_utf8_off($_); + } + } + } + elsif(!ref($_[0])) + { + $list = [ @_ ]; + if( $]>=5.008 ) + { + foreach(@$list) + { + defined($_) and Encode::_utf8_off($_); + } + } + } + else + { + my $ref = ref($_[0]); + die "String->joinCsv, Param[1] is not ARRAY/ARRRAY-ref. [$ref]\n"; + } + + my $text; + if( $^W && grep{!defined($_)}@$list ) + { + $_[0] && $list eq $_[0] and $list = [@$list]; + foreach(@$list) + { + defined($_) and next; + warn "Use of uninitialized value in Unicode::Japanese::joinCsv"; + $_ = ""; + } + } + $text = join ',', map {defined($_) ? (s/"/""/g or /[\r\n,]/) ? qq("$_") : $_ : ""} @$list; + + $this->{str} = $text."\n"; + $this->{icode} = 'binary'; + + $this; +} +sub _decodeBase64 +{ + local($^W) = 0; # unpack("u",...) gives bogus warning in 5.00[123] + + my $this = shift; + my $str = shift; + my $res = ""; + + $str =~ tr|A-Za-z0-9+=/||cd; # remove non-base64 chars + if (length($str) % 4) + { + warn("Length of base64 data not a multiple of 4"); + } + $str =~ s/=+$//; # remove padding + $str =~ tr|A-Za-z0-9+/| -_|; # convert to uuencoded format + while ($str =~ /(.{1,60})/gs) + { + my $len = chr(32 + length($1)*3/4); # compute length byte + $res .= unpack("u", $len . $1 ); # uudecode + } + $res; +} +sub z2hNum { + my $this = shift; + + if(!defined(%_z2hNum)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(\xef\xbc\x90|\xef\xbc\x91|\xef\xbc\x92|\xef\xbc\x93|\xef\xbc\x94|\xef\xbc\x95|\xef\xbc\x96|\xef\xbc\x97|\xef\xbc\x98|\xef\xbc\x99)/$_z2hNum{$1}/eg; + + $this; +} +sub kata2hira { + my $this = shift; + + if(!defined(%_kata2hira)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(\xe3\x82\xa1|\xe3\x82\xa2|\xe3\x82\xa3|\xe3\x82\xa4|\xe3\x82\xa5|\xe3\x82\xa6|\xe3\x82\xa7|\xe3\x82\xa8|\xe3\x82\xa9|\xe3\x82\xaa|\xe3\x82\xab|\xe3\x82\xac|\xe3\x82\xad|\xe3\x82\xae|\xe3\x82\xaf|\xe3\x82\xb0|\xe3\x82\xb1|\xe3\x82\xb2|\xe3\x82\xb3|\xe3\x82\xb4|\xe3\x82\xb5|\xe3\x82\xb6|\xe3\x82\xb7|\xe3\x82\xb8|\xe3\x82\xb9|\xe3\x82\xba|\xe3\x82\xbb|\xe3\x82\xbc|\xe3\x82\xbd|\xe3\x82\xbe|\xe3\x82\xbf|\xe3\x83\x80|\xe3\x83\x81|\xe3\x83\x82|\xe3\x83\x83|\xe3\x83\x84|\xe3\x83\x85|\xe3\x83\x86|\xe3\x83\x87|\xe3\x83\x88|\xe3\x83\x89|\xe3\x83\x8a|\xe3\x83\x8b|\xe3\x83\x8c|\xe3\x83\x8d|\xe3\x83\x8e|\xe3\x83\x8f|\xe3\x83\x90|\xe3\x83\x91|\xe3\x83\x92|\xe3\x83\x93|\xe3\x83\x94|\xe3\x83\x95|\xe3\x83\x96|\xe3\x83\x97|\xe3\x83\x98|\xe3\x83\x99|\xe3\x83\x9a|\xe3\x83\x9b|\xe3\x83\x9c|\xe3\x83\x9d|\xe3\x83\x9e|\xe3\x83\x9f|\xe3\x83\xa0|\xe3\x83\xa1|\xe3\x83\xa2|\xe3\x83\xa3|\xe3\x83\xa4|\xe3\x83\xa5|\xe3\x83\xa6|\xe3\x83\xa7|\xe3\x83\xa8|\xe3\x83\xa9|\xe3\x83\xaa|\xe3\x83\xab|\xe3\x83\xac|\xe3\x83\xad|\xe3\x83\xae|\xe3\x83\xaf|\xe3\x83\xb0|\xe3\x83\xb1|\xe3\x83\xb2|\xe3\x83\xb3)/$_kata2hira{$1}/eg; + + $this; +} +sub _utf16le_utf16 { + my $this = shift; + my $str = shift; + + my $result = ''; + foreach my $ch (unpack('v*', $str)) + { + $result .= pack('n', $ch); + } + + $result; +} +sub _u2ai2 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($eu2a2)) + { + $eu2a2 = $this->_getFile('jcode/emoji2/eu2a2.dat'); + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + my $c; + my $d; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})|([^\x00-\x7f])/ + defined($2) ? '?' : + ((length($1) == 1) ? $1 : + (length($1) == 2) ? $1 : + (length($1) == 3) ? $1 : + (length($1) == 4) ? ( + ($c1,$c2,$c3,$c4) = unpack("C4", $1), + $ch = (($c1 & 0x07)<<18)|(($c2 & 0x3F)<<12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F), + ( + ($ch >= 0x0fe000 and $ch <= 0x0fffff) ? + ( + $c = substr($eu2a2, ($ch - 0x0fe000) * 2, 2), + $d = unpack('n', $c), + $c =~ tr,\0,,d, + ($d <= 0x0336) ? $RE{E_ICON_AU_START} . $d . $RE{E_ICON_AU_END} : + ($c eq '') ? '?' : $c + ) : + '?' + ) + ) : + '?' + ) + /eg; + + $str; +} +sub z2hAlpha { + my $this = shift; + + if(!defined(%_z2hAlpha)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(\xef\xbc\xa1|\xef\xbc\xa2|\xef\xbc\xa3|\xef\xbc\xa4|\xef\xbc\xa5|\xef\xbc\xa6|\xef\xbc\xa7|\xef\xbc\xa8|\xef\xbc\xa9|\xef\xbc\xaa|\xef\xbc\xab|\xef\xbc\xac|\xef\xbc\xad|\xef\xbc\xae|\xef\xbc\xaf|\xef\xbc\xb0|\xef\xbc\xb1|\xef\xbc\xb2|\xef\xbc\xb3|\xef\xbc\xb4|\xef\xbc\xb5|\xef\xbc\xb6|\xef\xbc\xb7|\xef\xbc\xb8|\xef\xbc\xb9|\xef\xbc\xba|\xef\xbd\x81|\xef\xbd\x82|\xef\xbd\x83|\xef\xbd\x84|\xef\xbd\x85|\xef\xbd\x86|\xef\xbd\x87|\xef\xbd\x88|\xef\xbd\x89|\xef\xbd\x8a|\xef\xbd\x8b|\xef\xbd\x8c|\xef\xbd\x8d|\xef\xbd\x8e|\xef\xbd\x8f|\xef\xbd\x90|\xef\xbd\x91|\xef\xbd\x92|\xef\xbd\x93|\xef\xbd\x94|\xef\xbd\x95|\xef\xbd\x96|\xef\xbd\x97|\xef\xbd\x98|\xef\xbd\x99|\xef\xbd\x9a)/$_z2hAlpha{$1}/eg; + + $this; +} +sub _ucs4_utf8 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + my $result = ''; + for my $uc (unpack("N*", $str)) + { + $result .= ($uc < 0x80) ? chr($uc) : + ($uc < 0x800) ? chr(0xC0 | ($uc >> 6)) . chr(0x80 | ($uc & 0x3F)) : + ($uc < 0x10000) ? chr(0xE0 | ($uc >> 12)) . chr(0x80 | (($uc >> 6) & 0x3F)) . chr(0x80 | ($uc & 0x3F)) : + ($uc < 0x200000) ? chr(0xF0 | ($uc >> 18)) . chr(0x80 | (($uc >> 12) & 0x3F)) . chr(0x80 | (($uc >> 6) & 0x3F)) . chr(0x80 | ($uc & 0x3F)) : + ($uc < 0x4000000) ? chr(0xF8 | ($uc >> 24)) . chr(0x80 | (($uc >> 18) & 0x3F)) . chr(0x80 | (($uc >> 12) & 0x3F)) . chr(0x80 | (($uc >> 6) & 0x3F)) . chr(0x80 | ($uc & 0x3F)) : + chr(0xFC | ($uc >> 30)) . chr(0x80 | (($uc >> 24) & 0x3F)) . chr(0x80 | (($uc >> 18) & 0x3F)) . chr(0x80 | (($uc >> 12) & 0x3F)) . chr(0x80 | (($uc >> 6) & 0x3F)) . chr(0x80 | ($uc & 0x3F)); + } + + $result; +} +sub h2zSym { + my $this = shift; + + if(!defined(%_h2zSym)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(\x20|\x21|\x22|\x23|\x24|\x25|\x26|\x27|\x28|\x29|\x2a|\x2b|\x2c|\x2d|\x2e|\x2f|\x3a|\x3b|\x3c|\x3d|\x3e|\x3f|\x40|\x5b|\x5c|\x5d|\x5e|_|\x60|\x7b|\x7c|\x7d|\x7e)/$_h2zSym{$1}/eg; + + $this; +} +sub utf8_icon_au1 +{ + my $this = shift; + $this->_u2ai1($this->{str}); +} +sub h2z { + my $this = shift; + + $this->h2zKana; + $this->h2zNum; + $this->h2zAlpha; + $this->h2zSym; + + $this; +} +# ----------------------------------------------------------------------------- +# $bytes_sjis = $unijp->sjis(); +# +sub sjis +{ + my $this = shift; + $this->_u2s($this->{str}); +} +sub euc_icon_au2 +{ + my $this = shift; + $this->_s2e($this->_u2s($this->_u2ai2($this->{str}))); +} +sub _u2si1 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($u2s_table)) + { + $u2s_table = $this->_getFile('jcode/u2s.dat'); + } + + if(!defined($eu2i1)) + { + $eu2i1 = $this->_getFile('jcode/emoji2/eu2i.dat'); + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + my $c; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})|([^\x00-\x7f])/ + defined($2) ? '?' : + ((length($1) == 1) ? $1 : + (length($1) == 2) ? ( + ($c1,$c2) = unpack("C2", $1), + $ch = (($c1 & 0x1F)<<6)|($c2 & 0x3F), + $c = substr($u2s_table, $ch * 2, 2), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 3) ? ( + ($c1,$c2,$c3) = unpack("C3", $1), + $ch = (($c1 & 0x0F)<<12)|(($c2 & 0x3F)<<6)|($c3 & 0x3F), + ( + ($ch <= 0x9fff) ? + $c = substr($u2s_table, $ch * 2, 2) : + ($ch >= 0xf900 and $ch <= 0xffff) ? + ( + $c = substr($u2s_table, ($ch - 0xf900 + 0xa000) * 2, 2), + (($c =~ tr,\0,,d)==2 and $c = "\0\0"), + ) : + ( + $c = '?' + ) + ), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 4) ? ( + ($c1,$c2,$c3,$c4) = unpack("C4", $1), + $ch = (($c1 & 0x07)<<18)|(($c2 & 0x3F)<<12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F), + ( + ($ch >= 0x0fe000 and $ch <= 0x0fffff) ? + ( + $c = substr($eu2i1, ($ch - 0x0fe000) * 2, 2), + $c =~ tr,\0,,d, + ($c eq '') ? '?' : $c + ) : + '?' + ) + ) : + '?' + ) + /eg; + $str; + +} +sub _sj2u1 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($s2u_table)) + { + $s2u_table = $this->_getFile('jcode/s2u.dat'); + } + + if(!defined($ej2u1)) + { + $ej2u1 = $this->_getFile('jcode/emoji2/ej2u.dat'); + } + + my $l; + my $j1; + my $uc; + $str =~ s/($RE{SJIS_KANA}|$RE{SJIS_DBCS}|$RE{E_JSKYv1}|[\x80-\xff])/ + (length($1) <= 2) ? + ( + $l = (unpack('n', $1) or unpack('C', $1)), + ( + ($l >= 0xa1 and $l <= 0xdf) ? + ( + $uc = substr($s2u_table, ($l - 0xa1) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0x8100 and $l <= 0x9fff) ? + ( + $uc = substr($s2u_table, ($l - 0x8100 + 0x3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xe000 and $l <= 0xffff) ? + ( + $uc = substr($s2u_table, ($l - 0xe000 + 0x1f3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l < 0x80) ? + chr($l) : + '?' + ) + ) : + ( + $l = $1, + $l =~ s,^$RE{E_JSKY_START}($RE{E_JSKY1v1}),,o, + $j1 = $1, + $uc = '', + $l =~ s!($RE{E_JSKY2})!$uc .= substr($ej2u1, (unpack('n', $j1 . $1) - 0x4500) * 4, 4), ''!ego, + $uc =~ tr,\0,,d, + $uc + ) + /eg; + + $str; + +} +# ----------------------------------------------------------------------------- +# tag2bin +# +sub tag2bin { + my $this = shift; + + $this->{str} =~ s/\&(\#\d+|\#x[a-f0-9A-F]+);/ + (substr($1, 1, 1) eq 'x') ? $this->_ucs4_utf8(pack('N', hex(substr($1, 2)))) : + $this->_ucs4_utf8(pack('N', substr($1, 1))) + /eg; + + $this; +} +sub euc_icon_au +{ + my $this = shift; + $this->_s2e($this->_u2s($this->_u2ai2($this->{str}))); +} +sub z2hSym { + my $this = shift; + + if(!defined(%_z2hSym)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(\xe3\x80\x80|\xef\xbc\x8c|\xef\xbc\x8e|\xef\xbc\x9a|\xef\xbc\x9b|\xef\xbc\x9f|\xef\xbc\x81|\xef\xbd\x80|\xef\xbc\xbe|\xef\xbc\xbf|\xef\xbc\x8f|\xef\xbd\x9e|\xef\xbd\x9c|\xe2\x80\x99|\xe2\x80\x9d|\xef\xbc\x88|\xef\xbc\x89|\xef\xbc\xbb|\xef\xbc\xbd|\xef\xbd\x9b|\xef\xbd\x9d|\xef\xbc\x8b|\xef\xbc\x8d|\xef\xbc\x9d|\xef\xbc\x9c|\xef\xbc\x9e|\xef\xbf\xa5|\xef\xbc\x84|\xef\xbc\x85|\xef\xbc\x83|\xef\xbc\x86|\xef\xbc\x8a|\xef\xbc\xa0|\xe3\x80\x9c)/$_z2hSym{$1}/eg; + + $this; +} +# ----------------------------------------------------------------------------- +# $bytes_ucs2 = $unijp->ucs2(); +# +sub ucs2 +{ + my $this = shift; + $this->_utf8_ucs2($this->{str}); +} +sub jis_au2 +{ + my $this = shift; + $this->_s2j($this->_u2ja2($this->{str})); +} +sub _si2u1 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($s2u_table)) + { + $s2u_table = $this->_getFile('jcode/s2u.dat'); + } + + if(!defined($ei2u1)) + { + $ei2u1 = $this->_getFile('jcode/emoji2/ei2u.dat'); + } + + $str =~ s/(\&\#(\d+);)/ + ($2 >= 0xf800 and $2 <= 0xf9ff) ? pack('n', $2) : $1 + /eg; + + my $l; + my $uc; + $str =~ s/($RE{SJIS_KANA}|$RE{SJIS_DBCS}|$RE{E_IMODEv1}|[\x80-\xff])/ + $S2U{$1} + or ($S2U{$1} = + ( + $l = (unpack('n', $1) or unpack('C', $1)), + ( + ($l >= 0xa1 and $l <= 0xdf) ? + ( + $uc = substr($s2u_table, ($l - 0xa1) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0x8100 and $l <= 0x9fff) ? + ( + $uc = substr($s2u_table, ($l - 0x8100 + 0x3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xf800 and $l <= 0xf9ff) ? + ( + $uc = substr($ei2u1, ($l - 0xf800) * 4, 4), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xe000 and $l <= 0xffff) ? + ( + $uc = substr($s2u_table, ($l - 0xe000 + 0x1f3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l < 0x80) ? + chr($l) : + '?' + ) + ) + )/eg; + + $str; + +} +sub _utf8_utf16 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $uc; + $str =~ s/([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})/ + $T2U{$1} + or ($T2U{$1} + = ((length($1) == 1) ? pack("n", unpack("C", $1)) : + (length($1) == 2) ? (($c1,$c2) = unpack("C2", $1), + pack("n", (($c1 & 0x1F)<<6)|($c2 & 0x3F))) : + (length($1) == 3) ? (($c1,$c2,$c3) = unpack("C3", $1), + pack("n", (($c1 & 0x0F)<<12)|(($c2 & 0x3F)<<6)|($c3 & 0x3F))) : + (length($1) == 4) ? (($c1,$c2,$c3,$c4) = unpack("C4", $1), + ($uc = ((($c1 & 0x07) << 18)|(($c2 & 0x3F) << 12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F)) - 0x10000), + (($uc < 0x100000) ? pack("nn", (($uc >> 10) | 0xd800), (($uc & 0x3ff) | 0xdc00)) : "\0?")) : + "\0?") + ); + /eg; + $str; +} +sub jis_icon_au1 +{ + my $this = shift; + $this->_s2j($this->_u2s($this->_u2ai1($this->{str}))); +} +sub sjis_icon_au1 +{ + my $this = shift; + $this->_u2s($this->_u2ai1($this->{str})); +} +sub sjis_jsky2 +{ + my $this = shift; + $this->_u2sj2($this->{str}); +} +# ----------------------------------------------------------------------------- +# $code = Unicode::Japanese->getcode($str); +# +sub getcode { + my $this = shift; + my $str = shift; + + if( $]>=5.008 ) + { + Encode::_utf8_off($str); + } + + my $l = length($str); + + if((($l % 4) == 0) + and ($str =~ m/^(?:$RE{BOM4_BE}|$RE{BOM4_LE})/o)) + { + return 'utf32'; + } + if((($l % 2) == 0) + and ($str =~ m/^(?:$RE{BOM2_BE}|$RE{BOM2_LE})/o)) + { + return 'utf16'; + } + + my $str2; + + if(($l % 4) == 0) + { + $str2 = $str; + 1 while($str2 =~ s/^(?:$RE{UTF32_BE})//o); + if($str2 eq '') + { + return 'utf32-be'; + } + + $str2 = $str; + 1 while($str2 =~ s/^(?:$RE{UTF32_LE})//o); + if($str2 eq '') + { + return 'utf32-le'; + } + } + + if($str !~ m/[\e\x80-\xff]/) + { + return 'ascii'; + } + + if($str =~ m/$RE{JIS_0208}|$RE{JIS_0212}|$RE{JIS_ASC}|$RE{JIS_KANA}/o) + { + if($str =~ m/(?:$RE{JIS_0208})(?:[^\e]{2})*$RE{E_JIS_AU}/o) + { + return 'jis-au'; + } + elsif($str =~ m/(?:$RE{E_JSKY})/o) + { + return 'jis-jsky'; + } + else + { + return 'jis'; + } + } + + if($str =~ m/(?:$RE{E_JSKY})/o) + { + return 'sjis-jsky'; + } + + $str2 = $str; + 1 while($str2 =~ s/^(?:$RE{ASCII}|$RE{EUC_0212}|$RE{EUC_KANA}|$RE{EUC_C})//o); + if($str2 eq '') + { + return 'euc'; + } + + $str2 = $str; + 1 while($str2 =~ s/^(?:$RE{ASCII}|$RE{SJIS_DBCS}|$RE{SJIS_KANA})//o); + if($str2 eq '') + { + return 'sjis'; + } + if($str =~ m/^(?:$RE{E_SJIS_AU})/o) + { + return 'sjis-au'; + } + + + my $str3; + $str3 = $str2; + 1 while($str3 =~ s/^(?:$RE{ASCII}|$RE{SJIS_DBCS}|$RE{SJIS_KANA}|$RE{E_IMODE})//o); + if($str3 eq '') + { + return 'sjis-imode'; + } + + $str3 = $str2; + 1 while($str3 =~ s/^(?:$RE{ASCII}|$RE{SJIS_DBCS}|$RE{SJIS_KANA}|$RE{E_DOTI})//o); + if($str3 eq '') + { + return 'sjis-doti'; + } + + $str2 = $str; + 1 while($str2 =~ s/^(?:$RE{UTF8})//o); + if($str2 eq '') + { + return 'utf8'; + } + + return 'unknown'; +} +sub _j2s2 { + my $this = shift; + my $esc = shift; + my $str = shift; + + if($esc eq $ESC{JIS_0212}) + { + $str =~ s/../$CHARCODE{UNDEF_SJIS}/g; + } + elsif($esc !~ m/^$RE{JIS_ASC}/) + { + $str =~ s{([\x21-\x7e]+)}{ + my $str = $1; + $str =~ tr/\x21-\x7e/\xa1-\xfe/; + if($esc =~ m/^$RE{JIS_0208}/) + { + $str =~ s/($RE{EUC_C})/ + $J2S[unpack('n', $1)] or $this->_j2s3($1) + /geo; + } + $str; + }e; + } + + $str; +} +sub sjis_au2 +{ + my $this = shift; + $this->_j2sa($this->_s2j($this->_u2ja2($this->{str}))); +} +sub h2zKanaD { + my $this = shift; + + if(!defined(%_h2zKanaD)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(\xef\xbd\xb3\xef\xbe\x9e|\xef\xbd\xb6\xef\xbe\x9e|\xef\xbd\xb7\xef\xbe\x9e|\xef\xbd\xb8\xef\xbe\x9e|\xef\xbd\xb9\xef\xbe\x9e|\xef\xbd\xba\xef\xbe\x9e|\xef\xbd\xbb\xef\xbe\x9e|\xef\xbd\xbc\xef\xbe\x9e|\xef\xbd\xbd\xef\xbe\x9e|\xef\xbd\xbe\xef\xbe\x9e|\xef\xbd\xbf\xef\xbe\x9e|\xef\xbe\x80\xef\xbe\x9e|\xef\xbe\x81\xef\xbe\x9e|\xef\xbe\x82\xef\xbe\x9e|\xef\xbe\x83\xef\xbe\x9e|\xef\xbe\x84\xef\xbe\x9e|\xef\xbe\x8a\xef\xbe\x9e|\xef\xbe\x8a\xef\xbe\x9f|\xef\xbe\x8b\xef\xbe\x9e|\xef\xbe\x8b\xef\xbe\x9f|\xef\xbe\x8c\xef\xbe\x9e|\xef\xbe\x8c\xef\xbe\x9f|\xef\xbe\x8d\xef\xbe\x9e|\xef\xbe\x8d\xef\xbe\x9f|\xef\xbe\x8e\xef\xbe\x9e|\xef\xbe\x8e\xef\xbe\x9f)/$_h2zKanaD{$1}/eg; + + $this; +} +sub sjis_imode1 +{ + my $this = shift; + $this->_u2si1($this->{str}); +} +sub eucjp +{ + shift->euc(@_); +} +# ----------------------------------------------------------------------------- +# $bytes_utf8 = $unijp->utf8(); +# +sub utf8 +{ + my $this = shift; + $this->_validate_utf8($this->{str}); +} +sub _s2e { + my $this = shift; + my $str = shift; + + if( $]>=5.008 ) + { + Encode::_utf8_off($str); + } + + $str =~ s/($RE{SJIS_DBCS}|$RE{SJIS_KANA})/ + $S2E[unpack('n', $1) or unpack('C', $1)] or $this->_s2e2($1) + /geo; + + $str; +} +# ----------------------------------------------------------------------------- +# $bytes_utf8 = $unijp->utf8_jsky(); +# +sub utf8_jsky +{ + my $this = shift; + $this->_u2uj2($this->{str}); +} +# utf8-jsky2 => utf8. +sub _uj2u2 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($s2u_table)) + { + $s2u_table = $this->_getFile('jcode/s2u.dat'); + } + + if(!defined($ej2u1)) + { + $ej2u1 = $this->_getFile('jcode/emoji2/ej2u.dat'); + } + if(!defined($ej2u2)) + { + $ej2u2 = $this->_getFile('jcode/emoji2/ej2u2.dat'); + } + + $str = $this->_validate_utf8($str); + + my @umap = (0x200, 0x000, 0x100); + $str =~ s{($RE{E_JSKYv1_UTF8}+)}{ + join('', + map{ + my $l = $_ - 0xe000; + substr($ej2u1, ($umap[$l/256]+($l&255)+0x20) * 4, 4); + } unpack("n*", $this->_utf8_ucs2($1)) + ) + }geo; + $str =~ s{($RE{E_JSKYv2_UTF8}+)}{ + join('', + map{ + my $l = $_ - 0xe300 + 0x20; + substr($ej2u2, $l * 4, 4); + } unpack("n*", $this->_utf8_ucs2($1)) + ) + }geo; + + $str; + +} +sub utf8_jsky1 +{ + my $this = shift; + $this->_u2uj1($this->{str}); +} +# ----------------------------------------------------------------------------- +# $bytes_str = $unijp->conv($ocode,[$encode]); +# +sub conv { + my $this = shift; + my $ocode = shift; + my $encode = shift; + my (@option) = @_; + + my $res; + if(!defined($ocode)) + { + use Carp; + croak(qq(String->conv, Param[1] is undef.)); + } + elsif($ocode eq 'utf8') + { + $res = $this->utf8; + } + elsif($ocode eq 'euc' || $ocode eq 'euc-jp' ) + { + $res = $this->euc; + } + elsif($ocode eq 'jis') + { + $res = $this->jis; + } + elsif($ocode eq 'sjis' || $ocode eq 'cp932') + { + $res = $this->sjis; + } + elsif($ocode eq 'sjis-imode') + { + $res = $this->sjis_imode; + } + elsif($ocode eq 'sjis-imode1') + { + $res = $this->sjis_imode1; + } + elsif($ocode eq 'sjis-imode2') + { + $res = $this->sjis_imode2; + } + elsif($ocode eq 'sjis-doti') + { + $res = $this->sjis_doti; + } + elsif($ocode eq 'sjis-doti1') + { + $res = $this->sjis_doti; + } + elsif($ocode eq 'sjis-jsky') + { + $res = $this->sjis_jsky; + } + elsif($ocode eq 'sjis-jsky1') + { + $res = $this->sjis_jsky1; + } + elsif($ocode eq 'sjis-jsky2') + { + $res = $this->sjis_jsky2; + } + elsif($ocode eq 'jis-jsky') + { + $res = $this->jis_jsky; + } + elsif($ocode eq 'jis-jsky1') + { + $res = $this->jis_jsky1; + } + elsif($ocode eq 'jis-jsky2') + { + $res = $this->jis_jsky2; + } + elsif($ocode eq 'utf8-jsky') + { + $res = $this->utf8_jsky; + } + elsif($ocode eq 'utf8-jsky1') + { + $res = $this->utf8_jsky1; + } + elsif($ocode eq 'utf8-jsky2') + { + $res = $this->utf8_jsky2; + } + elsif($ocode eq 'jis-au') + { + $res = $this->jis_au2; + } + elsif($ocode eq 'jis-au1') + { + $res = $this->jis_au1; + } + elsif($ocode eq 'jis-au2') + { + $res = $this->jis_au2; + } + elsif($ocode eq 'sjis-au') + { + $res = $this->sjis_au2; + } + elsif($ocode eq 'sjis-au1') + { + $res = $this->sjis_au1; + } + elsif($ocode eq 'sjis-au2') + { + $res = $this->sjis_au2; + } + elsif($ocode eq 'sjis-icon-au') + { + $res = $this->sjis_icon_au2; + } + elsif($ocode eq 'sjis-icon-au1') + { + $res = $this->sjis_icon_au1; + } + elsif($ocode eq 'sjis-icon-au2') + { + $res = $this->sjis_icon_au2; + } + elsif($ocode eq 'jis-icon-au') + { + $res = $this->jis_icon_au2; + } + elsif($ocode eq 'jis-icon-au1') + { + $res = $this->jis_icon_au1; + } + elsif($ocode eq 'jis-icon-au2') + { + $res = $this->jis_icon_au2; + } + elsif($ocode eq 'euc-icon-au') + { + $res = $this->euc_icon_au2; + } + elsif($ocode eq 'euc-icon-au1') + { + $res = $this->euc_icon_au1; + } + elsif($ocode eq 'euc-icon-au2') + { + $res = $this->euc_icon_au2; + } + elsif($ocode eq 'utf8-icon-au') + { + $res = $this->utf8_icon_au2; + } + elsif($ocode eq 'utf8-icon-au1') + { + $res = $this->utf8_icon_au1; + } + elsif($ocode eq 'utf8-icon-au2') + { + $res = $this->utf8_icon_au2; + } + elsif($ocode eq 'ucs2') + { + $res = $this->ucs2; + } + elsif($ocode eq 'ucs4') + { + $res = $this->ucs4; + } + elsif($ocode eq 'utf16') + { + $res = $this->utf16; + } + elsif($ocode eq 'binary') + { + $res = $this->{str}; + } + else + { + use Carp; + croak(qq(String->conv, Param[1] "$ocode" is error.)); + } + + if(defined($encode)) + { + if($encode eq 'base64') + { + $res = $this->_encodeBase64($res, @option); + } + else + { + use Carp; + croak(qq(String->conv, Param[2] "$encode" encode name error.)); + } + } + + $res; +} +sub _utf16be_utf16 { + my $this = shift; + my $str = shift; + + $str; +} +sub hira2kata { + my $this = shift; + + if(!defined(%_hira2kata)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(\xe3\x81\x81|\xe3\x81\x82|\xe3\x81\x83|\xe3\x81\x84|\xe3\x81\x85|\xe3\x81\x86|\xe3\x81\x87|\xe3\x81\x88|\xe3\x81\x89|\xe3\x81\x8a|\xe3\x81\x8b|\xe3\x81\x8c|\xe3\x81\x8d|\xe3\x81\x8e|\xe3\x81\x8f|\xe3\x81\x90|\xe3\x81\x91|\xe3\x81\x92|\xe3\x81\x93|\xe3\x81\x94|\xe3\x81\x95|\xe3\x81\x96|\xe3\x81\x97|\xe3\x81\x98|\xe3\x81\x99|\xe3\x81\x9a|\xe3\x81\x9b|\xe3\x81\x9c|\xe3\x81\x9d|\xe3\x81\x9e|\xe3\x81\x9f|\xe3\x81\xa0|\xe3\x81\xa1|\xe3\x81\xa2|\xe3\x81\xa3|\xe3\x81\xa4|\xe3\x81\xa5|\xe3\x81\xa6|\xe3\x81\xa7|\xe3\x81\xa8|\xe3\x81\xa9|\xe3\x81\xaa|\xe3\x81\xab|\xe3\x81\xac|\xe3\x81\xad|\xe3\x81\xae|\xe3\x81\xaf|\xe3\x81\xb0|\xe3\x81\xb1|\xe3\x81\xb2|\xe3\x81\xb3|\xe3\x81\xb4|\xe3\x81\xb5|\xe3\x81\xb6|\xe3\x81\xb7|\xe3\x81\xb8|\xe3\x81\xb9|\xe3\x81\xba|\xe3\x81\xbb|\xe3\x81\xbc|\xe3\x81\xbd|\xe3\x81\xbe|\xe3\x81\xbf|\xe3\x82\x80|\xe3\x82\x81|\xe3\x82\x82|\xe3\x82\x83|\xe3\x82\x84|\xe3\x82\x85|\xe3\x82\x86|\xe3\x82\x87|\xe3\x82\x88|\xe3\x82\x89|\xe3\x82\x8a|\xe3\x82\x8b|\xe3\x82\x8c|\xe3\x82\x8d|\xe3\x82\x8e|\xe3\x82\x8f|\xe3\x82\x90|\xe3\x82\x91|\xe3\x82\x92|\xe3\x82\x93)/$_hira2kata{$1}/eg; + + $this; +} +sub splitCsvu +{ + my $this = shift; + my $result = &splitCsv; + + if( $]>=5.008 && $this->{icode} ne 'binary' ) + { + foreach(@$result) + { + Encode::_utf8_on($_); + } + } + + $result; +} +sub sjis_doti1 +{ + my $this = shift; + $this->_u2sd($this->{str}); +} +# ----------------------------------------------------------------------------- +# conversion methods (private). +# +sub _s2j { + my $this = shift; + my $str = shift; + + $str =~ s/((?:$RE{SJIS_DBCS}|$RE{SJIS_KANA})+)/ + $this->_s2j2($1) . $ESC{ASC} + /geo; + + $str; +} +sub _sa2j2 { + my $this = shift; + my $str = shift; + + $str =~ s/((?:$RE{SJIS_DBCS}|$RE{E_SJIS_AU})+|(?:$RE{SJIS_KANA})+)/ + my $s = $1; + if($s =~ m,^$RE{SJIS_KANA},o) + { + $s =~ tr,\xa1-\xdf,\x21-\x5f,; + $ESC{KANA} . $s + } + else + { + $s =~ s!($RE{SJIS_DBCS}|$RE{E_SJIS_AU})! + $this->_sa2j3($1) + !geo; + $ESC{JIS_0208} . $s; + } + /geo; + + $str; +} +sub _j2sa { + my $this = shift; + my $str = shift; + + $str =~ s/($RE{JIS_0208}|$RE{JIS_0212}|$RE{JIS_ASC}|$RE{JIS_KANA})([^\e]*)/ + $this->_j2sa2($1, $2) + /geo; + + $str; +} +sub sjis_au1 +{ + my $this = shift; + $this->_j2sa($this->_s2j($this->_u2ja1($this->{str}))); +} +sub join_csv { + &joinCsv; +} +# utf8ʸAUʸɤѴ +sub _ai2u1 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($ea2u1)) + { + $ea2u1 = $this->_getFile('jcode/emoji2/ea2u.dat'); + } + + my $c; + $str =~ s/$RE{E_ICON_AU_START}(\d+)$RE{E_ICON_AU_END}/ + ($1 > 0 and $1 <= 0x14a) ? + ($c = substr($ea2u1, ($1-1) * 4, 4), $c =~ tr,\0,,d, ($c eq '') ? '?' : $c) : + '?' + /ige; + + $str; +} +# ----------------------------------------------------------------------------- +# sjis/ʸ => utf8 +# +sub _s2u { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($s2u_table)) + { + $s2u_table = $this->_getFile('jcode/s2u.dat'); + } + + my $l; + my $uc; + $str =~ s/($RE{SJIS_KANA}|$RE{SJIS_DBCS}|[\x80-\xff])/ + $S2U{$1} + or ($S2U{$1} = + ( + $l = (unpack('n', $1) or unpack('C', $1)), + ( + ($l >= 0xa1 and $l <= 0xdf) ? + ( + $uc = substr($s2u_table, ($l - 0xa1) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0x8100 and $l <= 0x9fff) ? + ( + $uc = substr($s2u_table, ($l - 0x8100 + 0x3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xe000 and $l <= 0xfcff) ? + ( + $uc = substr($s2u_table, ($l - 0xe000 + 0x1f3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l < 0x80) ? + chr($l) : + '?' + ) + ) + )/eg; + + $str; + +} +sub jis_jsky1 +{ + my $this = shift; + $this->_s2j($this->_u2sj1($this->{str})); +} +sub jis_icon_au2 +{ + my $this = shift; + $this->_s2j($this->_u2s($this->_u2ai2($this->{str}))); +} +sub _j2sa3 { + my $this = shift; + my $c = shift; + + my ($c1, $c2) = unpack('CC', $c); + if ($c1 % 2) + { + $c1 = ($c1>>1) + ($c1 < 0xdf ? 0x31 : 0x71); + $c2 -= 0x60 + ($c2 < 0xe0); + } + else + { + $c1 = ($c1>>1) + ($c1 < 0xdf ? 0x30 : 0x70); + $c2 -= 2; + } + $c1 = 0xf6 if($c1 == 0xeb); + $c1 = 0xf7 if($c1 == 0xec); + $c1 = 0xf3 if($c1 == 0xed); + $c1 = 0xf4 if($c1 == 0xee); + + pack('CC', $c1, $c2); +} +# ----------------------------------------------------------------------------- +# $bytes_jsky = $unijp->sjis_jsky(); +# +sub sjis_jsky +{ + my $this = shift; + $this->_u2sj2($this->{str}); +} +sub _u2uj2 +{ + my $this = shift; + + if(!defined($eu2j2)) + { + $eu2j2 = $this->_getFile('jcode/emoji2/eu2j2.dat'); + } + + my $str = $this->_validate_utf8($this->{str}); + + $str =~ s{([\xf0-\xf7][\x80-\xbf]{3})}{ + my ($c1,$c2,$c3,$c4) = unpack("C4", $1); + my $ch = (($c1 & 0x07)<<18) | (($c2 & 0x3F)<<12) | + (($c3 & 0x3f)<< 6) | ($c4 & 0x3F); + if( 0x0fe000 <= $ch && $ch <= 0x0fffff ) + { + my $c = substr($eu2j2, ($ch - 0x0fe000) * 5, 5); + $c =~ tr,\0,,d; + $c eq '' and $c = '?'; + if( $c =~ /^\e\$([GEFOPQ])(.)\x0f/ ) + { + my ($j1,$j2) = ($1,$2); + $j1 =~ tr/GEFOPQ/\xe0-\xe5/; + $j2 =~ tr/!-z/\x01-\x5a/; + $c = $this->_ucs2_utf8($j1.$j2); + } + $c; + }else + { + '?'; + } + }ge; + $str; +} +# ----------------------------------------------------------------------------- +# $bytes_iso2022jp = $unijp->jis(); +# +sub jis +{ + my $this = shift; + $this->_s2j($this->sjis); +} +sub jis_au1 +{ + my $this = shift; + $this->_s2j($this->_u2ja1($this->{str})); +} +sub _utf8_ucs4 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + $str =~ s/([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5}|(.))/ + defined($2) ? "\0\0\0$2" : + (length($1) == 1) ? pack("N", unpack("C", $1)) : + (length($1) == 2) ? + do { + ($c1,$c2) = unpack("C2", $1); + my $n = (($c1 & 0x1F) << 6)|($c2 & 0x3F); + pack("N", $n>=0x80 ? $n : unpack("C",'?')); + } : + (length($1) == 3) ? + do { + ($c1,$c2,$c3) = unpack("C3", $1); + my $n = (($c1 & 0x0F) << 12)|(($c2 & 0x3F) << 6)| ($c3 & 0x3F); + pack("N", $n>=0x800 ? $n : unpack("C",'?')); + } : + (length($1) == 4) ? + do { + ($c1,$c2,$c3,$c4) = unpack("C4", $1); + my $n = (($c1 & 0x07) << 18)|(($c2 & 0x3F) << 12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F); + pack("N", ($n>=0x010000 && $n<=0x10FFFF) ? $n : unpack("C",'?')); + } : + pack("N", unpack("C",'?')) + /eg; + + $str; +} +# ----------------------------------------------------------------------------- +# $bytes_utf8 = $unijp->get(); +# +sub get { + my $this = shift; + $this->{str}; +} +sub z2h { + my $this = shift; + + $this->z2hKana; + $this->z2hNum; + $this->z2hAlpha; + $this->z2hSym; + + $this; +} +# ----------------------------------------------------------------------------- +# $chars_utf8 = $unijp->getu(); +# +sub getu { + my $this = shift; + my $str = $this->{str}; + if( $]>=5.008 && $this->{icode} ne 'binary' ) + { + Encode::_utf8_on($str); + } + $str; +} +sub _loadConvTable { + + +%_h2zNum = ( + "0" => "\xef\xbc\x90", "1" => "\xef\xbc\x91", + "2" => "\xef\xbc\x92", "3" => "\xef\xbc\x93", + "4" => "\xef\xbc\x94", "5" => "\xef\xbc\x95", + "6" => "\xef\xbc\x96", "7" => "\xef\xbc\x97", + "8" => "\xef\xbc\x98", "9" => "\xef\xbc\x99", + +); + + + +%_z2hNum = ( + "\xef\xbc\x90" => "0", "\xef\xbc\x91" => "1", + "\xef\xbc\x92" => "2", "\xef\xbc\x93" => "3", + "\xef\xbc\x94" => "4", "\xef\xbc\x95" => "5", + "\xef\xbc\x96" => "6", "\xef\xbc\x97" => "7", + "\xef\xbc\x98" => "8", "\xef\xbc\x99" => "9", + +); + + + +%_h2zAlpha = ( + "A" => "\xef\xbc\xa1", "B" => "\xef\xbc\xa2", + "C" => "\xef\xbc\xa3", "D" => "\xef\xbc\xa4", + "E" => "\xef\xbc\xa5", "F" => "\xef\xbc\xa6", + "G" => "\xef\xbc\xa7", "H" => "\xef\xbc\xa8", + "I" => "\xef\xbc\xa9", "J" => "\xef\xbc\xaa", + "K" => "\xef\xbc\xab", "L" => "\xef\xbc\xac", + "M" => "\xef\xbc\xad", "N" => "\xef\xbc\xae", + "O" => "\xef\xbc\xaf", "P" => "\xef\xbc\xb0", + "Q" => "\xef\xbc\xb1", "R" => "\xef\xbc\xb2", + "S" => "\xef\xbc\xb3", "T" => "\xef\xbc\xb4", + "U" => "\xef\xbc\xb5", "V" => "\xef\xbc\xb6", + "W" => "\xef\xbc\xb7", "X" => "\xef\xbc\xb8", + "Y" => "\xef\xbc\xb9", "Z" => "\xef\xbc\xba", + "a" => "\xef\xbd\x81", "b" => "\xef\xbd\x82", + "c" => "\xef\xbd\x83", "d" => "\xef\xbd\x84", + "e" => "\xef\xbd\x85", "f" => "\xef\xbd\x86", + "g" => "\xef\xbd\x87", "h" => "\xef\xbd\x88", + "i" => "\xef\xbd\x89", "j" => "\xef\xbd\x8a", + "k" => "\xef\xbd\x8b", "l" => "\xef\xbd\x8c", + "m" => "\xef\xbd\x8d", "n" => "\xef\xbd\x8e", + "o" => "\xef\xbd\x8f", "p" => "\xef\xbd\x90", + "q" => "\xef\xbd\x91", "r" => "\xef\xbd\x92", + "s" => "\xef\xbd\x93", "t" => "\xef\xbd\x94", + "u" => "\xef\xbd\x95", "v" => "\xef\xbd\x96", + "w" => "\xef\xbd\x97", "x" => "\xef\xbd\x98", + "y" => "\xef\xbd\x99", "z" => "\xef\xbd\x9a", + +); + + + +%_z2hAlpha = ( + "\xef\xbc\xa1" => "A", "\xef\xbc\xa2" => "B", + "\xef\xbc\xa3" => "C", "\xef\xbc\xa4" => "D", + "\xef\xbc\xa5" => "E", "\xef\xbc\xa6" => "F", + "\xef\xbc\xa7" => "G", "\xef\xbc\xa8" => "H", + "\xef\xbc\xa9" => "I", "\xef\xbc\xaa" => "J", + "\xef\xbc\xab" => "K", "\xef\xbc\xac" => "L", + "\xef\xbc\xad" => "M", "\xef\xbc\xae" => "N", + "\xef\xbc\xaf" => "O", "\xef\xbc\xb0" => "P", + "\xef\xbc\xb1" => "Q", "\xef\xbc\xb2" => "R", + "\xef\xbc\xb3" => "S", "\xef\xbc\xb4" => "T", + "\xef\xbc\xb5" => "U", "\xef\xbc\xb6" => "V", + "\xef\xbc\xb7" => "W", "\xef\xbc\xb8" => "X", + "\xef\xbc\xb9" => "Y", "\xef\xbc\xba" => "Z", + "\xef\xbd\x81" => "a", "\xef\xbd\x82" => "b", + "\xef\xbd\x83" => "c", "\xef\xbd\x84" => "d", + "\xef\xbd\x85" => "e", "\xef\xbd\x86" => "f", + "\xef\xbd\x87" => "g", "\xef\xbd\x88" => "h", + "\xef\xbd\x89" => "i", "\xef\xbd\x8a" => "j", + "\xef\xbd\x8b" => "k", "\xef\xbd\x8c" => "l", + "\xef\xbd\x8d" => "m", "\xef\xbd\x8e" => "n", + "\xef\xbd\x8f" => "o", "\xef\xbd\x90" => "p", + "\xef\xbd\x91" => "q", "\xef\xbd\x92" => "r", + "\xef\xbd\x93" => "s", "\xef\xbd\x94" => "t", + "\xef\xbd\x95" => "u", "\xef\xbd\x96" => "v", + "\xef\xbd\x97" => "w", "\xef\xbd\x98" => "x", + "\xef\xbd\x99" => "y", "\xef\xbd\x9a" => "z", + +); + + + +%_h2zSym = ( + "\x20" => "\xe3\x80\x80", "\x21" => "\xef\xbc\x81", + "\x22" => "\xe2\x80\x9d", "\x23" => "\xef\xbc\x83", + "\x24" => "\xef\xbc\x84", "\x25" => "\xef\xbc\x85", + "\x26" => "\xef\xbc\x86", "\x27" => "\xe2\x80\x99", + "\x28" => "\xef\xbc\x88", "\x29" => "\xef\xbc\x89", + "\x2a" => "\xef\xbc\x8a", "\x2b" => "\xef\xbc\x8b", + "\x2c" => "\xef\xbc\x8c", "\x2d" => "\xef\xbc\x8d", + "\x2e" => "\xef\xbc\x8e", "\x2f" => "\xef\xbc\x8f", + "\x3a" => "\xef\xbc\x9a", "\x3b" => "\xef\xbc\x9b", + "\x3c" => "\xef\xbc\x9c", "\x3d" => "\xef\xbc\x9d", + "\x3e" => "\xef\xbc\x9e", "\x3f" => "\xef\xbc\x9f", + "\x40" => "\xef\xbc\xa0", "\x5b" => "\xef\xbc\xbb", + "\x5c" => "\xef\xbf\xa5", "\x5d" => "\xef\xbc\xbd", + "\x5e" => "\xef\xbc\xbe", "_" => "\xef\xbc\xbf", + "\x60" => "\xef\xbd\x80", "\x7b" => "\xef\xbd\x9b", + "\x7c" => "\xef\xbd\x9c", "\x7d" => "\xef\xbd\x9d", + "\x7e" => "\xef\xbd\x9e", +); + + + +%_z2hSym = ( + "\xe3\x80\x80" => "\x20", "\xef\xbc\x8c" => "\x2c", + "\xef\xbc\x8e" => "\x2e", "\xef\xbc\x9a" => "\x3a", + "\xef\xbc\x9b" => "\x3b", "\xef\xbc\x9f" => "\x3f", + "\xef\xbc\x81" => "\x21", "\xef\xbd\x80" => "\x60", + "\xef\xbc\xbe" => "\x5e", "\xef\xbc\xbf" => "_", + "\xef\xbc\x8f" => "\x2f", "\xef\xbd\x9e" => "\x7e", + "\xef\xbd\x9c" => "\x7c", "\xe2\x80\x99" => "\x27", + "\xe2\x80\x9d" => "\x22", "\xef\xbc\x88" => "\x28", + "\xef\xbc\x89" => "\x29", "\xef\xbc\xbb" => "\x5b", + "\xef\xbc\xbd" => "\x5d", "\xef\xbd\x9b" => "\x7b", + "\xef\xbd\x9d" => "\x7d", "\xef\xbc\x8b" => "\x2b", + "\xef\xbc\x8d" => "\x2d", "\xef\xbc\x9d" => "\x3d", + "\xef\xbc\x9c" => "\x3c", "\xef\xbc\x9e" => "\x3e", + "\xef\xbf\xa5" => "\x5c", "\xef\xbc\x84" => "\x24", + "\xef\xbc\x85" => "\x25", "\xef\xbc\x83" => "\x23", + "\xef\xbc\x86" => "\x26", "\xef\xbc\x8a" => "\x2a", + "\xef\xbc\xa0" => "\x40", "\xe3\x80\x9c" => "\x7e", + +); + + + +%_h2zKanaK = ( + "\xef\xbd\xa1" => "\xe3\x80\x82", "\xef\xbd\xa2" => "\xe3\x80\x8c", + "\xef\xbd\xa3" => "\xe3\x80\x8d", "\xef\xbd\xa4" => "\xe3\x80\x81", + "\xef\xbd\xa5" => "\xe3\x83\xbb", "\xef\xbd\xa6" => "\xe3\x83\xb2", + "\xef\xbd\xa7" => "\xe3\x82\xa1", "\xef\xbd\xa8" => "\xe3\x82\xa3", + "\xef\xbd\xa9" => "\xe3\x82\xa5", "\xef\xbd\xaa" => "\xe3\x82\xa7", + "\xef\xbd\xab" => "\xe3\x82\xa9", "\xef\xbd\xac" => "\xe3\x83\xa3", + "\xef\xbd\xad" => "\xe3\x83\xa5", "\xef\xbd\xae" => "\xe3\x83\xa7", + "\xef\xbd\xaf" => "\xe3\x83\x83", "\xef\xbd\xb0" => "\xe3\x83\xbc", + "\xef\xbd\xb1" => "\xe3\x82\xa2", "\xef\xbd\xb2" => "\xe3\x82\xa4", + "\xef\xbd\xb3" => "\xe3\x82\xa6", "\xef\xbd\xb4" => "\xe3\x82\xa8", + "\xef\xbd\xb5" => "\xe3\x82\xaa", "\xef\xbd\xb6" => "\xe3\x82\xab", + "\xef\xbd\xb7" => "\xe3\x82\xad", "\xef\xbd\xb8" => "\xe3\x82\xaf", + "\xef\xbd\xb9" => "\xe3\x82\xb1", "\xef\xbd\xba" => "\xe3\x82\xb3", + "\xef\xbd\xbb" => "\xe3\x82\xb5", "\xef\xbd\xbc" => "\xe3\x82\xb7", + "\xef\xbd\xbd" => "\xe3\x82\xb9", "\xef\xbd\xbe" => "\xe3\x82\xbb", + "\xef\xbd\xbf" => "\xe3\x82\xbd", "\xef\xbe\x80" => "\xe3\x82\xbf", + "\xef\xbe\x81" => "\xe3\x83\x81", "\xef\xbe\x82" => "\xe3\x83\x84", + "\xef\xbe\x83" => "\xe3\x83\x86", "\xef\xbe\x84" => "\xe3\x83\x88", + "\xef\xbe\x85" => "\xe3\x83\x8a", "\xef\xbe\x86" => "\xe3\x83\x8b", + "\xef\xbe\x87" => "\xe3\x83\x8c", "\xef\xbe\x88" => "\xe3\x83\x8d", + "\xef\xbe\x89" => "\xe3\x83\x8e", "\xef\xbe\x8a" => "\xe3\x83\x8f", + "\xef\xbe\x8b" => "\xe3\x83\x92", "\xef\xbe\x8c" => "\xe3\x83\x95", + "\xef\xbe\x8d" => "\xe3\x83\x98", "\xef\xbe\x8e" => "\xe3\x83\x9b", + "\xef\xbe\x8f" => "\xe3\x83\x9e", "\xef\xbe\x90" => "\xe3\x83\x9f", + "\xef\xbe\x91" => "\xe3\x83\xa0", "\xef\xbe\x92" => "\xe3\x83\xa1", + "\xef\xbe\x93" => "\xe3\x83\xa2", "\xef\xbe\x94" => "\xe3\x83\xa4", + "\xef\xbe\x95" => "\xe3\x83\xa6", "\xef\xbe\x96" => "\xe3\x83\xa8", + "\xef\xbe\x97" => "\xe3\x83\xa9", "\xef\xbe\x98" => "\xe3\x83\xaa", + "\xef\xbe\x99" => "\xe3\x83\xab", "\xef\xbe\x9a" => "\xe3\x83\xac", + "\xef\xbe\x9b" => "\xe3\x83\xad", "\xef\xbe\x9c" => "\xe3\x83\xaf", + "\xef\xbe\x9d" => "\xe3\x83\xb3", "\xef\xbe\x9e" => "\xe3\x82\x9b", + "\xef\xbe\x9f" => "\xe3\x82\x9c", +); + + + +%_z2hKanaK = ( + "\xe3\x80\x81" => "\xef\xbd\xa4", "\xe3\x80\x82" => "\xef\xbd\xa1", + "\xe3\x83\xbb" => "\xef\xbd\xa5", "\xe3\x82\x9b" => "\xef\xbe\x9e", + "\xe3\x82\x9c" => "\xef\xbe\x9f", "\xe3\x83\xbc" => "\xef\xbd\xb0", + "\xe3\x80\x8c" => "\xef\xbd\xa2", "\xe3\x80\x8d" => "\xef\xbd\xa3", + "\xe3\x82\xa1" => "\xef\xbd\xa7", "\xe3\x82\xa2" => "\xef\xbd\xb1", + "\xe3\x82\xa3" => "\xef\xbd\xa8", "\xe3\x82\xa4" => "\xef\xbd\xb2", + "\xe3\x82\xa5" => "\xef\xbd\xa9", "\xe3\x82\xa6" => "\xef\xbd\xb3", + "\xe3\x82\xa7" => "\xef\xbd\xaa", "\xe3\x82\xa8" => "\xef\xbd\xb4", + "\xe3\x82\xa9" => "\xef\xbd\xab", "\xe3\x82\xaa" => "\xef\xbd\xb5", + "\xe3\x82\xab" => "\xef\xbd\xb6", "\xe3\x82\xad" => "\xef\xbd\xb7", + "\xe3\x82\xaf" => "\xef\xbd\xb8", "\xe3\x82\xb1" => "\xef\xbd\xb9", + "\xe3\x82\xb3" => "\xef\xbd\xba", "\xe3\x82\xb5" => "\xef\xbd\xbb", + "\xe3\x82\xb7" => "\xef\xbd\xbc", "\xe3\x82\xb9" => "\xef\xbd\xbd", + "\xe3\x82\xbb" => "\xef\xbd\xbe", "\xe3\x82\xbd" => "\xef\xbd\xbf", + "\xe3\x82\xbf" => "\xef\xbe\x80", "\xe3\x83\x81" => "\xef\xbe\x81", + "\xe3\x83\x83" => "\xef\xbd\xaf", "\xe3\x83\x84" => "\xef\xbe\x82", + "\xe3\x83\x86" => "\xef\xbe\x83", "\xe3\x83\x88" => "\xef\xbe\x84", + "\xe3\x83\x8a" => "\xef\xbe\x85", "\xe3\x83\x8b" => "\xef\xbe\x86", + "\xe3\x83\x8c" => "\xef\xbe\x87", "\xe3\x83\x8d" => "\xef\xbe\x88", + "\xe3\x83\x8e" => "\xef\xbe\x89", "\xe3\x83\x8f" => "\xef\xbe\x8a", + "\xe3\x83\x92" => "\xef\xbe\x8b", "\xe3\x83\x95" => "\xef\xbe\x8c", + "\xe3\x83\x98" => "\xef\xbe\x8d", "\xe3\x83\x9b" => "\xef\xbe\x8e", + "\xe3\x83\x9e" => "\xef\xbe\x8f", "\xe3\x83\x9f" => "\xef\xbe\x90", + "\xe3\x83\xa0" => "\xef\xbe\x91", "\xe3\x83\xa1" => "\xef\xbe\x92", + "\xe3\x83\xa2" => "\xef\xbe\x93", "\xe3\x83\xa3" => "\xef\xbd\xac", + "\xe3\x83\xa4" => "\xef\xbe\x94", "\xe3\x83\xa5" => "\xef\xbd\xad", + "\xe3\x83\xa6" => "\xef\xbe\x95", "\xe3\x83\xa7" => "\xef\xbd\xae", + "\xe3\x83\xa8" => "\xef\xbe\x96", "\xe3\x83\xa9" => "\xef\xbe\x97", + "\xe3\x83\xaa" => "\xef\xbe\x98", "\xe3\x83\xab" => "\xef\xbe\x99", + "\xe3\x83\xac" => "\xef\xbe\x9a", "\xe3\x83\xad" => "\xef\xbe\x9b", + "\xe3\x83\xaf" => "\xef\xbe\x9c", "\xe3\x83\xb2" => "\xef\xbd\xa6", + "\xe3\x83\xb3" => "\xef\xbe\x9d", +); + + + +%_h2zKanaD = ( + "\xef\xbd\xb3\xef\xbe\x9e" => "\xe3\x83\xb4", "\xef\xbd\xb6\xef\xbe\x9e" => "\xe3\x82\xac", + "\xef\xbd\xb7\xef\xbe\x9e" => "\xe3\x82\xae", "\xef\xbd\xb8\xef\xbe\x9e" => "\xe3\x82\xb0", + "\xef\xbd\xb9\xef\xbe\x9e" => "\xe3\x82\xb2", "\xef\xbd\xba\xef\xbe\x9e" => "\xe3\x82\xb4", + "\xef\xbd\xbb\xef\xbe\x9e" => "\xe3\x82\xb6", "\xef\xbd\xbc\xef\xbe\x9e" => "\xe3\x82\xb8", + "\xef\xbd\xbd\xef\xbe\x9e" => "\xe3\x82\xba", "\xef\xbd\xbe\xef\xbe\x9e" => "\xe3\x82\xbc", + "\xef\xbd\xbf\xef\xbe\x9e" => "\xe3\x82\xbe", "\xef\xbe\x80\xef\xbe\x9e" => "\xe3\x83\x80", + "\xef\xbe\x81\xef\xbe\x9e" => "\xe3\x83\x82", "\xef\xbe\x82\xef\xbe\x9e" => "\xe3\x83\x85", + "\xef\xbe\x83\xef\xbe\x9e" => "\xe3\x83\x87", "\xef\xbe\x84\xef\xbe\x9e" => "\xe3\x83\x89", + "\xef\xbe\x8a\xef\xbe\x9e" => "\xe3\x83\x90", "\xef\xbe\x8a\xef\xbe\x9f" => "\xe3\x83\x91", + "\xef\xbe\x8b\xef\xbe\x9e" => "\xe3\x83\x93", "\xef\xbe\x8b\xef\xbe\x9f" => "\xe3\x83\x94", + "\xef\xbe\x8c\xef\xbe\x9e" => "\xe3\x83\x96", "\xef\xbe\x8c\xef\xbe\x9f" => "\xe3\x83\x97", + "\xef\xbe\x8d\xef\xbe\x9e" => "\xe3\x83\x99", "\xef\xbe\x8d\xef\xbe\x9f" => "\xe3\x83\x9a", + "\xef\xbe\x8e\xef\xbe\x9e" => "\xe3\x83\x9c", "\xef\xbe\x8e\xef\xbe\x9f" => "\xe3\x83\x9d", + +); + + + +%_z2hKanaD = ( + "\xe3\x82\xac" => "\xef\xbd\xb6\xef\xbe\x9e", "\xe3\x82\xae" => "\xef\xbd\xb7\xef\xbe\x9e", + "\xe3\x82\xb0" => "\xef\xbd\xb8\xef\xbe\x9e", "\xe3\x82\xb2" => "\xef\xbd\xb9\xef\xbe\x9e", + "\xe3\x82\xb4" => "\xef\xbd\xba\xef\xbe\x9e", "\xe3\x82\xb6" => "\xef\xbd\xbb\xef\xbe\x9e", + "\xe3\x82\xb8" => "\xef\xbd\xbc\xef\xbe\x9e", "\xe3\x82\xba" => "\xef\xbd\xbd\xef\xbe\x9e", + "\xe3\x82\xbc" => "\xef\xbd\xbe\xef\xbe\x9e", "\xe3\x82\xbe" => "\xef\xbd\xbf\xef\xbe\x9e", + "\xe3\x83\x80" => "\xef\xbe\x80\xef\xbe\x9e", "\xe3\x83\x82" => "\xef\xbe\x81\xef\xbe\x9e", + "\xe3\x83\x85" => "\xef\xbe\x82\xef\xbe\x9e", "\xe3\x83\x87" => "\xef\xbe\x83\xef\xbe\x9e", + "\xe3\x83\x89" => "\xef\xbe\x84\xef\xbe\x9e", "\xe3\x83\x90" => "\xef\xbe\x8a\xef\xbe\x9e", + "\xe3\x83\x91" => "\xef\xbe\x8a\xef\xbe\x9f", "\xe3\x83\x93" => "\xef\xbe\x8b\xef\xbe\x9e", + "\xe3\x83\x94" => "\xef\xbe\x8b\xef\xbe\x9f", "\xe3\x83\x96" => "\xef\xbe\x8c\xef\xbe\x9e", + "\xe3\x83\x97" => "\xef\xbe\x8c\xef\xbe\x9f", "\xe3\x83\x99" => "\xef\xbe\x8d\xef\xbe\x9e", + "\xe3\x83\x9a" => "\xef\xbe\x8d\xef\xbe\x9f", "\xe3\x83\x9c" => "\xef\xbe\x8e\xef\xbe\x9e", + "\xe3\x83\x9d" => "\xef\xbe\x8e\xef\xbe\x9f", "\xe3\x83\xb4" => "\xef\xbd\xb3\xef\xbe\x9e", + +); + + + +%_hira2kata = ( + "\xe3\x81\x81" => "\xe3\x82\xa1", "\xe3\x81\x82" => "\xe3\x82\xa2", + "\xe3\x81\x83" => "\xe3\x82\xa3", "\xe3\x81\x84" => "\xe3\x82\xa4", + "\xe3\x81\x85" => "\xe3\x82\xa5", "\xe3\x81\x86" => "\xe3\x82\xa6", + "\xe3\x81\x87" => "\xe3\x82\xa7", "\xe3\x81\x88" => "\xe3\x82\xa8", + "\xe3\x81\x89" => "\xe3\x82\xa9", "\xe3\x81\x8a" => "\xe3\x82\xaa", + "\xe3\x81\x8b" => "\xe3\x82\xab", "\xe3\x81\x8c" => "\xe3\x82\xac", + "\xe3\x81\x8d" => "\xe3\x82\xad", "\xe3\x81\x8e" => "\xe3\x82\xae", + "\xe3\x81\x8f" => "\xe3\x82\xaf", "\xe3\x81\x90" => "\xe3\x82\xb0", + "\xe3\x81\x91" => "\xe3\x82\xb1", "\xe3\x81\x92" => "\xe3\x82\xb2", + "\xe3\x81\x93" => "\xe3\x82\xb3", "\xe3\x81\x94" => "\xe3\x82\xb4", + "\xe3\x81\x95" => "\xe3\x82\xb5", "\xe3\x81\x96" => "\xe3\x82\xb6", + "\xe3\x81\x97" => "\xe3\x82\xb7", "\xe3\x81\x98" => "\xe3\x82\xb8", + "\xe3\x81\x99" => "\xe3\x82\xb9", "\xe3\x81\x9a" => "\xe3\x82\xba", + "\xe3\x81\x9b" => "\xe3\x82\xbb", "\xe3\x81\x9c" => "\xe3\x82\xbc", + "\xe3\x81\x9d" => "\xe3\x82\xbd", "\xe3\x81\x9e" => "\xe3\x82\xbe", + "\xe3\x81\x9f" => "\xe3\x82\xbf", "\xe3\x81\xa0" => "\xe3\x83\x80", + "\xe3\x81\xa1" => "\xe3\x83\x81", "\xe3\x81\xa2" => "\xe3\x83\x82", + "\xe3\x81\xa3" => "\xe3\x83\x83", "\xe3\x81\xa4" => "\xe3\x83\x84", + "\xe3\x81\xa5" => "\xe3\x83\x85", "\xe3\x81\xa6" => "\xe3\x83\x86", + "\xe3\x81\xa7" => "\xe3\x83\x87", "\xe3\x81\xa8" => "\xe3\x83\x88", + "\xe3\x81\xa9" => "\xe3\x83\x89", "\xe3\x81\xaa" => "\xe3\x83\x8a", + "\xe3\x81\xab" => "\xe3\x83\x8b", "\xe3\x81\xac" => "\xe3\x83\x8c", + "\xe3\x81\xad" => "\xe3\x83\x8d", "\xe3\x81\xae" => "\xe3\x83\x8e", + "\xe3\x81\xaf" => "\xe3\x83\x8f", "\xe3\x81\xb0" => "\xe3\x83\x90", + "\xe3\x81\xb1" => "\xe3\x83\x91", "\xe3\x81\xb2" => "\xe3\x83\x92", + "\xe3\x81\xb3" => "\xe3\x83\x93", "\xe3\x81\xb4" => "\xe3\x83\x94", + "\xe3\x81\xb5" => "\xe3\x83\x95", "\xe3\x81\xb6" => "\xe3\x83\x96", + "\xe3\x81\xb7" => "\xe3\x83\x97", "\xe3\x81\xb8" => "\xe3\x83\x98", + "\xe3\x81\xb9" => "\xe3\x83\x99", "\xe3\x81\xba" => "\xe3\x83\x9a", + "\xe3\x81\xbb" => "\xe3\x83\x9b", "\xe3\x81\xbc" => "\xe3\x83\x9c", + "\xe3\x81\xbd" => "\xe3\x83\x9d", "\xe3\x81\xbe" => "\xe3\x83\x9e", + "\xe3\x81\xbf" => "\xe3\x83\x9f", "\xe3\x82\x80" => "\xe3\x83\xa0", + "\xe3\x82\x81" => "\xe3\x83\xa1", "\xe3\x82\x82" => "\xe3\x83\xa2", + "\xe3\x82\x83" => "\xe3\x83\xa3", "\xe3\x82\x84" => "\xe3\x83\xa4", + "\xe3\x82\x85" => "\xe3\x83\xa5", "\xe3\x82\x86" => "\xe3\x83\xa6", + "\xe3\x82\x87" => "\xe3\x83\xa7", "\xe3\x82\x88" => "\xe3\x83\xa8", + "\xe3\x82\x89" => "\xe3\x83\xa9", "\xe3\x82\x8a" => "\xe3\x83\xaa", + "\xe3\x82\x8b" => "\xe3\x83\xab", "\xe3\x82\x8c" => "\xe3\x83\xac", + "\xe3\x82\x8d" => "\xe3\x83\xad", "\xe3\x82\x8e" => "\xe3\x83\xae", + "\xe3\x82\x8f" => "\xe3\x83\xaf", "\xe3\x82\x90" => "\xe3\x83\xb0", + "\xe3\x82\x91" => "\xe3\x83\xb1", "\xe3\x82\x92" => "\xe3\x83\xb2", + "\xe3\x82\x93" => "\xe3\x83\xb3", +); + + + +%_kata2hira = ( + "\xe3\x82\xa1" => "\xe3\x81\x81", "\xe3\x82\xa2" => "\xe3\x81\x82", + "\xe3\x82\xa3" => "\xe3\x81\x83", "\xe3\x82\xa4" => "\xe3\x81\x84", + "\xe3\x82\xa5" => "\xe3\x81\x85", "\xe3\x82\xa6" => "\xe3\x81\x86", + "\xe3\x82\xa7" => "\xe3\x81\x87", "\xe3\x82\xa8" => "\xe3\x81\x88", + "\xe3\x82\xa9" => "\xe3\x81\x89", "\xe3\x82\xaa" => "\xe3\x81\x8a", + "\xe3\x82\xab" => "\xe3\x81\x8b", "\xe3\x82\xac" => "\xe3\x81\x8c", + "\xe3\x82\xad" => "\xe3\x81\x8d", "\xe3\x82\xae" => "\xe3\x81\x8e", + "\xe3\x82\xaf" => "\xe3\x81\x8f", "\xe3\x82\xb0" => "\xe3\x81\x90", + "\xe3\x82\xb1" => "\xe3\x81\x91", "\xe3\x82\xb2" => "\xe3\x81\x92", + "\xe3\x82\xb3" => "\xe3\x81\x93", "\xe3\x82\xb4" => "\xe3\x81\x94", + "\xe3\x82\xb5" => "\xe3\x81\x95", "\xe3\x82\xb6" => "\xe3\x81\x96", + "\xe3\x82\xb7" => "\xe3\x81\x97", "\xe3\x82\xb8" => "\xe3\x81\x98", + "\xe3\x82\xb9" => "\xe3\x81\x99", "\xe3\x82\xba" => "\xe3\x81\x9a", + "\xe3\x82\xbb" => "\xe3\x81\x9b", "\xe3\x82\xbc" => "\xe3\x81\x9c", + "\xe3\x82\xbd" => "\xe3\x81\x9d", "\xe3\x82\xbe" => "\xe3\x81\x9e", + "\xe3\x82\xbf" => "\xe3\x81\x9f", "\xe3\x83\x80" => "\xe3\x81\xa0", + "\xe3\x83\x81" => "\xe3\x81\xa1", "\xe3\x83\x82" => "\xe3\x81\xa2", + "\xe3\x83\x83" => "\xe3\x81\xa3", "\xe3\x83\x84" => "\xe3\x81\xa4", + "\xe3\x83\x85" => "\xe3\x81\xa5", "\xe3\x83\x86" => "\xe3\x81\xa6", + "\xe3\x83\x87" => "\xe3\x81\xa7", "\xe3\x83\x88" => "\xe3\x81\xa8", + "\xe3\x83\x89" => "\xe3\x81\xa9", "\xe3\x83\x8a" => "\xe3\x81\xaa", + "\xe3\x83\x8b" => "\xe3\x81\xab", "\xe3\x83\x8c" => "\xe3\x81\xac", + "\xe3\x83\x8d" => "\xe3\x81\xad", "\xe3\x83\x8e" => "\xe3\x81\xae", + "\xe3\x83\x8f" => "\xe3\x81\xaf", "\xe3\x83\x90" => "\xe3\x81\xb0", + "\xe3\x83\x91" => "\xe3\x81\xb1", "\xe3\x83\x92" => "\xe3\x81\xb2", + "\xe3\x83\x93" => "\xe3\x81\xb3", "\xe3\x83\x94" => "\xe3\x81\xb4", + "\xe3\x83\x95" => "\xe3\x81\xb5", "\xe3\x83\x96" => "\xe3\x81\xb6", + "\xe3\x83\x97" => "\xe3\x81\xb7", "\xe3\x83\x98" => "\xe3\x81\xb8", + "\xe3\x83\x99" => "\xe3\x81\xb9", "\xe3\x83\x9a" => "\xe3\x81\xba", + "\xe3\x83\x9b" => "\xe3\x81\xbb", "\xe3\x83\x9c" => "\xe3\x81\xbc", + "\xe3\x83\x9d" => "\xe3\x81\xbd", "\xe3\x83\x9e" => "\xe3\x81\xbe", + "\xe3\x83\x9f" => "\xe3\x81\xbf", "\xe3\x83\xa0" => "\xe3\x82\x80", + "\xe3\x83\xa1" => "\xe3\x82\x81", "\xe3\x83\xa2" => "\xe3\x82\x82", + "\xe3\x83\xa3" => "\xe3\x82\x83", "\xe3\x83\xa4" => "\xe3\x82\x84", + "\xe3\x83\xa5" => "\xe3\x82\x85", "\xe3\x83\xa6" => "\xe3\x82\x86", + "\xe3\x83\xa7" => "\xe3\x82\x87", "\xe3\x83\xa8" => "\xe3\x82\x88", + "\xe3\x83\xa9" => "\xe3\x82\x89", "\xe3\x83\xaa" => "\xe3\x82\x8a", + "\xe3\x83\xab" => "\xe3\x82\x8b", "\xe3\x83\xac" => "\xe3\x82\x8c", + "\xe3\x83\xad" => "\xe3\x82\x8d", "\xe3\x83\xae" => "\xe3\x82\x8e", + "\xe3\x83\xaf" => "\xe3\x82\x8f", "\xe3\x83\xb0" => "\xe3\x82\x90", + "\xe3\x83\xb1" => "\xe3\x82\x91", "\xe3\x83\xb2" => "\xe3\x82\x92", + "\xe3\x83\xb3" => "\xe3\x82\x93", +); + + +} +# ----------------------------------------------------------------------------- +# unijp(); +# +sub unijp +{ + Unicode::Japanese->new(@_); +} +# utf8 => utf8-jsky2 +sub _u2uj1 +{ + my $this = shift; + + if(!defined($eu2j1)) + { + $eu2j2 = $this->_getFile('jcode/emoji2/eu2j2.dat'); + } + + my $str = $this->_validate_utf8($this->{str}); + + $str =~ s{([\xf0-\xf7][\x80-\xbf]{3})}{ + my ($c1,$c2,$c3,$c4) = unpack("C4", $1); + my $ch = (($c1 & 0x07)<<18) | (($c2 & 0x3F)<<12) | + (($c3 & 0x3f)<< 6) | ($c4 & 0x3F); + if( 0x0fe000 <= $ch && $ch <= 0x0fffff ) + { + my $c = substr($eu2j1, ($ch - 0x0fe000) * 5, 5); + $c =~ tr,\0,,d; + $c eq '' and $c = '?'; + if( $c =~ /^\e\$([GEFOPQ])(.)\x0f/ ) + { + my ($j1,$j2) = ($1,$2); + $j1 =~ tr/GEF/\xe0-\xe5/; + $j2 =~ tr/!-z/\x01-\x5a/; + $c = $this->_ucs2_utf8($j1.$j2); + } + $c; + }else + { + '?'; + } + }ge; + $str; +} +# utf8 -> jis-au1 +sub _u2ja1 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($u2s_table)) + { + $u2s_table = $this->_getFile('jcode/u2s.dat'); + } + + if(!defined($eu2a1s)) + { + $eu2a1s = $this->_getFile('jcode/emoji2/eu2as.dat'); + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + my $c; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})|([^\x00-\x7f])/ + defined($2) ? '?' : + ((length($1) == 1) ? $1 : + (length($1) == 2) ? ( + ($c1,$c2) = unpack("C2", $1), + $ch = (($c1 & 0x1F)<<6)|($c2 & 0x3F), + $c = substr($u2s_table, $ch * 2, 2), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 3) ? ( + ($c1,$c2,$c3) = unpack("C3", $1), + $ch = (($c1 & 0x0F)<<12)|(($c2 & 0x3F)<<6)|($c3 & 0x3F), + ( + ($ch <= 0x9fff) ? + $c = substr($u2s_table, $ch * 2, 2) : + ($ch >= 0xf900 and $ch <= 0xffff) ? + ( + $c = substr($u2s_table, ($ch - 0xf900 + 0xa000) * 2, 2), + (($c =~ tr,\0,,d)==2 and $c = "\0\0"), + ) : + ( + $c = '?' + ) + ), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 4) ? ( + ($c1,$c2,$c3,$c4) = unpack("C4", $1), + $ch = (($c1 & 0x07)<<18)|(($c2 & 0x3F)<<12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F), + ( + ($ch >= 0x0fe000 and $ch <= 0x0fffff) ? + ( + $c = substr($eu2a1s, ($ch - 0x0fe000) * 2, 2), + $c =~ tr,\0,,d, + ($c eq '') ? '?' : $c + ) : + '?' + ) + ) : + '?' + ) + /eg; + + $str; +} +sub _j2s { + my $this = shift; + my $str = shift; + + $str =~ s/($RE{JIS_0208}|$RE{JIS_0212}|$RE{JIS_ASC}|$RE{JIS_KANA})([^\e]*)/ + $this->_j2s2($1, $2) + /geo; + + $str; +} +# ----------------------------------------------------------------------------- +# $bytes_utf16 = $unijp->utf16(); +# +sub utf16 +{ + my $this = shift; + $this->_utf8_utf16($this->{str}); +} +sub utf8_jsky2 +{ + my $this = shift; + $this->_u2uj2($this->{str}); +} +# ----------------------------------------------------------------------------- +# AUʸѴ +# +# utf8AUʸѴ +sub _u2ai1 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($eu2a1)) + { + $eu2a1 = $this->_getFile('jcode/emoji2/eu2a.dat'); + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + my $c; + my $d; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})|([^\x00-\x7f])/ + defined($2) ? '?' : + ((length($1) == 1) ? $1 : + (length($1) == 2) ? $1 : + (length($1) == 3) ? $1 : + (length($1) == 4) ? ( + ($c1,$c2,$c3,$c4) = unpack("C4", $1), + $ch = (($c1 & 0x07)<<18)|(($c2 & 0x3F)<<12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F), + ( + ($ch >= 0x0fe000 and $ch <= 0x0fffff) ? + ( + $c = substr($eu2a1, ($ch - 0x0fe000) * 2, 2), + $d = unpack('n', $c), + $c =~ tr,\0,,d, + ($d <= 0x0336) ? $RE{E_ICON_AU_START} . $d . $RE{E_ICON_AU_END} : + ($c eq '') ? '?' : $c + ) : + '?' + ) + ) : + '?' + ) + /eg; + + $str; +} +sub sjis_icon_au2 +{ + my $this = shift; + $this->_u2s($this->_u2ai2($this->{str})); +} +sub _u2si2 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($u2s_table)) + { + $u2s_table = $this->_getFile('jcode/u2s.dat'); + } + + if(!defined($eu2i2)) + { + $eu2i2 = $this->_getFile('jcode/emoji2/eu2i2.dat'); + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + my $c; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})|([^\x00-\x7f])/ + defined($2) ? '?' : + ((length($1) == 1) ? $1 : + (length($1) == 2) ? ( + ($c1,$c2) = unpack("C2", $1), + $ch = (($c1 & 0x1F)<<6)|($c2 & 0x3F), + $c = substr($u2s_table, $ch * 2, 2), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 3) ? ( + ($c1,$c2,$c3) = unpack("C3", $1), + $ch = (($c1 & 0x0F)<<12)|(($c2 & 0x3F)<<6)|($c3 & 0x3F), + ( + ($ch <= 0x9fff) ? + $c = substr($u2s_table, $ch * 2, 2) : + ($ch >= 0xf900 and $ch <= 0xffff) ? + ( + $c = substr($u2s_table, ($ch - 0xf900 + 0xa000) * 2, 2), + (($c =~ tr,\0,,d)==2 and $c = "\0\0"), + ) : + ( + $c = '?' + ) + ), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 4) ? ( + ($c1,$c2,$c3,$c4) = unpack("C4", $1), + $ch = (($c1 & 0x07)<<18)|(($c2 & 0x3F)<<12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F), + ( + ($ch >= 0x0fe000 and $ch <= 0x0fffff) ? + ( + $c = substr($eu2i2, ($ch - 0x0fe000) * 2, 2), + $c =~ tr,\0,,d, + ($c eq '') ? '?' : $c + ) : + '?' + ) + ) : + '?' + ) + /eg; + $str; + +} +sub splitCsv { + my $this = shift; + my $text = $this->{str}; + my @field; + + chomp($text); + + while ($text =~ m/"([^"\\]*(?:(?:\\.|\"\")[^"\\]*)*)",?|([^,]+),?|,/g) { + my $field = defined($1) ? $1 : (defined($2) ? $2 : ''); + $field =~ s/["\\]"/"/g; + push(@field, $field); + } + push(@field, '') if($text =~ m/,$/); + + \@field; +} +sub sjis_jsky1 +{ + my $this = shift; + $this->_u2sj1($this->{str}); +} +sub _s2j3 { + my $this = shift; + my $c = shift; + + my ($c1, $c2) = unpack('CC', $c); + if (0x9f <= $c2) + { + $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe0 : 0x60); + $c2 += 2; + } + else + { + $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe1 : 0x61); + $c2 += 0x60 + ($c2 < 0x7f); + } + + $S2J[unpack('n', $c)] = pack('CC', $c1 - 0x80, $c2 - 0x80); +} +# sjis-au1 => utf8 +sub _sa2u1 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($s2u_table)) + { + $s2u_table = $this->_getFile('jcode/s2u.dat'); + } + + if(!defined($ea2u1s)) + { + $ea2u1s = $this->_getFile('jcode/emoji2/ea2us.dat'); + } + + my $l; + my $uc; + $str =~ s/($RE{SJIS_KANA}|$RE{SJIS_DBCS}|[\x80-\xff])/ + $SA2U1{$1} + or ($SA2U1{$1} = + ( + $l = (unpack('n', $1) or unpack('C', $1)), + ( + ($l >= 0xa1 and $l <= 0xdf) ? + ( + $uc = substr($s2u_table, ($l - 0xa1) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0x8100 and $l <= 0x9fff) ? + ( + $uc = substr($s2u_table, ($l - 0x8100 + 0x3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xeb00 and $l <= 0xeeff) ? + ( + $uc = substr($ea2u1s, ($l - 0xeb00) * 4, 4), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xe000 and $l <= 0xfcff) ? + ( + $uc = substr($s2u_table, ($l - 0xe000 + 0x1f3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l < 0x80) ? + chr($l) : + '?' + ) + ) + )/eg; + + $str; + +} +# ----------------------------------------------------------------------------- +# utf8 ==> sjis/ʸ +# +sub _u2s { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($u2s_table)) + { + $u2s_table = $this->_getFile('jcode/u2s.dat'); + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + my $c; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})|([^\x00-\x7f])/ + defined($2) ? '?' : ( + $U2S{$1} + or ($U2S{$1} + = ((length($1) == 1) ? $1 : + (length($1) == 2) ? ( + ($c1,$c2) = unpack("C2", $1), + $ch = (($c1 & 0x1F)<<6)|($c2 & 0x3F), + $c = substr($u2s_table, $ch * 2, 2), + # UTF-3Х(U+0x80-U+07FF)sjis-1ХȤؤΥޥåԥ󥰤ϤʤΤ\0ɬפϤʤ + $ch<0x80 ? '?' : ($c eq "\0\0") ? '&#' . $ch . ';' : $c + ) : + (length($1) == 3) ? ( + ($c1,$c2,$c3) = unpack("C3", $1), + $ch = (($c1 & 0x0F)<<12)|(($c2 & 0x3F)<<6)|($c3 & 0x3F), + ( + ($ch <= 0x9fff) ? + $c = substr($u2s_table, $ch * 2, 2) : + ($ch >= 0xf900 and $ch <= 0xffff) ? + ( + $c = substr($u2s_table, ($ch - 0xf900 + 0xa000) * 2, 2), + (($c =~ tr,\0,,d)==2 and $c = "\0\0"), + ) : + ( + $c = '&#' . $ch . ';' + ) + ), + $ch<0x0800 ? '?' : ($c eq "\0\0") ? '&#' . $ch . ';' : $c + ) : + (length($1) == 4) ? ( + ($c1,$c2,$c3,$c4) = unpack("C4", $1), + $ch = (($c1 & 0x07)<<18)|(($c2 & 0x3F)<<12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F), + ( + $ch <0x01_0000 ? '?' : + ($ch >= 0x0fe000 and $ch <= 0x0fffff) ? + '?' + : '&#' . $ch . ';' + ) + ) : + (length($1) == 5) ? (($c1,$c2,$c3,$c4,$c5) = unpack("C5", $1), + $ch = (($c1 & 0x03) << 24)|(($c2 & 0x3F) << 18)| + (($c3 & 0x3f) << 12)|(($c4 & 0x3f) << 6)| + ($c5 & 0x3F), + $ch<0x20_0000 ? '?' : '&#' . $ch . ';' + ) : + ( + ($c1,$c2,$c3,$c4,$c5,$c6) = unpack("C6", $1), + $ch = (($c1 & 0x03) << 30)|(($c2 & 0x3F) << 24)| + (($c3 & 0x3f) << 18)|(($c4 & 0x3f) << 12)| + (($c5 & 0x3f) << 6)|($c6 & 0x3F), + $ch<0x0400_0000 ? '?' : '&#' . $ch . ';' + ) + ) + ) + ) + /eg; + $str; + +} +sub _sa2j3 { + my $this = shift; + my $c = shift; + + my ($c1, $c2) = unpack('CC', $c); + $c1 = 0xeb if($c1 == 0xf6); + $c1 = 0xec if($c1 == 0xf7); + $c1 = 0xed if($c1 == 0xf3); + $c1 = 0xee if($c1 == 0xf4); + + if (0x9f <= $c2) + { + $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe0 : 0x60); + $c2 += 2; + } + else + { + $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe1 : 0x61); + $c2 += 0x60 + ($c2 < 0x7f); + } + + pack('CC', $c1 - 0x80, $c2 - 0x80); +} +sub _utf16_utf8 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + my $result = ''; + my $sa; + foreach my $uc (unpack("n*", $str)) + { + ($uc >= 0xd800 and $uc <= 0xdbff and $sa = $uc and next); + + ($uc >= 0xdc00 and $uc <= 0xdfff and ($uc = ((($sa - 0xd800) << 10)|($uc - 0xdc00))+0x10000)); + + $result .= $U2T[$uc] ? $U2T[$uc] : + ($U2T[$uc] = ($uc < 0x80) ? chr($uc) : + ($uc < 0x800) ? chr(0xC0 | ($uc >> 6)) . chr(0x80 | ($uc & 0x3F)) : + ($uc < 0x10000) ? chr(0xE0 | ($uc >> 12)) . chr(0x80 | (($uc >> 6) & 0x3F)) . chr(0x80 | ($uc & 0x3F)) : + chr(0xF0 | ($uc >> 18)) . chr(0x80 | (($uc >> 12) & 0x3F)) . chr(0x80 | (($uc >> 6) & 0x3F)) . chr(0x80 | ($uc & 0x3F))); + } + + $result; +} +sub h2zNum { + my $this = shift; + + if(!defined(%_h2zNum)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(0|1|2|3|4|5|6|7|8|9)/$_h2zNum{$1}/eg; + + $this; +} +sub h2zKanaK { + my $this = shift; + + if(!defined(%_h2zKanaK)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(\xef\xbd\xa1|\xef\xbd\xa2|\xef\xbd\xa3|\xef\xbd\xa4|\xef\xbd\xa5|\xef\xbd\xa6|\xef\xbd\xa7|\xef\xbd\xa8|\xef\xbd\xa9|\xef\xbd\xaa|\xef\xbd\xab|\xef\xbd\xac|\xef\xbd\xad|\xef\xbd\xae|\xef\xbd\xaf|\xef\xbd\xb0|\xef\xbd\xb1|\xef\xbd\xb2|\xef\xbd\xb3|\xef\xbd\xb4|\xef\xbd\xb5|\xef\xbd\xb6|\xef\xbd\xb7|\xef\xbd\xb8|\xef\xbd\xb9|\xef\xbd\xba|\xef\xbd\xbb|\xef\xbd\xbc|\xef\xbd\xbd|\xef\xbd\xbe|\xef\xbd\xbf|\xef\xbe\x80|\xef\xbe\x81|\xef\xbe\x82|\xef\xbe\x83|\xef\xbe\x84|\xef\xbe\x85|\xef\xbe\x86|\xef\xbe\x87|\xef\xbe\x88|\xef\xbe\x89|\xef\xbe\x8a|\xef\xbe\x8b|\xef\xbe\x8c|\xef\xbe\x8d|\xef\xbe\x8e|\xef\xbe\x8f|\xef\xbe\x90|\xef\xbe\x91|\xef\xbe\x92|\xef\xbe\x93|\xef\xbe\x94|\xef\xbe\x95|\xef\xbe\x96|\xef\xbe\x97|\xef\xbe\x98|\xef\xbe\x99|\xef\xbe\x9a|\xef\xbe\x9b|\xef\xbe\x9c|\xef\xbe\x9d|\xef\xbe\x9e|\xef\xbe\x9f)/$_h2zKanaK{$1}/eg; + + $this; +} +sub strlen { + my $this = shift; + + my $ch_re = '[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5}'; + my $length = 0; + + foreach my $c(split(/($ch_re)/,$this->{str})) { + next if(length($c) == 0); + $length += ((length($c) >= 3) ? 2 : 1); + } + + return $length; +} +sub strcutu +{ + my $this = shift; + my $result = &strcut; + + if( $]>=5.008 && $this->{icode} ne 'binary' ) + { + foreach(@$result) + { + Encode::_utf8_on($_); + } + } + + $result; +} +sub sjis_imode2 +{ + my $this = shift; + $this->_u2si2($this->{str}); +} +sub _validate_utf8 +{ + my $pkg = shift; + my $str = shift; + + # ŬڤǤʤĹ˥󥳡ɤƤ + # ʸ ? ֤. + defined($str) and $str =~ s{ + # 2 bytes char which is restricted 1 byte. + # + [\xc0-\xc1] [\x80-\xbf] + | + # 3 bytes char which is restricted <= 2 bytes. + # + \xe0 [\x80-\x9f] [\x80-\xbf] + | + # 4 bytes char which is restricted <= 3 bytes. + # + \xf0 [\x80-\x8f] [\x80-\xbf] [\x80-\xbf] + | + # > U+10FFFF (4byte) + # + \xf4 [\x90-\xbf] [\x80-\xbf] [\x80-\xbf] + |[\xf5-\xf7] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] + | + # > U+10FFFF (5byte) + # + [\xf8-\xfb] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] + | + # > U+10FFFF (6byte) + # + [\xfc-\xfd] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] + }{?}xg; + $str; +} +# ----------------------------------------------------------------------------- +# $unijp->set($str,[$icode,[$encode]]); +# +sub set +{ + my $this = shift; + my $str = shift; + my $icode = shift; + my $encode = shift; + + if(ref($str)) + { + die "String->set, Param[1] is Ref.\n"; + } + if(ref($icode)) + { + die "String->set, Param[2] is Ref.\n"; + } + if(ref($encode)) + { + die "String->set, Param[3] is Ref.\n"; + } + + if( $]>=5.008 ) + { + Encode::_utf8_off($str); + } + + if(defined($encode)) + { + if($encode eq 'base64') + { + $str = $this->_decodeBase64($str); + } + else + { + die "String->set, Param[3] encode name error.\n"; + } + } + + if(!defined($icode)) + { # omitted then 'utf8' + $this->{str} = $this->_validate_utf8($str); + $this->{icode} = 'utf8'; + } + else + { + $icode = lc($icode); + if($icode eq 'auto') + { + $icode = $this->getcode($str); + if($icode eq 'unknown') + { + $icode = 'binary'; + } + } + + if($icode eq 'utf8') + { + $this->{str} = $this->_validate_utf8($str); + } + elsif($icode eq 'ucs2') + { + $this->{str} = $this->_ucs2_utf8($str); + } + elsif($icode eq 'ucs4') + { + $this->{str} = $this->_ucs4_utf8($str); + } + elsif($icode eq 'utf16-be') + { + $this->{str} = $this->_utf16_utf8($this->_utf16be_utf16($str)); + } + elsif($icode eq 'utf16-le') + { + $this->{str} = $this->_utf16_utf8($this->_utf16le_utf16($str)); + } + elsif($icode eq 'utf16') + { + $this->{str} = $this->_utf16_utf8($this->_utf16_utf16($str)); + } + elsif($icode eq 'utf32-be') + { + $this->{str} = $this->_ucs4_utf8($this->_utf32be_ucs4($str)); + } + elsif($icode eq 'utf32-le') + { + $this->{str} = $this->_ucs4_utf8($this->_utf32le_ucs4($str)); + } + elsif($icode eq 'utf32') + { + $this->{str} = $this->_ucs4_utf8($this->_utf32_ucs4($str)); + } + elsif($icode eq 'jis') + { + $this->{str} = $this->_s2u($this->_j2s($str)); + } + elsif($icode eq 'euc' || $icode eq 'euc-jp') + { + $this->{str} = $this->_s2u($this->_e2s($str)); + } + elsif($icode eq 'sjis' || $icode eq 'cp932') + { + $this->{str} = $this->_s2u($str); + } + elsif($icode eq 'sjis-imode') + { + $this->{str} = $this->_si2u2($str); + } + elsif($icode eq 'sjis-imode1') + { + $this->{str} = $this->_si2u1($str); + } + elsif($icode eq 'sjis-imode2') + { + $this->{str} = $this->_si2u2($str); + } + elsif($icode eq 'sjis-doti') + { + $this->{str} = $this->_sd2u($str); + } + elsif($icode eq 'sjis-doti1') + { + $this->{str} = $this->_sd2u($str); + } + elsif($icode eq 'sjis-jsky') + { + $this->{str} = $this->_sj2u2($str); + } + elsif($icode eq 'sjis-jsky1') + { + $this->{str} = $this->_sj2u1($str); + } + elsif($icode eq 'sjis-jsky2') + { + $this->{str} = $this->_sj2u2($str); + } + elsif($icode eq 'jis-jsky') + { + $this->{str} = $this->_sj2u2($this->_j2s($str)); + } + elsif($icode eq 'jis-jsky1') + { + $this->{str} = $this->_sj2u1($this->_j2s($str)); + } + elsif($icode eq 'jis-jsky2') + { + $this->{str} = $this->_sj2u2($this->_j2s($str)); + } + elsif($icode eq 'utf8-jsky') + { + $this->{str} = $this->_uj2u2($str); + } + elsif($icode eq 'utf8-jsky1') + { + $this->{str} = $this->_uj2u1($str); + } + elsif($icode eq 'utf8-jsky2') + { + $this->{str} = $this->_uj2u2($str); + } + elsif($icode eq 'jis-au') + { + $this->{str} = $this->_sa2u2($this->_j2s($str)); + } + elsif($icode eq 'jis-au1') + { + $this->{str} = $this->_sa2u1($this->_j2s($str)); + } + elsif($icode eq 'jis-au2') + { + $this->{str} = $this->_sa2u2($this->_j2s($str)); + } + elsif($icode eq 'sjis-au') + { + $this->{str} = $this->_sa2u2($this->_j2s($this->_sa2j($str))); + } + elsif($icode eq 'sjis-au1') + { + $this->{str} = $this->_sa2u1($this->_j2s($this->_sa2j($str))); + } + elsif($icode eq 'sjis-au2') + { + $this->{str} = $this->_sa2u2($this->_j2s($this->_sa2j($str))); + } + elsif($icode eq 'sjis-icon-au') + { + $this->{str} = $this->_ai2u2($this->_s2u($str)); + } + elsif($icode eq 'sjis-icon-au1') + { + $this->{str} = $this->_ai2u1($this->_s2u($str)); + } + elsif($icode eq 'sjis-icon-au2') + { + $this->{str} = $this->_ai2u2($this->_s2u($str)); + } + elsif($icode eq 'euc-icon-au') + { + $this->{str} = $this->_ai2u2($this->_s2u($this->_e2s($str))); + } + elsif($icode eq 'euc-icon-au1') + { + $this->{str} = $this->_ai2u1($this->_s2u($this->_e2s($str))); + } + elsif($icode eq 'euc-icon-au2') + { + $this->{str} = $this->_ai2u2($this->_s2u($this->_e2s($str))); + } + elsif($icode eq 'jis-icon-au') + { + $this->{str} = $this->_ai2u2($this->_s2u($this->_j2s($str))); + } + elsif($icode eq 'jis-icon-au1') + { + $this->{str} = $this->_ai2u1($this->_s2u($this->_j2s($str))); + } + elsif($icode eq 'jis-icon-au2') + { + $this->{str} = $this->_ai2u2($this->_s2u($this->_j2s($str))); + } + elsif($icode eq 'utf8-icon-au') + { + $this->{str} = $this->_ai2u2($str); + } + elsif($icode eq 'utf8-icon-au1') + { + $this->{str} = $this->_ai2u1($str); + } + elsif($icode eq 'utf8-icon-au2') + { + $this->{str} = $this->_ai2u2($str); + } + elsif($icode eq 'ascii') + { + $this->{str} = $str; + } + elsif($icode eq 'binary') + { + $this->{str} = $str; + } + else + { + use Carp; + croak "icode error [$icode]"; + } + $this->{icode} = $icode; + } + + $this; +} +# ----------------------------------------------------------------------------- +# Unicode Ѵ +# +sub _ucs2_utf8 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + my $result = ''; + for my $uc (unpack("n*", $str)) + { + $result .= $U2T[$uc] ? $U2T[$uc] : + ($U2T[$uc] = ($uc < 0x80) ? chr($uc) : + ($uc < 0x800) ? chr(0xC0 | ($uc >> 6)) . chr(0x80 | ($uc & 0x3F)) : + chr(0xE0 | ($uc >> 12)) . chr(0x80 | (($uc >> 6) & 0x3F)) . + chr(0x80 | ($uc & 0x3F))); + } + + $result; +} +sub _utf16_utf16 { + my $this = shift; + my $str = shift; + + if($str =~ s/^\xfe\xff//) + { + $str = $this->_utf16be_utf16($str); + } + elsif($str =~ s/^\xff\xfe//) + { + $str = $this->_utf16le_utf16($str); + } + else + { + $str = $this->_utf16be_utf16($str); + } + + $str; +} +sub h2zAlpha { + my $this = shift; + + if(!defined(%_h2zAlpha)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)/$_h2zAlpha{$1}/eg; + + $this; +} +sub z2hKanaK { + my $this = shift; + + if(!defined(%_z2hKanaK)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(\xe3\x80\x81|\xe3\x80\x82|\xe3\x83\xbb|\xe3\x82\x9b|\xe3\x82\x9c|\xe3\x83\xbc|\xe3\x80\x8c|\xe3\x80\x8d|\xe3\x82\xa1|\xe3\x82\xa2|\xe3\x82\xa3|\xe3\x82\xa4|\xe3\x82\xa5|\xe3\x82\xa6|\xe3\x82\xa7|\xe3\x82\xa8|\xe3\x82\xa9|\xe3\x82\xaa|\xe3\x82\xab|\xe3\x82\xad|\xe3\x82\xaf|\xe3\x82\xb1|\xe3\x82\xb3|\xe3\x82\xb5|\xe3\x82\xb7|\xe3\x82\xb9|\xe3\x82\xbb|\xe3\x82\xbd|\xe3\x82\xbf|\xe3\x83\x81|\xe3\x83\x83|\xe3\x83\x84|\xe3\x83\x86|\xe3\x83\x88|\xe3\x83\x8a|\xe3\x83\x8b|\xe3\x83\x8c|\xe3\x83\x8d|\xe3\x83\x8e|\xe3\x83\x8f|\xe3\x83\x92|\xe3\x83\x95|\xe3\x83\x98|\xe3\x83\x9b|\xe3\x83\x9e|\xe3\x83\x9f|\xe3\x83\xa0|\xe3\x83\xa1|\xe3\x83\xa2|\xe3\x83\xa3|\xe3\x83\xa4|\xe3\x83\xa5|\xe3\x83\xa6|\xe3\x83\xa7|\xe3\x83\xa8|\xe3\x83\xa9|\xe3\x83\xaa|\xe3\x83\xab|\xe3\x83\xac|\xe3\x83\xad|\xe3\x83\xaf|\xe3\x83\xb2|\xe3\x83\xb3)/$_z2hKanaK{$1}/eg; + + $this; +} +# ----------------------------------------------------------------------------- +# @codelist = Unicode::Japanese->getcodelist($str); +# +sub getcodelist { + my $this = shift; + my $str = shift; + my @codelist; + + if( $]>=5.008 ) + { + Encode::_utf8_off($str); + } + + my $l = length($str); + + if((($l % 4) == 0) + and ($str =~ m/^(?:$RE{BOM4_BE}|$RE{BOM4_LE})/o)) + { + push(@codelist, 'utf32'); + } + if((($l % 2) == 0) + and ($str =~ m/^(?:$RE{BOM2_BE}|$RE{BOM2_LE})/o)) + { + push(@codelist, 'utf16'); + } + + my $str2; + + if(($l % 4) == 0) + { + $str2 = $str; + 1 while($str2 =~ s/^(?:$RE{UTF32_BE})//o); + if($str2 eq '') + { + push(@codelist, 'utf32-be'); + } + + $str2 = $str; + 1 while($str2 =~ s/^(?:$RE{UTF32_LE})//o); + if($str2 eq '') + { + push(@codelist, 'utf32-le'); + } + } + + if($str !~ m/[\e\x80-\xff]/) + { + push(@codelist, 'ascii'); + } + + if($str =~ m/$RE{JIS_0208}|$RE{JIS_0212}|$RE{JIS_ASC}|$RE{JIS_KANA}/o) + { + if($str =~ m/(?:$RE{JIS_0208})(?:[^\e]{2})*$RE{E_JIS_AU}/o) + { + push(@codelist, 'jis-au'); + } + elsif($str =~ m/(?:$RE{E_JSKY})/o) + { + push(@codelist, 'jis-jsky'); + } + else + { + push(@codelist, 'jis'); + } + } + + if($str =~ m/(?:$RE{E_JSKY})/o) + { + push(@codelist, 'sjis-jsky'); + } + + $str2 = $str; + 1 while($str2 =~ s/^(?:$RE{ASCII}|$RE{EUC_0212}|$RE{EUC_KANA}|$RE{EUC_C})//o); + if($str2 eq '') + { + push(@codelist, 'euc'); + } + + $str2 = $str; + 1 while($str2 =~ s/^(?:$RE{ASCII}|$RE{SJIS_DBCS}|$RE{SJIS_KANA})//o); + if($str2 eq '') + { + push(@codelist, 'sjis'); + } + if($str =~ m/^(?:$RE{E_SJIS_AU})/o) + { + push(@codelist, 'sjis-au'); + } + + my $str3; + $str3 = $str2; + 1 while($str3 =~ s/^(?:$RE{ASCII}|$RE{SJIS_DBCS}|$RE{SJIS_KANA}|$RE{E_IMODE})//o); + if($str3 eq '') + { + push(@codelist, 'sjis-imode'); + } + + $str3 = $str2; + 1 while($str3 =~ s/^(?:$RE{ASCII}|$RE{SJIS_DBCS}|$RE{SJIS_KANA}|$RE{E_DOTI})//o); + if($str3 eq '') + { + push(@codelist, 'sjis-doti'); + } + + $str2 = $str; + 1 while($str2 =~ s/^(?:$RE{UTF8})//o); + if($str2 eq '') + { + push(@codelist, 'utf8'); + } + + @codelist or push(@codelist, 'unknown'); + @codelist; +} +sub _sj2u2 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($s2u_table)) + { + $s2u_table = $this->_getFile('jcode/s2u.dat'); + } + + if(!defined($ej2u1)) + { + $ej2u1 = $this->_getFile('jcode/emoji2/ej2u.dat'); + } + if(!defined($ej2u2)) + { + $ej2u2 = $this->_getFile('jcode/emoji2/ej2u2.dat'); + } + + my $l; + my $j1; + my $uc; + $str =~ s/($RE{SJIS_KANA}|$RE{SJIS_DBCS}|$RE{E_JSKY}|[\x80-\xff])/ + (length($1) <= 2) ? + ( + $l = (unpack('n', $1) or unpack('C', $1)), + ( + ($l >= 0xa1 and $l <= 0xdf) ? + ( + $uc = substr($s2u_table, ($l - 0xa1) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0x8100 and $l <= 0x9fff) ? + ( + $uc = substr($s2u_table, ($l - 0x8100 + 0x3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xe000 and $l <= 0xffff) ? + ( + $uc = substr($s2u_table, ($l - 0xe000 + 0x1f3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l < 0x80) ? + chr($l) : + '?' + ) + ) : + ( + $l = $1, + ( $l =~ s,^$RE{E_JSKY_START}($RE{E_JSKY1v1}),,o + ? + ( + $j1 = $1, + $uc = '', + $l =~ s!($RE{E_JSKY2})!$uc .= substr($ej2u1, (unpack('n', $j1 . $1) - 0x4500) * 4, 4), ''!ego, + $uc =~ tr,\0,,d, + $uc + ) + : + ( + $l =~ s,^$RE{E_JSKY_START}($RE{E_JSKY1v2}),,o, + $j1 = $1, + $uc = '', + $l =~ s!($RE{E_JSKY2})!$uc .= substr($ej2u2, (unpack('n', $j1 . $1) - 0x4f00) * 4, 4), ''!ego, + $uc =~ tr,\0,,d, + $uc + ) + ) + ) + /eg; + + $str; + +} +sub jis_icon_au +{ + my $this = shift; + $this->_s2j($this->_u2s($this->_u2ai2($this->{str}))); +} +sub _utf32_ucs4 { + my $this = shift; + my $str = shift; + + if($str =~ s/^\x00\x00\xfe\xff//) + { + $str = $this->_utf32be_ucs4($str); + } + elsif($str =~ s/^\xff\xfe\x00\x00//) + { + $str = $this->_utf32le_ucs4($str); + } + else + { + $str = $this->_utf32be_ucs4($str); + } + + $str; +} +sub _ai2u2 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($ea2u2)) + { + $ea2u2 = $this->_getFile('jcode/emoji2/ea2u2.dat'); + } + + my $c; + $str =~ s/$RE{E_ICON_AU_START}(\d+)$RE{E_ICON_AU_END}/ + ($1 > 0 and $1 <= 0x0336) ? + ($c = substr($ea2u2, ($1-1) * 4, 4), $c =~ tr,\0,,d, ($c eq '') ? '?' : $c) : + '?' + /ige; + + $str; +} +sub utf8_icon_au2 +{ + my $this = shift; + $this->_u2ai2($this->{str}); +} +# utf8-jsky1 => utf8. +sub _uj2u1 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($s2u_table)) + { + $s2u_table = $this->_getFile('jcode/s2u.dat'); + } + + if(!defined($ej2u1)) + { + $ej2u1 = $this->_getFile('jcode/emoji2/ej2u.dat'); + } + + $str = $this->_validate_utf8($str); + + my @umap = (0x200, 0x000, 0x100); + $str =~ s{($RE{E_JSKYv1_UTF8}+)}{ + join('', + map{ + my $l = $_ - 0xe000 + 0x20; + substr($ej2u1, ($umap[$l/256]+($l&255)) * 4, 4); + } unpack("n*", $this->_utf8_ucs2($1)) + ) + }geo; + + $str; + +} +sub _sa2j { + my $this = shift; + my $str = shift; + + $str =~ s/((?:$RE{SJIS_DBCS}|$RE{E_SJIS_AU}|$RE{SJIS_KANA})+)/ + $this->_sa2j2($1) . $ESC{ASC} + /geo; + + $str; +} +# ----------------------------------------------------------------------------- +# h2z/z2h Kana +# +sub h2zKana +{ + my $this = shift; + + $this->h2zKanaD; + $this->h2zKanaK; + + $this; +} +sub z2hKana +{ + my $this = shift; + + $this->z2hKanaD; + $this->z2hKanaK; + + $this; +} +sub _si2u2 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($s2u_table)) + { + $s2u_table = $this->_getFile('jcode/s2u.dat'); + } + + if(!defined($ei2u2)) + { + $ei2u2 = $this->_getFile('jcode/emoji2/ei2u2.dat'); + } + + $str =~ s/(\&\#(\d+);)/ + ($2 >= 0xf800 and $2 <= 0xf9ff) ? pack('n', $2) : $1 + /eg; + + my $l; + my $uc; + $str =~ s/($RE{SJIS_KANA}|$RE{SJIS_DBCS}|$RE{E_IMODE}|[\x80-\xff])/ + $S2U{$1} + or ($S2U{$1} = + ( + $l = (unpack('n', $1) or unpack('C', $1)), + ( + ($l >= 0xa1 and $l <= 0xdf) ? + ( + $uc = substr($s2u_table, ($l - 0xa1) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0x8100 and $l <= 0x9fff) ? + ( + $uc = substr($s2u_table, ($l - 0x8100 + 0x3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xf800 and $l <= 0xf9ff) ? + ( + $uc = substr($ei2u2, ($l - 0xf800) * 4, 4), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xe000 and $l <= 0xffff) ? + ( + $uc = substr($s2u_table, ($l - 0xe000 + 0x1f3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l < 0x80) ? + chr($l) : + '?' + ) + ) + )/eg; + + $str; + +} +sub _u2sj1 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($u2s_table)) + { + $u2s_table = $this->_getFile('jcode/u2s.dat'); + } + + if(!defined($eu2j1)) + { + $eu2j1 = $this->_getFile('jcode/emoji2/eu2j.dat'); + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + my $c; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})|([^\x00-\x7f])/ + defined($2) ? '?' : + ((length($1) == 1) ? $1 : + (length($1) == 2) ? ( + ($c1,$c2) = unpack("C2", $1), + $ch = (($c1 & 0x1F)<<6)|($c2 & 0x3F), + $c = substr($u2s_table, $ch * 2, 2), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 3) ? ( + ($c1,$c2,$c3) = unpack("C3", $1), + $ch = (($c1 & 0x0F)<<12)|(($c2 & 0x3F)<<6)|($c3 & 0x3F), + ( + ($ch <= 0x9fff) ? + $c = substr($u2s_table, $ch * 2, 2) : + ($ch >= 0xf900 and $ch <= 0xffff) ? + ( + $c = substr($u2s_table, ($ch - 0xf900 + 0xa000) * 2, 2), + (($c =~ tr,\0,,d)==2 and $c = "\0\0"), + ) : + ( + $c = '?' + ) + ), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 4) ? ( + ($c1,$c2,$c3,$c4) = unpack("C4", $1), + $ch = (($c1 & 0x07)<<18)|(($c2 & 0x3F)<<12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F), + ( + ($ch >= 0x0fe000 and $ch <= 0x0fffff) ? + ( + $c = substr($eu2j1, ($ch - 0x0fe000) * 5, 5), + $c =~ tr,\0,,d, + ($c eq '') ? '?' : $c + ) : + '?' + ) + ) : + '?' + ) + /eg; + + 1 while($str =~ s/($RE{E_JSKY_START})($RE{E_JSKY1})($RE{E_JSKY2}+)$RE{E_JSKY_END}$RE{E_JSKY_START}\2($RE{E_JSKY2})($RE{E_JSKY_END})/$1$2$3$4$5/o); + + $str; + +} +# utf8 => utf8-jsky1 +sub _u2sj2 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($u2s_table)) + { + $u2s_table = $this->_getFile('jcode/u2s.dat'); + } + + if(!defined($eu2j2)) + { + $eu2j2 = $this->_getFile('jcode/emoji2/eu2j2.dat'); + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + my $c; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})|([^\x00-\x7f])/ + defined($2) ? '?' : + ((length($1) == 1) ? $1 : + (length($1) == 2) ? ( + ($c1,$c2) = unpack("C2", $1), + $ch = (($c1 & 0x1F)<<6)|($c2 & 0x3F), + $c = substr($u2s_table, $ch * 2, 2), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 3) ? ( + ($c1,$c2,$c3) = unpack("C3", $1), + $ch = (($c1 & 0x0F)<<12)|(($c2 & 0x3F)<<6)|($c3 & 0x3F), + ( + ($ch <= 0x9fff) ? + $c = substr($u2s_table, $ch * 2, 2) : + ($ch >= 0xf900 and $ch <= 0xffff) ? + ( + $c = substr($u2s_table, ($ch - 0xf900 + 0xa000) * 2, 2), + (($c =~ tr,\0,,d)==2 and $c = "\0\0"), + ) : + ( + $c = '?' + ) + ), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 4) ? ( + ($c1,$c2,$c3,$c4) = unpack("C4", $1), + $ch = (($c1 & 0x07)<<18)|(($c2 & 0x3F)<<12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F), + ( + ($ch >= 0x0fe000 and $ch <= 0x0fffff) ? + ( + $c = substr($eu2j2, ($ch - 0x0fe000) * 5, 5), + $c =~ tr,\0,,d, + ($c eq '') ? '?' : $c + ) : + '?' + ) + ) : + '?' + ) + /eg; + + 1 while($str =~ s/($RE{E_JSKY_START})($RE{E_JSKY1})($RE{E_JSKY2}+)$RE{E_JSKY_END}$RE{E_JSKY_START}\2($RE{E_JSKY2})($RE{E_JSKY_END})/$1$2$3$4$5/o); + + $str; + +} +sub utf8_icon_au +{ + my $this = shift; + $this->_u2ai2($this->{str}); +} +sub jis_jsky2 +{ + my $this = shift; + $this->_s2j($this->_u2sj2($this->{str})); +} +# ----------------------------------------------------------------------------- +# $bytes_doti = $unijp->sjis_doti(); +# +sub sjis_doti +{ + my $this = shift; + $this->_u2sd($this->{str}); +} +sub _e2s { + my $this = shift; + my $str = shift; + + $str =~ s/($RE{EUC_KANA}|$RE{EUC_0212}|$RE{EUC_C})/ + $E2S[unpack('n', $1) or unpack('N', "\0" . $1)] or $this->_e2s2($1) + /geo; + + $str; +} +# ----------------------------------------------------------------------------- +# $bytes_eucjp = $unijp->euc(); +# +sub euc +{ + my $this = shift; + $this->_s2e($this->sjis); +} +sub _j2s3 { + my $this = shift; + my $c = shift; + + my ($c1, $c2) = unpack('CC', $c); + if ($c1 % 2) + { + $c1 = ($c1>>1) + ($c1 < 0xdf ? 0x31 : 0x71); + $c2 -= 0x60 + ($c2 < 0xe0); + } + else + { + $c1 = ($c1>>1) + ($c1 < 0xdf ? 0x30 : 0x70); + $c2 -= 2; + } + + $J2S[unpack('n', $c)] = pack('CC', $c1, $c2); +} +sub _j2sa2 { + my $this = shift; + my $esc = shift; + my $str = shift; + + if($esc eq $ESC{JIS_0212}) + { + $str =~ s/../$CHARCODE{UNDEF_SJIS}/g; + } + elsif($esc !~ m/^$RE{JIS_ASC}/) + { + $str =~ s{([\x21-\x7e]+)}{ + my $str = $1; + $str =~ tr/\x21-\x7e/\xa1-\xfe/; + if($esc =~ m/^$RE{JIS_0208}/) + { + $str =~ s/($RE{EUC_C})/ + $this->_j2sa3($1) + /geo; + } + $str; + }e; + } + + $str; +} +# ----------------------------------------------------------------------------- +# $bytes_ucs4 = $unijp->ucs4(); +# +sub ucs4 +{ + my $this = shift; + $this->_utf8_ucs4($this->{str}); +} +sub _sd2u { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($s2u_table)) + { + $s2u_table = $this->_getFile('jcode/s2u.dat'); + } + + if(!defined($ed2u)) + { + $ed2u = $this->_getFile('jcode/emoji2/ed2u.dat'); + } + + $str =~ s/(\&\#(\d+);)/ + ($2 >= 0xf000 and $2 <= 0xf4ff) ? pack('n', $2) : $1 + /eg; + + my $l; + my $uc; + $str =~ s/($RE{SJIS_KANA}|$RE{SJIS_DBCS}|$RE{E_DOTI}|[\x80-\xff])/ + $S2U{$1} + or ($S2U{$1} = + ( + $l = (unpack('n', $1) or unpack('C', $1)), + ( + ($l >= 0xa1 and $l <= 0xdf) ? + ( + $uc = substr($s2u_table, ($l - 0xa1) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0x8100 and $l <= 0x9fff) ? + ( + $uc = substr($s2u_table, ($l - 0x8100 + 0x3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xf000 and $l <= 0xf4ff) ? + ( + $uc = substr($ed2u, ($l - 0xf000) * 4, 4), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xe000 and $l <= 0xffff) ? + ( + $uc = substr($s2u_table, ($l - 0xe000 + 0x1f3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l < 0x80) ? + chr($l) : + '?' + ) + ) + )/eg; + + $str; + +} +# utf8 -> jis-au2 +sub _u2ja2 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($u2s_table)) + { + $u2s_table = $this->_getFile('jcode/u2s.dat'); + } + + if(!defined($eu2a2s)) + { + $eu2a2s = $this->_getFile('jcode/emoji2/eu2a2s.dat'); + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + my $c; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})|([^\x00-\x7f])/ + defined($2) ? '?' : + ((length($1) == 1) ? $1 : + (length($1) == 2) ? ( + ($c1,$c2) = unpack("C2", $1), + $ch = (($c1 & 0x1F)<<6)|($c2 & 0x3F), + $c = substr($u2s_table, $ch * 2, 2), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 3) ? ( + ($c1,$c2,$c3) = unpack("C3", $1), + $ch = (($c1 & 0x0F)<<12)|(($c2 & 0x3F)<<6)|($c3 & 0x3F), + ( + ($ch <= 0x9fff) ? + $c = substr($u2s_table, $ch * 2, 2) : + ($ch >= 0xf900 and $ch <= 0xffff) ? + ( + $c = substr($u2s_table, ($ch - 0xf900 + 0xa000) * 2, 2), + (($c =~ tr,\0,,d)==2 and $c = "\0\0"), + ) : + ( + $c = '?' + ) + ), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 4) ? ( + ($c1,$c2,$c3,$c4) = unpack("C4", $1), + $ch = (($c1 & 0x07)<<18)|(($c2 & 0x3F)<<12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F), + ( + ($ch >= 0x0fe000 and $ch <= 0x0fffff) ? + ( + $c = substr($eu2a2s, ($ch - 0x0fe000) * 2, 2), + $c =~ tr,\0,,d, + ($c eq '') ? '?' : $c + ) : + '?' + ) + ) : + '?' + ) + /eg; + + $str; +} +sub _s2e2 { + my $this = shift; + my $c = shift; + + my ($c1, $c2) = unpack('CC', $c); + if (0xa1 <= $c1 && $c1 <= 0xdf) + { + $c2 = $c1; + $c1 = 0x8e; + } + elsif (0x9f <= $c2) + { + $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe0 : 0x60); + $c2 += 2; + } + else + { + $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe1 : 0x61); + $c2 += 0x60 + ($c2 < 0x7f); + } + + $S2E[unpack('n', $c) or unpack('C', $1)] = pack('CC', $c1, $c2); +} +sub z2hKanaD { + my $this = shift; + + if(!defined(%_z2hKanaD)) + { + $this->_loadConvTable; + } + + $this->{str} =~ s/(\xe3\x82\xac|\xe3\x82\xae|\xe3\x82\xb0|\xe3\x82\xb2|\xe3\x82\xb4|\xe3\x82\xb6|\xe3\x82\xb8|\xe3\x82\xba|\xe3\x82\xbc|\xe3\x82\xbe|\xe3\x83\x80|\xe3\x83\x82|\xe3\x83\x85|\xe3\x83\x87|\xe3\x83\x89|\xe3\x83\x90|\xe3\x83\x91|\xe3\x83\x93|\xe3\x83\x94|\xe3\x83\x96|\xe3\x83\x97|\xe3\x83\x99|\xe3\x83\x9a|\xe3\x83\x9c|\xe3\x83\x9d|\xe3\x83\xb4)/$_z2hKanaD{$1}/eg; + + $this; +} +sub _u2sd { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($u2s_table)) + { + $u2s_table = $this->_getFile('jcode/u2s.dat'); + } + + if(!defined($eu2d)) + { + $eu2d = $this->_getFile('jcode/emoji2/eu2d.dat'); + } + + my $c1; + my $c2; + my $c3; + my $c4; + my $c5; + my $c6; + my $c; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5})|([^\x00-\x7f])/ + defined($2) ? '?' : + ((length($1) == 1) ? $1 : + (length($1) == 2) ? ( + ($c1,$c2) = unpack("C2", $1), + $ch = (($c1 & 0x1F)<<6)|($c2 & 0x3F), + $c = substr($u2s_table, $ch * 2, 2), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 3) ? ( + ($c1,$c2,$c3) = unpack("C3", $1), + $ch = (($c1 & 0x0F)<<12)|(($c2 & 0x3F)<<6)|($c3 & 0x3F), + ( + ($ch <= 0x9fff) ? + $c = substr($u2s_table, $ch * 2, 2) : + ($ch >= 0xf900 and $ch <= 0xffff) ? + ( + $c = substr($u2s_table, ($ch - 0xf900 + 0xa000) * 2, 2), + (($c =~ tr,\0,,d)==2 and $c = "\0\0"), + ) : + ( + $c = '?' + ) + ), + ($c eq "\0\0") ? '?' : $c + ) : + (length($1) == 4) ? ( + ($c1,$c2,$c3,$c4) = unpack("C4", $1), + $ch = (($c1 & 0x07)<<18)|(($c2 & 0x3F)<<12)| + (($c3 & 0x3f) << 6)|($c4 & 0x3F), + ( + ($ch >= 0x0fe000 and $ch <= 0x0fffff) ? + ( + $c = substr($eu2d, ($ch - 0x0fe000) * 2, 2), + $c =~ tr,\0,,d, + ($c eq '') ? '?' : $c + ) : + '?' + ) + ) : + '?' + ) + /eg; + $str; + +} +sub sjis_au +{ + my $this = shift; + $this->_j2sa($this->_s2j($this->_u2ja2($this->{str}))); +} +sub _utf8_ucs2 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + my $c1; + my $c2; + my $c3; + my $ch; + $str =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5}|.)/ + defined($2)?"\0?": + $T2U{$1} + or ($T2U{$1} + = ((length($1) == 1) ? pack("n", unpack("C", $1)) : + (length($1) == 2) ? (($c1,$c2) = unpack("C2", $1), + $ch = (($c1 & 0x1F)<<6)|($c2 & 0x3F), + $ch<0x80 ? "\0?" : pack("n", $ch) + ) : + (length($1) == 3) ? (($c1,$c2,$c3) = unpack("C3", $1), + $ch = (($c1 & 0x0F)<<12)|(($c2 & 0x3F)<<6)|($c3 & 0x3F), + $ch<0x0800 ? "\0?" : pack("n", $ch) + ) : "\0?")) + /eg; + $str; +} +sub euc_icon_au1 +{ + my $this = shift; + $this->_s2e($this->_u2s($this->_u2ai1($this->{str}))); +} +# ----------------------------------------------------------------------------- +# $bytes_au = $unijp->jis_au1(); +# +sub jis_au +{ + my $this = shift; + $this->_s2j($this->_u2ja2($this->{str})); +} +sub _utf32le_ucs4 { + my $this = shift; + my $str = shift; + + my $result = ''; + foreach my $ch (unpack('V*', $str)) + { + $result .= pack('N', $ch); + } + + $result; +} +# ----------------------------------------------------------------------------- +# $bytes_imode = $unijp->sjis_imode(); +# +sub sjis_imode +{ + my $this = shift; + $this->_u2si2($this->{str}); +} +sub _e2s2 { + my $this = shift; + my $c = shift; + + my ($c1, $c2) = unpack('CC', $c); + if ($c1 == 0x8e) + { # SS2 + $E2S[unpack('n', $c)] = chr($c2); + } + elsif ($c1 == 0x8f) + { # SS3 + $E2S[unpack('N', "\0" . $c)] = $CHARCODE{UNDEF_SJIS}; + } + else + { #SS1 or X0208 + if ($c1 % 2) + { + $c1 = ($c1>>1) + ($c1 < 0xdf ? 0x31 : 0x71); + $c2 -= 0x60 + ($c2 < 0xe0); + } + else + { + $c1 = ($c1>>1) + ($c1 < 0xdf ? 0x30 : 0x70); + $c2 -= 2; + } + $E2S[unpack('n', $c)] = pack('CC', $c1, $c2); + } +} +sub _s2j2 { + my $this = shift; + my $str = shift; + + $str =~ s/((?:$RE{SJIS_DBCS})+|(?:$RE{SJIS_KANA})+)/ + my $s = $1; + if($s =~ m,^$RE{SJIS_KANA},o) + { + $s =~ tr,\xa1-\xdf,\x21-\x5f,; + $ESC{KANA} . $s + } + else + { + $s =~ s!($RE{SJIS_DBCS})! + $S2J[unpack('n', $1)] or $this->_s2j3($1) + !geo; + $ESC{JIS_0208} . $s; + } + /geo; + + $str; +} +# ----------------------------------------------------------------------------- +# encode/decode +sub _encodeBase64 +{ + my $this = shift; + my $str = shift; + my $eol = shift; + my $res = ""; + + $eol = "\n" unless defined $eol; + pos($str) = 0; # ensure start at the beginning + while ($str =~ /(.{1,45})/gs) + { + $res .= substr(pack('u', $1), 1); + chop($res); + } + $res =~ tr|` -_|AA-Za-z0-9+/|; # `# help emacs + # fix padding at the end + my $padding = (3 - length($str) % 3) % 3; + $res =~ s/.{$padding}$/'=' x $padding/e if $padding; + # break encoded string into lines of no more than 76 characters each + if (length $eol) + { + $res =~ s/(.{1,76})/$1$eol/g; + } + $res; +} +sub validate_utf8 +{ + # my $safer_utf8 = Unicode::Japanese->validate_utf8($utf8_str); + # + $_[0]->_validate_utf8(@_[1..$#_]); +} +sub sjis_icon_au +{ + my $this = shift; + $this->_u2s($this->_u2ai2($this->{str})); +} +# ----------------------------------------------------------------------------- +# split/join Csv +# +sub split_csv { + &splitCsv; +} +# sjis-au2 => utf8 +sub _sa2u2 { + my $this = shift; + my $str = shift; + + if(!defined($str)) + { + return ''; + } + + if(!defined($s2u_table)) + { + $s2u_table = $this->_getFile('jcode/s2u.dat'); + } + + if(!defined($ea2u2s)) + { + $ea2u2s = $this->_getFile('jcode/emoji2/ea2u2s.dat'); + } + + my $l; + my $uc; + $str =~ s/($RE{SJIS_KANA}|$RE{SJIS_DBCS}|[\x80-\xff])/ + $SA2U2{$1} + or ($SA2U2{$1} = + ( + $l = (unpack('n', $1) or unpack('C', $1)), + ( + ($l >= 0xa1 and $l <= 0xdf) ? + ( + $uc = substr($s2u_table, ($l - 0xa1) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0x8100 and $l <= 0x9fff) ? + ( + $uc = substr($s2u_table, ($l - 0x8100 + 0x3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xeb00 and $l <= 0xeeff) ? + ( + $uc = substr($ea2u2s, ($l - 0xeb00) * 4, 4), + $uc =~ tr,\0,,d, + $uc + ) : + ($l >= 0xe000 and $l <= 0xfcff) ? + ( + $uc = substr($s2u_table, ($l - 0xe000 + 0x1f3f) * 3, 3), + $uc =~ tr,\0,,d, + $uc + ) : + ($l < 0x80) ? + chr($l) : + '?' + ) + ) + )/eg; + + $str; + +} +# ----------------------------------------------------------------------------- +# $bytes_jsky = $unijp->jis_jsky(); +# +sub jis_jsky +{ + my $this = shift; + $this->_s2j($this->_u2sj2($this->{str})); +} +# ----------------------------------------------------------------------------- +# strcut, strlen +# +sub strcut +{ + my $this = shift; + my $cutlen = shift; + + if(ref($cutlen)) + { + die "String->strcut, Param[1] is Ref.\n"; + } + if($cutlen =~ m/\D/) + { + die "String->strcut, Param[1] must be NUMERIC.\n"; + } + + my $ch_re = '[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5}'; + + my $result; + my $line = ''; + my $linelength = 0; + + foreach my $c (split(/($ch_re)/, $this->{str})) + { + next if(length($c) == 0); + if($linelength + (length($c) >= 3 ? 2 : 1) > $cutlen) + { + $line ne '' and push(@$result, $line); + $line = ''; + $linelength = 0; + } + $linelength += (length($c) >= 3 ? 2 : 1); + $line .= $c; + } + push(@$result, $line); + + $result; +} +sub cp932 +{ + shift->sjis(@_); +} +sub _utf32be_ucs4 { + my $this = shift; + my $str = shift; + + $str; +} +  +  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\N}L~ƒÃăŃƃǃȃɃʃ˃̃̓΃Ѓу҃ӃԃՃF@ABCDEGHIJKLMNOPQRSTUVWXYZ[\]^_`pqrstuwxyz{|}~v]\aefghdc~TUVWXYZ[\]݁ށ|假aȁɁ@ABCDEFGHIJKLMNOPQRS@ABVXYZqrstuvwxyzkl`‚ÂĂłƂǂȂɂʂ˂̂͂΂ςЂт҂ӂԂՂւׂ؂قڂۂ܂݂ނ߂JKTU@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~E[RSei`cakjdlfn_mbgh~rsopqut꒚O㉺s^NuLےO嘥TvVRh昩T\]܈jiS喒lYmwedtWM߈CNOPˆފꕚx`LQfAʒZCR]ØōƛCј͌gTSVUDNWErWܘۘMݘCoUZq{|[Yl㌑Ϙ`X^\Θ]UT_P×bBXC@AlDaEHFmGI`KJVMNLQPORSDUTWVXYZ[b[ƓeZ\}]cS_`ZaTbc~fegh`ijkdnlmyopq~ustrvwexyyz꣋{}}f~Mʉon؊Ygh䙍홎OUܔ虛nchiw[JNjuEk噫MlmkxnC\ߙڑ싦PmTƉKopɉpΙ~X}qQyFofrbpËْ@ڙ؉‘䎶jEiheg݉D@fNiܙߙz݌CĖuatBv@]PDCiAENFGLKNMJwSOHISBYXOPUR[VWTZQ`ea\fPxhA^b[슅c_igridcmkpjnlkorwutQqsRv}{|~\XxydXdlc͐}ޚy\nVByzR^C_{}|Wu|xꟉgYhUom큚n킕՚ϚҚdښܚӚߚmpsᐺ딄ϚĚ[OǏgVvΚޕt_턖zDz@DA@ܖDJWdBE툑WiF퉍GonKLIWHÕPpQORPNPMVWSKkUXwYT}ZQ[_\ś^]kda`bcefhgildjmnqopqrEs튎tuyFGǛvwwxyz{}~FvG@舶Xq鎺G{Qeh⛃ЖxQ@ǛJːRΎ˛ёqAڐKsAǛ͉rWjwRZx푛㛴풓sRśěÛɛ홗כޛۛBHIțߖbJFsztыAX蕝y햋NK􌶗cHLXM{xNfpLf@CDB_FEAGHILJKMNUOPMQTU|VOo팷WX^휒YJeZK[\]_`abSRc`FʕVjdeefihgamkjlk]ponqrzsOtJSKEuuYZzwyOxv|{|vӜ}}P~pbIxYߜ{fҜySĜz䜷DĜǜ‘ԍQT̜͜dSшԜʜМ׌c|J؜e荧匜^ʜ@ABCYDEF[G绔˝HKILJM}NQZOVPc}RSWTRe❫ZcS]d_fba[YUXS`qg@hminAE\kwlgjUҝp}Jqso{̝~xPv|{uzrt@||̒TyT[wdf͝}~`KghrgETQPdBohi^FC[xUq~ݔsŋǝUhG~ʝ|kl͎ҐώafzV{ѝԗٝڊU|{VՐftGE莞WWNAiqɝgÝb\A@BCjDFGHȉgXIJJ֑]\֍LÞK񒽞LN]MNO{DQpSVURTWǍޑZmXY۞[\aYt^ܝnf`f]cbʎ}ged_ki˞gmsȑuAt^_Mpoqnvljrhč`ɒ̓ȉhIxZz}ji{jy|~ˌKNJjVO~[旜BHǞ_IXoAŞk^ힾžƞ|OyT|PYɞ̍\Ƒl͞ߞW⏾͞~MӞk@ɞՊh@wKGFEBDCIELHJMQNORSTU~WVY\Ԋ\[]V^`_abc~cΗdefgihw}cjlBkmnopqsrtiuEkvaBwxꖈşyz|{~}CXiْ`ړ🇍]rܑDןBv@ݟAgDןjmk^FhlY_Q\CZߏOUtƟҟiWˈ[~䟹ǓYϏŸakЏًnԟ݈Q֑͟ύ`؟XNΓp팹anMHBYRAQ@NIRKHkEDMGFLCOPUTVYbSWQZX][^aZG\`_JdhfbcgemmjilnoqprsD܍FutxY{vzy_F}G~|wBRFonMRzWCݕઑu୕Дஔv௉Sq]@_ƋĒKTA͒LPQωblCDEXHFG]J䗝IKMLNԋՔilOPQZ@ZABCDFGErIHRKJLMONQPr[RYSpT팓cRb\jUV[YXEW\Z{L^l_]`aSfcbEidehgDa`^jklnmuvprt]usoqaxwyz|{ᅒs}~oᢔSTᤓIFcHWUVXM᱔u~mv᳓XᵖĔἔŌ^Z̖ruߖmZ⋸\uԋmCjv{]^d_VOqmA@CBDbFEGIH`JV_FSPOcLNj_MKI[QRh\TSВdfTUWXHYZ[׉ѓÏG\Hȕb]d`a`^_HbcBdetgfiljҌmkemsoωnnpqrntuvލwy{xzA|Eq~M}↗g⏏vhGj[^|J}y⤕M➒}͉Zk\⽕zUєӗԐ̌HeSl㊟WfnI@gC[RBэhAfaFݍGaIЍHIgDJmEoMQLUniROPNKGWTVSpXepa[_Zbfj\odY]^]ٔΏqgchjmiҊlknuovrtqwpcDks{~|z`}x@qJrDUyJ[@㚓Zs㫍ߌrul㭜rt㸌QA`HK|sVl͎̎k^ޒEW攣]IҎbmnx_wEE\ƘerE]BAtDCorTHIGFJBNOKLMpUQGPSRcVWVXZ^[Y^\]d_`acbefgbhLvijPklmnopqrs܊CwMtquwǔvDxzy|{}~䅐FH䎔mcF|䒗c꒗pv䗉֊s䟒t`rwx䮔yep،ԕHz“ĖGʈӗ{tⓟבKߕNf|葓~uWꖪDH@U@ԎB}C~nJPQDNFHRGKLOEEIFdOVTmSUWX[YZM\a`Abh]_^PAdcefgsi|jklqrm\naopztwsuvx`ua{^|}~gIwXIZIayOsȏpXqtˈ\΋UٗT琻JAA@CBDPEFGvHeIJKK`LoMONePQRSTUVpWXYGZ[\]vu`_P^LabcKidfehigٕ]frmwllkFlbYjopn_FsaUvrwtuqNbzxkyz_{懒~|@}慏dy抍u揗w擕T朕x桋c㿏]QJL涕^eLvnݔÊѐǒƋMȔ\fʘGdڑGo͎^qЍwԑӊqNzHHxH@DABCJEGIFLRKMNQPOSRUTVWYXgZ[]^_\`aORb]cfedygrihqkmjlpnPorySsAutx`wv{zyQ|}~Dh燒CJ_ӒҍHIv}犉猔R獏qޑ琋t磓r瘐痑畈ATiNِx礗V^Չ碓Bky穓K竑JIℊWM@xYSsXsAUޔz|ǗVy_X΍юחd؋B܊jt݊bnSzgeCLKNseI|K@BACdB^EDFBtKbGHLJIOZMNLPVYXLQRUWZTS^_`]\[dbcaefhgsiljkmopqtruwvxMyzJ[̊{|}~֊t}{hj虍~蚌@wA袒˓蜗zG@褊Ku襌ۏB讗ǔYW貎GJᎴ_뗋d軐kIP֐זrҊvxCfB쉹CŒ{aГzjopz{猰؊^@BACDEFHGIHQJKZOLM{a`NOPRSUQT܊VWXYZ\[^a]_`bcde]nfgyhʉwmljkiwnopqsrxtvRuxyz}|~{[ETS@鮖D鸕LNI~ӊkhوˉVߒLPDCEL@ABQJFKHG{LMNIOSTRQWPUVYX[\]hZ^_`abcdefghki[jlmnpqo˖sotuv썕wҖxzy{|}~Cl@Vꔗss~BYabceiluIij{C|D^OPQRSTUVWXFGH`abcdefghijklmnopqrstuvwxym_nOQMobp`ʁP。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚???????????????????????????????????????????????????????????????? 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×?÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓???????????∈∋⊆⊇⊂⊃∪∩????????∧∨¬⇒⇔∀∃???????????∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬???????ʼn♯♭♪†‡¶????◯??????????????????????????????????????????????????????????????????????????????????0123456789???????ABCDEFGHIJKLMNOPQRSTUVWXYZ???????abcdefghijklmnopqrstuvwxyz????ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん??????????????????????????????????????????????????????????????????????????????ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ?ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ????????ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ????????αβγδεζηθικλμνξοπρστυφχψω?????????????????????????????????????????????????????????????????????????????????????????????????????????АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ???????????????абвгдеёжзийклмн?опрстуфхцчшщъыьэюя?????????????─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ?㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡????????㍻?〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭???????????????????????????????????????????????????????????????????院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円?園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改???????????????????????????????????????????????????????????????????魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫?橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄???????????????????????????????????????????????????????????????????機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救?朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈???????????????????????????????????????????????????????????????????掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨?劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向???????????????????????????????????????????????????????????????????后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降?項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷???????????????????????????????????????????????????????????????????察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止?死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周???????????????????????????????????????????????????????????????????宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳?準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾???????????????????????????????????????????????????????????????????拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨?逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線???????????????????????????????????????????????????????????????????繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻?操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只???????????????????????????????????????????????????????????????????叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄?逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓???????????????????????????????????????????????????????????????????邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬?凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入???????????????????????????????????????????????????????????????????如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅?楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美???????????????????????????????????????????????????????????????????鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷?斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋???????????????????????????????????????????????????????????????????法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆?摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒???????????????????????????????????????????????????????????????????諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲?沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯???????????????????????????????????????????????????????????????????蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕????????????????????????????????????????????弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲???????????????????????????????????????????????????????????????????僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭?凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨???????????????????????????????????????????????????????????????????咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸?噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩???????????????????????????????????????????????????????????????????奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀?它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏???????????????????????????????????????????????????????????????????廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠?怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛???????????????????????????????????????????????????????????????????戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫?捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼???????????????????????????????????????????????????????????????????曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎?梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣???????????????????????????????????????????????????????????????????檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯?麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌???????????????????????????????????????????????????????????????????漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝?烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱???????????????????????????????????????????????????????????????????瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿?痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬???????????????????????????????????????????????????????????????????磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰?窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆???????????????????????????????????????????????????????????????????紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷?縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋???????????????????????????????????????????????????????????????????隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤?艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈???????????????????????????????????????????????????????????????????蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬?蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞???????????????????????????????????????????????????????????????????襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧?諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊???????????????????????????????????????????????????????????????????蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜?轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮???????????????????????????????????????????????????????????????????錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙?閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰???????????????????????????????????????????????????????????????????顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃?騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈???????????????????????????????????????????????????????????????????鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯?黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏?塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱???????????????????????????????????????????????????????????????????犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙?蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑??ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊?兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯???????????????????????????????????????????????????????????????????涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神?祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙???????????????????????????????????????????????????????????????????髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????󿢟󿢠󿢡󿢢󿢣󿢤󿢥󿢦󿢧󿢨󿢩󿢪󿢫󿢬󿢭󿢮󿢯󿢰󿢱󿢲󿢳󿢴󿢵󿢶󿢷󿢸󿢹󿢺󿢻󿢼󿢽󿢾󿢿󿣀󿣁󿣂󿣃󿣄󿣅󿣆󿣇󿣈󿣉󿣊󿣋󿣌󿣍󿣎󿣏󿣐󿣑󿣒󿣓󿣔󿣕󿣖󿣗󿣘󿣙󿣚󿣛󿣜󿣝󿣞󿣟󿣠󿣡󿣢󿣣󿣤󿣥󿣦󿣧󿣨󿣩󿣪󿣫󿣬󿣭󿣮󿣯󿣰󿣱󿣲󿣳󿣴󿣵󿣶󿣷󿣸󿣹󿣺󿣻󿣼???????????????????????????????????????????????????????????????????󿥀󿥁󿥂󿥃󿥄󿥅󿥆󿥇󿥈󿥉??????󿥐