Class | DCModelThumbnail |
In: |
dcmodel-tools/dcmodel-thum.rb
|
Parent: | Object |
「dcmodel お絵描きサムネイル HTML 作成スクリプト」の作成用のクラス
COPYRIGHT | = | "GFD Dennou Club" | CopyRight | |
INFO_DELIMITER | = | ":" | 項目の区切り文字 | |
INFO_MULTI_START | = | "{" | 情報ファイルにおける、複数行の開始文字 | |
INFO_MULTI_STOP | = | "}" | 情報ファイルにおける、複数行の終了 | |
GATE_USER_SHOW | = | "/usr/local/bin/gate-user-show" | SIGEN ファイル作成時の情報を得るための gate コマンド | |
PUB_BIN_URL | = | "http://www.gfd-dennou.org/library/dcmodel/bin/dcmodel-thum.rb" | 公開本体置き場 | |
PUB_DOC_URL | = | "http://www.gfd-dennou.org/library/dcmodel/doc/dcmodel-tools/dcmodel-thum-rdoc" | 公開ドキュメントの URL | |
PUB_SAMPLE_URL | = | "http://www.gfd-dennou.org/library/dcmodel/doc/dcmodel-tools/dcmodel-thum-sample" | 公開サンプルの URL | |
CVS_HOST | = | "www.gfd-dennou.org" | CVSHOST | |
CVS_ROOT | = | "/GFD_Dennou_Club/ftp/arch/dcmodel/cvsroot" | CVSROOT | |
CVS_PROJECT | = | "dcmodel-tools" | CVS のプロジェクト名 | |
VER | = | "$Revision: 1.31 $ : $Date: 2007/05/22 05:13:14 $" | バージョンナンバー (CVS により自動管理) |
blankfig | [RW] | ファイル名の非表示のフラグ |
convert_cmd | [RW] | convert コマンドおよびオプション. この後ろに画像サイズが 200x150 のような形式で指定される. |
convert_overwrite | [RW] | convert コマンドが実行される際, 既に出力先のファイルがある場合に 上書きするためのフラグ. これが false の場合, 出力先のファイルが 存在し, 且つ元のファイルよりも新しい場合は変換を行わない. |
copyright | [RW] | copyright |
css | [RW] | スタイルシートファイル |
ext_list | [RW] | 画像ファイルとして認識する拡張子 |
figdir | [RW] | 絵のあるディレクトリの名前。必ず存在していなければならない。 |
figtable_num | [RW] | 横にならべるファイル数 |
footer | [RW] | フッターとして書き出すメッセージ。サムネイルの部分よりも下に出力される。 この変数自体は Array オブジェクトで、その内部に String オブジェクトが 格納される。 |
gate_user_show | [RW] | SIGEN ファイル作成時の情報を得るための gate コマンド |
headlimit | [RW] | headlimit に当てはまらないものは画像としては無視され、 当てはまるものは「情報ファイル」において、接頭部分 headlimit が 省略可能になる。 |
html_author | [RW] | html の作成者情報 (デフォルトはユーザアカウント名が自動取得される) |
img_height | [RW] | 画像ファイルサイズ (高さ) |
img_width | [RW] | 画像ファイルサイズ (幅) |
index | [RW] | 作成されるサムネイルのファイル名 (拡張子除く) |
index_ext | [RW] | 作成されるサムネイルの拡張子名 |
infofile | [RW] | 「情報ファイル (infofile)」のファイル名 |
message | [RW] | 本体に書き出すメッセージ。サムネイルの部分よりも上に出力される。 この変数自体は Array オブジェクトで、その内部に String オブジェクトが 格納される。 |
mksigen | [RW] | SIGEN ファイルを作らない場合は false にセットする |
norobots | [RW] | HTML のロボット検索を禁止する |
pub_doc_url | [R] | 公開ドキュメントの URL |
pub_sample_url | [R] | 公開サンプルの URL |
rd2_path | [RW] | rd2 コマンドへのパス |
rd2htmlextlib | [RW] | rd2-ext-lib へのライブラリへのパス |
self_name | [R] | 実行ファイルの basename |
style | [RW] | スタイルシートを直接設定するためのもの (css ファイルに書き込む情報を直接指定できる) |
sub_rb_name | [R] | サンプル ruby スクリプト名 |
thumbnaildir | [RW] | サムネイル画像を置くディレクトリ名。カレントディレクトリから "#{@thumbaildir}" の場所に指定される. |
thumbnailpage | [RW] | サムネイル画像化する元画像のページ番号 |
thumbnailtail | [RW] | サムネイル画像の最後部名. サムネイル画像名は元画像の拡張子と置換された名前になる. |
title | [RW] | html ヘッダのタイトル |
tmp | [RW] | テンポラリファイル置き場 (UNIX 系ならば変える必要なし) |
version | [R] | バージョン |
これを呼ぶことで、最低限必要な情報が生成される。 最終的には DCModelThumbnail.create メソッドを呼ぶことで ファイルが作成される。
# File dcmodel-tools/dcmodel-thum.rb, line 474 474: def initialize() 475: # 476: # version 477: # 478: @version = VER 479: 480: # 481: # copyright 482: # 483: @copyright = COPYRIGHT 484: 485: # 公開ドキュメントの URL 486: @pub_doc_url = PUB_DOC_URL 487: 488: # 公開サンプルの URL 489: @pub_sample_url = PUB_SAMPLE_URL 490: 491: # dcmodel-thum.rb 自身の名前 492: # @self_name = File.basename($0.to_s) 493: @self_name = "dcmodel-thum.rb" 494: 495: # サンプル ruby スクリプト名 496: @sub_rb_name = "#{File.basename($0, ".*")}" + "-make.rb" 497: 498: # html の置き場・ファイル名・拡張子。カレントディレクトリから 499: # 500: # "#{@index}#{index_ext}" 501: # 502: #に置かれる。 503: @index = "../sample_thum" 504: @index_ext = ".htm" 505: 506: # 絵のあるディレクトリ名。カレントディレクトリから 507: # "#{@figdir}" の場所を探査する。 508: @figdir = "../figdir" 509: 510: # サムネイル画像を置くディレクトリ名。カレントディレクトリから 511: # "#{@thumbaildir}" の場所に指定される. 512: @thumbnaildir = "../thumbdir" 513: 514: # サムネイル画像の最後部名. 515: # サムネイル画像名は元画像の拡張子と置換された名前になる. 516: @thumbnailtail = "_thumb.png" 517: 518: # サムネイル画像化する元画像のページ番号 519: @thumbnailpage = "1" 520: 521: # convert コマンドおよびオプション。この後ろに画像サイズが 200x150 522: # のような形式で指定される。 523: @convert_cmd = "convert -depth 8 -geometry" 524: 525: # convert コマンドが実行される際, 既に出力先のファイルがある場合に 526: # 上書きするためのフラグ. これが false の場合, 出力先のファイルが 527: # 存在し, 且つ元のファイルよりも新しい場合は変換を行わない. 528: @convert_overwrite = false 529: 530: # 情報ファイル, $PWD/${infofile} 531: @infofile = File.basename(@index).chomp.strip + ".txt" 532: 533: # 画像ファイルとして認識する拡張子 534: @ext_list = ["gif", "png", "jpg", "jpeg"] 535: 536: # 接頭子制限 @headlimit = "figure_head"。 537: # これにより、@headlimit に当てはまらないものは無視される 538: @headlimit = "" 539: 540: # ファイル名の非表示のフラグ 541: @blankfig = false 542: 543: # スタイルシートファイル 544: # @css = "../dcmodel.css" # for morikawa (I'm sorry...) 545: @css = "/GFD_Dennou_Club/ftp/arch/dcmodel/htmltools/dcmodel.css" 546: 547: # スタイルシートを直接設定するためのもの 548: # (css ファイルに書き込む情報を直接指定できる) 549: @style = nil 550: 551: # rd2 ファイルのパス 552: @rd2_path = "/usr/bin/rd2" 553: 554: # rd2-ext-lib へのライブラリのパス 555: # @rd2htmlextlib = ".." # for morikawa (I'm sorry...) 556: @rd2htmlextlib = "/GFD_Dennou_Club/ftp/arch/dcmodel/lib/ruby/1.8" 557: 558: # SIGEN ファイル作成時の情報を得るための gate コマンド 559: @gate_user_show = GATE_USER_SHOW 560: 561: # テンポラリファイル置き場 (UNIX 系ならば変える必要なし) 562: @tmp = "/tmp" 563: 564: # SIGEN ファイルを作らない場合は false にセットする 565: @mksigen = true 566: 567: # HTML のロボット検索を禁止する場合には true にセットする 568: @norobots = false 569: 570: # 画像ファイルサイズ 571: @img_width = 200 572: @img_height = 150 573: 574: # 横にならべるファイル数 575: @figtable_num = 3 576: 577: # NAME, HREF タグ内のラベルナンバー 578: @label_num = 0 579: 580: # ラベルナンバーと対応するヘッダ文字列のハッシュ 581: @label_num_header_hash = {} 582: 583: # html の作成者情報 (ユーザアカウント名) 584: @html_author = username_from_gid 585: 586: # html ヘッダタイトル 587: @title = "dcmodel-thum : 実験結果サムネイル簡易作成スクリプト" 588: 589: # フッター (サムネイルの部分よりも下にメッセージ) 590: # 指定方法は message と同様です。 591: @footer = Array.new 592: 593: # 本体 (サムネイルの部分よりも上にメッセージ) 594: @message = Array.new 595: @message << "=begin\n[((<\303\317\265\345\316\256\302\316\305\305\307\276\266\346\263\332\311\364|URL:http://www.gfd-dennou.org>))]\n[((<dcmodel|URL:http://www.gfd-dennou.org/library/dcmodel>)) |\n((<dcmodel-tools|URL:http://www.gfd-dennou.org/library/dcmodel/doc/dcmodel-tools/SIGEN.htm>))]\n[((<\#{@self_name}|URL:\#{PUB_DOC_URL}>))]\n\n= \#{@title}\n\n* ((<\263\265\315\327\241\246\315\370\315\321\241\246\306\260\272\356\264\304\266\255\244\316\263\265\300\342>))\n* ((<\245\320\241\274\245\270\245\347\245\363 1.1 (\245\252\245\352\245\270\245\312\245\353\244\344\244\336\244\300\315\263\245\304\241\274\245\353) \244\253\244\351\244\316\273\305\315\315\312\321\271\271>))\n* ((<\315\370\315\321\244\316\274\352\260\372\244\255>))\n* ((<\262\350\301\374\244\316\315\321\260\325>))\n* ((<\#{@self_name} \244\316\315\321\260\325>))\n* ((<\244\310\244\352\244\242\244\250\244\272\274\302\271\324>))\n* ((<\273\322\245\271\245\257\245\352\245\327\245\310\244\316\274\302\271\324>))\n* ((<\244\307\244\255\244\277\244\342\244\316\244\362\270\253\244\306\244\337\244\353>))\n* ((<\245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\306\376\314\347\312\324)>))\n* ((<\272\306\305\331\274\302\271\324>))\n* ((<\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\316\312\324\275\270 (\306\376\314\347\312\324)>))\n* ((<\244\342\244\246\260\354\305\331\274\302\271\324>))\n* ((<\245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\261\376\315\321\312\324)>))\n* ((<\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\316\312\324\275\270 (\261\376\315\321\312\324)>))\n\n\n== \263\265\315\327\241\246\315\370\315\321\241\246\306\260\272\356\264\304\266\255\244\316\263\265\300\342\n\n((<\#{@self_name} \244\316 rdoc \245\336\245\313\245\345\245\242\245\353|URL:\#{PUB_DOC_URL}>))\n\nOverview \244\310 Operation Environment \244\310 Usage \244\362\244\265\244\351\244\303\244\310\306\311\244\363\244\300\244\351\314\341\244\303\244\306\244\255\244\306\244\315\241\243\n\n\244\312\244\252\241\242\260\312\262\274\244\316 URL \244\313\244\317\244\263\244\316\275\320\316\317\267\353\262\314\244\310\306\261\305\371\244\316\244\342\244\316\244\254\303\326\244\244\244\306\244\242\244\353\244\317\244\272\244\307\244\271\241\243\n\n((<\#{@self_name} \244\316 \245\265\245\363\245\327\245\353|URL:\#{PUB_SAMPLE_URL}>))\n\n== \245\320\241\274\245\270\245\347\245\363 1.1 (\245\252\245\352\245\270\245\312\245\353\244\344\244\336\244\300\315\263\245\304\241\274\245\353) \244\253\244\351\244\316\273\305\315\315\312\321\271\271\n\n\244\263\244\263\244\317\241\242\245\320\241\274\245\270\245\347\245\363 1.2 \260\312\271\337\244\253\244\351\315\370\315\321\244\267\244\306\244\244\244\353\277\315\244\313\244\317\311\324\315\327\244\307\244\271\241\243\n\245\320\241\274\245\270\245\347\245\363 1.1 \244\316\245\252\245\352\245\270\245\312\245\353\244\316\244\344\244\336\244\300\315\263\245\304\241\274\245\353\244\253\244\351\315\370\315\321\244\267\244\306\244\244\244\353\n\312\375\244\317\241\242\260\312\262\274\244\316\312\321\271\271\305\300\244\313\244\264\303\355\260\325\244\257\244\300\244\265\244\244\241\243\n\n* \241\326\276\360\312\363\245\325\245\241\245\244\245\353 (infofile)\241\327\244\316\275\361\274\260\n* \262\350\301\374\314\276\244\313\263\310\304\245\273\322\244\362\262\303\244\250\244\353\244\350\244\246\244\313\244\312\244\303\244\277\n* 1.1 \244\307\244\317 <\262\350\301\374\314\276> : <\245\263\245\341\245\363\245\310> \244\300\244\303\244\277\244\254\241\242\n\270\275\272\337\244\317 <\262\350\301\374\314\276> : <\275\244\276\376\273\322> : <\245\263\245\341\245\363\245\310> \244\313\244\312\244\303\244\306\244\244\244\353\241\243\n* pathname.rb \244\362\315\370\315\321\244\271\244\353\244\277\244\341\241\242ruby 1.8 \244\362\315\370\315\321\244\271\244\353\244\253\241\2421.6 \244\312\244\351\244\320\n\274\302\271\324\244\316\272\335\244\313 RUBYLIB \244\316\245\321\245\271\244\254\304\314\244\303\244\277\244\310\244\263\244\355\244\313 pathname.rb \244\254\311\254\315\327\n\244\307\244\242\244\353\241\243\n\n\n== \315\370\315\321\244\316\274\352\260\372\244\255\n\n=== \#{@self_name} \244\316\306\376\274\352\244\316\312\375\313\241\n\n((<\#{@self_name} \245\271\245\257\245\352\245\327\245\310\313\334\302\316|URL:\#{PUB_BIN_URL}>)) \244\362\245\300\245\246\245\363\245\355\241\274\245\311\n\244\267\244\306\244\257\244\300\244\265\244\244\241\243\244\342\244\267\244\257\244\317 cvsroot \244\362\244\342\244\303\244\306\244\244\244\353 \#{CVS_HOST} \244\313\245\355\245\260\245\244\245\363\244\254\n\262\304\307\275\244\307\244\242\244\354\244\320\241\242cvs \244\253\244\351\244\342\304\276\300\334\274\350\306\300\244\254\262\304\307\275\244\307\244\271\241\243\n\n$ CVS_RSH=ssh; export CVS_RSH\n$ cvs -d :ext:\#{CVS_HOST}:\#{CVS_ROOT} checkout \#{CVS_PROJECT}\n\n\264\373\244\313 \#{CVS_HOST} \244\313\245\355\245\260\245\244\245\363\244\267\244\277\276\365\302\326\244\307\244\242\244\354\244\320\241\242\260\312\262\274\244\316\245\263\245\336\245\363\245\311\244\316\244\337\244\307\n\274\350\306\300\262\304\307\275\244\307\244\271\241\243\n\n$ cvs -d \#{CVS_ROOT} checkout \#{CVS_PROJECT}\n\n\n== \262\350\301\374\244\316\315\321\260\325\n\n\245\265\245\340\245\315\245\244\245\353\262\275\244\267\244\350\244\246\244\310\244\271\244\353\262\350\301\374\244\362 (({\#{File.basename(@figdir)} })) \244\310\244\244\244\246\n\245\307\245\243\245\354\245\257\245\310\245\352\244\313\303\326\244\244\244\306\244\257\244\300\244\265\244\244\241\243\270\275\272\337\241\242\262\350\301\374\244\310\244\267\244\306\307\247\274\261\244\265\244\354\244\353\244\316\244\317\241\242\n(({ \#{@ext_list.join(\", \")}, \#{@ext_list.join(\", \").swapcase} }))\n\244\307\244\271\241\243\245\242\245\313\245\341\241\274\245\267\245\347\245\363 gif \244\313\244\342\260\354\261\376\302\320\261\376\244\267\244\306\244\244\244\336\244\271\244\254, \245\265\245\340\245\315\245\244\245\353\262\275\244\271\244\353\n\245\332\241\274\245\270\310\326\271\346\244\317\301\264\262\350\301\374\266\246\304\314\244\313\244\267\244\253\300\337\304\352\244\307\244\255\244\336\244\273\244\363.\n\n\302\276\244\316\267\301\274\260\244\316\262\350\301\374\244\362\307\247\274\261\244\265\244\273\244\277\244\244\276\354\271\347\244\317 ((<\245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\306\376\314\347\312\324)>))\n\244\362\273\262\276\310\244\267\244\306\244\257\244\300\244\265\244\244\241\243\244\310\244\352\244\242\244\250\244\272\241\242\n\244\336\244\272\244\317 (({\#{File.basename(@figdir)} })) \244\362\272\356\300\256\244\267\244\306\262\274\244\265\244\244\241\243\n\n== \#{@self_name} \244\316\315\321\260\325\n\n((<\#{@self_name} \244\316\306\376\274\352\244\316\312\375\313\241>)) \244\307\274\350\306\300\244\267\244\277 \#{@self_name} \244\317\n(({ thum-src })) \244\310\244\244\244\246\245\307\245\243\245\354\245\257\245\310\245\352\244\362\272\356\244\303\244\306\244\275\244\263\244\313\303\326\244\244\244\306\262\274\244\265\244\244\241\243\n\267\353\262\314\305\252\244\313\241\242\260\312\262\274\244\316\244\350\244\246\244\312\271\275\300\256\244\313\244\312\244\303\244\306\244\244\244\353\244\310\316\311\244\244\244\307\244\271\241\243\n\n./\#{File.basename(@figdir)}/*****.jpg\n*****.gif\n./thum-src/dcmodel-thum.rb\n\n\n== \244\310\244\352\244\242\244\250\244\272\274\302\271\324\n\n(({ thum-src })) \244\330\260\334\306\260\244\267\241\242\#{@self_name} \244\362\274\302\271\324\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\n$ cd thum-src\n$ ruby \#{@self_name}\n\n\244\271\244\353\244\310\241\242\#{@sub_rb_name} \244\310\244\244\244\246\274\302\271\324\245\271\245\257\245\352\245\327\245\310\244\254\272\356\300\256\244\265\244\354\244\353\n\244\317\244\272\244\307\244\271\241\243\n\n== \273\322\245\271\245\257\245\352\245\327\245\310\244\316\274\302\271\324\n\n\272\243\305\331\244\317 \#{@sub_rb_name} \244\362\274\302\271\324\244\267\244\336\244\271\241\243\n\n$ ruby \#{@sub_rb_name}\n\n\244\271\244\353\244\310\241\242(({ \#{@index}\#{@index_ext} }))\244\310\244\244\244\246\245\325\245\241\245\244\245\353\244\254\272\356\300\256\244\265\244\354\244\336\244\271\241\243\n\244\263\244\354\244\254\245\265\245\340\245\315\245\244\245\353\244\316 HTML \244\307\244\271\241\243\n\n\n== \244\307\244\255\244\277\244\342\244\316\244\362\270\253\244\306\244\337\244\353\n\n(({ \#{@index}\#{@index_ext} })) \244\362\245\326\245\351\245\246\245\266\244\307\270\253\244\306\244\337\244\306\244\257\244\300\244\265\244\244\241\243\n\244\263\244\316\245\332\241\274\245\270\244\310\306\261\315\315\244\316\245\341\245\303\245\273\241\274\245\270\244\254\275\361\244\253\244\354\244\277\245\332\241\274\245\270\244\254\275\320\316\317\244\265\244\354\244\306\244\244\244\353\n\244\317\244\272\244\307\244\271\241\243\n\n\#{File.basename(@figdir)} \244\313\262\350\301\374\244\362\244\252\244\244\244\306\244\242\244\303\244\277\276\354\271\347\241\242\244\275\244\354\244\351\244\254\n\262\274\244\313\245\265\245\340\245\315\245\244\245\353\262\275\244\265\244\354\244\306\244\244\244\353\244\317\244\272\244\307\244\271\241\243\n\n\n== \245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\306\376\314\347\312\324)\n\n\244\263\244\316\244\336\244\336\244\307\244\317\273\310\244\250\244\312\244\244\244\316\244\307\241\242(({ \#{@sub_rb_name} })) \244\362\312\324\275\270\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\244\336\244\272\241\242\244\263\244\263\244\313\265\255\275\322\244\265\244\354\244\353\245\263\245\341\245\363\245\310\244\362\272\357\275\374\244\267\244\336\244\267\244\347\244\246\241\243\n\n\260\312\262\274\244\316\311\364\312\254\260\312\271\337\244\362\301\264\244\306\276\303\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.message << <<-Message\n=begin\n[((<\303\317\265\345\316\256\302\316\305\305\307\276\266\346\263\332\311\364|URL:http://www.gfd-dennou.org>))]\n[((<dcmodel|URL:http://www.gfd-dennou.org/library/dcmodel>)) |\n:\n:\n\n\274\241\244\313\241\242\272\356\300\256\244\265\244\354\244\353 HTML \245\325\245\241\245\244\245\353\244\316\314\276\301\260\244\362\264\365\313\276\244\316\244\342\244\316\244\313\312\321\271\271\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\262\274\265\255\244\316\244\350\244\246\244\313 infofile \244\362\300\337\304\352\244\267\244\306\244\252\244\257\244\310\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327(\270\345\275\322) \244\316\n\314\276\301\260\244\342\260\354\275\357\244\313\312\321\271\271\244\265\244\354\244\306\312\330\315\370\244\307\244\271\241\243\n\nthumb.index = \"../result\"\nthumb.infofile = \"\\\\\\#\\\\\\{File.basename(thumb.index)\\\\\\}.txt\"\n\n\262\350\301\374\244\310\244\267\244\306\307\247\274\261\244\267\244\277\244\244\263\310\304\245\273\322\244\362\301\375\244\344\244\267\244\277\244\244\276\354\271\347\244\317\260\312\262\274\244\316\244\350\244\246\244\313\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.ext_list.push(\"bmp\")\n\n\262\350\301\374\245\325\245\241\245\244\245\353\314\276\244\254\304\271\244\257\241\242\245\325\245\241\245\244\245\353\314\276\244\316\306\254\244\316\311\364\312\254\244\362\274\350\244\352\275\374\244\244\244\306\311\275\274\250\244\267\244\277\244\244\241\242\n\244\336\244\277\244\317\245\325\245\241\245\244\245\353\314\276\244\316\306\254\244\307\275\320\316\317\244\271\244\353\245\325\245\241\245\244\245\353\244\316\301\252\302\362\244\362\271\324\244\244\244\277\244\244\276\354\271\347\244\317\n\260\312\262\274\244\316\244\350\244\246\244\313\300\337\304\352\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.headlimit = \"exp_name_\"\n\n\262\350\301\374\245\325\245\241\245\244\245\353\314\276\244\362 HTML \244\313\311\275\274\250\244\267\244\277\244\257\244\312\244\244\276\354\271\347\244\317\260\312\262\274\244\316\244\350\244\246\244\313\300\337\304\352\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\270\304\312\314\305\252\244\313\245\325\245\241\245\244\245\353\314\276\244\362\310\363\311\275\274\250\244\313\244\267\244\277\244\244\276\354\271\347\244\317\n((<\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\316\312\324\275\270 (\261\376\315\321\312\324)>)) \244\316 ((<\245\325\245\241\245\244\245\353\314\276\310\363\311\275\274\250>))\n\244\362\273\262\276\310\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.blankfig = true\n\n\262\350\301\374\244\316\275\304\262\243\245\265\245\244\245\272\244\344\241\242\245\265\245\340\245\315\245\244\245\353\244\307\262\243\244\313\311\275\274\250\244\271\244\353\262\350\301\374\244\316\277\364\244\317\260\312\262\274\244\316\244\350\244\246\244\313\n\300\337\304\352\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.img_width = 200\nthumb.img_height = 150\nthumb.figtable_num = 3\n\n\274\253\306\260\300\270\300\256\244\265\244\354\244\353\245\265\245\340\245\315\245\244\245\353\262\350\301\374\244\316\303\326\244\255\276\354\244\310\262\350\301\374\244\316\314\276\301\260\244\316\272\307\270\345\311\364\244\362\n\274\241\244\316\244\350\244\246\244\313\273\330\304\352\244\267\244\306\262\274\244\265\244\244.\n\nthumb.thumbnaildir = \"../thumb\" # \245\265\245\340\245\315\245\244\245\353\262\350\301\374\244\362\303\326\244\257\245\307\245\243\245\354\245\257\245\310\245\352\314\276\nthumb.thumbnailtail = \"_thumb.png\" # \245\265\245\340\245\315\245\244\245\353\262\350\301\374\244\316\263\310\304\245\273\322\314\276\n\n\245\242\245\313\245\341\241\274\245\267\245\347\245\363 gif \305\371\312\243\277\364\245\332\241\274\245\270\244\362\302\253\244\315\244\277\262\350\301\374\244\313\302\320\244\267\244\306\244\317\245\265\245\340\245\315\245\244\245\353\262\275\244\271\244\353\n\245\332\241\274\245\270\310\326\271\346\244\362 1 \244\350\244\352\302\347\244\255\244\244\303\315\244\313\300\337\304\352\244\307\244\255\244\336\244\271.\n\nthumb.thumbnailpage = \"50\" # \245\265\245\340\245\315\245\244\245\353\262\350\301\374\262\275\244\271\244\353\270\265\262\350\301\374\244\316\245\332\241\274\245\270\310\326\271\346\n\n\245\271\245\277\245\244\245\353\245\267\241\274\245\310\244\313\275\361\244\255\271\376\244\340\300\337\304\352\244\362\303\261\302\316\244\307\244\342\273\330\304\352\262\304\307\275\244\307\244\271\241\243\n\316\343\244\250\244\320\241\242\245\352\245\363\245\257\244\313\264\330\244\271\244\353\306\260\272\356\244\362\300\337\304\352\244\271\244\353\244\313\244\317\260\312\262\274\244\316\244\350\244\246\244\313\244\267\244\336\244\271\241\243\n\nthumb.style = <<-STYLE\na:link { color:#269900; }\na:visited { color:#269900; }\na:hover { color:#99FF33; }\nSTYLE\n\n\270\265\241\271\244\316 (({ thumb.title ... })) \244\316\271\324\244\362\316\343\244\250\244\320\260\312\262\274\244\316\244\350\244\246\244\313\275\361\244\255\264\271\244\250\241\242\n\245\277\245\244\245\310\245\353\244\362\300\337\304\352\244\267\244\306\244\257\244\300\244\265\244\244\241\243(\244\263\244\354\244\317 HTML \244\316 head \245\277\245\260\306\342\244\316\ntitle \245\277\245\260\244\313\300\337\304\352\244\265\244\354\244\336\244\271 )\n\nthumb.title = \"\274\302\270\263\267\353\262\314\"\n\n\244\301\244\347\244\246\244\311\244\263\244\316\245\301\245\345\241\274\245\310\245\352\245\242\245\353\244\254\272\356\300\256\244\265\244\354\244\353\276\354\275\352\244\313\275\361\244\255\275\320\244\271\241\242\n\245\341\245\303\245\273\241\274\245\270\244\362\300\337\304\352\244\267\244\306\244\257\244\300\244\265\244\244\241\243\244\263\244\263\244\313\275\361\244\255\271\376\244\340\306\342\315\306\244\254\244\275\244\316\244\336\244\336\nHTML \244\310\244\267\244\306\275\320\316\317\244\265\244\354\244\353\244\316\244\307\241\242HTML \245\277\245\260\244\342\275\361\244\255\271\376\244\363\244\307\244\257\244\300\244\265\244\244\241\243\n\n((* \303\355\260\325\241\252\241\252 *)) message \244\313\302\345\306\376\244\271\244\353\244\310\244\255\244\316\265\255\271\346\244\317\311\254\244\272 \241\326=\241\327\n\244\307\244\317\244\312\244\257\241\242\241\326<<\241\327\244\313\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.message << <<-MSG\n<h1>\274\302\270\263\267\353\262\314</h1>\n\n<p>\n\260\312\262\274\244\317\274\302\270\263\267\353\262\314\244\362\260\354\315\367\244\267\244\277\244\342\244\316\244\307\244\242\244\353\n</p>\n\n<h2>\274\302\270\263\300\337\304\352</h2>\n\n<ul>\n<li>\262\362\301\374\305\331 : T42L20\n<li>\273\376\264\326\245\271\245\306\245\303\245\327 : 30 s\n</ul>\n:\n:\nMSG\n\n\245\265\245\340\245\315\245\244\245\353\311\364\312\254\244\316\262\274\244\313\245\341\245\303\245\273\241\274\245\270\244\362\265\255\275\322\244\267\244\277\244\244\276\354\271\347\244\317\241\242\260\312\262\274\244\316\244\350\244\246\244\313\n\300\337\304\352\244\267\244\336\244\267\244\347\244\246\241\243\275\361\244\255\312\375\244\317\276\345\265\255\244\316 message \244\310\306\261\315\315\244\307\244\271\241\243\n\nthumb.footer << <<-MSG\n=begin\n== \273\262\271\315\273\361\316\301\n\n* \303\317\265\345\316\256\302\316\305\305\307\276\266\346\263\332\311\364 dcmodel \245\327\245\355\245\270\245\247\245\257\245\310.\n((<URL:http://www.gfd-dennou.org/library/dcmodel>)),\n\303\317\265\345\316\256\302\316\305\305\307\276\266\346\263\332\311\364.\n\n=end\nMSG\n\n\n== \272\306\305\331\274\302\271\324\n\n\272\306\305\331 \#{@sub_rb_name} \244\362\274\302\271\324\244\267\244\336\244\271\241\243\n\n$ ruby \#{@sub_rb_name}\n\n\244\271\244\353\244\310\241\242\276\345\265\255\244\316\265\255\275\322\244\254\310\277\261\307\244\265\244\354\244\277 (({ \#{@index}\#{@index_ext} })) \244\254\n\272\356\300\256\244\265\244\354\244\336\244\271\241\243\245\326\245\351\245\246\245\266\244\307\263\316\307\247\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\n\244\277\244\300\244\267\241\242\244\263\244\354\244\300\244\261\244\307\244\317\241\242\245\265\245\340\245\315\245\244\245\353\306\342\244\316\245\263\245\341\245\363\245\310\244\362\312\324\275\270\244\307\244\255\244\312\244\244\244\316\244\307\241\242\n\260\312\262\274\244\316 ((<\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\316\312\324\275\270 (\306\376\314\347\312\324)>)) \244\362\273\262\276\310\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\n\n== \241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\316\312\324\275\270 (\306\376\314\347\312\324)\n\n\#{@sub_rb_name} \244\362\274\302\271\324\244\267\244\277\245\307\245\243\245\354\245\257\245\310\245\352\244\313\244\317\276\345\265\255\244\307\300\337\304\352\244\267\244\277\ninfofile \244\313\302\320\261\376\244\267\244\277\245\325\245\241\245\244\245\353\244\254\272\356\300\256\244\265\244\354\244\353\244\317\244\272\244\307\244\271\241\243\n\nthumb.infofile = \"\\\\\\#\\\\\\{File.basename(thumb.index)\\\\\\}.txt\"\n\n\244\263\244\316\245\325\245\241\245\244\245\353\244\362\312\324\275\270\244\271\244\353\244\263\244\310\244\307\241\242\245\265\245\340\245\315\245\244\245\353\306\342\244\313\245\263\245\341\245\363\245\310\244\362\265\255\275\322\244\307\244\255\244\336\244\271\241\243\n\n\244\336\244\272\303\346\277\310\244\362\270\253\244\306\244\337\244\306\244\257\244\300\244\265\244\244\241\243\n\nfig1.png::\nfig2.gif::\nfig3.jpg::\nfig3.png::\n\n\244\263\244\354\244\317\241\242\260\312\262\274\244\316\244\350\244\246\244\312\245\325\245\251\241\274\245\336\245\303\245\310\244\313\244\312\244\303\244\306\244\244\244\336\244\271\241\243\n\n<\262\350\301\374\314\276> : <\275\244\276\376\273\322> : <\245\263\245\341\245\363\245\310>\n\n<\275\244\276\376\273\322> \244\313\264\330\244\267\244\306\244\317 ((<\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\316\312\324\275\270 (\261\376\315\321\312\324)>))\n\244\362\273\262\276\310\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\n\n=== \262\350\301\374\244\316\275\347\275\370\244\316\306\376\244\354\302\330\244\250\n\n\245\265\245\340\245\315\245\244\245\353\244\313\244\317\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\313\275\361\244\255\271\376\244\336\244\354\244\277\275\347\244\313\275\361\244\255\275\320\244\265\244\354\244\336\244\271\241\243\n\306\376\244\354\302\330\244\250\244\277\244\244\273\376\244\313\244\317\271\324\244\264\244\310\244\275\244\316\260\314\303\326\244\362\306\376\244\354\302\330\244\250\244\306\244\257\244\300\244\265\244\244\241\243\n\nfig2.gif::\nfig3.jpg::\nfig3.png::\nfig1.png::\n\n=== \245\263\245\341\245\363\245\310\311\325\244\261\n\n\245\263\245\341\245\363\245\310\244\362\244\304\244\261\244\277\244\244\244\310\244\255\244\313\244\317\241\242\260\312\262\274\244\316\244\350\244\246\244\313\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nfig1.png:: 1 \262\363\314\334\244\316\274\302\270\263\nfig2.gif:: 2 \262\363\314\334\244\316\274\302\270\263\nfig3.jpg:: 3 \262\363\314\334\244\316\274\302\270\263 (jpg \262\350\301\374)\nfig3.png:: 3 \262\363\314\334\244\316\274\302\270\263 (png \262\350\301\374)\n\nHTML \245\277\245\260\244\317\244\275\244\316\244\336\244\336\307\247\274\261\244\265\244\354\244\353\244\316\244\307\241\242\260\312\262\274\244\316\244\350\244\246\244\313\275\361\244\255\271\376\244\340\244\263\244\310\244\254\n\262\304\307\275\244\307\244\271\241\243\n\nfig1.png:: <hr> 1 \262\363\314\334\244\316\274\302\270\263 <br> \274\272\307\324 <hr>\n\n\n=== \245\263\245\341\245\363\245\310\245\242\245\246\245\310\n\n\245\263\245\341\245\363\245\310\245\242\245\246\245\310\244\267\244\277\244\244\276\354\271\347\244\317\271\324\306\254\244\313 \241\326#\241\327\244\362\275\361\244\255\271\376\244\337\244\336\244\271\241\243\n\n# fig2.gif:: 2 \262\363\314\334\244\316\274\302\270\263\n\n\n=== \245\351\245\331\245\353\n\n\262\350\301\374\244\307\244\317\244\312\244\257\241\242\245\263\245\341\245\363\245\310\244\316\244\337\244\362\275\361\244\255\271\376\244\337\244\277\244\244\244\310\244\255\244\317\241\242<\262\350\301\374\314\276> \244\313\n\241\326label\241\327\244\310\265\255\275\322\244\267\244\336\244\271\241\243\n\nlabel:: <hr><table><tr><td>\274\302\270\263\300\337\304\352 2</td><td>\245\321\245\351\245\341\241\274\245\277 3</td></tr></table>\n\n=== \245\271\245\332\241\274\245\271\n\n\260\354\244\304\312\254\310\364\244\320\244\267\244\306\311\275\274\250\244\267\244\277\244\244\273\376\244\317\260\312\262\274\244\316\244\350\244\246\244\313 <\262\350\301\374\314\276> \244\316\311\364\312\254\244\313\262\277\244\342\275\361\244\253\244\312\244\244\244\307\n\262\274\244\265\244\244\241\243\n\n\241\241::\n\n\n== \244\342\244\246\260\354\305\331\274\302\271\324\n\n\272\306\305\331 \#{@sub_rb_name} \244\362\274\302\271\324\244\267\244\336\244\271\241\243\n\n$ ruby \#{@sub_rb_name}\n\n\244\271\244\353\244\310\241\242\276\345\265\255\244\316\265\255\275\322\244\254\310\277\261\307\244\265\244\354\244\277 (({ \#{@index}\#{@index_ext} })) \244\254\n\272\356\300\256\244\265\244\354\244\336\244\271\241\243\245\326\245\351\245\246\245\266\244\307\263\316\307\247\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\n\n== \245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\261\376\315\321\312\324)\n\n((<\245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\306\376\314\347\312\324)>)) \244\316\261\376\315\321\310\307\244\307\244\271\241\243\n\n((<\#{@self_name} \244\316 rdoc \245\336\245\313\245\345\245\242\245\353|URL:\#{PUB_DOC_URL}>))\n\244\316 DCModelThumbnail \245\257\245\351\245\271\244\316 Attribute \244\313\300\337\304\352\244\307\244\255\244\353\301\264\244\306\244\316\303\315\n\244\316\276\360\312\363\244\254\244\242\244\353\244\316\244\307\241\242\276\334\244\267\244\257\244\317\244\275\244\301\244\351\244\362\273\262\276\310\244\257\244\300\244\265\244\244\241\243\n\n=== \305\305\307\276\245\265\241\274\245\320\260\312\263\260\244\307\273\310\244\246\244\277\244\341\244\313\n\n\305\305\307\276\245\265\241\274\245\320\260\312\263\260\244\307\244\316\315\370\315\321\244\362\271\315\244\250\244\353\276\354\271\347\244\313\244\317\241\242\262\274\265\255\244\316\300\337\304\352\244\342\312\324\275\270\244\271\244\353\n\311\254\315\327\244\254\244\242\244\353\244\253\244\342\244\267\244\354\244\336\244\273\244\363\241\243\n\n\245\263\245\324\241\274\245\351\245\244\245\310\n\nthumb.copyright = \"GFD Dennou Club\"\n\n\245\271\245\277\245\244\245\353\245\267\241\274\245\310\n\nthumb.css = \"/GFD_Dennou_Club/ftp/arch/dcmodel/htmltools/dcmodel.css\"\n\nrd2 \245\263\245\336\245\363\245\311\244\330\244\316\245\321\245\271 (\244\263\244\354\244\317\241\242\262\274\265\255\244\307\276\322\262\360\244\271\244\353 RD \244\310\244\244\244\246\275\361\313\241\244\307\n\275\361\244\257\311\254\315\327\244\254\314\265\244\261\244\354\244\320\241\242\300\337\304\352\244\316\311\254\315\327\244\317\244\242\244\352\244\336\244\273\244\363)\n\nthumb.rd2_path = \"/usr/bin/rd2\"\n\nrd2html-ext-lib \244\316\300\337\304\352 (\244\263\244\354\244\342\241\242\262\274\265\255\244\307\276\322\262\360\244\271\244\353 RD \244\310\244\244\244\246\275\361\313\241\244\307\n\275\361\244\257\311\254\315\327\244\254\314\265\244\261\244\354\244\320\241\242\300\337\304\352\244\316\311\254\315\327\244\317\244\242\244\352\244\336\244\273\244\363)\n\nthumb.rd2htmlextlib = \"/GFD_Dennou_Club/ftp/arch/dcmodel/lib\"\n\n\n=== RD \244\362\273\310\244\244\244\277\244\244\277\315\244\316\244\277\244\341\244\313\n\n\303\346\244\313\244\317\241\242\241\326RD\n((-\nRD (Ruby Documents) \244\344 rdtool \244\313\264\330\244\267\244\306\244\317\241\242\n((<RD\273\366\273\317\244\341|URL:http://www.rubyist.net/~rubikitch/computer/rd-intro/>))\n\244\344\n((<RAA - rdtool|URL:http://raa.ruby-lang.org/project/rdtool/>))\n\244\362\273\262\276\310\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n-))\n\244\307\275\361\244\255\244\277\244\244\241\252\241\252 HTML \244\307\244\312\244\363\244\253\275\361\244\255\244\277\244\257\244\312\244\244\241\252\241\252\241\327\244\310\244\244\244\246\n\244\357\244\254\244\336\244\336\244\317\312\375\244\342\244\244\244\353\244\253\244\342\244\267\244\354\244\336\244\273\244\363\241\243(\244\263\244\354\244\362\275\361\244\244\244\306\244\244\244\353\273\344\244\254\300\265\244\313\244\275\244\246\244\307\244\271\241\243\n\244\275\244\316\244\277\244\341\244\313\244\263\244\316\245\304\241\274\245\353\244\362\262\376\316\311\244\267\244\277\244\310\270\300\244\303\244\306\244\342\262\341\270\300\244\307\244\317\244\242\244\352\244\336\244\273\244\363\241\304)\241\243\n\n\244\275\244\246\244\244\244\246\312\375\244\317\241\242\245\341\245\303\245\273\241\274\245\270\244\316\300\337\304\352\244\316\272\335\244\313\241\242\306\254\244\313 \241\326=begin\241\327\241\242\260\354\310\326\272\307\270\345\244\313\n\241\326=end\241\327\244\310\265\255\275\322\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.message << <<-MSG\n=begin\n= \274\302\270\263\267\353\262\314\n\n\260\312\262\274\244\317\274\302\270\263\267\353\262\314\244\362\260\354\315\367\244\267\244\277\244\342\244\316\244\307\244\242\244\353\n\n== \274\302\270\263\300\337\304\352\n\n* \262\362\301\374\305\331 : T42L20\n* \273\376\264\326\245\271\245\306\245\303\245\327 : 30 s\n:\n:\n=end\nMSG\n\n\244\271\244\353\244\310\241\242\244\263\244\316\276\360\312\363\244\362 rdtool \244\307 HTML \262\275\244\267\244\277\244\342\244\316\244\362\245\265\245\340\245\315\245\244\245\353\244\316\245\325\245\241\245\244\245\353\244\313\n\313\344\244\341\271\376\244\337\244\336\244\271\241\243\n\n=== RT \244\362\273\310\244\244\244\277\244\244\277\315\244\316\244\277\244\341\244\313 (\314\244\274\302\301\365)\n\n((* \303\355\260\325\241\247 *)) \244\263\244\316\265\241\307\275\244\317\244\336\244\300\245\320\241\274\245\270\245\347\245\363 \#{VER} \244\307\244\317\301\310\244\337\271\376\244\336\244\354\244\306\244\244\244\336\244\273\244\363\241\243\n\n\302\276\244\313\244\342\241\242\241\326RT\n((-\n((<RT|URL:http://www.rubyist.net/~rubikitch/computer/rt/>))\n\244\362\273\262\276\310\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n-))\n\244\307\275\361\244\244\244\306\244\337\244\277\244\244\241\252\241\252\241\327\244\310\244\244\244\246\312\375\244\342\244\244\244\353\244\253\244\342\244\267\244\354\244\336\244\273\244\363\241\243\n\n\244\275\244\246\244\244\244\246\312\375\244\317\241\242\245\341\245\303\245\273\241\274\245\270\244\316\300\337\304\352\244\316\272\335\244\313\241\242\306\254\244\313 \241\326=begin RT\241\327\241\242\260\354\310\326\272\307\270\345\244\313\n\241\326=end\241\327\244\310\265\255\275\322\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.message << <<-MSG\n=begin RT\ncaption = \311\275\245\306\245\271\245\310\n\n, \277\315\264\326, == , \270\244 , ==\n|| , \303\313 , \275\367 ,\245\252\245\271,\245\341\245\271\n\nx , 1.0 , 2.0, 1.1, 1.2\ny , 0.4 , 0.5, 0.3, 0.1\n\n=end\nMSG\n\n\244\271\244\353\244\310\241\242\244\263\244\316\276\360\312\363\244\362 rttool \244\307 HTML \262\275\244\267\244\277\244\342\244\316\244\362\245\265\245\340\245\315\245\244\245\353\244\316\245\325\245\241\245\244\245\353\244\313\n\313\344\244\341\271\376\244\337\244\336\244\271\241\243\n\n\n=== SIGEN \245\325\245\241\245\244\245\353\300\270\300\256\244\316\245\263\245\363\245\310\245\355\241\274\245\353\n\n\245\307\245\325\245\251\245\353\245\310\244\307\244\317\245\265\245\340\245\315\245\244\245\353\245\325\245\241\245\244\245\353\244\316\272\356\300\256\244\310\306\261\273\376\244\313 SIGEN \245\325\245\241\245\244\245\353\n<http://www.gfd-dennou.org/library/cc-env/mksigen/desc.htm> \244\362\n\272\356\300\256\244\267\244\336\244\271\244\254\241\242\311\324\315\327\244\307\244\242\244\353\276\354\271\347\244\317 mksigen \244\362 false \244\313\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.mksigen = false\n\n\n=== \245\355\245\334\245\303\245\310\270\241\272\367\244\316\266\330\273\337\n\n\300\270\300\256\244\271\244\353\245\265\245\340\245\315\245\244\245\353\244\362\245\355\245\334\245\303\245\310\270\241\272\367\244\267\244\306\315\337\244\267\244\257\244\312\244\244\276\354\271\347\244\313\244\317\nnorobots \244\362 true \244\313\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.norobots = true\n\n=== \245\265\245\340\245\315\245\244\245\353\262\350\301\374\312\321\264\271\245\304\241\274\245\353\244\316\312\321\271\271\n\n\245\307\245\325\245\251\245\353\245\310\244\307\245\265\245\340\245\315\245\244\245\353\244\362\312\321\264\271\244\271\244\353\245\263\245\336\245\363\245\311\244\252\244\350\244\323\245\252\245\327\245\267\245\347\245\363\244\317\n\260\312\262\274\244\316\304\314\244\352\244\307\244\271\241\243\n\n\#{@convert_cmd}\n\n\244\263\244\354\244\362\312\321\264\271\244\267\244\277\244\244\276\354\271\347\244\313\244\317\260\312\262\274\244\316\244\350\244\246\244\313\300\337\304\352\244\362\271\324\244\303\244\306\244\257\244\300\244\265\244\244\241\243\n\244\277\244\300\244\267\241\242\266\365\307\362\244\316\276\354\271\347\244\344\245\267\245\271\245\306\245\340\244\313\302\270\272\337\244\267\244\312\244\244\245\263\245\336\245\363\245\311\244\254\300\337\304\352\244\265\244\354\244\306\244\244\244\353\n\276\354\271\347\244\313\244\317\245\250\245\351\241\274\244\362\312\326\244\267\244\336\244\271\241\243\n\nthumb.convert_cmd = \"mogrify -geometry\"\n\n\245\307\245\325\245\251\245\353\245\310\244\307\244\317\264\373\244\313\275\320\316\317\300\350\244\313\245\325\245\241\245\244\245\353\244\254\302\270\272\337\244\267\241\242\263\356\244\304\270\265\244\316\245\325\245\241\245\244\245\353\244\350\244\352\244\342\n\277\267\244\267\244\244\276\354\271\347\241\242\273\376\264\326\244\316\303\273\275\314\244\316\244\277\244\341\241\242\262\350\301\374\245\325\245\241\245\244\245\353\244\316\312\321\264\271\244\362\271\324\244\244\244\336\244\273\244\363\241\243\n\244\342\244\267\244\342\313\350\262\363\311\254\244\272\245\325\245\241\245\244\245\353\244\316\312\321\264\271\244\362\271\324\244\244\244\277\244\244\276\354\271\347\244\317\260\312\262\274\244\316\244\350\244\246\244\313\300\337\304\352\244\267\244\306\244\257\244\300\244\265\244\244\241\243\n\nthumb.convert_overwrite = true\n\n\n== \241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\316\312\324\275\270 (\261\376\315\321\312\324)\n\n((<\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\316\312\324\275\270 (\306\376\314\347\312\324)>)) \244\316\261\376\315\321\310\307\244\307\244\271\241\243\n\n=== \261\246\264\363\244\273\241\246\272\270\264\363\244\273\n\n<\275\244\276\376\273\322>\244\313 \">\" \244\362\275\361\244\255\271\376\244\340\244\310\261\246\264\363\244\273\244\313\241\242\"<\" \244\362\275\361\244\255\271\376\244\340\244\310\272\270\264\363\244\273\244\313\244\312\244\352\244\336\244\271\241\243\n\nfig1.png:>: \261\246\264\363\244\273\244\300\244\350\nfig2.gif:<: \272\270\264\363\244\273\244\300\244\350\nfig3.jpg:: \245\307\245\325\245\251\245\353\245\310\244\317\277\277\244\363\303\346\264\363\244\273\244\300\244\350\n\n\n=== \312\243\277\364\271\324\306\376\316\317\n\n<\275\244\276\376\273\322>\244\313 \"m\" \244\362\275\361\244\255\271\376\244\340\244\263\244\310\244\307\312\243\277\364\271\324\306\376\316\317\244\254\262\304\307\275\244\307\244\271\241\243\n\244\312\244\252\241\242\276\345\265\255\244\316 ((<\261\246\264\363\244\273\241\246\272\270\264\363\244\273>)) \244\310\312\273\315\321\244\271\244\353\276\354\271\347\244\313\244\317\245\253\245\363\245\336 \",\" \244\307\n\266\350\300\332\244\352\244\336\244\271\241\243\306\342\315\306\274\253\302\316\244\317 \"{\" \244\310 \"}\" \244\307\244\257\244\257\244\352\244\336\244\271\241\243\n\nfig1.png:m:{\n<p>\n\312\243\277\364\271\324\306\376\316\317\244\362\271\324\244\246\244\350\241\243\n\244\263\244\246\244\244\244\246\244\263\244\310\244\307\244\255\244\353\244\350\241\243\n\312\330\315\370\244\300\244\315\241\274\241\243\245\306\241\274\245\326\245\353\244\342\275\361\244\255\244\344\244\271\244\244\244\315\241\243\n</p>\n}\nfig2.gif:>,m:{\n<ul>\n<li> \312\273\315\321\244\271\244\353\244\313\244\317\244\263\244\246\244\271\244\353\244\350\241\243\n</ul>\n}\n\n=== \245\325\245\241\245\244\245\353\314\276\310\363\311\275\274\250\n\n<\275\244\276\376\273\322>\244\313 \"b\" \244\362\275\361\244\255\271\376\244\340\244\263\244\310\244\307\245\325\245\241\245\244\245\353\314\276\244\316\311\275\274\250\244\362\315\336\300\251\244\267\244\336\244\271\241\243\n\nfig1.png:b: \245\325\245\241\245\244\245\353\314\276\311\275\274\250\244\254\315\336\300\251\244\265\244\354\244\336\244\271\n\n\301\264\244\306\244\316\245\325\245\241\245\244\245\353\314\276\244\362\260\354\263\347\244\307\315\336\300\251\244\271\244\353\312\375\313\241\244\317 ((<\245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\306\376\314\347\312\324)>))\n\244\362\273\262\276\310\244\267\244\306\244\257\244\300\244\265\244\244\241\243(\302\260\300\255 blankfig \244\362 true \244\313\300\337\304\352\244\267\244\336\244\271)\241\243\n\n\n=== RD \244\362\273\310\244\244\244\277\244\244\277\315\244\316\244\277\244\341\244\313\n\n<\275\244\276\376\273\322>\244\313 \"rd\" \244\362\275\361\244\255\271\376\244\340\244\263\244\310\244\307\241\242\312\270\273\372\316\363\244\317 RD \244\310\244\267\244\306\262\362\274\341\244\265\244\354\241\242\nrdtool \244\307 HTML \244\313\312\321\264\271\244\265\244\354\244\336\244\271\241\243RD \244\307\245\332\241\274\245\270\306\342\245\352\245\363\245\257\244\362\272\356\300\256\244\271\244\353\n\265\255\313\241\244\342\315\370\315\321\262\304\307\275\244\307\241\242\313\334\312\270\244\344\245\325\245\303\245\277\241\242\245\265\245\340\245\315\245\244\245\353\306\342\244\316\245\330\245\303\245\300\244\313\245\352\245\363\245\257\244\362\n\305\275\244\353\244\263\244\310\244\342\244\307\244\255\244\336\244\271\241\243(\316\343 ((<\245\330\245\303\245\3001>))\241\242((<\245\330\245\303\245\3002>)) )\n\nfig1.png:m,rd:{\n((<\244\352\244\363\244\257|URL:./>)) \244\317\244\263\244\363\244\312\264\266\244\270\244\307\275\361\244\261\244\353\244\350\241\243\n* \245\352\245\271\245\310\244\342\n* \264\312\303\261\nRD \245\351\245\331\245\353\244\362\273\310\315\321\244\267\244\277\245\332\241\274\245\270\306\342\245\352\245\363\245\257\244\317\n((<RD \244\362\273\310\244\244\244\277\244\244\277\315\244\316\244\277\244\341\244\313>)) \244\316\244\350\244\246\244\313\265\255\275\322\244\271\244\354\244\320 OK \244\307\244\271\241\243\n}\n\n\n=== RT \244\362\273\310\244\244\244\277\244\244\277\315\244\316\244\277\244\341\244\313 (\314\244\274\302\301\365)\n\n((* \303\355\260\325\241\247 *)) \244\263\244\316\265\241\307\275\244\317\244\336\244\300\245\320\241\274\245\270\245\347\245\363 \#{VER} \244\307\244\317\301\310\244\337\271\376\244\336\244\354\244\306\244\244\244\336\244\273\244\363\241\243\n\n<\275\244\276\376\273\322>\244\313 \"rt\" \244\362\275\361\244\255\271\376\244\340\244\263\244\310\244\307\241\242\312\270\273\372\316\363\244\317 RT \244\310\244\267\244\306\262\362\274\341\244\265\244\354\241\242\nrttool \244\307 HTML \244\313\312\321\264\271\244\265\244\354\244\336\244\271\241\243\n\nfig1.png:m,rt:{\ncaption = \311\275\245\306\245\271\245\310\n\n, \277\315\264\326, == , \270\244 , ==\n|| , \303\313 , \275\367 ,\245\252\245\271,\245\341\245\271\n\nx , 1.0 , 2.0, 1.1, 1.2\ny , 0.4 , 0.5, 0.3, 0.1\n}\n\n\n=== \241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\253\244\351\245\277\245\244\245\310\245\353\244\316\300\337\304\352\n\n((<\245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\306\376\314\347\312\324)>)) \244\307\245\277\245\244\245\310\245\353\244\316\300\337\304\352\244\313\264\330\244\267\244\306\n\265\255\275\322\244\267\244\336\244\267\244\277\244\254\241\242\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\253\244\351\244\316\300\337\304\352\244\342\262\304\307\275\244\307\244\271\241\243\n<\262\350\301\374\314\276> \244\313 title \244\310\265\255\275\322\244\267 <\245\263\245\341\245\363\245\310> \244\313\245\277\245\244\245\310\245\353\244\362\275\361\244\255\271\376\244\363\244\307\244\257\244\300\244\265\244\244\241\243\n\ntitle:: \274\302\270\263\300\337\304\352 \302\266\244\316\306\365\n\n((<\245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\306\376\314\347\312\324)>)) \244\317\276\345\275\361\244\255\244\265\244\354\244\336\244\271\241\243\n\n\n=== \241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\253\244\351\313\334\312\270\245\341\245\303\245\273\241\274\245\270\244\316\304\311\262\303\n\n((<\245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\306\376\314\347\312\324)>)) \244\307\313\334\312\270\245\341\245\303\245\273\241\274\245\270\244\316\300\337\304\352\244\313\264\330\244\267\244\306\n\265\255\275\322\244\267\244\336\244\267\244\277\244\254\241\242\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\253\244\351\304\311\262\303\244\342\262\304\307\275\244\307\244\271\241\243\n<\262\350\301\374\314\276> \244\313 message \244\310\265\255\275\322\244\267\241\242\313\334\312\270\245\341\245\303\245\273\241\274\245\270\244\362\275\361\244\255\271\376\244\363\244\307\244\257\244\300\244\265\244\244\241\243\n\nmessage:m,rd:{\n= \245\265\245\363\245\327\245\353\244\300\241\274\n\n== \314\334\274\241\244\307\244\271\n\n=== \244\265\244\351\244\313\314\334\274\241\244\307\244\271\n\n((<\244\333\244\262|URL:thum/sample_thum.txt>))\n}\nmessage:m:{\n<b>HTML</b> \244\307\244\271\244\254\262\277\244\253\314\344\302\352\244\307\244\342\241\251\n<ul>\n<li>\244\301\244\244\244\265\244\312\n<li>\245\306\241\274\245\326\245\353\244\362\n<li>\272\356\244\303\244\306\n<li>\244\337\244\277\244\350\242\366\n</ul>\n<hr>\n}\n\n=== \241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\253\244\351\245\325\245\303\245\277\241\274\245\341\245\303\245\273\241\274\245\270\244\316\304\311\262\303\n\n((<\245\271\245\257\245\352\245\327\245\310\244\316\312\324\275\270 (\306\376\314\347\312\324)>)) \244\307\245\325\245\303\245\277\241\274\245\341\245\303\245\273\241\274\245\270\244\316\300\337\304\352\244\313\264\330\244\267\244\306\n\265\255\275\322\244\267\244\336\244\267\244\277\244\254\241\242\241\326\276\360\312\363\245\325\245\241\245\244\245\353\241\327\244\253\244\351\304\311\262\303\244\342\262\304\307\275\244\307\244\271\241\243\n<\262\350\301\374\314\276> \244\313 footer \244\310\265\255\275\322\244\267\241\242\245\325\245\303\245\277\241\274\245\341\245\303\245\273\241\274\245\270\244\362\275\361\244\255\271\376\244\363\244\307\244\257\244\300\244\265\244\244\241\243\n\nfooter:m,rd:{\n== \245\325\245\303\245\277\241\274\244\307\244\271\n\273\262\271\315\312\270\270\245\244\310\244\253\275\361\244\255\271\376\244\340\244\316\244\313\312\330\315\370\244\253\244\342\244\267\244\354\244\336\244\273\244\363\241\243\n}\n\n=end\n" 596: debug(@message) 597: end
HTML ファイルの最終的な作成メソッド。最後にこのメソッドを呼ぶことで 作業が完了する。
overwrite に false を与えると、上書きを禁止する。
quiet を true にするとエラーを除く全てのメッセージが表示されなくなる。
verbose を true にすると作業の進捗状況がメッセージとして出力される。
err を true にした場合、意図しない動作が起きた場合にすぐに エラーを起こす。
# File dcmodel-tools/dcmodel-thum.rb, line 1196 1196: def create(overwrite=true, quiet=nil, verbose=true, err=true) 1197: 1198: # 1199: # サムネイルファイル名 1200: # 1201: index_file_name = @index.chomp.strip + 1202: @index_ext.chomp.strip 1203: 1204: # 1205: # 元ファイル削除 (overwrite が nil の場合はエラー) 1206: # 1207: if File.exist?(index_file_name) 1208: if overwrite then 1209: File.delete(index_file_name) 1210: else 1211: raise ArgumentError, "\n\n Error : \"#{index_file_name}\" exist already.\n\n" 1212: end 1213: end 1214: 1215: 1216: # 1217: # infofile の作成 (既に存在する場合はそのまま)。 1218: # DCModelThumbnail.info_make メソッドを呼ぶ 1219: # 1220: status = info_make(@figdir, @infofile, @ext_list, 1221: @headlimit, nil, nil, 1222: true, err) 1223: if verbose then 1224: if /create/ =~ status 1225: $stdout.print " Message : Infofile \"#{@infofile}\" is created.\n" 1226: elsif /exist/ =~ status 1227: $stdout.print " Message : Infofile \"#{@infofile}\" is already exist.\n" 1228: end 1229: end 1230: 1231: # 1232: # @message が Array オブジェクト以外の場合はエラーを返す。 1233: # 1234: if !@message.instance_of?(Array) then 1235: warn_or_err( 1236: "\"message\" must be Array Object. " + 1237: "Please \"message = Array.new\" initially.\n", 1238: true, nil, ArgumentError) 1239: end 1240: 1241: # 1242: # infofile から情報の取得。 1243: # DCModelThumbnail.info_get メソッドを呼ぶ。 1244: # 1245: $stdout.print " Message : Get information from \"#{@infofile}\".... " if verbose 1246: info_list = info_get(@infofile, @headlimit, nil, quiet, err) 1247: # 1248: # infofile からの情報のうち、画像ファイル名を "title" にしている 1249: # ものに関して @title に上書きして、info_list から除く。 1250: # 1251: # infofile からの情報のうち、画像ファイル名を "message" にしている 1252: # ものに関して @message に追加して、info_list から除く。 1253: # 1254: info_list_buff = Array.new 1255: info_list.each{ |info_part| 1256: if /title/ =~ info_part['fig_name'] 1257: @title = info_part['comment'] 1258: elsif /message/ =~ info_part['fig_name'] 1259: # フォーマットの情報を受けて、"=begin" 等の補完 1260: if /rd/ =~ info_part['format'] then 1261: mess_body = "=begin\n" 1262: mess_body << info_part['comment'] 1263: mess_body << "\n=end\n" 1264: elsif /rt/ =~ info_part['format'] then 1265: mess_body = "=begin RT\n" 1266: mess_body << info_part['comment'] 1267: mess_body << "\n=end\n" 1268: else 1269: mess_body = info_part['comment'] 1270: end 1271: 1272: @message << mess_body 1273: 1274: elsif /footer/ =~ info_part['fig_name'] 1275: # フォーマットの情報を受けて、"=begin" 等の補完 1276: if /rd/ =~ info_part['format'] then 1277: foot_body = "=begin\n" 1278: foot_body << info_part['comment'] 1279: foot_body << "\n=end\n" 1280: elsif /rt/ =~ info_part['format'] then 1281: foot_body = "=begin RT\n" 1282: foot_body << info_part['comment'] 1283: foot_body << "\n=end\n" 1284: else 1285: foot_body = info_part['comment'] 1286: end 1287: 1288: @footer << foot_body 1289: 1290: # サムネイルに書き込む情報 (これが本命) 1291: else 1292: info_list_buff << info_part 1293: end 1294: } 1295: info_list = Array.new 1296: info_list << info_list_buff 1297: info_list.flatten! # 配列の平滑化 (1次元配列化) 1298: 1299: $stdout.print " done.\n" if verbose 1300: 1301: 1302: # @convert_cmd が存在するかどうかチェック 1303: $stdout.print " Message : Check converter command .... " if verbose 1304: convert_cmd_no_opt = @convert_cmd.strip.gsub(/\s+.*/, '') 1305: convert_cmd_check1 = convert_cmd_no_opt + " -help &> /dev/null" 1306: convert_cmd_check2 = convert_cmd_no_opt + " --help &> /dev/null" 1307: raise ArgumentError, "\n\n Error : \"#{convert_cmd_no_opt}\": command not found.\n\n" \ 1308: if !system(convert_cmd_check1) && !system(convert_cmd_check2) 1309: $stdout.print " done.\n" if verbose 1310: 1311: # サムネイル画像置き場の作成 1312: raise IOError, "\n\n Error: Existing #{@thumbnaildir} is not a directory.\n\n" \ 1313: if File.exists?(@thumbnaildir) && ! File.stat(@thumbnaildir).directory? 1314: Dir.mkdir(@thumbnaildir) unless File.exists?(@thumbnaildir) 1315: 1316: # サムネイル画像の作成 1317: $stdout.print " Message : Create small images for thumbnail ....\n" if verbose 1318: info_list.each_index{ |i| 1319: thumbnail_name = info_list[i]['fig_name'].sub(/\.\w+$/, @thumbnailtail) 1320: fig_name = info_list[i]['fig_name'] 1321: $stdout.print " [#{i + 1}/#{info_list.size}]: " if verbose 1322: if info_list[i]['fig_name_nohead'].strip.chomp == "label" || 1323: info_list[i]['fig_name_nohead'].strip.chomp == "message" || 1324: info_list[i]['fig_name_nohead'].strip.chomp == "title" || 1325: info_list[i]['fig_name_nohead'].strip.chomp.empty? 1326: $stdout.print "Skip: No image file.\n" if verbose 1327: elsif !@convert_overwrite && \ 1328: File.exists?("#{@thumbnaildir}/#{thumbnail_name}") && \ 1329: File.mtime("#{@thumbnaildir}/#{thumbnail_name}") > \ 1330: File.mtime("#{@figdir}/#{fig_name}") 1331: $stdout.print "Skip: \"#{@thumbnaildir}/#{thumbnail_name}\" is already exist, and newer than \"#{@figdir}/#{fig_name}\"\n" if verbose 1332: else 1333: cmd = "#{@convert_cmd} #{@img_width.to_s}x#{@img_height.to_s} '#{@figdir}/#{fig_name}[#{@thumbnailpage}]' '#{@thumbnaildir}/#{thumbnail_name}'" 1334: $stdout.print cmd if verbose 1335: $stdout.print "\n" if verbose 1336: raise "\n\n Error : \"#{cmd}\": failed.\n\n" if !system(cmd) 1337: end 1338: info_list[i]['thumbnail_name']=thumbnail_name 1339: } 1340: 1341: # 1342: # @message のフォーマットを解析し、HTML に変換する。 1343: # 1344: html_message = Array.new 1345: @message.each{ |mess| 1346: format = format_parser(mess) 1347: 1348: if /rd/ =~ format then 1349: html_buff = rd2html(mess, true) 1350: elsif /rt/ =~ format then 1351: html_buff = rd2html(mess, true) 1352: else 1353: html_buff = mess 1354: end 1355: 1356: html_message << html_buff if html_buff 1357: debug(html_message) 1358: } 1359: debug(html_message) 1360: 1361: 1362: # 1363: # @footer のフォーマットを解析し、HTML に変換する。 1364: # 1365: footer_mess = Array.new 1366: @footer.each{ |mess| 1367: format = format_parser(mess) 1368: 1369: if /rd/ =~ format then 1370: html_buff = rd2html(mess, true) 1371: elsif /rt/ =~ format then 1372: html_buff = rd2html(mess, true) 1373: else 1374: html_buff = mess 1375: end 1376: 1377: footer_mess << html_buff if html_buff 1378: debug(footer_mess) 1379: } 1380: debug(footer_mess) 1381: if !footer_mess.empty? 1382: footer_mess.unshift "\n<hr size=\"1\">\n" 1383: end 1384: 1385: # 初期化 1386: html_entire = "" 1387: 1388: # HTML ヘッダ部分 1389: $stdout.print " Message : Generate HTML Header...." if verbose 1390: html_entire << html_header 1391: $stdout.print " done.\n" if verbose 1392: 1393: # 本文 1394: $stdout.print " Message : Insert body messages...." if verbose 1395: html_message.each { |message| 1396: html_entire << message 1397: } 1398: $stdout.print " done.\n" if verbose 1399: 1400: # サムネイル部分 1401: $stdout.print " Message : Generate Thumbnail Lists...." if verbose 1402: html_entire << html_thum(info_list, quiet, true) 1403: $stdout.print " done.\n" if verbose 1404: 1405: # フッタメッセージ部分 1406: $stdout.print " Message : Insert footer messages...." if verbose 1407: footer_mess.each { |message| 1408: html_entire << message 1409: } 1410: $stdout.print " done.\n" if verbose 1411: 1412: # HTML フッタ部分 1413: $stdout.print " Message : Generate HTML Footer...." if verbose 1414: html_entire << html_footer 1415: $stdout.print " done.\n" if verbose 1416: 1417: # ヘッダ, サムネイル, フッタ間のハイパーリンクを有効にする. 1418: $stdout.print " Message : Cross hyperlinks between header and thumbnail and footer .... " if verbose 1419: html_entire = relabel(html_entire) 1420: $stdout.print " done.\n" if verbose 1421: 1422: # ファイルの書きだし 1423: $stdout.print " Message : Output to \"#{index_file_name}\"...." if verbose 1424: ifile = open(index_file_name, "w") 1425: ifile.print html_entire 1426: ifile.close 1427: $stdout.print " Successfull. \n" if verbose 1428: 1429: # 最後までうまくいったら、SIGEN ファイルも作成する。 1430: if @mksigen then 1431: mksigen_file = index_file_name.chomp.strip + ".SIGEN" 1432: mksigen_thumbdir = @thumbnaildir + ".SIGEN" 1433: mksigen_thumbdir_title = @title || "" 1434: mksigen_thumbdir_title << " サムネイル画像置き場ディレクトリ" 1435: mksigen_src = relative_str("#{$0}" , mksigen_file) 1436: mksigen_info = relative_str(@infofile, mksigen_file) 1437: 1438: mksigen_desc = "relative:\#{mksigen_src} \244\310\nrelative:\#{mksigen_info}\n\244\313\244\350\244\352\274\253\306\260\300\270\300\256\n" 1439: 1440: mksigen_note = "\244\263\244\316 SIGEN \245\325\245\241\245\244\245\353\274\253\302\316\244\342\nrelative:\#{mksigen_src}\n\244\253\244\351\244\316\274\253\306\260\300\270\300\256\244\307\244\242\244\353\n" 1441: 1442: $stdout.print " Message : Create \"#{mksigen_file}\"...." if verbose 1443: mksigen_write(mksigen_file, @title, nil, 1444: nil, "自動生成", 1445: mksigen_desc, mksigen_note) 1446: mksigen_write(mksigen_thumbdir, mksigen_thumbdir_title, nil, 1447: nil, "自動生成", 1448: mksigen_desc, mksigen_note) if File.exists?(@thumbnaildir) 1449: $stdout.print " Successfull. \n" if verbose 1450: end 1451: 1452: end
サンプルスクリプト出力用のメソッド。 この DCModelThumbnail クラスに依存するサンプルスクリプトを 引数 filename という名前で出力する。実際には、このファイル を編集・実行することでサムネイルが作成される寸法である。
# File dcmodel-tools/dcmodel-thum.rb, line 1470 1470: def create_sample_rb(filename) 1471: if !(str_and_notspace?(filename)) then 1472: return warn_or_err("filename is invalid.\n", 1473: true, nil, ArgumentError) 1474: end 1475: 1476: rb_file_body = "#!/usr/bin/env ruby1.8\n#\n#= dcmodel thumbnail generate ruby script\n#\n# Editor :: \#{username_from_uid}\n# Version:: \#{Time.now.strftime(\"%Y/%m/%d %H:%M:%S\")}\n#\n#== Overview\n#\n#This file is generate by following ruby script automatically.\n#\n# \#{File.expand_path($0.to_s)}\n# version \"\#{VER}\"\n#\n#Please edit this file according to your purpose.\n#\n#== Usage\n#\n#Please check following sample page and reference manual.\n#\n# \#{PUB_SAMPLE_URL}\n# \#{PUB_DOC_URL}\n#\n##################################################\n\nrequire \"\#{File.expand_path($0.to_s)}\"\n\n######################################################\n# DCModelThumbnail \244\316\245\244\245\363\245\271\245\277\245\363\245\271\244\362\272\356\300\256 (\311\254\277\334)\nthumb = DCModelThumbnail.new\n\n# \245\265\245\340\245\315\245\244\245\353\274\302\271\324\245\263\245\336\245\363\245\311 (\311\254\277\334)\241\243\272\307\270\345\244\313\274\302\271\324\244\271\244\353\244\263\244\310\nEND{\nthumb.create\n}\n\n#thumb.copyright = \"\#{@copyright}\"\n# \245\263\245\324\241\274\245\351\245\244\245\310\n\nthumb.index = \"\#{@index}\"\n# \272\356\300\256\244\265\244\354\244\353\245\265\245\340\245\315\245\244\245\353\244\316\245\325\245\241\245\244\245\353\314\276 (\263\310\304\245\273\322\275\374\244\257)\n\n#thumb.index_ext = \"\#{@index_ext}\"\n# \272\356\300\256\244\265\244\354\244\353\245\265\245\340\245\315\245\244\245\353\244\316\263\310\304\245\273\322\314\276\n\nthumb.infofile = \"\\#\\{File.basename(thumb.index)\\}.txt\"\n# \241\326\276\360\312\363\245\325\245\241\245\244\245\353 (infofile)\241\327\244\316\245\325\245\241\245\244\245\353\314\276\n\n#thumb.ext_list.push(\"bmp\")\n# \262\350\301\374\245\325\245\241\245\244\245\353\244\310\244\267\244\306\307\247\274\261\244\265\244\273\244\277\244\244\263\310\304\245\273\322\244\316\n# \304\311\262\303\241\243\245\307\245\325\245\251\245\353\245\310\244\307\244\317\n# \#{@ext_list.join(\", \")},\n# \#{@ext_list.join(\", \").swapcase}\n# \244\254\307\247\274\261\244\265\244\354\244\353\241\243\n\n#thumb.headlimit = \"headlimit_\"\n# headlimit \244\313\305\366\244\306\244\317\244\336\244\351\244\312\244\244\244\342\244\316\244\317\262\350\301\374\244\310\n# \244\267\244\306\244\317\314\265\273\353\244\265\244\354\241\242\305\366\244\306\244\317\244\336\244\353\244\342\244\316\244\317\241\326\276\360\312\363\n# \245\325\245\241\245\244\245\353\241\327\244\313\244\252\244\244\244\306\241\242\300\334\306\254\311\364\312\254 headlimit\n# \244\362\276\312\316\254\244\267\244\306\273\330\304\352\244\271\244\353\244\263\244\310\244\254\262\304\307\275\244\310\244\312\244\353\241\243\n\n#thumb.blankfig = true\n# \262\350\301\374\245\325\245\241\245\244\245\353\314\276\244\362\311\275\274\250\244\267\244\312\244\244\n\n#thumb.figdir = \"\#{@figdir}\"\n# \263\250\244\316\244\242\244\353\245\307\245\243\245\354\245\257\245\310\245\352\244\316\314\276\301\260\241\243\n# \311\254\244\272\302\270\272\337\244\267\244\306\244\244\244\312\244\261\244\354\244\320\244\312\244\351\244\312\244\244\241\243\n\n#thumb.thumbnaildir = \"\#{@thumbnaildir}\"\n# \245\265\245\340\245\315\245\244\245\353\262\350\301\374\244\362\303\326\244\257\245\307\245\243\245\354\245\257\245\310\245\352\244\316\314\276\301\260\n\n#thumb.thumbnailtail = \"\#{@thumbnailtail}\"\n# \245\265\245\340\245\315\245\244\245\353\262\350\301\374\244\316\263\310\304\245\273\322\314\276\n\n#thumb.thumbnailpage = \"1\"\n# \245\265\245\340\245\315\245\244\245\353\262\350\301\374\262\275\244\271\244\353\270\265\262\350\301\374\244\316\245\332\241\274\245\270\310\326\271\346\n\n#thumb.convert_cmd = \"\#{@convert_cmd}\"\n# convert \245\263\245\336\245\363\245\311\244\252\244\350\244\323\245\252\245\327\245\267\245\347\245\363\241\243\244\263\244\316\n# \270\345\244\355\244\313\262\350\301\374\245\265\245\244\245\272\244\254 200x150 \244\316\244\350\244\246\244\312\267\301\n# \274\260\244\307\273\330\304\352\244\265\244\354\244\353\241\243\n\n#thumb.convert_overwrite = \#{@convert_overwrite}\n# convert \245\263\245\336\245\363\245\311\244\254\274\302\271\324\244\265\244\354\244\353\272\335\241\242\264\373\244\313\275\320\n# \316\317\300\350\244\316\245\325\245\241\245\244\245\353\244\254\244\242\244\353\276\354\271\347\244\313\276\345\275\361\244\255\244\271\244\353\244\277\n# \244\341\244\316\245\325\245\351\245\260\241\243\244\263\244\354\244\254 false \244\316\276\354\271\347\241\242\275\320\316\317\n# \300\350\244\316\245\325\245\241\245\244\245\353\244\254\302\270\272\337\244\267\241\242\263\356\244\304\270\265\244\316\245\325\245\241\245\244\245\353\n# \244\350\244\352\244\342\277\267\244\267\244\244\276\354\271\347\244\317\312\321\264\271\244\362\271\324\244\357\244\312\244\244\241\243\n\n#thumb.css = \"\#{@css}\"\n# \245\271\245\277\245\244\245\353\245\267\241\274\245\310\245\325\245\241\245\244\245\353\n\n#thumb.rd2_path = \"\#{@rd2_path}\"\n# rd2 \245\263\245\336\245\363\245\311\244\330\244\316\245\321\245\271\n\n#thumb.rd2htmlextlib = \"\#{@rd2htmlextlib}\"\n# rd2-ext-lib \244\330\244\316\245\351\245\244\245\326\245\351\245\352\244\330\244\316\245\321\245\271\n\n#thumb.mksigen = false\n# SIGEN \245\325\245\241\245\244\245\353\244\362\272\356\244\351\244\312\244\244\276\354\271\347\244\317 false\n# \244\313\245\273\245\303\245\310\244\271\244\353\n\n#thumb.norobots = true\n# HTML \244\316\245\355\245\334\245\303\245\310\270\241\272\367\244\362\266\330\273\337\244\271\244\353\276\354\271\347\244\313\244\317\n# true \244\313\245\273\245\303\245\310\244\271\244\353\n\n#thumb.img_width = \#{@img_width}\n# \262\350\301\374\245\325\245\241\245\244\245\353\245\265\245\244\245\272 (\311\375)\n\n#thumb.img_height = \#{@img_height}\n# \262\350\301\374\245\325\245\241\245\244\245\353\245\265\245\244\245\272 (\271\342\244\265)\n\n#thumb.figtable_num = \#{@figtable_num}\n# \262\243\244\313\244\312\244\351\244\331\244\353\245\325\245\241\245\244\245\353\277\364\n\n#thumb.style = <<-STYLE\n# a:link { color:#269900; }\n# a:visited { color:#269900; }\n# a:hover { color:#99FF33; }\n#STYLE\n# \245\271\245\277\245\244\245\353\245\267\241\274\245\310\244\362\304\276\300\334\300\337\304\352\244\271\244\353\244\277\244\341\244\316\244\342\244\316\n# (css \245\325\245\241\245\244\245\353\244\313\275\361\244\255\271\376\244\340\276\360\312\363\244\362\304\276\300\334\273\330\304\352\n# \244\307\244\255\244\353)\n\n#thumb.html_author = \"\#{@html_author}\"\n# html \244\316\272\356\300\256\274\324\276\360\312\363 (\245\307\245\325\245\251\245\353\245\310\244\317\245\346\241\274\245\266\n# \245\242\245\253\245\246\245\363\245\310\314\276\244\254\274\253\306\260\274\350\306\300\244\265\244\354\244\353)\n\nthumb.title = \"\#{@title}\"\n# html \245\330\245\303\245\300\244\316\245\277\245\244\245\310\245\353\n\n# \313\334\302\316\244\313\275\361\244\255\275\320\244\271\245\341\245\303\245\273\241\274\245\270\241\243\245\265\245\340\245\315\245\244\245\353\244\316\n# \311\364\312\254\244\350\244\352\244\342\276\345\244\313\275\320\316\317\244\265\244\354\244\353\241\243\244\263\244\316\312\321\277\364\274\253\302\316\n# \244\317 Array \245\252\245\326\245\270\245\247\245\257\245\310\244\307\241\242\244\275\244\316\306\342\311\364\244\313\n# String \245\252\245\326\245\270\245\247\245\257\245\310\244\254\263\312\307\274\244\265\244\354\244\353\241\243\n\n# \245\325\245\303\245\277\241\274\245\341\245\303\245\273\241\274\245\270\241\243\n# \"=\" \244\307\244\317\244\312\244\257\241\242\"<<\" \244\307\302\345\306\376\244\271\244\353\244\263\244\310\244\313\303\355\260\325\241\252\241\252\nthumb.footer = Array.new\n#thumb.footer << <<-Footer\n# \#{@footer.join(\"\\n\\n\")}\n#Footer\n\n# \245\341\245\303\245\273\241\274\245\270\241\243\n# \"=\" \244\307\244\317\244\312\244\257\241\242\"<<\" \244\307\302\345\306\376\244\271\244\353\244\263\244\310\244\313\303\355\260\325\241\252\241\252\nthumb.message = Array.new\nthumb.message << <<-Message\n\#{@message.join(\"\\n\\n\")}\nMessage\n\n" 1477: 1478: # 1479: # ファイルの作成 1480: # 1481: ifile = open(filename, "w") 1482: ifile.print "#{rb_file_body}" 1483: ifile.close 1484: 1485: # 1486: # パーミッションの設定 1487: # 1488: File.chmod(0755, filename) 1489: 1490: end
mes で与えられる本文の行頭を解析し、その本文が HTML であるか、 RD であるか、RT であるのかを判別する。現在、以下のように判定している。
返り値は "html", "rd", "rt" のいづれかである。なお、body に String オブジェクト以外、もしくは完全に空白のみが入っている場合、 nil を返す。
# File dcmodel-tools/dcmodel-thum.rb, line 2392 2392: def format_parser(body=nil) 2393: debug(body) 2394: if !(str_and_notspace?(body)) then 2395: return warn_or_err("\"body\" is not String Object.\n") 2396: end 2397: 2398: Kconv::toeuc(body) 2399: body_parts = body.split("\n") 2400: 2401: body_parts.each{ |line| 2402: next unless /\w+/e =~ line.chomp.strip 2403: if /=begin\s+(rt)/ie =~ line.chomp.strip 2404: return "rt" 2405: elsif /=begin/ie =~ line.chomp.strip 2406: return "rd" 2407: elsif /=begin\s+(rd)/ie =~ line.chomp.strip 2408: return "rd" 2409: else 2410: return "html" 2411: end 2412: } 2413: return nil 2414: end
フッター作成用メソッド。相当する文字列を返す。 DCModelThumbnail.html_header で得られる文字列で始まる HTML を 閉じることを想定している。
# File dcmodel-tools/dcmodel-thum.rb, line 2341 2341: def html_footer() 2342: # @index のディレクトリから見た、生成スクリプトの相対的な位置 2343: generator = relative_str("#{$0}", @index) 2344: 2345: # @index のディレクトリから見た、情報ファイルの相対的な位置 2346: infofile = relative_str(@infofile, @index) 2347: 2348: # 2349: # フッターとして書き出し 2350: # 2351: html_footer = "<hr size=\"1\">\n<center>\n<small>\nThis page is generated by <a href=\\\"\#{generator}\\\">\#{generator}</a>\nand <a href=\\\"\#{infofile}\\\">\#{infofile}</a>\n(\#{Time.now.strftime(\"%Y/%m/%d %H:%M:%S\")} \#{username_from_uid})<br>\n\#{@self_name}\n[<a href=\"\#{PUB_BIN_URL}\">Script</a> |\n<a href=\"\#{PUB_DOC_URL}\">Doc</a> | <a href=\"\#{PUB_SAMPLE_URL}\">Sample</a>]\nis provided by\n<a href=\"http://www.gfd-dennou.org/library/dcmodel\">dcmodel project</a>\nin\n<a href=\"http://www.gfd-dennou.org\">GFD Dennou Club</a> <br>\nCopyright © \#{@copyright} \#{Time.now.strftime(\"%Y\")}\n</small>\n</center>\n</body>\n</html>\n" 2352: return html_footer 2353: end
HTML のヘッダ部分の作成メソッド。相当する文字列を返す。 作成した HTML は DCModelThumbnail.html_footer で得られる文字列で 閉じられることを想定している。
# File dcmodel-tools/dcmodel-thum.rb, line 2074 2074: def html_header() 2075: # @index のディレクトリから見た、生成スクリプトの相対的な位置 2076: generator = relative_str("#{$0}", @index) 2077: 2078: # @index のディレクトリから見た、css の相対的な位置 2079: css = relative_str(@css, @index) 2080: 2081: # @norobots が ture であれば、meta タグに書き込み。 2082: if @norobots then 2083: robots = "<meta name=\"robots\" content=\"noindex,nofollow\" />\n<meta name=\"robots\" content=\"noarchive\" />\n" 2084: end 2085: 2086: # @style で指定されているものがあれば、それも書き込み。 2087: if str_and_notspace?(@style) then 2088: style = "<style type=\"text/css\">\n<!--\n\#{@style}\n-->\n</style>\n" 2089: else 2090: style = "" 2091: end 2092: 2093: # 2094: # ヘッダ全体の生成 2095: # 2096: header = "<?xml version=\"1.0\" encoding=\"euc-jp\" ?>\n<!DOCTYPE html\nPUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html lang=\"ja\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<title>\#{@title}</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-euc-jp\" />\n<meta name=\"Author\" content=\"\#{@html_author}\" />\n\#{robots}\n<meta name=\"generator\" content=\"\#{generator}\" />\n<link href=\"\#{css}\" type=\"text/css\" rel=\"stylesheet\" />\n\#{style}\n</head>\n<body>\n" 2097: return header 2098: end
HTML のサムネイル部分 (画像の数に応じて繰り返す部分) を作成するメソッド。 相当する文字列を返す。info_list には DCModelThumbnail.info_get で 取得される形式の情報ファイルが与えられる。
それ以外の形のデータが与えられる場合には警告を発して nil を返す。 ただし、err に true を与えると、エラーが生じる。 quiet が true の場合には警告メッセージも表示しない。
内部で DCModelThumbnail.html_thum_parts を呼び、各要素はそちらで 作成する。
# File dcmodel-tools/dcmodel-thum.rb, line 2140 2140: def html_thum(info_list=nil, quiet=nil, err=nil) 2141: 2142: # 2143: # 引数に与えられたデータの検証 2144: # 2145: if !array_and_notzero?(info_list) then 2146: return warn_or_err( 2147: "\"info_list\" is invalid.\n", 2148: err, quiet, ArgumentError) 2149: end 2150: 2151: # 2152: # table タグを作成 2153: # 2154: html_table = "" 2155: 2156: html_table = "<table border=\"0\" cellspacing=\"10\" align=\"center\">\n" 2157: 2158: # 2159: # 中身を作成 2160: # 2161: info_list.size.times{ |num| 2162: html_table << html_thum_parts(info_list, num, quiet, err) 2163: } 2164: 2165: # 2166: # もしも、info_list.size が @figtable_num で割り切れない場合、 2167: # 残り分の空白 td を作成する 2168: # 2169: remain = @figtable_num - (info_list.size % @figtable_num) 2170: td_width = (100 / @figtable_num).truncate.to_s + "%" # 一つの td の幅 2171: 2172: if !(remain == 0) then 2173: remain.times{ |time| 2174: html_table << "<td width=\"\#{td_width}\" valign=\"top\">\n \n</td>\n" 2175: } 2176: html_table << "</tr>\n" 2177: end 2178: 2179: # 2180: # /table タグを作成 2181: # 2182: html_table << "</table>\n" 2183: 2184: return html_table 2185: end
HTML のサムネイル部分の内部 (テーブルの1要素毎) を作成するメソッド。 相当する文字列を返す。info_list には DCModelThumbnail.info_get で 取得される形式の情報ファイルを、num には何番目のデータなのかを 示す Numerical オブジェクトを与える。
それ以外の形のデータが与えられる場合には警告を発して nil を返す。 ただし、err に true を与えると、エラーが生じる。 quiet が true の場合には警告メッセージも表示しない。
# File dcmodel-tools/dcmodel-thum.rb, line 2212 2212: def html_thum_parts(info_list=nil, num=nil, quiet=nil, err=nil) 2213: # 2214: # 引数に与えられたデータの検証 2215: # 2216: if !array_and_notzero?(info_list) then 2217: return warn_or_err( 2218: "\"info_list\" is invalid.\n", 2219: err, quiet, ArgumentError) 2220: end 2221: 2222: if !num.kind_of?(Integer) 2223: return warn_or_err( 2224: "\"num\" is not integer.\n", 2225: err, quiet, ArgumentError) 2226: end 2227: 2228: # 2229: # info_list からデータの取得 2230: # 2231: fig_name = info_list[num]['fig_name'] # 画像ファイル名 2232: thumbnail_name = info_list[num]['thumbnail_name'] # サムネイル画像名 2233: comment = info_list[num]['comment'] # コメント 2234: align = info_list[num]['align'] # 文字寄せ 2235: fig_name_nohead = info_list[num]['fig_name_nohead'] # 省略画像ファイル名 2236: format = info_list[num]['format'] # comment のフォーマット 2237: blankfig = info_list[num]['blankfig'] # 画像名非表示 2238: debug(fig_name, comment, align, fig_name_nohead) 2239: 2240: # 2241: # format から、comment の変換処理 2242: # 2243: if /rd/ =~ format then 2244: comment_buff = rd2html(comment) 2245: elsif /rt/ =~ format then 2246: comment_buff = rd2html(comment) 2247: else 2248: comment_buff = "#{comment}" 2249: end 2250: comment = "#{comment_buff}" 2251: 2252: # 2253: # @index からの相対的な @figdir の設定 2254: # 2255: rel_figdir = relative_str(@figdir, @index) 2256: 2257: # 2258: # @index からの相対的な @thumbaildir の設定 2259: # 2260: rel_thumbnaildir = relative_str(@thumbnaildir, @index) 2261: 2262: # 2263: # テーブルの配置によって <tr> のつけたしをおこなう。 2264: # (num はゼロからスタートすることに注意) 2265: # 左端 : @figtable_num * n (remainder == 0) 2266: # 右端 : @figtable_num * n - 1 (remainder == @figtable - 1) 2267: # 2268: remainder = num % @figtable_num # 余り 2269: figtable_1 = @figtable_num - 1 # 列数 - 1 2270: td_width = (100 / @figtable_num).truncate.to_s + "%" # 一つの td の幅 2271: debug(num, remainder, figtable_1, @figtable_num, td_width) 2272: 2273: html_table_part = "" 2274: 2275: # 左端用の <tr> タグ 2276: if remainder == 0 then 2277: html_table_part = "<tr valign=\"center\">\n" 2278: end 2279: 2280: # 画像ファイル名が "label" の場合には comment をそのまま書き出す。 2281: if /^label$/ =~ fig_name_nohead.chomp.strip then 2282: html_table_part << "<td align=\"\#{align}\" width=\"\#{td_width}\" valign=\"center\">\n<small>\n\#{comment}\n</small>\n</td>\n" 2283: 2284: # 画像ファイル名が存在しない場合は空白を書き出す。 2285: elsif !(str_and_notspace?(fig_name_nohead)) then 2286: html_table_part << "<td align=\"\#{align}\" width=\"\#{td_width}\" valign=\"top\">\n \n</td>\n" 2287: 2288: # 上記以外の場合には、絵の縮小版とそのリンクを張り込む 2289: else 2290: if blankfig || @blankfig 2291: fig_name_show = "" 2292: else 2293: fig_name_show = "\n #{fig_name_nohead}<br>\n" 2294: end 2295: html_table_part << "<td align=\"center\" width=\"\#{td_width}\" valign=\"top\">\n<a href=\"\#{rel_figdir}/\#{fig_name}\">\n<img src=\"\#{rel_thumbnaildir}/\#{thumbnail_name}\" border=\"1\" width=\"\#{@img_width.to_s}\" height=\"\#{@img_height.to_s}\">\n</a>\n<div align=\"\#{align}\">\n<small>\#{fig_name_show}\n\#{comment}<br><br>\n</small>\n</div>\n</td>\n" 2296: end 2297: 2298: # 右端用の </tr> タグ 2299: if remainder == figtable_1 then 2300: html_table_part << "</tr>\n" 2301: end 2302: 2303: return html_table_part 2304: end
DCModelThumbnail.info_make によって作成される「情報ファイル」 infofile から画像ファイル名とコメント、および修飾情報を取り出し、 Array[Hash, …] にして返す。 各要素の Hash にはキーに値の種類の文字列を格納してある。 以下は現在 Hash のキーとして取得されるものである。
delimiter (String オブジェクト) は情報ファイルの 画像ファイル名・修飾情報・コメントの区切り文字を設定する ものであり、デフォルトは定数 INFO_DELIMITER にて設定されている。 一応変更できるようになっているが、原則的に変更しない 事を薦める。
quiet を真にすると、ファイルがない際にもメッセージを表示しない。
err を真にすると、ファイルが見つからない際にエラー処理をする。
# File dcmodel-tools/dcmodel-thum.rb, line 1851 1851: def info_get(infofile=nil, headlimit=nil, delimiter=nil, 1852: quiet=nil, err=nil) 1853: 1854: # delimiter のセット 1855: if !(str_and_notspace?(delimiter)) then 1856: delimiter = INFO_DELIMITER 1857: end 1858: 1859: info_list = Array.new 1860: 1861: # ファイルが読み取れるかチェック 1862: if !(File.readable?(infofile)) then 1863: return warn_or_err("\"#{infofile}\" is not readable. \n", 1864: err, quiet, ArgumentError) 1865: end 1866: 1867: # 実際にファイルを開く 1868: ifile = open(infofile, "r") 1869: 1870: line_num = 0 1871: multi_valid = false # 複数行取得用のフラグ 1872: multi_first = true # 複数行取得用のフラグ 1873: 1874: start_char = Regexp.quote(INFO_MULTI_START) # 複数行開始 "{" 1875: stop_char = Regexp.quote(INFO_MULTI_STOP) # 複数行停止 "}" 1876: 1877: info_hash_tmp = Hash.new 1878: 1879: ifile.each { |line| 1880: 1881: # 探索したデータの格納用配列とハッシュ 1882: info_part = Array.new 1883: info_hash = Hash.new 1884: 1885: # 行数を数える 1886: line_num += 1 1887: 1888: debug("line=", line_num, ":", "multi=", multi_valid) 1889: 1890: info_part = line.chomp.split(/#{delimiter}/, 3) 1891: info_hash['fig_name_nohead'] = info_part[0] || "" 1892: info_hash['comment'] = info_part[2] || "" 1893: info_hash['line'] = line_num.to_s 1894: 1895: # 行頭が "#", または完全に空行の場合はコメントアウトと考えて無視。 1896: if /^\s*#/ =~ info_part[0] then 1897: next 1898: elsif !(str_and_notspace?(line)) then 1899: next 1900: end 1901: 1902: # info_hash['fig_name'] の設定 1903: if str_and_notspace?(headlimit) then 1904: info_hash['fig_name'] = 1905: headlimit.chomp.strip + info_hash['fig_name_nohead'].chomp.strip 1906: else 1907: info_hash['fig_name'] = info_hash['fig_name_nohead'] 1908: end 1909: 1910: # 1911: # 修飾子の解析 (万が一のことを考え、日本語も処理)。 1912: # 1913: if !(str_and_notspace?(info_part[1])) then 1914: modifier = "" 1915: else 1916: modifier = Kconv::toeuc(info_part[1].chomp.strip) 1917: # 1918: # 日本語らしきものが入っていたら警告またはエラー 1919: # ただし、複数行処理の場合は気にしない。(文中に「:」が 1920: # 入っていることも考えられるので 1921: # 1922: if !(modifier == Kconv::toeuc(modifier)) || 1923: !(modifier == Kconv::tojis(modifier)) || 1924: !(modifier == Kconv::tosjis(modifier)) then 1925: 1926: if !(multi_valid) then 1927: warn_or_err( 1928: "\"#{modifier}\" include 2 bite code, " + 1929: "so this may not be parsed correctly.\n", 1930: err, quiet, ArgumentError) 1931: end 1932: end 1933: end 1934: 1935: # 1936: # 修飾子の分割 1937: # 1938: modifier_parts = modifier.split(",") 1939: 1940: # 文字寄せ情報の解析 1941: info_hash['align'] = "center" # デフォルト値 1942: modifier_parts.each{ |char| 1943: if />/ =~ char.chomp.strip then 1944: info_hash['align'] = "right" 1945: break 1946: elsif /</ =~ char.chomp.strip then 1947: info_hash['align'] = "left" 1948: break 1949: end 1950: } 1951: 1952: # フォーマット情報の解析 1953: info_hash['format'] = "html" # デフォルト値 1954: modifier_parts.each{ |char| 1955: if /rd/ =~ char.chomp.strip then 1956: info_hash['format'] = "rd" 1957: break 1958: elsif /rt/ =~ char.chomp.strip then 1959: info_hash['format'] = "rt" 1960: break 1961: end 1962: } 1963: 1964: # ファイル名の非表示フラグ 1965: info_hash['blankfig'] = false # デフォルト値 1966: modifier_parts.each{ |char| 1967: if /b/ =~ char.chomp.strip then 1968: info_hash['blankfig'] = true 1969: break 1970: end 1971: } 1972: 1973: # 複数行を取得するかどうかの解析 1974: modifier_parts.each{ |char| 1975: if /m/ =~ char.chomp.strip then 1976: debug(info_hash['comment']) 1977: debug(str_and_notspace?(info_hash['comment'])) 1978: if str_and_notspace?(info_hash['comment']) && 1979: /#{start_char}/e =~ Kconv::toeuc(info_hash['comment']) then 1980: multi_valid = true 1981: break 1982: end 1983: end 1984: } 1985: 1986: # 複数行取得が有効になっている場合は、値を一時 1987: # ここで止め、次のループへ回す。 1988: if multi_valid then 1989: 1990: # 文字コード変換等をまともに行うため、line および 1991: # info_hash['comment'] を別の文字列に置き換え 1992: if !(str_and_notspace?(line)) then 1993: line_tmp = "\n" 1994: else 1995: line_tmp = line 1996: end 1997: if !(str_and_notspace?(info_hash['comment'])) then 1998: comment_tmp = "\n" 1999: else 2000: comment_tmp = info_hash['comment'] 2001: end 2002: 2003: # 初回の場合は、各値を保持しておく。 2004: if multi_first then 2005: info_hash_tmp = info_hash.dup 2006: 2007: # "{" 以降のみを comment として保持 2008: if !(line_tmp.split(INFO_MULTI_START)[1]) 2009: info_hash_tmp['comment'] = "\n" 2010: else 2011: info_hash_tmp['comment'] = 2012: line_tmp.split(INFO_MULTI_START)[1] 2013: end 2014: 2015: multi_first = false 2016: 2017: # もしも同じ行に "}" もある場合にはそこで終了 2018: if /#{stop_char}/e =~ Kconv::toeuc(info_hash_tmp['comment']) then 2019: info_hash_tmp['comment'] = 2020: info_hash_tmp['comment'].split(INFO_MULTI_STOP)[0] 2021: 2022: # フラグの初期化 2023: multi_valid = false 2024: multi_first = true 2025: 2026: # 値を info_hash に戻す。 2027: info_hash = info_hash_tmp.dup 2028: 2029: # 脱出して info_hash を info_list へ (next で脱出しない) 2030: 2031: # 同じ行に "}" が無い場合は info_list へ格納せずに次の行へ 2032: else 2033: next 2034: end 2035: 2036: # 初回以降、まだ "}" がコメントに無い場合 2037: elsif !(/#{stop_char}/e =~ Kconv::toeuc(line_tmp)) then 2038: info_hash_tmp['comment'] << line_tmp 2039: 2040: # info_list に渡さずにループを回す 2041: next 2042: 2043: # コメントに "}" が現れ、終了する際 2044: else 2045: if !(line_tmp.split(INFO_MULTI_STOP)[0]) 2046: last_comment = "" 2047: else 2048: last_comment = line_tmp.split(INFO_MULTI_STOP)[0] 2049: end 2050: info_hash_tmp['comment'] << last_comment 2051: 2052: # フラグの初期化 2053: multi_valid = false 2054: multi_first = true 2055: 2056: # 値を info_hash に戻す。 2057: info_hash = info_hash_tmp.dup 2058: end 2059: end 2060: 2061: # 値を info_list に格納。 2062: info_list.push(info_hash) 2063: } 2064: ifile.close 2065: 2066: return info_list 2067: end
画像ファイル名・修飾情報・コメントを含む「情報ファイル」を作成するための メソッド。
figdir (String オブジェクト) 内の拡張子 ext_list (Array オブジェクト) にヒットするファイル名 をリストにし、infofile (String オブジェクト) に書き出す。
headlimit (String オブジェクト) を渡すと、ファイル名の頭が headlimit にヒットするものだけを拾い、リストからはその部分を 取り除くようにする。
overwrite を true にすると、infofile が存在する場合でも 上書きする。また、quiet を true にすると警告メッセージを表示しない。
delimiter (String オブジェクト) は情報ファイルの 画像ファイル名・修飾情報・コメントの区切り文字を設定する ものであり、デフォルトは定数 INFO_DELIMITER にて設定されている。 一応変更できるようになっているが、原則的に変更しない 事を薦める。
ファイルを作成したときは "create"、既存のものがすでに存在する 場合には "exist" を返す。画像ファイルが一つも読み込めない、 すなわち空のファイルを作成してしまった時や、既存のものが無く、 なおかつ作成に失敗した場合はエラーを起こす。(引数 err を false にした場合には警告を表示するだけである)
ここで作成されるファイルは DCModelThumbnail.info_get で取得される ファイルの雛形である。
# File dcmodel-tools/dcmodel-thum.rb, line 1707 1707: def info_make(figdir=nil, infofile=nil, ext_list=nil, 1708: headlimit=nil, overwrite=nil, delimiter=nil, 1709: quiet=nil, err=true) 1710: 1711: # infofile があり、overwrite が false の場合は終了。 1712: if File.exist?(infofile) && !overwrite then 1713: warn_or_err("Infofile \"#{infofile}\" already exist. " + 1714: "So not generate infofile once again.\n", 1715: nil, quiet) 1716: return "exist" 1717: end 1718: 1719: # 引数の有効性の検証 1720: if !(str_and_notspace?(figdir)) then 1721: return warn_or_err("\"figdir\" is not specified. " + 1722: "So \"infofile\" is not generated. \n", 1723: err, quiet, ArgumentError) 1724: 1725: elsif !(str_and_notspace?(infofile)) then 1726: return warn_or_err("\"infofile\" is not specified. " + 1727: "So \"infofile\" is not generated. \n", 1728: err, quiet, ArgumentError) 1729: 1730: elsif !(array_and_notzero?(ext_list)) then 1731: return warn_or_err("\"ext_list\" is not specified. " + 1732: "So \"infofile\" is not generated. \n", 1733: err, quiet, ArgumentError) 1734: end 1735: 1736: # delimiter のセット 1737: if !(str_and_notspace?(delimiter)) then 1738: delimiter = INFO_DELIMITER 1739: end 1740: 1741: # headlimit の整形 1742: if !(str_and_notspace?(headlimit)) then 1743: headlimit = "" 1744: end 1745: 1746: # figdir から画像ファイル名一覧をとりだし, 配列 imgfiles へ代入 1747: imgfiles = Array.new 1748: Dir.foreach("#{figdir}") { |item| 1749: ext_list.each{ |ext| 1750: next if !(str_and_notspace?(ext)) 1751: 1752: # ドットが付いていない場合はドットをつける 1753: if !(/^\.(.*)/ =~ ext) then 1754: ext = "." + ext.chomp.strip 1755: end 1756: 1757: # 拡張から有効か判定 1758: next unless /#{ext}$/i =~ item 1759: 1760: # headlimit から有効か判定 1761: if str_and_notspace?(headlimit) then 1762: if /^#{headlimit}(.+)$/ =~ item 1763: bodyname = $1 1764: else 1765: next 1766: end 1767: else 1768: bodyname = item 1769: end 1770: 1771: # imgfiles への格納 1772: #imgfiles.push( (File.basename(bodyname, ext) ) ) 1773: imgfiles.push( bodyname ) 1774: } 1775: } 1776: 1777: # もしも画像情報が取り出せていなかったら警告 or エラー 1778: if !(imgfiles.size > 0) then 1779: if str_and_notspace?(headlimit) 1780: errmsg = "Image files \"#{headlimit}...\" are not found in \"#{figdir}\".\n" 1781: else 1782: errmsg = "Image files are not found in \"#{figdir}\".\n" 1783: end 1784: return warn_or_err(errmsg, err, quiet, ArgumentError) 1785: end 1786: 1787: imgfiles = imgfiles.sort 1788: 1789: # infofile に書き込み 1790: ifile = open(infofile, "w") 1791: imgfiles.each{ |filename| 1792: ifile.print "#{filename}#{delimiter}#{delimiter}\n" 1793: } 1794: ifile.close 1795: 1796: return "create" 1797: end
SIGEN ファイル作成メソッド。 書式等詳しいことは <www.gfd-dennou.org/library/cc-env/mksigen/desc.htm> を参照のこと
# File dcmodel-tools/dcmodel-thum.rb, line 2622 2622: def mksigen_write(file=nil , subject=nil , maintainer=nil, 2623: update=nil, update_info=nil, 2624: desc=nil , note=nil , prune=nil , 2625: quiet=nil , err=true) 2626: # 引数の検査 2627: if !(str_and_notspace?(file)) then 2628: return warn_or_err("\"file\" is not specified.", 2629: err, quiet, ArgumentError) 2630: end 2631: if !(str_and_notspace?(subject)) then 2632: return warn_or_err("\"subject\" is not specified.", 2633: err, quiet, ArgumentError) 2634: end 2635: 2636: # 引数が無効でも補完するもの 2637: if !(str_and_notspace?(maintainer)) then 2638: maintainer = jpname_from_uid || username_from_uid || "Unknown" 2639: end 2640: if !(str_and_notspace?(update)) then 2641: update = Time.now.strftime("%Y/%m/%d") 2642: end 2643: if !(str_and_notspace?(update_info)) then 2644: update_info = "" 2645: end 2646: if !(str_and_notspace?(desc)) then 2647: desc = "" 2648: end 2649: if !(str_and_notspace?(note)) then 2650: note = "" 2651: end 2652: if prune then 2653: prune = "Prune: 1" 2654: else 2655: prune = "" 2656: end 2657: 2658: # 2659: # 出力内容の格納 2660: # 2661: sigen = "Subject: \#{subject.chomp}\nMaintainer: \#{maintainer.chomp}\nDescription: \#{desc.chomp}\nNote: \#{note.chomp}\nUpdate: \#{update.chomp} \#{update_info.chomp}\n\#{prune}\n" 2662: 2663: # 2664: # 文字コード設定 2665: # 2666: Kconv::toeuc(sigen) 2667: 2668: # 2669: # ファイルの作成 2670: # 2671: ifile = open(file, "w") 2672: ifile.print "#{sigen}" 2673: ifile.close 2674: 2675: end
引数 rd に与えられた文字列を rd2html を掛けた文字列として 返す。デフォルトでは "=begin" や "=end" が存在しない文字列を 想定している。この場合、rd 文字列を "=begin" と "=end" ではさまれたものとして自動的に解釈する。もしも "=begin" や "=end" が書き込まれた文字列を rd として与えたい場合は 引数 beginend を true にすること。返される html は <body> 以上と </body> 以下は省かれた本文部分のみである。
err が nil や false の場合、mes に与えられたメッセージを 警告として表示する。err が真の場合はそのメッセージの出力 と同時にエラーを発生させ、プログラムを終了させる。
もしも rd2 コマンドが存在しない場合には nil を返す。
なお、現在は rd2html-ext-lib を必ず利用するようになっているので インスタンス変数 rd2htmlextlib を適宜設定しないとまともに 動かないので注意すること。
返される文字列を探査し、A タグの NAME, HREF 属性に用いられる "label-XX" のナンバーを保持しておき、再度このメソッドが呼ばれた場合には、 文字列内の "label-XX" のナンバーを自動的に繰り上げる。
relabel メソッドを呼ぶことで、別々の rd2html で HTML に変換された 文字列内のラベルのリンクを作成する。
# File dcmodel-tools/dcmodel-thum.rb, line 2442 2442: def rd2html(rd=nil, beginend=true, quiet=nil, err=nil) 2443: debug(rd) 2444: 2445: if !(FileTest.executable?(@rd2_path)) then 2446: return warn_or_err( 2447: "\"#{@rd2_path}\" is not excutable.\n", 2448: err, quiet, ArgumentError) 2449: elsif !rd 2450: return warn_or_err( 2451: "\"rd\" is invalid.\n", 2452: err, quiet, ArgumentError) 2453: end 2454: 2455: debug(@rd2_path) 2456: 2457: # "=begin" や "=end" を消去するための処理 (行頭のものしか消さない) 2458: rd_body = "" 2459: if beginend then 2460: rd_parts = rd.split("\n") 2461: debug(rd_parts) 2462: rd_parts.each { |line| 2463: if /^=begin\s+.*/ =~ line then 2464: next 2465: elsif /^=begin$/ =~ line then 2466: next 2467: elsif /^=end\s+.*/ =~ line then 2468: next 2469: elsif /^=end$/ =~ line then 2470: next 2471: else 2472: rd_body << line + "\n" 2473: end 2474: } 2475: else 2476: rd_body = "#{rd}" 2477: end 2478: debug(rd_body) 2479: 2480: 2481: # rd で得られた文字列を /tmp/dcmodel-thum-$$.rd に一時的に格納 2482: rdfile_tmp = @tmp + "/" + File.basename($0.to_s) + "-" + $$.to_s 2483: debug(rdfile_tmp) 2484: 2485: tmpfile = open(rdfile_tmp, "w") 2486: tmpfile.print "=begin\n" 2487: tmpfile.print rd_body 2488: tmpfile.print "\n=end\n" 2489: tmpfile.close 2490: 2491: debug(open(rdfile_tmp){|io| io.read}) 2492: # print "#{open(rdfile_tmp){|io| io.read}}" 2493: 2494: # # ライブラリパスを $: に追加 2495: # @rd2lib.each{ |path| 2496: # next if !(str_and_notspace?(path)) 2497: ## $:.push(path) 2498: # $:.unshift(path) 2499: # } 2500: # debug($:) 2501: 2502: # 2503: # コマンドの文字列を整形 2504: # 2505: cmd = "#{@rd2_path}" 2506: cmd << " -r rd/rd2html-ext-lib" 2507: cmd << " --with-css=#{@css}" 2508: cmd << " --with-part=\'RT:rt\'" 2509: cmd << " --with-part=\'HTML:html\'" 2510: cmd << " --out-code=euc" 2511: cmd << " --ref-extension" 2512: cmd << " --native-inline" 2513: cmd << " --head-element" 2514: # cmd << " --headline-secno" 2515: # cmd << " --enable-br" 2516: 2517: debug(cmd) 2518: html_org = IO.popen("export RUBYLIB=#{@rd2htmlextlib} ; #{cmd} #{rdfile_tmp}").read 2519: debug(html_org) 2520: 2521: html_body_each_line = html_org.split(/\n/) 2522: debug(html_body_each_line) 2523: 2524: html_body = "" 2525: bodyflag = false 2526: html_body_each_line.each{ |line| 2527: if /^.*<body.*$/ =~ line then 2528: bodyflag = true 2529: next 2530: elsif /^.*<\/body.*$/ =~ line 2531: bodyflag = false 2532: else 2533: html_body << line + "\n" if bodyflag 2534: end 2535: } 2536: 2537: # ラベルの張り替え 2538: html_body_relabeled = "#{html_body}" 2539: 2540: last_label_num = -1 2541: while html_body =~ /\<a\s+name\=\"label\-(\d+)\"\s+id\=\"label\-\d+\"\>(.*?)\<\/a\>/i 2542: last_label_num = $1.to_i 2543: html_body = $~.post_match 2544: labeled_str = $2 2545: @label_num_header_hash.store(last_label_num + @label_num, labeled_str) 2546: end 2547: 2548: if last_label_num >= 0 2549: if @label_num < 1 2550: @label_num = last_label_num + 1 2551: else 2552: last_label_num.downto(0){|i| 2553: html_body_relabeled.gsub!(/(\<a\s+name\=\"label\-)#{i.to_s}(\"\s+id\=\"label\-)#{i.to_s}(\"\>.*?\<\/a\>)/i, "\\1#{(i + @label_num).to_s}\\2#{(i + @label_num).to_s}\\3") 2554: html_body_relabeled.gsub!(/(\<a\s+href\=\"\#label\-)#{i.to_s}(\"\>)/i, "\\1#{(i + @label_num).to_s}\\2") 2555: } 2556: @label_num = @label_num + last_label_num + 1 2557: end 2558: end 2559: 2560: # テンポラリファイルを削除 2561: File.delete(rdfile_tmp) 2562: 2563: debug(html_body_relabeled) 2564: return html_body_relabeled 2565: end
rd2html メソッドで呼ばれた別々の HTML 同士のラベル間に関して ハイパーリンクを貼る. rd2html を一通り呼び終わった後に, その rd2html から返る HTML をまとめたものを引数 html として与える.
# File dcmodel-tools/dcmodel-thum.rb, line 2572 2572: def relabel(html=nil, quiet=nil, err=nil) 2573: debug(html) 2574: 2575: if !html 2576: return warn_or_err( 2577: "\"html\" is invalid.\n", 2578: err, quiet, ArgumentError) 2579: end 2580: 2581: html_relabeled = "#{html}" 2582: @label_num_header_hash.each{|num, word| 2583: html_relabeled.gsub!( 2584: /\<\!\-\-\s+Reference\,\s+RDLabel\s+\"#{word}\"\s+doesn\'t\s+exist\s+\-\-\>\<em\s+class\=\"label\-not\-found\"\>#{word}\<\/em\>\<\!\-\-\s+Reference\s+end\s+\-\-\>/im, 2585: "<a href=\"#label-#{num.to_s}\">#{word}</a>") 2586: } 2587: 2588: debug(html_relabeled) 2589: return html_relabeled 2590: end
target で与えられたパス (String オブジェクト) を from (String オブジェクト) から見た相対パスとして String オブジェクトで返す。 内部で Pathname クラスを利用している。 与えられるパスは絶対パスでも相対パスでもかまわない。
# File dcmodel-tools/dcmodel-thum.rb, line 2598 2598: def relative_str(target=nil, from=nil) 2599: return nil unless str_and_notspace?(target) 2600: return target unless str_and_notspace?(from) 2601: 2602: from_dir = File.dirname(from) 2603: target_dir = File.dirname(target) 2604: target_base = File.basename(target) 2605: 2606: from_ab_path = Pathname.new(File.expand_path(from_dir)) 2607: target_ab_path = Pathname.new(File.expand_path(target_dir)) 2608: 2609: target_re_path = target_ab_path.relative_path_from(from_ab_path) 2610: 2611: result = target_re_path.to_s + "/" + target_base 2612: 2613: return result 2614: end
代入された変数が、配列で、且つゼロ配列ではないことを 調べるメソッド
# File dcmodel-tools/dcmodel-thum.rb, line 2795 2795: def array_and_notzero?(obj) 2796: debug(obj) 2797: 2798: if obj.instance_of?(Array) && obj.size > 0 then 2799: return true 2800: else 2801: return false 2802: end 2803: 2804: end
引数 uid に対応するユーザ名 (日本語) を返す。 uid に nil を与えた場合はプロセスの uid に対応するユーザ名 (日本語) を返す。
日本語名は gate-toroku-system <www.ep.sci.hokudai.ac.jp/~gate> によるデータベースから取得するため、このシステムがインストールされて いない場合には nil を返す。
引数 family_name に true を与えた場合、姓のみを返そうと試みる。 データベースの和名が半角空白または全角空白で区切られる場合、 姓のみを返すことが可能である。
# File dcmodel-tools/dcmodel-thum.rb, line 2737 2737: def jpname_from_uid(uid=nil, family_name=nil) 2738: if FileTest.executable?(@gate_user_show) 2739: gate_user_database = IO.popen("#{@gate_user_show} #{username_from_uid(uid)}") 2740: 2741: # 2742: # 以下は、完全に gate-toroku-system のデータベース依存である。 2743: # 詳しくは <http://www.ep.sci.hokudai.ac.jp/~gate/doc/gate-user-db.htm> 2744: # を参照せよ。 2745: # 2746: while gate_user_data = gate_user_database.gets do 2747: gate_user_data.chomp! 2748: if /^kname/ =~ gate_user_data 2749: jpname_key, jpname_value = gate_user_data.split(/: /, 2) 2750: Kconv::toeuc(jpname_value) 2751: end 2752: # 名字だけ取り出そうと試みる。 2753: # (姓名の間に半角空白または全角空白が無い時は無理) 2754: if family_name && /(.+)[\s| ]+.+/e =~ jpname_value then 2755: jpname = $1 2756: else 2757: jpname = jpname_value 2758: end 2759: end 2760: else 2761: jpname = nil 2762: end 2763: 2764: return jpname 2765: end
代入された変数が、文字列で、且つ空白文字のみではないことを 調べるメソッド。日本語であっても、文字列が入っていれば true を返す。
# File dcmodel-tools/dcmodel-thum.rb, line 2773 2773: def str_and_notspace?(obj) 2774: debug(obj) 2775: 2776: if !obj.instance_of?(String) then 2777: return false 2778: end 2779: 2780: # 日本語の文字列も対応できるように 2781: Kconv::toeuc(obj) 2782: 2783: if /\S+/e =~ obj.chomp.strip then 2784: return true 2785: else 2786: return false 2787: end 2788: end
引数 gid に対応するユーザ名 (ログイン名) を返す。 gid に nil を与えた場合はプロセスの gid に対応するユーザ名 (ログイン名) を返す。gid が無効なものである場合、エラーを返す。
# File dcmodel-tools/dcmodel-thum.rb, line 2712 2712: def username_from_gid(gid=nil) 2713: unless gid 2714: pw = Etc.getpwuid(Process.gid) or return nil 2715: else 2716: pw = Etc.getpwuid(gid) or return nil 2717: end 2718: 2719: user_name = pw.name 2720: return user_name 2721: end
引数 uid に対応するユーザ名 (ログイン名) を返す。 uid に nil を与えた場合はプロセスの uid に対応するユーザ名 (ログイン名) を返す。uid が無効なものである場合、エラーを返す。
# File dcmodel-tools/dcmodel-thum.rb, line 2695 2695: def username_from_uid(uid=nil) 2696: unless uid 2697: pw = Etc.getpwuid(Process.uid) or return nil 2698: else 2699: pw = Etc.getpwuid(uid) or return nil 2700: end 2701: 2702: user_name = pw.name 2703: return user_name 2704: end
警告またはエラー。 err が nil や false の場合、mes に与えられたメッセージを 警告として表示する。err が真の場合はそのメッセージの出力 と同時にエラーを発生させ、プログラムを終了させる。 errvar に変数を与えると、エラーの種類を指定できる。 quiet を true にすると、err が nil の場合、何も動作しなくなる。
# File dcmodel-tools/dcmodel-thum.rb, line 1663 1663: def warn_or_err(mes=nil, err=nil, quiet=nil, errvar=nil) 1664: return nil if !mes 1665: 1666: errvar = RuntimeError if !errvar 1667: 1668: if err then 1669: raise errvar, "Error: #{mes}" 1670: elsif !quiet 1671: $stdout.print "[#{caller.first}] \n Warning: #{mes}" 1672: return nil 1673: end 1674: end