diff options
| author | fukachan <fukachan> | 2010-03-18 20:28:04 +0000 |
|---|---|---|
| committer | fukachan <fukachan> | 2010-03-18 20:28:04 +0000 |
| commit | 86a52769ded52eebbd7c4819e15ab67070e1a613 (patch) | |
| tree | b44024947d70795f9c60804c0c65673049a2915b /fml/doc/ja/tutorial/module | |
| parent | abd10b8bb57d469af413f1a4f1365d24ea97c45c (diff) | |
| download | fml8-86a52769ded52eebbd7c4819e15ab67070e1a613.tar.gz fml8-86a52769ded52eebbd7c4819e15ab67070e1a613.tar.bz2 fml8-86a52769ded52eebbd7c4819e15ab67070e1a613.zip | |
fixed and clean up.
Diffstat (limited to 'fml/doc/ja/tutorial/module')
| -rw-r--r-- | fml/doc/ja/tutorial/module/IO.sgml | 92 | ||||
| -rw-r--r-- | fml/doc/ja/tutorial/module/Message.sgml | 135 | ||||
| -rw-r--r-- | fml/doc/ja/tutorial/module/create.sgml | 81 | ||||
| -rw-r--r-- | fml/doc/ja/tutorial/module/encode.sgml | 72 | ||||
| -rw-r--r-- | fml/doc/ja/tutorial/module/nativelanguage.sgml | 28 |
5 files changed, 272 insertions, 136 deletions
diff --git a/fml/doc/ja/tutorial/module/IO.sgml b/fml/doc/ja/tutorial/module/IO.sgml index 47d8306f..518df072 100644 --- a/fml/doc/ja/tutorial/module/IO.sgml +++ b/fml/doc/ja/tutorial/module/IO.sgml @@ -1,5 +1,5 @@ <!-- - $FML: IO.sgml,v 1.5 2005/06/25 15:11:35 fukachan Exp $ + $FML: IO.sgml,v 1.6 2008/08/19 03:16:57 fukachan Exp $ --> <chapter id="module.io.adapter"> @@ -14,6 +14,14 @@ </title> <para> +&fml8; のメンバーリストはファイル、 +Unix のグループ、 +RDBMS (リレーショナルデータベースシステム)、 +LDAP など、さまざまな形式で管理できます。 +もちろん、デフォルトはファイルです。 +</para> + +<para> &fml8; でのメンバーリストの読み書き、例えばアドレスの登録/削除は IO::Adapter という抽象クラスを通じて行ないます。ようは Unix で vfs/vnode インターフェイスを導入した時のような感じですね。 @@ -28,7 +36,7 @@ $io->close; </para> <para> -$map は「map:識別子」となります。 +$map は「map:識別子」形式です。 現在のところ $map は次のようなものが使えます。 file: は省略可能です。 <screen> @@ -50,8 +58,18 @@ ldap:id は LDAP への通信を可能とします。 </para> <para> -RDBMS などは別の名前空間で定義することにしています。 +設定ファイル中では、(なにかとまぎらわしいので)、 +RDBMS と LDAP を別の名前空間で定義する仕様です。 たとえば MySQL は config.cf の mysql:id で指定されたパラメータを用います。 +<screen> +[mysql:id] + +sql_database = fml + +sql_password = uja + +... 略 ... +</screen> このパラメータは new IO::Adapter を実行する際に、 指定する必要があります(後述)。 </para> @@ -84,7 +102,6 @@ touch() find(REGEXP, $args) </screen> -です。 </para> <para> @@ -99,7 +116,7 @@ REGEXP は正規表現ですが、たいていはメールアドレスです。 </para> <para> -最低限のメソッド群の定義は実際に実装してみる実験を通じて選ばれました。 +メソッド群の定義は、実際に実装し、実験運用を通じて選ばれました。 その際、ファイルの IO よりは、SQL との IO を想定しつつ、 メソッドの組を考えています。 そのため、&fml4; のファイルを前提にした処理とくらべると、 @@ -116,13 +133,16 @@ REGEXP は正規表現ですが、たいていはメールアドレスです。 </title> <para> -get_next_key() のように引数なしか STR を引数にして STR を返り値にする -ものが多いです。これはファイルの一覧を見るとか、特定のアドレスに対する -何かの値を取り寄せるとかいう操作がよく使われるためです。 +メソッドの型は、 +get_next_key() のように引数なしか STR を引数にし STR を返り値にしています。 +これは、 +ファイルの一覧を見るとか、 +特定のアドレスに対する何かの値を取り寄せる、 +といった操作がよく使われるためです。 </para> <para> -しかし、特定のアドレスに対する値が組になっているものがあります。 +しかし、特定のアドレスに対する値が組になっている返り値もあります。 これは <screen> KEY_STR => [ @@ -132,8 +152,9 @@ KEY_STR => [ ] </screen> のようなデータ構造が返ってくることを期待する場合です。 -&fml4; の actives はメールアドレスに対していくつかのオプションの値を記 -述するので、こういったデータ構造と考えられます。 +たとえば &fml4; の actives +はメールアドレスに対していくつかのオプションの値を記述するので、 +こういったデータ構造と考えられます。 <screen> 例 @@ -148,8 +169,9 @@ rudo@nuinui.net => [ </para> <para> -まとめると引数は「ない」か「STR」なので STR とひとまとめにしても良いで -しょう。一方、返り値は STR か ARRAY_REF になります。 +まとめると引数は「ない」か「STR」(正規表現も文字列の一種)なので +STR とひとまとめにしても良いでしょう。 +一方、返り値は STR か ARRAY_REF になります。 <screen> 引数 返り値 --------------------------------------- @@ -232,9 +254,10 @@ NIS/YP から group にあたるものを引っ張ってくるところだけが異なります。 </title> <para> -保守性をあげるためには、一箇所に設定をまとめておきたい。つまり、一つの -cf ファイルにいろいろ書けるようにしておきたい。たとえば &fml8; の -場合、config.cf の中だけに SQL の設定を書いておきたいわけです。 +保守性をあげるためには、一箇所に設定をまとめておきたい。 +つまり、一つの cf ファイルにいろいろ書けるようにしておきたい。 +たとえば &fml8; の場合、 +config.cf の中だけに SQL の設定も書いておきたいわけです。 </para> <para> @@ -260,14 +283,21 @@ sql_find = select * from ... ... </screen> config.cf の中に別の名前空間を定義していると考えてもらってかまいません。 +ここは Unix より MS-DOS の config.ini 形式風ですが、 +Unix では該当するものが思いつけないので .ini となりました。 </para> <para> -IO::Adapter は +RDBMS や LDAP に対し $config の情報が必要なため、IO::Adapter は <screen> new IO::Adapter "mysql:members", $config; </screen> -のように呼び出します。 +のように呼び出す必要があります。 +よって、各ソフトウエアでは、つねに +<screen> +new IO::Adapter $map, $config; +</screen> +と書いておく必要があります。 この $config は次のようなハッシュ・リファレンスになっていることが 期待されています。通常 $config は FML::Config オブジェクトそのものです。 <screen> @@ -278,9 +308,9 @@ $config => { } } </screen> -FML::Config は .cf から上のようなハッシュを構成します。 -よって IO::Adapter の new() の際には、 -FML::Config のオブジェクトを引数で渡せば OK です。 +FML::Config は .cf から上のようなハッシュ・リファレンスを構成します。 +よって IO::Adapter で new() を呼び出す際には、 +つねに FML::Config オブジェクトを引数で渡すようにしてください。 </para> @@ -292,8 +322,8 @@ FML::Config のオブジェクトを引数で渡せば OK です。 </title> <para> -関数が呼ばれた時に始めて決まる変数もあるので -cf で全部定義することはできません。 +関数が呼ばれた際に、初めて決まる変数もあるので +config.cf ですべてを定義するわけにもいきません。 そこで、lexical scope で取り扱われる変数の表現があれば解決でしょうか? 現在は、この目的のために &varname 記法(下記)を使っています。 </para> @@ -307,12 +337,9 @@ cf で全部定義することはできません。 <para> 例: 以下は、受信者リストとメンバーリストが食い違う例で、 -アドレスの登録をする際に、fml_recepient という値が異なります。 -その場合、member と recipient は少し異なる SQL 命令になるので -別々に定義します。 -off/on 命令を無視するとか、 -fml は sql からデータを読むだけで書き込むことはしないなら、 -話は簡単になるわけです。 +アドレスの登録をする際に、fml_address という値が異なります。 +その場合、 +member と recipient は少し異なる SQL 命令になるので別々に定義します。 <screen> member_maps = mysql:members @@ -406,6 +433,13 @@ sql_find = select * from $sql_table </screen> </para> +<para> +off/on 命令を無視するとか、 +fml が SQL からデータを読むだけで書き込むことはしないのであれば、 +話は簡単になるわけですが… +避けるのは難しいですね。 +</para> + </sect2> diff --git a/fml/doc/ja/tutorial/module/Message.sgml b/fml/doc/ja/tutorial/module/Message.sgml index 560f703e..f76444a6 100644 --- a/fml/doc/ja/tutorial/module/Message.sgml +++ b/fml/doc/ja/tutorial/module/Message.sgml @@ -1,5 +1,5 @@ <!-- - $FML: Message.sgml,v 1.3 2005/06/25 15:11:36 fukachan Exp $ + $FML: Message.sgml,v 1.4 2008/08/19 03:16:57 fukachan Exp $ --> <chapter id="module.mail.message"> @@ -13,8 +13,8 @@ </title> <para> -このオブジェクトモジュールはメールの解析と、 -解析されたデータ構造へのさまざまな操作手段を提供しています。 +Mail::Message クラスはメールの解析と、 +解析されたデータ構造へのさまざまな操作手段を提供します。 </para> <para> @@ -39,18 +39,18 @@ header -> preamble -> part1 -> part2 -> trailor </para> <para> -header は Mail::Message のタイプが text/rfc822-headers で、 -data が Mail::Header オブジェクトになります。 +メールヘッダは Mail::Message のタイプが text/rfc822-headers で、 +その data が Mail::Header オブジェクトになります。 一方 part1 は text/plain で、 -data 部分が文字列へのリファレンスです。 +data 部分が文字列(テキスト)へのリファレンスです。 </para> <para> 参照: <ulink url="../../en/modules/Mail/Message.txt"> -Mail::Message モジュールのマニュアル +Mail::Message モジュールのマニュアル(英語) </ulink> </para> @@ -64,12 +64,13 @@ Mail::Message モジュールのマニュアル <para> parse() メソッドは引数で与えられたファイル(名)かファイルディスクリプタ -に対しメッセージの解析をします。 +に対しメッセージの解析を試みます。 </para> <para> data_type_list() は鎖の列の情報を返します。情報は ARRAY REFERENCE の形 -で返されます。例えば MIME/Multipart は次のように表現されています。 +で返されます。例えば MIME/Multipart は次のように表現されています +(ちなみに、以下の表示はデバッグモードで出力されるものです)。 <screen> type[ 1]: text/rfc822-headers | multipart/mixed type[ 2]: multipart/mixed | multipart/mixed @@ -82,7 +83,7 @@ data_type_list() は鎖の列の情報を返します。情報は ARRAY REFERENCE の形 type[ 9]: text/plain | multipart/mixed </screen> 真中の列が各オブジェクトの種別を表しています。 -右端は全体の mime type です。 +右端はメール全体の mime type です。 </para> </sect1> @@ -98,21 +99,21 @@ new() メソッドは通常、新しいメッセージを作る際に使われます。 </para> <para> -MIME/multipart 専用のためのメソッドもあります。 +MIME/multipart 作成専用のメソッドもあります。 <screen> build_mime_multipart_chain($args) parse_and_build_mime_multipart_chain($args) build_mime_header($args) </screen> -これらのメソッドを直接呼び出すことは実際ないので、 -これらは private に移行するかもしれません。 -だから、とりえあずこれらは使わないでください。 +注意: これらのメソッドを直接呼び出すことは実際ないので、 +将来、これらは private methods に移行するかもしれません。 +これらのメソッドは使わないでください。 </para> <para> -しかしながら、MIME/mulitpart の作成には -Mail::Message::Compose クラスがあります。 -実のところ、このクラスの実態は MIME::Lite そのものです :-) +実際のところ MIME/mulitpart の作成には +Mail::Message::Compose クラスを使っています。 +実のところ、このクラスの実態は CPAN の MIME::Lite そのものです :-) </para> </sect1> @@ -125,39 +126,45 @@ Mail::Message::Compose クラスがあります。 <para> dup_header() メソッドは -RFC822 型のメッセージのヘッダ部分のみのコピーを行ないます。 -メールの本体の部分はそのままです。 +RFC822 型メッセージのヘッダ部分のみをコピーします。 +メール本体の部分はそのままです。 複製されたヘッダオブジェクトからのリンクは メールの本体です。 <screen> +$header1 = $message0->dup_header0; + |<--------------- メール本体 -------------> -header0 ----> part1 -> part2 -> ... - A - | -dup_header0 --- +$header0 ---> part1 -> part2 -> ... + A + | +$header1 ------+ </screen> </para> <para> -whole_message_header() -はメッセージの中のヘッダ部分のオブジェクトを返します。 -文字列ではないことに注意して下さい。 +whole_message_header() +メソッドはメッセージ中の「ヘッダ部分のオブジェクト」を返します。 +「文字列ではない」ことに注意して下さい。 </para> <para> __head_message() は鎖の先頭のオブジェクトを返します。 __last_message() は鎖の最後のオブジェクトを返します。 -プライベートなので、これらのメソッドは使わないで下さい。 -__head_message() は、通常、図の header オブジェクトを返すことになりま -すので、多くの場合 whole_message_header() と等価です。 +モジュールの中で使われていますが、 +これらはプライベート・メソッドなので、 +これらのメソッドは使わないで下さい。 +将来、これらのコードは消去します。 +なお __head_message() は、 +通常、図の header オブジェクトを返すことになりますので、 +多くの場合 whole_message_header() と等価です。 </para> <para> header_data_type() -はメール全体のタイプ(文字列)を返します。 -つまり、このメッセージは単なるテキストなのかマルチパートなのか?などを -教えてくれます。 +メソッドはメール全体のタイプ(文字列)を返します。 +つまり、このメッセージは単なるテキストなのかマルチパートなのか? +などの情報を教える関数です。 </para> </sect1> @@ -169,7 +176,7 @@ header_data_type() </title> <para> -以下では、このような鎖を例にとることにします。 +本節では、次のようなオブジェクトの鎖を例にとることにします。 <screen> (multipart でない場合) @@ -181,19 +188,20 @@ header -> preamble -> part1 -> part2 -> trailor </screen> </para> +<para> +(一部、前述の繰り返しになります)。 +</para> <para> -まず header_data_type() -はメール全体のタイプ(文字列)を返します。 -つまり、このメッセージは単なるテキストなのかマルチパートなのか?などを -教えてくれます。 -つまり header の Content-Type で得られる情報です。 +header_data_type() +メソッドはメール全体のタイプ(文字列)を返します。 +つまり、header の Content-Type で得られる情報です。 </para> <para> whole_message_body() メソッドは body ないしは part1 の部分のオブジェクトを返します。 -whole_message_body_head() メソッドも同じ操作をします。 +whole_message_body_head() メソッドも同じ返り値です。 </para> <para> @@ -222,8 +230,10 @@ plain/text タイプのメッセージ部分に着目することが多いので </title> <para> -find() メソッドは Mail::Message の特定のタイプを探し、 +find() メソッドは Mail::Message オブジェクトの特定のタイプを探し、 最初に見つけたオブジェクトを返します。 +ヘッダの Content-Type: ではありません。 +注意。 </para> </sect1> @@ -264,7 +274,7 @@ reset_print_mode() <para> size() は(鎖の一つ一つの Mail::Message)オブジェクトのサイズを返します。 -メール全体ではありません。 +メール全体ではありません。注意。 header_size() や body_size() @@ -273,8 +283,13 @@ body_size() <para> is_empty() -はオブジェクトが空かどうかを教えてくれます。 +はオブジェクトのデータが空かどうかを教えてくれます。 +</para> + +<para> +これらはフィルタリングで有用です。 </para> + </sect2> @@ -285,25 +300,25 @@ is_empty() <para> envelope_sender() -は -メールの送信者情報(文字列)を返します。 +はメールの送信者情報(文字列)を返します。 +文字通り、いわゆる Envelope Sender 情報です。 </para> <para> data_type() -は +メソッドは Mail::Message オブジェクトのタイプ(文字列)を返します。 -これは、メール全体のタイプ(マルチパートとか text/plain) -どではなく、鎖の各部分のオブジェクトのタイプであることに注意して下さい。 +これは、メール全体のタイプ(マルチパートとか text/plain)ではなく、 +鎖の各部分のオブジェクト・タイプであることに注意して下さい。 </para> <para> encoding_mechanism() -は +メソッドは Mail::Message オブジェクトのエンコーディングメカニズム(文字列)を返します。 -エンコーディングされていないなら undef が返ります。 -これは、メール全体のタイプ(マルチパートとか text/plain) -ではなく、鎖の各部分のオブジェクトのタイプであることに注意して下さい。 +エンコーディングされていない場合 undef が返ります。 +これは、メール全体のタイプ(マルチパートとか text/plain)ではなく、 +鎖の各部分のオブジェクト・タイプであることに注意して下さい。 </para> </sect2> @@ -311,12 +326,12 @@ Mail::Message オブジェクトのエンコーディングメカニズム(文字列)を返します。 <sect2> <title> - Mail::Message 内の構造 + Mail::Message オブジェクト内部の構造を知る </title> <para> num_paragraph() -は +メソッドは、 その Mail::Message オブジェクトの中に 何個のパラグラフがあるか(数字)を返します。 </para> @@ -324,23 +339,25 @@ num_paragraph() <para> nth_paragraph(数字) -は +メソッドは 「数字」番目のパラグラフの内容を文字列として返します。 例えば、一番目のパラグラフは 0 ではなく 1 と指定して下さい。 -ここは、わざとC言語風ではなく人間に分かりやすいようにしてあります。 +ここは、わざとC言語風ではなく人間に分かりやすいように +「 1から始まる仕様」としてあります。 </para> <para> header() -は +メソッドは MIME/multipart の各ブロックにあるヘッダ部分を返します。 data() -は、データの部分です。 +メソッドは、データの部分です。 それぞれ message_fields($size) +および message_text($size) -の alias です。 +メソッドの alias になっています。 </para> </sect2> @@ -356,7 +373,7 @@ message_text($size) <para> <ulink url="../../en/modules/Mail/Message.txt"> -Mail::Message モジュールの(英語)マニュアル +Mail::Message モジュールマニュアル(英語) </ulink> </para> </sect1> diff --git a/fml/doc/ja/tutorial/module/create.sgml b/fml/doc/ja/tutorial/module/create.sgml index d3340ec3..93e39e51 100644 --- a/fml/doc/ja/tutorial/module/create.sgml +++ b/fml/doc/ja/tutorial/module/create.sgml @@ -1,5 +1,5 @@ <!-- - $FML: create.sgml,v 1.3 2005/06/25 15:11:36 fukachan Exp $ + $FML: create.sgml,v 1.4 2008/08/19 03:16:57 fukachan Exp $ --> <chapter id="module.create"> @@ -9,11 +9,38 @@ <para> -ここでは、単純なスケジュール表示ソフトを例にとり、&fml8; のフレームワー -クの中で新しいプログラムを追加するにはどうすれば良いのかを説明します。 +ここでは、単純なスケジュール表示ソフトを例にとり、 +&fml8; のフレームワーク中で +新しいプログラムを追加するにはどうすれば良いのかを説明します。 以下、プログラム名は fmlsch とし、その CGI 版が fmlsch.cgi です。 </para> +<para> +なお、&fml8; +サードパーティ拡張として出荷するソフトウエアでは、 +3rdparty/ 以下に同様の配置でファイルを生成し、 +<footnote> + +<para> +とはいえ、さすがに設定ファイルは、 +さすがに fml リポジトリ以下の設定を変更する必要がありますね。 +「追加で済むもの」 +であればサードパーティ以下にスクリプトを作ればすむかと… +</para> + +<para> +たぶん、そういった場合は、 +サードパーティ以下に fml リポジトリ以下を参考に、 +インストーラを一式作るほうが楽でしょう。 +</para> + +<para> +それでも、トップディレクトリの Makefile と configure の変更は必要ですなぁ。 +</para> + +</footnote> +インストーラ等の設定ファイルを変更して下さい。 +</para> + <sect1> <title> @@ -29,12 +56,13 @@ <para> fml/bin/fmlsch.in シェルスクリプトを用意し、 fml/etc/install.cf.in の bin_programs 変数に fmlsch を追加します。 -bin_programs にあるスクリプトはインストーラがインストールしてくれます。 +bin_programs にあるスクリプトはインストーラが +$prefix/bin/ へインストールする対象です。 </para> <para> fml/bin/fmlsch および fml/etc/install.cf の生成は -configure が行ないます。 +configure (GNU configure)が行ないます。 configure.in に、この2つのファイルの変数展開をするように登録し、 autoconf を実行して configure を生成して下さい。 </para> @@ -54,10 +82,10 @@ fml/lib/FML/Demo/Calendar.pm を書きます。 </para> <para> -また、必要な他にライブラリがあれば適宜輸入してください。 +また、ほかに必要なライブラリがあれば適宜輸入してください。 今回は CPAN から HTML-CalendarMonthSimple-1.02.tar.gz -を輸入します。 +をインストールする必要があります。 </para> <para> @@ -75,9 +103,17 @@ Date-Calc も必要なので適宜インストールしてください。 <para> 仕事のほとんどの部分は FML::Demo::Calendar が実行しますが、 &fml8; のブートローダから FML::Demo::Calendar を呼び出すために -FML::Process:: クラスを修正する必要があります。 +FML::Process::Calender クラスを作成します。 </para> +<caution> +<para> +クラスの階層は fml/etc/modules の設定次第なので、 +FML::Process::Calender である必要はなく、 +どの階層でも(もちろん FML:: 以外でも)かまいません。 +</para> +</caution> + <para> まず、fmlsch プロセスの初期化から実行といった大まかな一連の手順を fml/lib/FML/Process/Calender.pm @@ -89,12 +125,12 @@ fml/lib/FML/Process/Calender.pm </para> <para> -そして、ブートローダーへ fmlsch の場合は FML::Process::Calender を呼び -出せば良いことを教えるために -etc/modules +そして、ブートローダーへ fmlsch プログラムが起動された場合には +FML::Process::Calender を呼び出すことを教えるために +fml/etc/modules ファイル と -etc/command_line_options -に fmlsch のモジュール名との対応関係を追加します。 +fml/etc/command_line_options ファイルに +fmlsch のモジュール名との対応関係を追加します。 </para> @@ -120,15 +156,22 @@ FML::Process::Calender::run() メソッドだけ用意すればおしまいです。 <para> -改造の仕方はモジュールが FML::CGI:: クラスになる以外は fmlsch の場合と -同様です。FML::CGI::Calender は FML::Process::CGI のサブクラスです。 +改造の仕方はモジュールが +FML::CGI:: クラスになる以外は fmlsch の場合と同様です。 +FML::CGI::Calender は FML::Process::CGI のサブクラスです。 +</para> + +<para> +未定義のものについては FML::Process::CGI や FML::Process::Kernel +がよきにはからいます。 </para> <para> -未定義のものについては FML::Process::CGI や FML::Process::Kernel がよ -きにはからいます。また、CGI.pm は FML::Process::CGI が使い、HTTP -header を生成しています。あくまでも最低限の処理なので -FML::CGI:: のモジュールで適宜 HTML の出力を補佐してあげます。 +また、HTML 言語のほとんどは FML::Process::CGI が +Perl デフォルトの CGI.pm を使っています。 +HTTP header などの生成も CGI.pm モジュールです。 +これらは、あくまでも最低限の処理なので +FML::CGI:: 以下のモジュール群が適宜 HTML の出力を補正しています。 </para> </sect1> diff --git a/fml/doc/ja/tutorial/module/encode.sgml b/fml/doc/ja/tutorial/module/encode.sgml index 5309876e..6449d220 100644 --- a/fml/doc/ja/tutorial/module/encode.sgml +++ b/fml/doc/ja/tutorial/module/encode.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: encode.sgml,v 1.2 2003/04/15 14:51:42 fukachan Exp $ --> <chapter id="module.mail.message.encode"> @@ -7,6 +7,12 @@ Mail::Message::Encode クラス </title> + +<sect1 id="module.mail.message.encode.examplee"> + <title> + Mail::Message::Encode の使い方の見本 + </title> + <para> [リファレンス] fml-help ML's Count: 02012, 02013, 02016 など @@ -15,6 +21,8 @@ fml-help ML's Count: 02012, 02013, 02016 など <screen> [使い方の例] + * fml 8.0 風の使い方 + use Mail::Message::Encode; my $encode = new Mail::Message::Encode; my $str_euc = $encode->convert( $s, 'euc-jp' ); @@ -27,19 +35,22 @@ fml-help ML's Count: 02012, 02013, 02016 など my $fp = sub { ... }; $encode->run_in_chcode( $fp, $oout, $in ); - * 4.0 互換 + * fml 4.0 互換風の使い方 + ues Mail::Message::Encode qw(STR2EUC); my $euc_s = STR2EUC( $s ); </screen> +</sect1> + -<sect1> +<sect1 id="module.mail.message.encode.specification"> <title> - Mail::Message::Encode の仕様 + Mail::Message::Encode の仕様の粗筋 </title> <para> -本体は _convert_str_ref() にまとめる。 +本体はプライベートメソッド _convert_str_ref() にまとめてある。 <screen> sub convert # 引数が STR @@ -100,29 +111,56 @@ $x = $encode->base64($s); </sect1> -<sect1> +<sect1 id="module.mail.message.encode.run.in.code"> <title> - run_in_chcode() + ユーティリティ run_in_chcode() </title> <para> -言語依存処理の過程では、プログラムの扱いやすいコードに変換し、処理を行 -なう関数が多数存在します。そこで、そういった関数を用意すると便利です。 -<screen> -run_in_chcode の実装例 +言語依存処理の過程では、プログラムの扱いやすい文字コードに変換し、 +処理を行なう関数が多数存在します。 +そこで、そういった処理のための下請け関数を用意すると便利です。 +</para> -sub run_in_chcode +<para> +run_in_chcode() は、 +関数 $proc を実行します。 +引数は、あらかじめ指定された文字コードに変換後、 +関数 $proc に渡されるという仕様です。 +</para> + +<para> +<screen> +sub run_in_code { - my ($self, $proc, $s, $out_code, $in_code) = @_; + my ($self, $proc, $s, $args, $out_code, $in_code) = @_; + my $proc_status = undef; + + my $obj = new Mail::Message::Encode; + my $conv_status = $obj->convert_str_ref(\$s, $out_code, $in_code); - my $conv_status = convert_str_ref($s, $EUC_JP, $in_code); - my $proc_status = &$proc($s, @_); - convert_str_ref($s, $out_code, $EUC_JP) if $conv_status && $out_code; - return wantarray ? ($conv_status, $proc_status): $conv_status; + # XXX-TODO: validate $proc name regexp. + eval q{ + $proc_status = &$proc($s, $args); + }; + + # XXX-TODO: correct ? + if ($conv_status && $out_code) { + $obj->convert_str_ref($s, $out_code, $in_code); + } + + return wantarray ? ($conv_status, $proc_status): $conv_status; } </screen> +これは、次のように動作します。 +<screen> +$s は EUC-JP へ変換。 +$proc($s, $args); を実行 +$proc の実行結果を返す。 +</screen> </para> </sect1> + </chapter> diff --git a/fml/doc/ja/tutorial/module/nativelanguage.sgml b/fml/doc/ja/tutorial/module/nativelanguage.sgml index f8334d4b..583b86f2 100644 --- a/fml/doc/ja/tutorial/module/nativelanguage.sgml +++ b/fml/doc/ja/tutorial/module/nativelanguage.sgml @@ -1,5 +1,5 @@ <!-- - $FML: nativelanguage.sgml,v 1.3 2003/04/15 14:51:43 fukachan Exp $ + $FML: nativelanguage.sgml,v 1.4 2008/08/19 03:16:57 fukachan Exp $ --> <chapter id="nativelanguage"> @@ -8,14 +8,18 @@ </title> <para> -fml 内部では言語に依存した変換処理が必要です。 -例えば、JIS と EUC の相互変換は随所で必要です。 -これはメールでは JIS が使われますが、 -プログラムでは EUC の方が扱いやすいためです。 +&fml8; 内部では言語と文字コードに依存した変換処理が必要です。 +たとえば、JIS (ISO-2022-JP)と EUC の相互変換は随所で行なわれています。 +これはメールでは JIS コードが使われますが、 +プログラムでは EUC コードの方が扱いやすいためです。 </para> <para> -コマンドの返事の言語依存性については +本章では、言語依存の処理関数について解説します。 +</para> + +<para> +なお、コマンドに対する返事の言語依存性については <link linkend="message.nl"> 『メッセージの他国語化』 </link> @@ -25,22 +29,22 @@ fml 内部では言語に依存した変換処理が必要です。 <sect1 id="nativelanguage.overview"> <title> - 何か::Language:: + クラス::Language:: </title> <para> -言語依存のクラス名は「なにか::Language::」となります。これらの階層以下 -に言語依存モジュール群が配置されます。 +言語依存のクラス名は「クラス::Language::」となります。 +これらの階層以下に言語依存モジュール群が配置されます。 </para> <para> -例えば以下のようなモジュールがあります。 +たとえば次のようなモジュールがあります。 <screen> FML::Language::Japanese::String.pm Mail::Bounce::Language::Japanese.pm </screen> -前者は、FML モジュール群のために日本語依存の文字列処理関数を -提供しています。 +前者は、FML モジュール群のために、 +日本語依存の文字列処理関数を提供しています。 後者は Mail::Bounce 階層以下のモジュールに対して、 日本語に依存したエラーメール解析ルーチンを提供しています。 </para> |
