#!/usr/bin/env ruby
# coding: utf-8
#
#= dcmodel $BMQ$*3(IA$-%5%`%M%$%k:n@.%9%/%j%W%H(B
#
#Authors :: Yukiko YAMADA, Yasuhiro MORIKAWA, Shin-ichi TAKEHIRO, Shin-ya MURAKAMI
#Version :: $Id: dcmodel-thum.rb,v 1.31 2007/05/22 05:13:14 morikawa Exp $
#Source  :: $Source: /GFD_Dennou_Club/ftp/arch/dcmodel/cvsroot/dcmodel-tools/dcmodel-thum.rb,v $
#
#== Overview
#
#$B<B837k2L(B ($B<g$K(B dcmodel $B$N%b%G%k72$K$h$C$FF@$i$l$?7k2L$rIA2h$7$?$b$N(B)
#$B$r<j$C<h$jAa$/%5%`%M%$%k2=$7$FI=<($9$k$?$a$N(B
#$B%/%i%9%i%$%V%i%j$G$9!#(B
#
#NetCDF $B$J$I$NN.BN%G!<%?$+$i2hA|$r:n@.$9$k:n6H$K4X$7$F$OJLES(B
#$B9T$&I,MW$,$"$j$^$9!#$3$N%/%i%9%i%$%V%i%j$O$"$/$^$G!"(BHTML $B$r5-=R$9$k(B
#($BFC$K(B TABLE $B%?%0Ey$r5-=R$9$k(B) $BO+NO$rDc8:$9$k$3$H$rL\E*$H$7$F$$$^$9!#(B
#
#$B$3$N%U%!%$%k<+BN$O!"%/%i%9%i%$%V%i%jK\BN$K2C$(!"(B
#$B%/%i%9$rMQ$$$?%5%s%W%k%9%/%j%W%H$r=PNO$9$k$?$a$N%a%=%C%I$b5-:\(B
#$B$5$l$F$$$^$9!#;H$$J}$K4X$7$F$O(B Usage $B$r;2>H$/$@$5$$!#(B
#
#
#= Operation Environment
#
# *$BMW2~D{(B*
#
#$BK\%W%m%0%i%`$O!"(Bruby 1.8.2 (2005-01-10) [i386-linux] $B$G$N(B
#$BF0:n$r3NG'$7$F$$$^$9!#(B
#
#$B$J$*!"(Bruby 1.6.7 (2002-03-19) [i386-linux] $B$G$J$i$P!"(B
#pathname.rb $B$r(B RUBYPATH $B$NDL$C$?$H$3$m$KCV$1$PF0:n$7$^$9!#(B
#
#
#== Usage
#
#$B$^$:!"2hA|%U%!%$%kCV$->l$H$7$F(B figdir $B$r!"%5%`%M%$%k:n@.$N(B
#$B$?$a$N>pJsCV$->l$H$7$F(B thum-src $B%G%#%l%/%H%j$r:n@.$7$^$9!#(B
#$B$=$7$F(B thum-src $B%G%#%l%/%H%j$X0\F0$7$?8e!"$3$N%9%/%j%W%HK\BN(B
#$B$r<B9T$7$F$/$@$5$$!#(B
#
#  $ mkdir figdir thum-src
#  $ cd thum-src
#  $ ruby dcmodel-thum.rb
#
#$B$9$k$H!"%5%s%W%k$H$J$k(B Ruby $B%9%/%j%W%H$,=PNO$5$l$^$9!#(B
#
#$B<!$K$=$N%9%/%j%W%H$r<B9T$7$^$9!#(B
#
#  $ ruby dcmodel-thum-make.rb
#
#$B$9$k$H!"(B../sample_thum.htm $B$J$I$N$h$&$J%U%!%$%k$,@8@.$5$l$k$O$:$G$9!#(B
#$B$=$N%U%!%$%k$K%A%e!<%H%j%"%k$,:\$C$F$$$k$N$G!"$3$l$h$j0J9_$N(B
#$B>\$7$$<j=g$O$=$A$i$r;2>H$7$F$/$@$5$$!#(B
#$BF1MM$K(B sample_thum.txt $B$H$$$&%U%!%$%k$b:n@.$l$^$9!#(B
#$B$=$A$i$O%5%`%M%$%k$N8D!9$N2hA|MQ$N%3%a%s%HEy$r5-=R$9$k%U%!%$%k$G$9!#(B
#
#$BBg;(GD$JN.$l$O0J2<$N$h$&$K$J$j$^$9!#(B
#
#* dcmodel-thum.rb $B$r<B9T$7$F(B dcmodel-thum-make.rb $B$r:n@.!#(B
#* dcmodel-thum-make.rb $B$rJT=8!#(B($B<g$K!"%5%`%M%$%k(B HTML $B$N%9%?%$%k$J$I$r@_Dj(B)
#* sample_thum.txt $B$rJT=8(B
#* dcmodel-thum-make.rb $B$r:FEY<B9T(B
#
#$B$J$*!"@8@.$5$l$?(B Ruby $B%9%/%j%W%H$OK\%9%/%j%W%H$K0MB8$*$j!"(B
#$B@8@.$5$l$k:]$K@dBP%Q%9$GK\%9%/%j%W%H$r;XDj$9$k$h$&$K$J$j$^$9!#(B
#$BK\%9%/%j%W%H$N0\F0$dB>$N%[%9%H$G$NMxMQ$N:]$K$OCm0U$7$^$7$g$&!#(B
#
#
#== Desctiption
#
#$B$3$N%W%m%0%i%`$NFbIt;EMM$K4X$7$F$O!"$3$N(B Ruby $B%9%/%j%W%H$K(B RDoc $B$r(B
#$B;H$&$H8+$d$9$$%I%-%e%a%s%H$,@8@.$5$l$k$G$7$g$&!#(B
#
#   $ rdoc --op doc --title DCModelThumbnail --charset utf-8 --inline-source --line-numbers --all dcmodel-thum.rb
#
#$B5!G=$N3HD%0J30$K$b!"30It$+$iJL2U8F$Y$k%a%=%C%I$b$"$k$N$G!"(B
#$B;29M$K$7$F$/$@$5$$!#(B
#
#== Future Plans
#
#* rttool $B$rMQ$$$?(B DCModelThumbnail.rt2html $B$r:n@.$9$k!#(B
#  * DCModelThumbnail.rd2html $B$HF1MM$K$7$F$d$C$F$_$k!#(B
#* DCModelThumbnail.rd2html $B$K$*$$$F!"8=:_(B rd2html-ext-lib $B$N;HMQ$,(B
#  $BI,?\$K$J$C$F$$$k$,!"%i%$%V%i%j$,B8:_$9$k$+%5!<%A$9$kI,MW$,$"$k$@$m$&!#(B
#  $B%5!<%A$7$FB8:_$7$J$$>l9g$O!"(BWarning $B$rH/$7$F(B rd2html-lib $B$rMQ$$$k$+!"(B
#  $B%(%i!<$rEG$/$h$&$K$9$k!#(B
#
#== Notes
#
#$B:#$N$H$3$m!"FC$K$J$7!#(B
#
#== Acknowledgements
#
#$BK\%W%m%0%i%`$O!"(B
#dcphoto.pl <http://www.ep.sci.hokudai.ac.jp/~totera/official/program/dcphoto/>
#Ver 1.02 - $B<L??MQ(B HTML$B:n@.%9%/%j%W%H(B (Chihiro MITSUDA) $B$r85$K(B
#ruby $B$G:n@.$5$l$?(B ape-thum.rb (Yukiko YAMADA) $B$r(B dcmodel $B$N3+H/<T$,(B
#$B6&M-$G$-$k$h$&$K2~NI$7$?$b$N$G$9!#$=$N%*%j%8%J%k$O(B
#<http://www.gfd-dennou.org/library/dcmodel/ClipBoard/dcmodel-thum_2005-04-06/> (Yukiko Yamada) $B$G$9!#(B
#$B$3$l$O$A$g$&$IK\%W%m%0%i%`$N%P!<%8%g%s(B 1.1 $B$KBP1~$7$^$9!#(B
#
#== History
#
#These entries is generated by CVS automatically.
#So don't add new information manually.
#(But please adjust old log format to latest log format manually,
#if format gap between them causes).
#
#$Log: dcmodel-thum.rb,v $
#Revision 1.31  2007/05/22 05:13:14  morikawa
#* Documents are modified again.
#
#* $B%I%-%e%a%s%H$N:FEY$N=$@5(B.
#
#Revision 1.30  2007/05/22 05:11:19  morikawa
#* Documents are modified.
#
#* $B%I%-%e%a%s%H$N=$@5(B.
#
#Revision 1.29  2007/05/22 05:00:31  morikawa
#* Documents are modified.
#* Hyperlinks with RD label between header, thumbnail, footer are available.
#
#* $B%I%-%e%a%s%H$N=$@5(B.
#* RD $B%i%Y%k$KBP$9$k%O%$%Q!<%j%s%/$r%X%C%@(B, $B%5%`%M%$%k(B, $B%U%C%?4V$G(B
#  $B2DG=$K$9$k(B.
#
#Revision 1.28  2006/02/11 19:48:19  morikawa
#* A misprint of tutorial is modified.
#
#* $B%A%e!<%H%j%"%k$N8m?"$r=$@5(B.
#
#Revision 1.27  2006/02/11 17:25:14  morikawa
#* Messages can be added to footer.
#
#* $B%U%C%?!<$K%a%C%;!<%8$rDI2C$G$-$k$h$&=$@5(B.
#
#Revision 1.26  2006/02/11 13:49:13  morikawa
#* URL of web site of RD is modified.
#
#* RD $B$K4X$9$k(B Web $B%5%$%H$N(B URL $B$r=$@5(B.
#
#Revision 1.25  2006/02/11 13:39:48  morikawa
#* URL of dcmodel site is modified.
#* "blankfig" is added. This is a flag for nodisplay of file names.
#* A display of file names is controlled by giving the modifier "b".
#* In "dcmodel-thumb-make.rb", a format of comments is changed to
#  trailing comments.
#
#* dcmodel $B$N%Z!<%8$N(B URL $B$r=$@5(B.
#* $B%U%!%$%kHsI=<(MQ$N%U%i%0(B blankfig $B$rDI2C(B.
#* $B=$>~;R$K(B b $B$rM?$($k$3$H$G(B, $B$=$N%U%!%$%kL>$NI=<($rM^;_(B.
#* dcmodel-thumb-make.rb $B$N3F%$%s%9%?%s%9$K4X$9$k%3%a%s%H$N=q<0$r%H%l%$(B
#  $B%j%s%0%3%a%s%H$KJQ99(B.
#
#Revision 1.24  2005/12/09 07:45:36  morikawa
#* If "DCModelThumbnail.convert_overwrite" is false, modified time of
#  files are checked too.
#
#* $B%U%i%0(B DCModelThumbnail.convert_overwrite $B$N%A%'%C%/$N:](B,
#  $B%U%!%$%k$NB8:_$@$1$G$J$/(B, $B%?%$%`%9%?%s%W$G%A%'%C%/$9$k$h$&=$@5(B.
#
#Revision 1.23  2005/12/09 07:23:12  morikawa
#* "DCModelThumbnail.convert_overwrite" is added. If this variable is
#  false and converted files are exist, convert command is not executed.
#
#* convert $B%3%^%s%I$,<B9T$5$l$k(B, $B4{$K=PNO@h$N%U%!%$%k$,$"$k>l9g$K>e=q$-$9$k(B
#  $B$?$a$N%U%i%0(B DCModelThumbnail.convert_overwrite $B$rDI2C(B.
#  $B$3$l$,(B false $B$N>l9g(B, $B=PNO@h$N%U%!%$%k$,B8:_$9$k;~$OJQ49%3%^%s%I$N(B
#  $B<B9T$r%9%-%C%W$9$k(B.
#
#Revision 1.22  2005/12/07 14:57:31  yukiko
#* Fixed bug which cannot generate of thumbnail figures when the "thumb.headlimit" is specified
#
#* "thumb.headlimit" $B$r;XDj$9$k$H(B convert $B=PMh$J$$%P%0$r=$@5(B
#
#Revision 1.21  2005/11/09 10:43:15  morikawa
#* If the "verbose" argument is nil in "DCModelThumbnail.create"
#  method, messages about generation of images for the thumbnail are
#  not outputted.
#
#* DCModelThumbnail.create $B%a%=%C%I$N(B verbose $B$K(B nil $B$rM?$($?>l9g$K(B,
#  $B%5%`%M%$%kMQ2hA|@8@.%a%C%;!<%8$b=PNO$7$J$$$h$&=$@5(B.
#
#Revision 1.20  2005/11/05 01:06:32  takepiro
#* Regular expression for extracting tailing suffix from the figure filenames modified.
#* $B2hA|%U%!%$%k$N3HD%;R$r<h$j$@$9@55,I=8=$rJQ99$7$?!#(B
#
#Revision 1.19  2005/11/02 03:50:29  morikawa
#* When the label of the info file is "title" or "message",
#  images are not converted.
#
#* $B>pJs%U%!%$%k$N%i%Y%k$,(B "title", "message" $B$N>l9g$K$O2hA|JQ49(B
#  $B$7$J$$$h$&=$@5(B.
#
#Revision 1.18  2005/11/02 00:59:59  takepiro
#* Cheking the status of thumnail generation process.
#* $B%5%`%M%$%k2hA|@8@.%W%m%;%9%9%F!<%?%9$N%A%'%C%/$rDI2C(B.
#
#Revision 1.17  2005/11/01 09:31:00  morikawa
#* New instance variable "convert_cmd" is added to change "convert"
#  command by users.
#* The command for image conversion is checked.
#* Messages in process of conversion are decorated.
#* The SIGEN file for the directory for thumbnail images is created
#  automatically.
#* "Maintainer" in SIGEN file is specified to account name when
#  "gate-toroku-system" is not available.
#
#* convert $B%3%^%s%I$r%f!<%6%l%Y%k$GJQ99$G$-$k$h$&?7$?$J%$%s%9%?%s%9(B
#  $BJQ?t(B convert_cmd $B$rDI2C(B.
#* $B2hA|JQ49%D!<%k$NM-L5$r%A%'%C%/$9$k5!G=$rDI2C(B.
#* $B2hA|JQ49Cf$N%a%C%;!<%8$rAu>~(B.
#* $B%5%`%M%$%k2hA|CV$->l%G%#%l%/%H%j$N(B SIGEN $B%U%!%$%k$r:n@.$9$k$h$&$K$7(B
#  $B$?(B.
#* gate $B%7%9%F%`$+$i%f!<%6L>$r<hF@$G$-$J$$>l9g(B, $B%"%+%&%s%HL>$r(B SIGEN
#  $B%U%!%$%k$K=q$-=P$9$h$&=$@5(B.
#
#Revision 1.16  2005/11/01 06:46:24  takepiro
#* Automatic generation of thumbnail figures implemented.
#* Each one page can be extracted as a thumbnail from each animation file, such as gif-anime.
#
#* $B%5%`%M%$%k2hA|$N<+F0@8@.5!G=$rDI2C$7$?!#(B
#* $B%"%K%a!<%7%g%s%U%!%$%k(B(gif-anime $BEy(B)$B$+$i(B 1 $B%Z!<%8$r<h$j$@$7$F%5%`%M%$%k2=$G$-$k$h$&$K$7$?!#(B
#
#Revision 1.15  2005/10/31 02:41:34  morikawa
#* Methods "DCModelThumbnail.create", "DCModelThumbnail.create_sample_rb"
#  are moved up.
#
#* DCModelThumbnail.create $B%a%=%C%I$H(B DCModelThumbnail.create_sample_rb
#  $B%a%=%C%I$r>e$NJ}$K0\F0$9$k(B.
#
#Revision 1.14  2005/05/25 15:54:32  morikawa
#* Enable to specify whether to allow search of robots by
#  DCModelThumbnail.norobots .
#* Allow search of robots by default.
#* Add to tutorial about generation of SIGEN file.
#* Add to tutorial about search of robots.
#
#* HTML $B$N%m%\%C%H8!:w$r5v2D$9$k$+$I$&$+;XDj$G$-$k$h$&$K$7$?!#(B
#* $B%G%U%)%k%H$G%m%\%C%H8!:w$r5v2D$9$k$h$&$K$7$?!#(B
#* SIGEN $B%U%!%$%k@8@.$K4X$7$F%A%e!<%H%j%"%k$K$b5-:\$7$?!#(B
#* $B%m%\%C%H8!:w$N;XDj$K4X$7$F%A%e!<%H%j%"%k$K$b5-:\$7$?!#(B
#
#Revision 1.13  2005/05/15 20:21:51  morikawa
#* Use "ruby1.8" instead of "ruby" in dcmodel-thum-make.rb .
#  (This should be modified by modification before).
#
#Revision 1.12  2005/05/15 19:58:29  morikawa
#* Use "ruby1.8" instead of "ruby". (This program depends on
#  pathname.rb that is included ruby 1.8).
#
#Revision 1.11  2005/04/30 20:30:37  morikawa
#* Create SIGEN file automatically.
#
#Revision 1.10  2005/04/30 18:54:24  morikawa
#* Add directly css setting to DCModelThumbnail.html_header by
#  DCModelThumbnail.style .
#
#Revision 1.9  2005/04/30 18:18:02  morikawa
#* Modify DCModelThumbnail.info_get to get correct default value.
#
#Revision 1.8  2005/04/30 17:50:05  morikawa
#* Hard code "dcmodel-thum.rb" to @self_name. (Otherwise, not
#  "dcmodel-thum.rb" but executed file is wrote footer of HTML).
#
#Revision 1.7  2005/04/30 09:43:19  morikawa
#* In "info_get", when multi-line input, permit input ":".
#
#Revision 1.6  2005/04/30 09:07:14  morikawa
#* In "info_make", cause error if any image files are not found.
#
#Revision 1.5  2005/04/21 13:03:17  morikawa
#* Change comment of DCModelThumbnail.info_get format.
#
#Revision 1.4  2005/04/21 12:57:23  morikawa
#* Change log format.
#
#Revision 1.3  2005/04/21 09:24:06  morikawa
#* Add "Operation Environment"
#* Output detail sample messages.
#* In DCModelThumbnail.rd2html , modify to remove only "^=begin" and
#  "^=end"
#* Add Comment for sample rb script.
#* Output Help message when argument is given.
#
#Revision 1.2  2005/04/19 20:32:19  morikawa
#* Modify internal structure.
#* Revise for "rdoc" documentation format.
#* RD format context is supported.
#* Add various options in "infofile".
#* Use "keyword substitution" in CVS for version control.
#
#Revision 1.1  2005/04/19 19:54:23  morikawa
#* This script generate Thumbnail HTML for calculation result figures.
#  The author of the original is Yukiko Yamada. She rename her "ape-thum.rb"
#  to "dcmodel-thum.rb" for sharing by dcmodel developers and users.
#
##################################################

require 'date'
require 'etc'
require 'pathname'

##################################################

#
#== DCModelThumbnail
#
# $B!V(Bdcmodel $B$*3(IA$-%5%`%M%$%k(B HTML $B:n@.%9%/%j%W%H!W$N:n@.MQ$N%/%i%9(B
#
class DCModelThumbnail

  #
  # $BDj?t$N@_Dj(B
  #

  # CopyRight
  COPYRIGHT = "GFD Dennou Club"

  # $B9`L\$N6h@Z$jJ8;z(B
  INFO_DELIMITER = ":"

  # $B>pJs%U%!%$%k$K$*$1$k!"J#?t9T$N3+;OJ8;z(B
  INFO_MULTI_START = "{"

  # $B>pJs%U%!%$%k$K$*$1$k!"J#?t9T$N=*N;(B
  INFO_MULTI_STOP  = "}"

  # SIGEN $B%U%!%$%k:n@.;~$N>pJs$rF@$k$?$a$N(B gate $B%3%^%s%I(B
  GATE_USER_SHOW   = "/usr/local/bin/gate-user-show"

  # $B8x3+K\BNCV$->l(B
  PUB_BIN_URL = "http://www.gfd-dennou.org/library/dcmodel/bin/dcmodel-thum.rb"

  # $B8x3+%I%-%e%a%s%H$N(B URL
  PUB_DOC_URL = "http://www.gfd-dennou.org/library/dcmodel/doc/dcmodel-tools/dcmodel-thum-rdoc"

  # $B8x3+%5%s%W%k$N(B URL
  PUB_SAMPLE_URL = "http://www.gfd-dennou.org/library/dcmodel/doc/dcmodel-tools/dcmodel-thum-sample"

  # CVSHOST
  CVS_HOST       = "www.gfd-dennou.org"

  # CVSROOT
  CVS_ROOT       = "/GFD_Dennou_Club/ftp/arch/dcmodel/cvsroot"

  # CVS $B$N%W%m%8%'%/%HL>(B
  CVS_PROJECT    = "dcmodel-tools"

  # $B%P!<%8%g%s%J%s%P!<(B (CVS $B$K$h$j<+F04IM}(B)
  VER = "$Revision: 1.31 $ : $Date: 2007/05/22 05:13:14 $"

  #
  # $B%$%s%9%?%s%9JQ?t72(B
  #

  # $B%P!<%8%g%s(B
  attr_reader   :version

  # copyright
  attr_accessor :copyright

  # $B8x3+%I%-%e%a%s%H$N(B URL
  attr_reader   :pub_doc_url

  # $B8x3+%5%s%W%k$N(B URL
  attr_reader   :pub_sample_url

  # $B<B9T%U%!%$%k$N(B basename
  attr_reader   :self_name

  # $B%5%s%W%k(B ruby $B%9%/%j%W%HL>(B
  attr_reader   :sub_rb_name

  # $B:n@.$5$l$k%5%`%M%$%k$N%U%!%$%kL>(B ($B3HD%;R=|$/(B)
  attr_accessor :index

  # $B:n@.$5$l$k%5%`%M%$%k$N3HD%;RL>(B
  attr_accessor :index_ext

  # $B!V>pJs%U%!%$%k(B (infofile)$B!W$N%U%!%$%kL>(B
  attr_accessor :infofile

  # $B2hA|%U%!%$%k$H$7$FG'<1$9$k3HD%;R(B
  attr_accessor :ext_list

  # headlimit $B$KEv$F$O$^$i$J$$$b$N$O2hA|$H$7$F$OL5;k$5$l!"(B
  # $BEv$F$O$^$k$b$N$O!V>pJs%U%!%$%k!W$K$*$$$F!"@\F,ItJ,(B headlimit $B$,(B
  # $B>JN,2DG=$K$J$k!#(B
  attr_accessor :headlimit

  # $B%U%!%$%kL>$NHsI=<($N%U%i%0(B
  attr_accessor :blankfig

  # $B3($N$"$k%G%#%l%/%H%j$NL>A0!#I,$:B8:_$7$F$$$J$1$l$P$J$i$J$$!#(B
  attr_accessor :figdir

  # $B%5%`%M%$%k2hA|$rCV$/%G%#%l%/%H%jL>!#%+%l%s%H%G%#%l%/%H%j$+$i(B 
  # "#{@thumbaildir}" $B$N>l=j$K;XDj$5$l$k(B.
  attr_accessor :thumbnaildir

  # $B%5%`%M%$%k2hA|$N:G8eItL>(B. 
  # $B%5%`%M%$%k2hA|L>$O852hA|$N3HD%;R$HCV49$5$l$?L>A0$K$J$k(B. 
  attr_accessor :thumbnailtail

  # $B%5%`%M%$%k2hA|2=$9$k852hA|$N%Z!<%8HV9f(B
  attr_accessor :thumbnailpage

  # convert $B%3%^%s%I$*$h$S%*%W%7%g%s(B. $B$3$N8e$m$K2hA|%5%$%:$,(B 200x150
  # $B$N$h$&$J7A<0$G;XDj$5$l$k(B.
  attr_accessor :convert_cmd

  # convert $B%3%^%s%I$,<B9T$5$l$k:](B, $B4{$K=PNO@h$N%U%!%$%k$,$"$k>l9g$K(B
  # $B>e=q$-$9$k$?$a$N%U%i%0(B. $B$3$l$,(B false $B$N>l9g(B, $B=PNO@h$N%U%!%$%k$,(B
  # $BB8:_$7(B, $B3n$D85$N%U%!%$%k$h$j$b?7$7$$>l9g$OJQ49$r9T$o$J$$(B.
  attr_accessor :convert_overwrite

  # $B%9%?%$%k%7!<%H%U%!%$%k(B
  attr_accessor :css

  # $B%9%?%$%k%7!<%H$rD>@\@_Dj$9$k$?$a$N$b$N(B
  # (css $B%U%!%$%k$K=q$-9~$`>pJs$rD>@\;XDj$G$-$k(B)
  attr_accessor :style

  # rd2 $B%3%^%s%I$X$N%Q%9(B
  attr_accessor :rd2_path

  # rd2-ext-lib $B$X$N%i%$%V%i%j$X$N%Q%9(B
  attr_accessor :rd2htmlextlib

  # SIGEN $B%U%!%$%k:n@.;~$N>pJs$rF@$k$?$a$N(B gate $B%3%^%s%I(B
  attr_accessor :gate_user_show

  # $B2hA|%U%!%$%k%5%$%:(B ($BI}(B)
  attr_accessor :img_width

  # $B2hA|%U%!%$%k%5%$%:(B ($B9b$5(B)
  attr_accessor :img_height

  # $B2#$K$J$i$Y$k%U%!%$%k?t(B
  attr_accessor :figtable_num

  # html $B$N:n@.<T>pJs(B  ($B%G%U%)%k%H$O%f!<%6%"%+%&%s%HL>$,<+F0<hF@$5$l$k(B)
  attr_accessor :html_author

  # html $B%X%C%@$N%?%$%H%k(B
  attr_accessor :title

  # $BK\BN$K=q$-=P$9%a%C%;!<%8!#%5%`%M%$%k$NItJ,$h$j$b>e$K=PNO$5$l$k!#(B
  # $B$3$NJQ?t<+BN$O(B Array $B%*%V%8%'%/%H$G!"$=$NFbIt$K(B String $B%*%V%8%'%/%H$,(B
  # $B3JG<$5$l$k!#(B
  attr_accessor :message

  # $B%U%C%?!<$H$7$F=q$-=P$9%a%C%;!<%8!#%5%`%M%$%k$NItJ,$h$j$b2<$K=PNO$5$l$k!#(B
  # $B$3$NJQ?t<+BN$O(B Array $B%*%V%8%'%/%H$G!"$=$NFbIt$K(B String $B%*%V%8%'%/%H$,(B
  # $B3JG<$5$l$k!#(B
  attr_accessor :footer

  # $B%F%s%]%i%j%U%!%$%kCV$->l(B (UNIX $B7O$J$i$PJQ$($kI,MW$J$7(B)
  attr_accessor :tmp

  # SIGEN $B%U%!%$%k$r:n$i$J$$>l9g$O(B false $B$K%;%C%H$9$k(B
  attr_accessor :mksigen

  # HTML $B$N%m%\%C%H8!:w$r6X;_$9$k(B
  attr_accessor :norobots

  #
  # $B$3$l$r8F$V$3$H$G!":GDc8BI,MW$J>pJs$,@8@.$5$l$k!#(B
  # $B:G=*E*$K$O(B DCModelThumbnail.create $B%a%=%C%I$r8F$V$3$H$G(B
  # $B%U%!%$%k$,:n@.$5$l$k!#(B
  #
  def initialize()
    #
    # version
    #
    @version = VER

    #
    # copyright
    #
    @copyright = COPYRIGHT

    # $B8x3+%I%-%e%a%s%H$N(B URL
    @pub_doc_url = PUB_DOC_URL

    # $B8x3+%5%s%W%k$N(B URL
    @pub_sample_url = PUB_SAMPLE_URL

    # dcmodel-thum.rb $B<+?H$NL>A0(B
    # @self_name   = File.basename($0.to_s)
    @self_name   = "dcmodel-thum.rb"

    # $B%5%s%W%k(B ruby $B%9%/%j%W%HL>(B
    @sub_rb_name = "#{File.basename($0, ".*")}" + "-make.rb"

    # html $B$NCV$->l!&%U%!%$%kL>!&3HD%;R!#%+%l%s%H%G%#%l%/%H%j$+$i(B
    #
    #    "#{@index}#{index_ext}" 
    #
    #$B$KCV$+$l$k!#(B
    @index     = "../sample_thum"
    @index_ext = ".htm"

    # $B3($N$"$k%G%#%l%/%H%jL>!#%+%l%s%H%G%#%l%/%H%j$+$i(B 
    # "#{@figdir}" $B$N>l=j$rC5::$9$k!#(B
    @figdir = "../figdir"

    # $B%5%`%M%$%k2hA|$rCV$/%G%#%l%/%H%jL>!#%+%l%s%H%G%#%l%/%H%j$+$i(B 
    # "#{@thumbaildir}" $B$N>l=j$K;XDj$5$l$k(B.
    @thumbnaildir = "../thumbdir"

    # $B%5%`%M%$%k2hA|$N:G8eItL>(B. 
    # $B%5%`%M%$%k2hA|L>$O852hA|$N3HD%;R$HCV49$5$l$?L>A0$K$J$k(B. 
    @thumbnailtail = "_thumb.png"

    # $B%5%`%M%$%k2hA|2=$9$k852hA|$N%Z!<%8HV9f(B
    @thumbnailpage = "1"

    # convert $B%3%^%s%I$*$h$S%*%W%7%g%s!#$3$N8e$m$K2hA|%5%$%:$,(B 200x150
    # $B$N$h$&$J7A<0$G;XDj$5$l$k!#(B
    @convert_cmd = "convert -depth 8 -geometry"

    # convert $B%3%^%s%I$,<B9T$5$l$k:](B, $B4{$K=PNO@h$N%U%!%$%k$,$"$k>l9g$K(B
    # $B>e=q$-$9$k$?$a$N%U%i%0(B. $B$3$l$,(B false $B$N>l9g(B, $B=PNO@h$N%U%!%$%k$,(B
    # $BB8:_$7(B, $B3n$D85$N%U%!%$%k$h$j$b?7$7$$>l9g$OJQ49$r9T$o$J$$(B.
    @convert_overwrite = false

    # $B>pJs%U%!%$%k(B, $PWD/${infofile}
    @infofile = File.basename(@index).chomp.strip + ".txt"

    # $B2hA|%U%!%$%k$H$7$FG'<1$9$k3HD%;R(B
    @ext_list = ["gif", "png", "jpg", "jpeg"]

    # $B@\F,;R@)8B(B @headlimit = "figure_head"$B!#(B
    # $B$3$l$K$h$j!"(B@headlimit $B$KEv$F$O$^$i$J$$$b$N$OL5;k$5$l$k(B
    @headlimit = ""

    # $B%U%!%$%kL>$NHsI=<($N%U%i%0(B
    @blankfig = false

    # $B%9%?%$%k%7!<%H%U%!%$%k(B
#    @css    = "../dcmodel.css"  # for morikawa (I'm sorry...)
    @css    = "/GFD_Dennou_Club/ftp/arch/dcmodel/htmltools/dcmodel.css"

    # $B%9%?%$%k%7!<%H$rD>@\@_Dj$9$k$?$a$N$b$N(B
    # (css $B%U%!%$%k$K=q$-9~$`>pJs$rD>@\;XDj$G$-$k(B)
    @style = nil

    # rd2 $B%U%!%$%k$N%Q%9(B
    @rd2_path = "/usr/bin/rd2"

    # rd2-ext-lib $B$X$N%i%$%V%i%j$N%Q%9(B
#    @rd2htmlextlib = ".."       # for morikawa (I'm sorry...)
    @rd2htmlextlib = "/GFD_Dennou_Club/ftp/arch/dcmodel/lib/ruby/1.8"

    # SIGEN $B%U%!%$%k:n@.;~$N>pJs$rF@$k$?$a$N(B gate $B%3%^%s%I(B
    @gate_user_show = GATE_USER_SHOW

    # $B%F%s%]%i%j%U%!%$%kCV$->l(B (UNIX $B7O$J$i$PJQ$($kI,MW$J$7(B)
    @tmp     = "/tmp"

    # SIGEN $B%U%!%$%k$r:n$i$J$$>l9g$O(B false $B$K%;%C%H$9$k(B
    @mksigen = true

    # HTML $B$N%m%\%C%H8!:w$r6X;_$9$k>l9g$K$O(B true $B$K%;%C%H$9$k(B
    @norobots = false

    # $B2hA|%U%!%$%k%5%$%:(B
    @img_width  = 200
    @img_height = 150

    # $B2#$K$J$i$Y$k%U%!%$%k?t(B
    @figtable_num = 3

    # NAME, HREF $B%?%0Fb$N%i%Y%k%J%s%P!<(B
    @label_num = 0

    # $B%i%Y%k%J%s%P!<$HBP1~$9$k%X%C%@J8;zNs$N%O%C%7%e(B
    @label_num_header_hash = {}

    # html $B$N:n@.<T>pJs(B ($B%f!<%6%"%+%&%s%HL>(B)
    @html_author = username_from_gid

    # html $B%X%C%@%?%$%H%k(B
    @title  = "dcmodel-thum : $B<B837k2L%5%`%M%$%k4J0W:n@.%9%/%j%W%H(B"

    # $B%U%C%?!<(B ($B%5%`%M%$%k$NItJ,$h$j$b2<$K%a%C%;!<%8(B)
    # $B;XDjJ}K!$O(B message $B$HF1MM$G$9!#(B
    @footer = Array.new

    # $BK\BN(B ($B%5%`%M%$%k$NItJ,$h$j$b>e$K%a%C%;!<%8(B)
    @message = Array.new
    @message << <<-EndOfTutorial
=begin
[((<$BCO5eN.BNEEG>6f3ZIt(B|URL:http://www.gfd-dennou.org>))]
[((<dcmodel|URL:http://www.gfd-dennou.org/library/dcmodel>)) |
((<dcmodel-tools|URL:http://www.gfd-dennou.org/library/dcmodel/doc/dcmodel-tools/SIGEN.htm>))]
[((<#{@self_name}|URL:#{PUB_DOC_URL}>))]

= #{@title}

* ((<$B35MW!&MxMQ!&F0:n4D6-$N35@b(B>))
* ((<$B%P!<%8%g%s(B 1.1 ($B%*%j%8%J%k$d$^$@M3%D!<%k(B) $B$+$i$N;EMMJQ99(B>))
* ((<$BMxMQ$N<j0z$-(B>))
* ((<$B2hA|$NMQ0U(B>))
* ((<#{@self_name} $B$NMQ0U(B>))
* ((<$B$H$j$"$($:<B9T(B>))
* ((<$B;R%9%/%j%W%H$N<B9T(B>))
* ((<$B$G$-$?$b$N$r8+$F$_$k(B>))
* ((<$B%9%/%j%W%H$NJT=8(B ($BF~LgJT(B)>))
* ((<$B:FEY<B9T(B>))
* ((<$B!V>pJs%U%!%$%k!W$NJT=8(B ($BF~LgJT(B)>))
* ((<$B$b$&0lEY<B9T(B>))
* ((<$B%9%/%j%W%H$NJT=8(B ($B1~MQJT(B)>))
* ((<$B!V>pJs%U%!%$%k!W$NJT=8(B ($B1~MQJT(B)>))


== $B35MW!&MxMQ!&F0:n4D6-$N35@b(B

((<#{@self_name} $B$N(B rdoc $B%^%K%e%"%k(B|URL:#{PUB_DOC_URL}>))

Overview $B$H(B Operation Environment $B$H(B Usage $B$r$5$i$C$HFI$s$@$iLa$C$F$-$F$M!#(B

$B$J$*!"0J2<$N(B URL $B$K$O$3$N=PNO7k2L$HF1Ey$N$b$N$,CV$$$F$"$k$O$:$G$9!#(B

((<#{@self_name} $B$N(B $B%5%s%W%k(B|URL:#{PUB_SAMPLE_URL}>))

== $B%P!<%8%g%s(B 1.1 ($B%*%j%8%J%k$d$^$@M3%D!<%k(B) $B$+$i$N;EMMJQ99(B

$B$3$3$O!"%P!<%8%g%s(B 1.2 $B0J9_$+$iMxMQ$7$F$$$k?M$K$OITMW$G$9!#(B
$B%P!<%8%g%s(B 1.1 $B$N%*%j%8%J%k$N$d$^$@M3%D!<%k$+$iMxMQ$7$F$$$k(B
$BJ}$O!"0J2<$NJQ99E@$K$4Cm0U$/$@$5$$!#(B

  * $B!V>pJs%U%!%$%k(B (infofile)$B!W$N=q<0(B
    * $B2hA|L>$K3HD%;R$r2C$($k$h$&$K$J$C$?(B
    * 1.1 $B$G$O(B <$B2hA|L>(B> : <$B%3%a%s%H(B> $B$@$C$?$,!"(B
      $B8=:_$O(B <$B2hA|L>(B> : <$B=$>~;R(B> : <$B%3%a%s%H(B> $B$K$J$C$F$$$k!#(B
  * pathname.rb $B$rMxMQ$9$k$?$a!"(Bruby 1.8 $B$rMxMQ$9$k$+!"(B1.6 $B$J$i$P(B
    $B<B9T$N:]$K(B RUBYLIB $B$N%Q%9$,DL$C$?$H$3$m$K(B pathname.rb $B$,I,MW(B
    $B$G$"$k!#(B


== $BMxMQ$N<j0z$-(B

=== #{@self_name} $B$NF~<j$NJ}K!(B

((<#{@self_name} $B%9%/%j%W%HK\BN(B|URL:#{PUB_BIN_URL}>)) $B$r%@%&%s%m!<%I(B
$B$7$F$/$@$5$$!#$b$7$/$O(B cvsroot $B$r$b$C$F$$$k(B #{CVS_HOST} $B$K%m%0%$%s$,(B
$B2DG=$G$"$l$P!"(Bcvs $B$+$i$bD>@\<hF@$,2DG=$G$9!#(B

    $ CVS_RSH=ssh; export CVS_RSH
    $ cvs -d :ext:#{CVS_HOST}:#{CVS_ROOT} checkout #{CVS_PROJECT}

$B4{$K(B #{CVS_HOST} $B$K%m%0%$%s$7$?>uBV$G$"$l$P!"0J2<$N%3%^%s%I$N$_$G(B
$B<hF@2DG=$G$9!#(B

    $ cvs -d #{CVS_ROOT} checkout #{CVS_PROJECT}


== $B2hA|$NMQ0U(B

$B%5%`%M%$%k2=$7$h$&$H$9$k2hA|$r(B (({#{File.basename(@figdir)} })) $B$H$$$&(B
$B%G%#%l%/%H%j$KCV$$$F$/$@$5$$!#8=:_!"2hA|$H$7$FG'<1$5$l$k$N$O!"(B
(({ #{@ext_list.join(", ")}, #{@ext_list.join(", ").swapcase} }))
$B$G$9!#%"%K%a!<%7%g%s(B gif $B$K$b0l1~BP1~$7$F$$$^$9$,(B, $B%5%`%M%$%k2=$9$k(B
$B%Z!<%8HV9f$OA42hA|6&DL$K$7$+@_Dj$G$-$^$;$s(B. 

$BB>$N7A<0$N2hA|$rG'<1$5$;$?$$>l9g$O(B ((<$B%9%/%j%W%H$NJT=8(B ($BF~LgJT(B)>)) 
$B$r;2>H$7$F$/$@$5$$!#$H$j$"$($:!"(B
$B$^$:$O(B (({#{File.basename(@figdir)} })) $B$r:n@.$7$F2<$5$$!#(B

== #{@self_name} $B$NMQ0U(B

((<#{@self_name} $B$NF~<j$NJ}K!(B>)) $B$G<hF@$7$?(B #{@self_name} $B$O(B
(({ thum-src })) $B$H$$$&%G%#%l%/%H%j$r:n$C$F$=$3$KCV$$$F2<$5$$!#(B
$B7k2LE*$K!"0J2<$N$h$&$J9=@.$K$J$C$F$$$k$HNI$$$G$9!#(B

    ./#{File.basename(@figdir)}/*****.jpg
             *****.gif
    ./thum-src/dcmodel-thum.rb


== $B$H$j$"$($:<B9T(B

(({ thum-src })) $B$X0\F0$7!"(B#{@self_name} $B$r<B9T$7$F$/$@$5$$!#(B

    $ cd thum-src
    $ ruby #{@self_name}

$B$9$k$H!"(B#{@sub_rb_name} $B$H$$$&<B9T%9%/%j%W%H$,:n@.$5$l$k(B
$B$O$:$G$9!#(B

== $B;R%9%/%j%W%H$N<B9T(B

$B:#EY$O(B #{@sub_rb_name} $B$r<B9T$7$^$9!#(B

    $ ruby #{@sub_rb_name}

$B$9$k$H!"(B(({ #{@index}#{@index_ext} }))$B$H$$$&%U%!%$%k$,:n@.$5$l$^$9!#(B
$B$3$l$,%5%`%M%$%k$N(B HTML $B$G$9!#(B


== $B$G$-$?$b$N$r8+$F$_$k(B

(({ #{@index}#{@index_ext} })) $B$r%V%i%&%6$G8+$F$_$F$/$@$5$$!#(B
$B$3$N%Z!<%8$HF1MM$N%a%C%;!<%8$,=q$+$l$?%Z!<%8$,=PNO$5$l$F$$$k(B
$B$O$:$G$9!#(B

#{File.basename(@figdir)} $B$K2hA|$r$*$$$F$"$C$?>l9g!"$=$l$i$,(B
$B2<$K%5%`%M%$%k2=$5$l$F$$$k$O$:$G$9!#(B


== $B%9%/%j%W%H$NJT=8(B ($BF~LgJT(B)

$B$3$N$^$^$G$O;H$($J$$$N$G!"(B(({ #{@sub_rb_name} })) $B$rJT=8$7$F$/$@$5$$!#(B
$B$^$:!"$3$3$K5-=R$5$l$k%3%a%s%H$r:o=|$7$^$7$g$&!#(B

$B0J2<$NItJ,0J9_$rA4$F>C$7$F$/$@$5$$!#(B

    thumb.message   << <<-Message
    =begin
    [((<$BCO5eN.BNEEG>6f3ZIt(B|URL:http://www.gfd-dennou.org>))]
    [((<dcmodel|URL:http://www.gfd-dennou.org/library/dcmodel>)) |
                            :
                            : 

$B<!$K!":n@.$5$l$k(B HTML $B%U%!%$%k$NL>A0$r4uK>$N$b$N$KJQ99$7$F$/$@$5$$!#(B
$B2<5-$N$h$&$K(B infofile $B$r@_Dj$7$F$*$/$H!V>pJs%U%!%$%k!W(B($B8e=R(B) $B$N(B
$BL>A0$b0l=o$KJQ99$5$l$FJXMx$G$9!#(B

   thumb.index     = "../result"
   thumb.infofile  = "\\\#\\\{File.basename(thumb.index)\\\}.txt"

$B2hA|$H$7$FG'<1$7$?$$3HD%;R$rA}$d$7$?$$>l9g$O0J2<$N$h$&$K$7$F$/$@$5$$!#(B

   thumb.ext_list.push("bmp")

$B2hA|%U%!%$%kL>$,D9$/!"%U%!%$%kL>$NF,$NItJ,$r<h$j=|$$$FI=<($7$?$$!"(B
$B$^$?$O%U%!%$%kL>$NF,$G=PNO$9$k%U%!%$%k$NA*Br$r9T$$$?$$>l9g$O(B
$B0J2<$N$h$&$K@_Dj$7$F$/$@$5$$!#(B

   thumb.headlimit = "exp_name_"

$B2hA|%U%!%$%kL>$r(B HTML $B$KI=<($7$?$/$J$$>l9g$O0J2<$N$h$&$K@_Dj$7$F$/$@$5$$!#(B
$B8DJLE*$K%U%!%$%kL>$rHsI=<($K$7$?$$>l9g$O(B
((<$B!V>pJs%U%!%$%k!W$NJT=8(B ($B1~MQJT(B)>)) $B$N(B ((<$B%U%!%$%kL>HsI=<((B>))
$B$r;2>H$7$F$/$@$5$$!#(B

   thumb.blankfig = true

$B2hA|$N=D2#%5%$%:$d!"%5%`%M%$%k$G2#$KI=<($9$k2hA|$N?t$O0J2<$N$h$&$K(B
$B@_Dj$7$F$/$@$5$$!#(B

   thumb.img_width  = 200
   thumb.img_height = 150
   thumb.figtable_num = 3

$B<+F0@8@.$5$l$k%5%`%M%$%k2hA|$NCV$->l$H2hA|$NL>A0$N:G8eIt$r(B
$B<!$N$h$&$K;XDj$7$F2<$5$$(B. 

   thumb.thumbnaildir  = "../thumb"    # $B%5%`%M%$%k2hA|$rCV$/%G%#%l%/%H%jL>(B
   thumb.thumbnailtail = "_thumb.png"  # $B%5%`%M%$%k2hA|$N3HD%;RL>(B

$B%"%K%a!<%7%g%s(B gif $BEyJ#?t%Z!<%8$rB+$M$?2hA|$KBP$7$F$O%5%`%M%$%k2=$9$k(B
$B%Z!<%8HV9f$r(B 1 $B$h$jBg$-$$CM$K@_Dj$G$-$^$9(B. 

    thumb.thumbnailpage = "50"      # $B%5%`%M%$%k2hA|2=$9$k852hA|$N%Z!<%8HV9f(B

$B%9%?%$%k%7!<%H$K=q$-9~$`@_Dj$rC1BN$G$b;XDj2DG=$G$9!#(B
$BNc$($P!"%j%s%/$K4X$9$kF0:n$r@_Dj$9$k$K$O0J2<$N$h$&$K$7$^$9!#(B

   thumb.style = <<-STYLE
     a:link { color:#269900; }
     a:visited { color:#269900; }
     a:hover { color:#99FF33; }
   STYLE

$B85!9$N(B (({ thumb.title ... })) $B$N9T$rNc$($P0J2<$N$h$&$K=q$-49$(!"(B
$B%?%$%H%k$r@_Dj$7$F$/$@$5$$!#(B($B$3$l$O(B HTML $B$N(B head $B%?%0Fb$N(B 
title $B%?%0$K@_Dj$5$l$^$9(B )

  thumb.title     = "$B<B837k2L(B"

$B$A$g$&$I$3$N%A%e!<%H%j%"%k$,:n@.$5$l$k>l=j$K=q$-=P$9!"(B
$B%a%C%;!<%8$r@_Dj$7$F$/$@$5$$!#$3$3$K=q$-9~$`FbMF$,$=$N$^$^(B
HTML $B$H$7$F=PNO$5$l$k$N$G!"(BHTML $B%?%0$b=q$-9~$s$G$/$@$5$$!#(B

((* $BCm0U!*!*(B *)) message $B$KBeF~$9$k$H$-$N5-9f$OI,$:(B $B!V(B=$B!W(B
$B$G$O$J$/!"!V(B<<$B!W$K$7$F$/$@$5$$!#(B

    thumb.message   << <<-MSG
    <h1>$B<B837k2L(B</h1>

    <p>
      $B0J2<$O<B837k2L$r0lMw$7$?$b$N$G$"$k(B
    </p>

    <h2>$B<B83@_Dj(B</h2>

    <ul>
      <li>$B2rA|EY(B       : T42L20
      <li>$B;~4V%9%F%C%W(B : 30 s
    </ul>
                            :
                            : 
      MSG

$B%5%`%M%$%kItJ,$N2<$K%a%C%;!<%8$r5-=R$7$?$$>l9g$O!"0J2<$N$h$&$K(B
$B@_Dj$7$^$7$g$&!#=q$-J}$O>e5-$N(B message $B$HF1MM$G$9!#(B

    thumb.footer  << <<-MSG
    =begin
    == $B;29M;qNA(B
    
    * $BCO5eN.BNEEG>6f3ZIt(B dcmodel $B%W%m%8%'%/%H(B.
      ((<URL:http://www.gfd-dennou.org/library/dcmodel>)), 
      $BCO5eN.BNEEG>6f3ZIt(B.
    
    =end
    MSG


== $B:FEY<B9T(B

$B:FEY(B #{@sub_rb_name} $B$r<B9T$7$^$9!#(B

    $ ruby #{@sub_rb_name}

$B$9$k$H!">e5-$N5-=R$,H?1G$5$l$?(B (({ #{@index}#{@index_ext} })) $B$,(B
$B:n@.$5$l$^$9!#%V%i%&%6$G3NG'$7$F$/$@$5$$!#(B

$B$?$@$7!"$3$l$@$1$G$O!"%5%`%M%$%kFb$N%3%a%s%H$rJT=8$G$-$J$$$N$G!"(B
$B0J2<$N(B ((<$B!V>pJs%U%!%$%k!W$NJT=8(B ($BF~LgJT(B)>)) $B$r;2>H$7$F$/$@$5$$!#(B


== $B!V>pJs%U%!%$%k!W$NJT=8(B ($BF~LgJT(B)

#{@sub_rb_name} $B$r<B9T$7$?%G%#%l%/%H%j$K$O>e5-$G@_Dj$7$?(B
infofile $B$KBP1~$7$?%U%!%$%k$,:n@.$5$l$k$O$:$G$9!#(B

   thumb.infofile  = "\\\#\\\{File.basename(thumb.index)\\\}.txt"

$B$3$N%U%!%$%k$rJT=8$9$k$3$H$G!"%5%`%M%$%kFb$K%3%a%s%H$r5-=R$G$-$^$9!#(B

$B$^$:Cf?H$r8+$F$_$F$/$@$5$$!#(B

    fig1.png::
    fig2.gif::
    fig3.jpg::
    fig3.png::

$B$3$l$O!"0J2<$N$h$&$J%U%)!<%^%C%H$K$J$C$F$$$^$9!#(B

    <$B2hA|L>(B> : <$B=$>~;R(B> : <$B%3%a%s%H(B>

<$B=$>~;R(B> $B$K4X$7$F$O(B ((<$B!V>pJs%U%!%$%k!W$NJT=8(B ($B1~MQJT(B)>))
$B$r;2>H$7$F$/$@$5$$!#(B


=== $B2hA|$N=g=x$NF~$lBX$((B

$B%5%`%M%$%k$K$O!V>pJs%U%!%$%k!W$K=q$-9~$^$l$?=g$K=q$-=P$5$l$^$9!#(B
$BF~$lBX$($?$$;~$K$O9T$4$H$=$N0LCV$rF~$lBX$($F$/$@$5$$!#(B

    fig2.gif::
    fig3.jpg::
    fig3.png::
    fig1.png::

=== $B%3%a%s%HIU$1(B

$B%3%a%s%H$r$D$1$?$$$H$-$K$O!"0J2<$N$h$&$K$7$F$/$@$5$$!#(B

    fig1.png:: 1 $B2sL\$N<B83(B
    fig2.gif:: 2 $B2sL\$N<B83(B
    fig3.jpg:: 3 $B2sL\$N<B83(B (jpg $B2hA|(B)
    fig3.png:: 3 $B2sL\$N<B83(B (png $B2hA|(B)

HTML $B%?%0$O$=$N$^$^G'<1$5$l$k$N$G!"0J2<$N$h$&$K=q$-9~$`$3$H$,(B
$B2DG=$G$9!#(B

    fig1.png:: <hr> 1 $B2sL\$N<B83(B <br> $B<:GT(B <hr>


=== $B%3%a%s%H%"%&%H(B

$B%3%a%s%H%"%&%H$7$?$$>l9g$O9TF,$K(B $B!V(B#$B!W$r=q$-9~$_$^$9!#(B

    # fig2.gif:: 2 $B2sL\$N<B83(B


=== $B%i%Y%k(B

$B2hA|$G$O$J$/!"%3%a%s%H$N$_$r=q$-9~$_$?$$$H$-$O!"(B<$B2hA|L>(B> $B$K(B
$B!V(Blabel$B!W$H5-=R$7$^$9!#(B

    label:: <hr><table><tr><td>$B<B83@_Dj(B 2</td><td>$B%Q%i%a!<%?(B 3</td></tr></table>

=== $B%9%Z!<%9(B

$B0l$DJ,Ht$P$7$FI=<($7$?$$;~$O0J2<$N$h$&$K(B <$B2hA|L>(B> $B$NItJ,$K2?$b=q$+$J$$$G(B
$B2<$5$$!#(B
  
    $B!!(B::


== $B$b$&0lEY<B9T(B

$B:FEY(B #{@sub_rb_name} $B$r<B9T$7$^$9!#(B

    $ ruby #{@sub_rb_name}

$B$9$k$H!">e5-$N5-=R$,H?1G$5$l$?(B (({ #{@index}#{@index_ext} })) $B$,(B
$B:n@.$5$l$^$9!#%V%i%&%6$G3NG'$7$F$/$@$5$$!#(B


== $B%9%/%j%W%H$NJT=8(B ($B1~MQJT(B)

((<$B%9%/%j%W%H$NJT=8(B ($BF~LgJT(B)>)) $B$N1~MQHG$G$9!#(B

((<#{@self_name} $B$N(B rdoc $B%^%K%e%"%k(B|URL:#{PUB_DOC_URL}>))
$B$N(B DCModelThumbnail $B%/%i%9$N(B Attribute $B$K@_Dj$G$-$kA4$F$NCM(B
$B$N>pJs$,$"$k$N$G!">\$7$/$O$=$A$i$r;2>H$/$@$5$$!#(B

=== $BEEG>%5!<%P0J30$G;H$&$?$a$K(B

$BEEG>%5!<%P0J30$G$NMxMQ$r9M$($k>l9g$K$O!"2<5-$N@_Dj$bJT=8$9$k(B
$BI,MW$,$"$k$+$b$7$l$^$;$s!#(B

$B%3%T!<%i%$%H(B

   thumb.copyright = "GFD Dennou Club"

$B%9%?%$%k%7!<%H(B

   thumb.css       = "/GFD_Dennou_Club/ftp/arch/dcmodel/htmltools/dcmodel.css"

rd2 $B%3%^%s%I$X$N%Q%9(B ($B$3$l$O!"2<5-$G>R2p$9$k(B RD $B$H$$$&=qK!$G(B
$B=q$/I,MW$,L5$1$l$P!"@_Dj$NI,MW$O$"$j$^$;$s(B)

   thumb.rd2_path  = "/usr/bin/rd2"

rd2html-ext-lib $B$N@_Dj(B ($B$3$l$b!"2<5-$G>R2p$9$k(B RD $B$H$$$&=qK!$G(B
$B=q$/I,MW$,L5$1$l$P!"@_Dj$NI,MW$O$"$j$^$;$s(B)

   thumb.rd2htmlextlib = "/GFD_Dennou_Club/ftp/arch/dcmodel/lib"
    

=== RD $B$r;H$$$?$$?M$N$?$a$K(B

$BCf$K$O!"!V(BRD
((-
RD (Ruby Documents) $B$d(B rdtool $B$K4X$7$F$O!"(B
((<RD$B;v;O$a(B|URL:http://www.rubyist.net/~rubikitch/computer/rd-intro/>))
$B$d(B
((<RAA - rdtool|URL:http://raa.ruby-lang.org/project/rdtool/>))
$B$r;2>H$7$F$/$@$5$$!#(B
-)) 
$B$G=q$-$?$$!*!*(B  HTML $B$G$J$s$+=q$-$?$/$J$$!*!*!W$H$$$&(B
$B$o$,$^$^$OJ}$b$$$k$+$b$7$l$^$;$s!#(B($B$3$l$r=q$$$F$$$k;d$,@5$K$=$&$G$9!#(B
$B$=$N$?$a$K$3$N%D!<%k$r2~NI$7$?$H8@$C$F$b2a8@$G$O$"$j$^$;$s!D(B)$B!#(B

$B$=$&$$$&J}$O!"%a%C%;!<%8$N@_Dj$N:]$K!"F,$K(B $B!V(B=begin$B!W!"0lHV:G8e$K(B
$B!V(B=end$B!W$H5-=R$7$F$/$@$5$$!#(B

    thumb.message   << <<-MSG
    =begin
    = $B<B837k2L(B

    $B0J2<$O<B837k2L$r0lMw$7$?$b$N$G$"$k(B

    == $B<B83@_Dj(B

    * $B2rA|EY(B       : T42L20
    * $B;~4V%9%F%C%W(B : 30 s
                            :
                            : 
    =end
    MSG

$B$9$k$H!"$3$N>pJs$r(B rdtool $B$G(B HTML $B2=$7$?$b$N$r%5%`%M%$%k$N%U%!%$%k$K(B
$BKd$a9~$_$^$9!#(B

=== RT $B$r;H$$$?$$?M$N$?$a$K(B ($BL$<BAu(B)

((* $BCm0U!'(B *)) $B$3$N5!G=$O$^$@%P!<%8%g%s(B #{VER} $B$G$OAH$_9~$^$l$F$$$^$;$s!#(B

$BB>$K$b!"!V(BRT
((-
((<RT|URL:http://www.rubyist.net/~rubikitch/computer/rt/>))
$B$r;2>H$7$F$/$@$5$$!#(B
-)) 
$B$G=q$$$F$_$?$$!*!*!W$H$$$&J}$b$$$k$+$b$7$l$^$;$s!#(B

$B$=$&$$$&J}$O!"%a%C%;!<%8$N@_Dj$N:]$K!"F,$K(B $B!V(B=begin RT$B!W!"0lHV:G8e$K(B
$B!V(B=end$B!W$H5-=R$7$F$/$@$5$$!#(B

    thumb.message   << <<-MSG
    =begin RT
    caption = $BI=%F%9%H(B

         , $B?M4V(B, == , $B8$(B , ==
     ||  , $BCK(B  , $B=w(B ,$B%*%9(B,$B%a%9(B

      x  , 1.0 , 2.0, 1.1, 1.2
      y  , 0.4 , 0.5, 0.3, 0.1

    =end
    MSG

$B$9$k$H!"$3$N>pJs$r(B rttool $B$G(B HTML $B2=$7$?$b$N$r%5%`%M%$%k$N%U%!%$%k$K(B
$BKd$a9~$_$^$9!#(B


=== SIGEN $B%U%!%$%k@8@.$N%3%s%H%m!<%k(B

$B%G%U%)%k%H$G$O%5%`%M%$%k%U%!%$%k$N:n@.$HF1;~$K(B SIGEN $B%U%!%$%k(B
<http://www.gfd-dennou.org/library/cc-env/mksigen/desc.htm> $B$r(B
$B:n@.$7$^$9$,!"ITMW$G$"$k>l9g$O(B mksigen $B$r(B false $B$K$7$F$/$@$5$$!#(B

   thumb.mksigen = false


=== $B%m%\%C%H8!:w$N6X;_(B

$B@8@.$9$k%5%`%M%$%k$r%m%\%C%H8!:w$7$FM_$7$/$J$$>l9g$K$O(B
norobots $B$r(B true $B$K$7$F$/$@$5$$!#(B

   thumb.norobots = true

=== $B%5%`%M%$%k2hA|JQ49%D!<%k$NJQ99(B

$B%G%U%)%k%H$G%5%`%M%$%k$rJQ49$9$k%3%^%s%I$*$h$S%*%W%7%g%s$O(B
$B0J2<$NDL$j$G$9!#(B

    #{@convert_cmd}

$B$3$l$rJQ49$7$?$$>l9g$K$O0J2<$N$h$&$K@_Dj$r9T$C$F$/$@$5$$!#(B
$B$?$@$7!"6uGr$N>l9g$d%7%9%F%`$KB8:_$7$J$$%3%^%s%I$,@_Dj$5$l$F$$$k(B
$B>l9g$K$O%(%i!<$rJV$7$^$9!#(B

   thumb.convert_cmd = "mogrify -geometry"

$B%G%U%)%k%H$G$O4{$K=PNO@h$K%U%!%$%k$,B8:_$7!"3n$D85$N%U%!%$%k$h$j$b(B
$B?7$7$$>l9g!";~4V$NC;=L$N$?$a!"2hA|%U%!%$%k$NJQ49$r9T$$$^$;$s!#(B
$B$b$7$bKh2sI,$:%U%!%$%k$NJQ49$r9T$$$?$$>l9g$O0J2<$N$h$&$K@_Dj$7$F$/$@$5$$!#(B

   thumb.convert_overwrite = true


== $B!V>pJs%U%!%$%k!W$NJT=8(B ($B1~MQJT(B)

((<$B!V>pJs%U%!%$%k!W$NJT=8(B ($BF~LgJT(B)>)) $B$N1~MQHG$G$9!#(B

=== $B1&4s$;!&:84s$;(B

<$B=$>~;R(B>$B$K(B ">" $B$r=q$-9~$`$H1&4s$;$K!"(B"<" $B$r=q$-9~$`$H:84s$;$K$J$j$^$9!#(B

    fig1.png:>: $B1&4s$;$@$h(B
    fig2.gif:<: $B:84s$;$@$h(B
    fig3.jpg:: $B%G%U%)%k%H$O??$sCf4s$;$@$h(B


=== $BJ#?t9TF~NO(B

<$B=$>~;R(B>$B$K(B "m" $B$r=q$-9~$`$3$H$GJ#?t9TF~NO$,2DG=$G$9!#(B
$B$J$*!">e5-$N(B ((<$B1&4s$;!&:84s$;(B>)) $B$HJ;MQ$9$k>l9g$K$O%+%s%^(B "," $B$G(B
$B6h@Z$j$^$9!#FbMF<+BN$O(B "{" $B$H(B "}" $B$G$/$/$j$^$9!#(B

    fig1.png:m:{
    <p>
     $BJ#?t9TF~NO$r9T$&$h!#(B
     $B$3$&$$$&$3$H$G$-$k$h!#(B
     $BJXMx$@$M!<!#%F!<%V%k$b=q$-$d$9$$$M!#(B
    </p>
    }
    fig2.gif:>,m:{
    <ul>
      <li> $BJ;MQ$9$k$K$O$3$&$9$k$h!#(B
    </ul>
    }

=== $B%U%!%$%kL>HsI=<((B

<$B=$>~;R(B>$B$K(B "b" $B$r=q$-9~$`$3$H$G%U%!%$%kL>$NI=<($rM^@)$7$^$9!#(B

    fig1.png:b: $B%U%!%$%kL>I=<($,M^@)$5$l$^$9(B

$BA4$F$N%U%!%$%kL>$r0l3g$GM^@)$9$kJ}K!$O(B ((<$B%9%/%j%W%H$NJT=8(B ($BF~LgJT(B)>))
$B$r;2>H$7$F$/$@$5$$!#(B($BB0@-(B blankfig $B$r(B true $B$K@_Dj$7$^$9(B)$B!#(B


=== RD $B$r;H$$$?$$?M$N$?$a$K(B

<$B=$>~;R(B>$B$K(B "rd" $B$r=q$-9~$`$3$H$G!"J8;zNs$O(B RD $B$H$7$F2r<a$5$l!"(B
rdtool $B$G(B HTML $B$KJQ49$5$l$^$9!#(BRD $B$G%Z!<%8Fb%j%s%/$r:n@.$9$k(B 
$B5-K!$bMxMQ2DG=$G!"K\J8$d%U%C%?!"%5%`%M%$%kFb$N%X%C%@$K%j%s%/$r(B
$BE=$k$3$H$b$G$-$^$9!#(B($BNc(B ((<$B%X%C%@(B1>))$B!"(B((<$B%X%C%@(B2>)) )

    fig1.png:m,rd:{
    ((<$B$j$s$/(B|URL:./>)) $B$O$3$s$J46$8$G=q$1$k$h!#(B
    * $B%j%9%H$b(B
      * $B4JC1(B
    RD $B%i%Y%k$r;HMQ$7$?%Z!<%8Fb%j%s%/$O(B
    ((<RD $B$r;H$$$?$$?M$N$?$a$K(B>)) $B$N$h$&$K5-=R$9$l$P(B OK $B$G$9!#(B
    }


=== RT $B$r;H$$$?$$?M$N$?$a$K(B ($BL$<BAu(B)

((* $BCm0U!'(B *)) $B$3$N5!G=$O$^$@%P!<%8%g%s(B #{VER} $B$G$OAH$_9~$^$l$F$$$^$;$s!#(B

<$B=$>~;R(B>$B$K(B "rt" $B$r=q$-9~$`$3$H$G!"J8;zNs$O(B RT $B$H$7$F2r<a$5$l!"(B
rttool $B$G(B HTML $B$KJQ49$5$l$^$9!#(B

    fig1.png:m,rt:{
    caption = $BI=%F%9%H(B

         , $B?M4V(B, == , $B8$(B , ==
     ||  , $BCK(B  , $B=w(B ,$B%*%9(B,$B%a%9(B

      x  , 1.0 , 2.0, 1.1, 1.2
      y  , 0.4 , 0.5, 0.3, 0.1
    }


=== $B!V>pJs%U%!%$%k!W$+$i%?%$%H%k$N@_Dj(B

((<$B%9%/%j%W%H$NJT=8(B ($BF~LgJT(B)>)) $B$G%?%$%H%k$N@_Dj$K4X$7$F(B
$B5-=R$7$^$7$?$,!"!V>pJs%U%!%$%k!W$+$i$N@_Dj$b2DG=$G$9!#(B
<$B2hA|L>(B> $B$K(B title $B$H5-=R$7(B <$B%3%a%s%H(B> $B$K%?%$%H%k$r=q$-9~$s$G$/$@$5$$!#(B

     title:: $B<B83@_Dj(B $BB6$NFu(B

((<$B%9%/%j%W%H$NJT=8(B ($BF~LgJT(B)>)) $B$O>e=q$-$5$l$^$9!#(B


=== $B!V>pJs%U%!%$%k!W$+$iK\J8%a%C%;!<%8$NDI2C(B

((<$B%9%/%j%W%H$NJT=8(B ($BF~LgJT(B)>)) $B$GK\J8%a%C%;!<%8$N@_Dj$K4X$7$F(B
$B5-=R$7$^$7$?$,!"!V>pJs%U%!%$%k!W$+$iDI2C$b2DG=$G$9!#(B
<$B2hA|L>(B> $B$K(B message $B$H5-=R$7!"K\J8%a%C%;!<%8$r=q$-9~$s$G$/$@$5$$!#(B

     message:m,rd:{
     = $B%5%s%W%k$@!<(B

     == $BL\<!$G$9(B

     === $B$5$i$KL\<!$G$9(B

     ((<$B$[$2(B|URL:thum/sample_thum.txt>))
     }
     message:m:{
     <b>HTML</b> $B$G$9$,2?$+LdBj$G$b!)(B
     <ul>
       <li>$B$A$$$5$J(B  
       <li>$B%F!<%V%k$r(B
       <li>$B:n$C$F(B    
       <li>$B$_$?$h"v(B
     </ul>
     <hr>
     }

=== $B!V>pJs%U%!%$%k!W$+$i%U%C%?!<%a%C%;!<%8$NDI2C(B

((<$B%9%/%j%W%H$NJT=8(B ($BF~LgJT(B)>)) $B$G%U%C%?!<%a%C%;!<%8$N@_Dj$K4X$7$F(B
$B5-=R$7$^$7$?$,!"!V>pJs%U%!%$%k!W$+$iDI2C$b2DG=$G$9!#(B
<$B2hA|L>(B> $B$K(B footer $B$H5-=R$7!"%U%C%?!<%a%C%;!<%8$r=q$-9~$s$G$/$@$5$$!#(B

     footer:m,rd:{
     == $B%U%C%?!<$G$9(B
     $B;29MJ88%$H$+=q$-9~$`$N$KJXMx$+$b$7$l$^$;$s!#(B
     }

=end
    EndOfTutorial
    debug(@message)
  end

  #
  # HTML $B%U%!%$%k$N:G=*E*$J:n@.%a%=%C%I!#:G8e$K$3$N%a%=%C%I$r8F$V$3$H$G(B
  # $B:n6H$,40N;$9$k!#(B
  #
  # overwrite $B$K(B false $B$rM?$($k$H!">e=q$-$r6X;_$9$k!#(B
  #
  # quiet $B$r(B true $B$K$9$k$H%(%i!<$r=|$/A4$F$N%a%C%;!<%8$,I=<($5$l$J$/$J$k!#(B
  #
  # verbose $B$r(B true $B$K$9$k$H:n6H$N?JD=>u67$,%a%C%;!<%8$H$7$F=PNO$5$l$k!#(B
  #
  # err $B$r(B true $B$K$7$?>l9g!"0U?^$7$J$$F0:n$,5/$-$?>l9g$K$9$0$K(B
  # $B%(%i!<$r5/$3$9!#(B
  #
  def create(overwrite=true, quiet=nil, verbose=true, err=true)

    #
    # $B%5%`%M%$%k%U%!%$%kL>(B
    #
    index_file_name = @index.chomp.strip  +
                      @index_ext.chomp.strip

    #
    # $B85%U%!%$%k:o=|(B (overwrite $B$,(B nil $B$N>l9g$O%(%i!<(B)
    #
    if File.exist?(index_file_name)
      if overwrite then
        File.delete(index_file_name)
      else
        raise ArgumentError, "\n\n  Error : \"#{index_file_name}\" exist already.\n\n"
      end
    end


    #
    # infofile $B$N:n@.(B ($B4{$KB8:_$9$k>l9g$O$=$N$^$^(B)$B!#(B
    # DCModelThumbnail.info_make $B%a%=%C%I$r8F$V(B
    #
    status = info_make(@figdir, @infofile, @ext_list,
                       @headlimit, nil, nil,
                       true, err)
    if verbose then
      if /create/ =~ status
        $stdout.print "  Message : Infofile \"#{@infofile}\" is created.\n"
      elsif /exist/ =~ status
        $stdout.print "  Message : Infofile \"#{@infofile}\" is already exist.\n"
      end
    end

    #
    # @message $B$,(B Array $B%*%V%8%'%/%H0J30$N>l9g$O%(%i!<$rJV$9!#(B
    #
    if !@message.instance_of?(Array) then
      warn_or_err(
                  "\"message\" must be Array Object. " +
                  "Please \"message = Array.new\" initially.\n", 
                  true, nil, ArgumentError)
    end

    #
    # infofile $B$+$i>pJs$N<hF@!#(B
    # DCModelThumbnail.info_get $B%a%=%C%I$r8F$V!#(B
    #
    $stdout.print "  Message : Get information from \"#{@infofile}\".... " if verbose
    info_list = info_get(@infofile, @headlimit, nil, quiet, err)
    #
    # infofile $B$+$i$N>pJs$N$&$A!"2hA|%U%!%$%kL>$r(B "title" $B$K$7$F$$$k(B
    # $B$b$N$K4X$7$F(B @title $B$K>e=q$-$7$F!"(Binfo_list $B$+$i=|$/!#(B
    #
    # infofile $B$+$i$N>pJs$N$&$A!"2hA|%U%!%$%kL>$r(B "message" $B$K$7$F$$$k(B
    # $B$b$N$K4X$7$F(B @message $B$KDI2C$7$F!"(Binfo_list $B$+$i=|$/!#(B
    #
    info_list_buff = Array.new
    info_list.each{ |info_part|
      if /title/ =~ info_part['fig_name']
        @title = info_part['comment']
      elsif /message/ =~ info_part['fig_name']
        # $B%U%)!<%^%C%H$N>pJs$r<u$1$F!"(B"=begin" $BEy$NJd40(B
        if /rd/ =~ info_part['format'] then
          mess_body  = "=begin\n"
          mess_body << info_part['comment']
          mess_body << "\n=end\n"
        elsif /rt/ =~ info_part['format'] then
          mess_body  = "=begin RT\n"
          mess_body << info_part['comment']
          mess_body << "\n=end\n"
        else
          mess_body = info_part['comment']
        end

        @message << mess_body

      elsif /footer/ =~ info_part['fig_name']
        # $B%U%)!<%^%C%H$N>pJs$r<u$1$F!"(B"=begin" $BEy$NJd40(B
        if /rd/ =~ info_part['format'] then
          foot_body  = "=begin\n"
          foot_body << info_part['comment']
          foot_body << "\n=end\n"
        elsif /rt/ =~ info_part['format'] then
          foot_body  = "=begin RT\n"
          foot_body << info_part['comment']
          foot_body << "\n=end\n"
        else
          foot_body = info_part['comment']
        end

        @footer << foot_body

      # $B%5%`%M%$%k$K=q$-9~$`>pJs(B ($B$3$l$,K\L?(B)
      else
        info_list_buff << info_part
      end
    }
    info_list = Array.new
    info_list << info_list_buff
    info_list.flatten!          # $BG[Ns$NJ?3j2=(B (1$B<!85G[Ns2=(B)

    $stdout.print "  done.\n" if verbose


    # @convert_cmd $B$,B8:_$9$k$+$I$&$+%A%'%C%/(B
    $stdout.print "  Message : Check converter command .... " if verbose
    convert_cmd_no_opt = @convert_cmd.strip.gsub(/\s+.*/, '')
    convert_cmd_check1 = convert_cmd_no_opt + " -help > /dev/null"
    convert_cmd_check2 = convert_cmd_no_opt + " --help > /dev/null"
    raise ArgumentError, "\n\n  Error : \"#{convert_cmd_no_opt}\": command not found.\n\n" \
       if !system(convert_cmd_check1) && !system(convert_cmd_check2)
    $stdout.print "  done.\n" if verbose

    # $B%5%`%M%$%k2hA|CV$->l$N:n@.(B
    raise IOError, "\n\n  Error: Existing #{@thumbnaildir} is not a directory.\n\n" \
       if File.exists?(@thumbnaildir) && ! File.stat(@thumbnaildir).directory?
    Dir.mkdir(@thumbnaildir) unless File.exists?(@thumbnaildir)

    # $B%5%`%M%$%k2hA|$N:n@.(B
    $stdout.print "  Message : Create small images for thumbnail ....\n" if verbose
    info_list.each_index{ |i|
      thumbnail_name = info_list[i]['fig_name'].sub(/\.\w+$/, @thumbnailtail)
      fig_name = info_list[i]['fig_name']
      $stdout.print "    [#{i + 1}/#{info_list.size}]: " if verbose
      if info_list[i]['fig_name_nohead'].strip.chomp == "label" ||
          info_list[i]['fig_name_nohead'].strip.chomp == "message" ||
          info_list[i]['fig_name_nohead'].strip.chomp == "title" ||
          info_list[i]['fig_name_nohead'].strip.chomp.empty?
        $stdout.print "Skip: No image file.\n" if verbose
      elsif !@convert_overwrite && \
          File.exists?("#{@thumbnaildir}/#{thumbnail_name}") && \
          File.mtime("#{@thumbnaildir}/#{thumbnail_name}") > \
          File.mtime("#{@figdir}/#{fig_name}")
        $stdout.print "Skip: \"#{@thumbnaildir}/#{thumbnail_name}\" is already exist, and newer than \"#{@figdir}/#{fig_name}\"\n" if verbose
      else
        cmd = "#{@convert_cmd} #{@img_width.to_s}x#{@img_height.to_s} '#{@figdir}/#{fig_name}[#{@thumbnailpage}]' '#{@thumbnaildir}/#{thumbnail_name}'"
        $stdout.print cmd if verbose
        $stdout.print "\n" if verbose
        raise "\n\n  Error : \"#{cmd}\": failed.\n\n" if !system(cmd)
      end
      info_list[i]['thumbnail_name']=thumbnail_name
    }

    #
    # @message $B$N%U%)!<%^%C%H$r2r@O$7!"(BHTML $B$KJQ49$9$k!#(B
    #
    html_message = Array.new
    @message.each{ |mess|
      format = format_parser(mess)

      if /rd/ =~ format then
        html_buff = rd2html(mess, true)
      elsif /rt/ =~ format then
        html_buff = rd2html(mess, true)
      else
        html_buff = mess
      end

      html_message << html_buff if html_buff
      debug(html_message)
    }
    debug(html_message)


    #
    # @footer $B$N%U%)!<%^%C%H$r2r@O$7!"(BHTML $B$KJQ49$9$k!#(B
    #
    footer_mess = Array.new
    @footer.each{ |mess|
      format = format_parser(mess)

      if /rd/ =~ format then
        html_buff = rd2html(mess, true)
      elsif /rt/ =~ format then
        html_buff = rd2html(mess, true)
      else
        html_buff = mess
      end

      footer_mess << html_buff if html_buff
      debug(footer_mess)
    }
    debug(footer_mess)
    if !footer_mess.empty?
      footer_mess.unshift "\n<hr size=\"1\">\n"
    end

    # $B=i4|2=(B
    html_entire = ""

    # HTML $B%X%C%@ItJ,(B
    $stdout.print "  Message : Generate HTML Header...." if verbose
    html_entire << html_header 
    $stdout.print "  done.\n" if verbose

    # $BK\J8(B
    $stdout.print "  Message : Insert body messages...." if verbose
    html_message.each { |message|
      html_entire << message
    }
    $stdout.print "  done.\n" if verbose

    # $B%5%`%M%$%kItJ,(B
    $stdout.print "  Message : Generate Thumbnail Lists...." if verbose
    html_entire << html_thum(info_list, quiet, true)
    $stdout.print "  done.\n" if verbose

    # $B%U%C%?%a%C%;!<%8ItJ,(B
    $stdout.print "  Message : Insert footer messages...." if verbose
    footer_mess.each { |message|
      html_entire << message
    }
    $stdout.print "  done.\n" if verbose

    # HTML $B%U%C%?ItJ,(B
    $stdout.print "  Message : Generate HTML Footer...." if verbose
    html_entire << html_footer
    $stdout.print "  done.\n" if verbose

    # $B%X%C%@(B, $B%5%`%M%$%k(B, $B%U%C%?4V$N%O%$%Q!<%j%s%/$rM-8z$K$9$k(B.
    $stdout.print "  Message : Cross hyperlinks between header and thumbnail and footer .... " if verbose
    html_entire = relabel(html_entire)
    $stdout.print "  done.\n" if verbose

    # $B%U%!%$%k$N=q$-$@$7(B
    $stdout.print "  Message : Output to \"#{index_file_name}\"...." if verbose
    ifile = open(index_file_name, "w:utf-8")
    ifile.print html_entire
    ifile.close
    $stdout.print "  Successfull. \n" if verbose

    # $B:G8e$^$G$&$^$/$$$C$?$i!"(BSIGEN $B%U%!%$%k$b:n@.$9$k!#(B
    if @mksigen then
      mksigen_file = index_file_name.chomp.strip + ".SIGEN"
      mksigen_thumbdir = @thumbnaildir + ".SIGEN"
      mksigen_thumbdir_title = @title || ""
      mksigen_thumbdir_title << " $B%5%`%M%$%k2hA|CV$->l%G%#%l%/%H%j(B"
      mksigen_src  = relative_str("#{$0}"  , mksigen_file)
      mksigen_info = relative_str(@infofile, mksigen_file)

      mksigen_desc = <<-DESC
relative:#{mksigen_src} $B$H(B
		relative:#{mksigen_info}
		$B$K$h$j<+F0@8@.(B
      DESC
      mksigen_desc.encode!("euc-jp")

      mksigen_note = <<-NOTE
$B$3$N(B SIGEN $B%U%!%$%k<+BN$b(B
		relative:#{mksigen_src}
		$B$+$i$N<+F0@8@.$G$"$k(B
      NOTE
      mksigen_note.encode!("euc-jp")

      $stdout.print "  Message : Create \"#{mksigen_file}\"...." if verbose
      mksigen_write(mksigen_file, @title.encode("euc-jp"), nil,
                    nil, "$B<+F0@8@.(B".encode("euc-jp"),
                    mksigen_desc, mksigen_note)
      mksigen_write(mksigen_thumbdir, mksigen_thumbdir_title.encode("euc-jp"),
                    nil, nil, "$B<+F0@8@.(B".encode("euc-jp"),
                    mksigen_desc, mksigen_note) if File.exists?(@thumbnaildir) 
      $stdout.print "  Successfull. \n" if verbose
    end

  end

  #
  # $B%5%s%W%k%9%/%j%W%H=PNOMQ$N%a%=%C%I!#(B
  # $B$3$N(B DCModelThumbnail $B%/%i%9$K0MB8$9$k%5%s%W%k%9%/%j%W%H$r(B
  # $B0z?t(B filename $B$H$$$&L>A0$G=PNO$9$k!#<B:]$K$O!"$3$N%U%!%$%k(B
  # $B$rJT=8!&<B9T$9$k$3$H$G%5%`%M%$%k$,:n@.$5$l$k@#K!$G$"$k!#(B
  #
  def create_sample_rb(filename)
    if !(str_and_notspace?(filename)) then
      return warn_or_err("filename is invalid.\n",
                         true, nil, ArgumentError)
    end
    
    rb_file_body = <<-EndOfFile
#!/usr/bin/env ruby
# coding: utf-8
#
#= dcmodel thumbnail generate ruby script
#
#  Editor :: #{username_from_uid}
#  Version:: #{Time.now.strftime("%Y/%m/%d %H:%M:%S")}
#
#== Overview
#
#This file is generate by following ruby script automatically.
#
#      #{File.expand_path($0.to_s)}
#      version "#{VER}"
#
#Please edit this file according to your purpose.
#
#== Usage
#
#Please check following sample page and reference manual.
#
#  #{PUB_SAMPLE_URL}
#  #{PUB_DOC_URL}
#
##################################################

require "#{File.expand_path($0.to_s)}"

######################################################
# DCModelThumbnail $B$N%$%s%9%?%s%9$r:n@.(B ($BI,?\(B)
thumb = DCModelThumbnail.new

# $B%5%`%M%$%k<B9T%3%^%s%I(B ($BI,?\(B)$B!#:G8e$K<B9T$9$k$3$H(B
END{
  thumb.create
}

#thumb.copyright = "#{@copyright}"
                              # $B%3%T!<%i%$%H(B

thumb.index     = "#{@index}"
                              # $B:n@.$5$l$k%5%`%M%$%k$N%U%!%$%kL>(B ($B3HD%;R=|$/(B)

#thumb.index_ext = "#{@index_ext}"
                              # $B:n@.$5$l$k%5%`%M%$%k$N3HD%;RL>(B

thumb.infofile  = "\#\{File.basename(thumb.index)\}.txt"
                              # $B!V>pJs%U%!%$%k(B (infofile)$B!W$N%U%!%$%kL>(B

#thumb.ext_list.push("bmp")
                              # $B2hA|%U%!%$%k$H$7$FG'<1$5$;$?$$3HD%;R$N(B
                              # $BDI2C!#%G%U%)%k%H$G$O(B 
                              # #{@ext_list.join(", ")},
                              # #{@ext_list.join(", ").swapcase}
                              # $B$,G'<1$5$l$k!#(B

#thumb.headlimit = "headlimit_"
                              # headlimit $B$KEv$F$O$^$i$J$$$b$N$O2hA|$H(B
                              # $B$7$F$OL5;k$5$l!"Ev$F$O$^$k$b$N$O!V>pJs(B
                              # $B%U%!%$%k!W$K$*$$$F!"@\F,ItJ,(B headlimit 
                              # $B$r>JN,$7$F;XDj$9$k$3$H$,2DG=$H$J$k!#(B

#thumb.blankfig = true
                              # $B2hA|%U%!%$%kL>$rI=<($7$J$$(B

#thumb.figdir    = "#{@figdir}"
                              # $B3($N$"$k%G%#%l%/%H%j$NL>A0!#(B
                              # $BI,$:B8:_$7$F$$$J$1$l$P$J$i$J$$!#(B

#thumb.thumbnaildir    = "#{@thumbnaildir}"
                              # $B%5%`%M%$%k2hA|$rCV$/%G%#%l%/%H%j$NL>A0(B

#thumb.thumbnailtail    = "#{@thumbnailtail}"
                              # $B%5%`%M%$%k2hA|$N3HD%;RL>(B

#thumb.thumbnailpage = "1"
                              # $B%5%`%M%$%k2hA|2=$9$k852hA|$N%Z!<%8HV9f(B

#thumb.convert_cmd = "#{@convert_cmd}"
                              # convert $B%3%^%s%I$*$h$S%*%W%7%g%s!#$3$N(B
                              # $B8e$m$K2hA|%5%$%:$,(B 200x150 $B$N$h$&$J7A(B
                              # $B<0$G;XDj$5$l$k!#(B

#thumb.convert_overwrite = #{@convert_overwrite}
                              # convert $B%3%^%s%I$,<B9T$5$l$k:]!"4{$K=P(B
                              # $BNO@h$N%U%!%$%k$,$"$k>l9g$K>e=q$-$9$k$?(B
                              # $B$a$N%U%i%0!#$3$l$,(B false $B$N>l9g!"=PNO(B
                              # $B@h$N%U%!%$%k$,B8:_$7!"3n$D85$N%U%!%$%k(B
                              # $B$h$j$b?7$7$$>l9g$OJQ49$r9T$o$J$$!#(B

#thumb.css       = "#{@css}"
                              # $B%9%?%$%k%7!<%H%U%!%$%k(B

#thumb.rd2_path  = "#{@rd2_path}"
                              # rd2 $B%3%^%s%I$X$N%Q%9(B

#thumb.rd2htmlextlib = "#{@rd2htmlextlib}"
                              # rd2-ext-lib $B$X$N%i%$%V%i%j$X$N%Q%9(B

#thumb.mksigen = false
                              # SIGEN $B%U%!%$%k$r:n$i$J$$>l9g$O(B false 
                              # $B$K%;%C%H$9$k(B

#thumb.norobots = true
                              # HTML $B$N%m%\%C%H8!:w$r6X;_$9$k>l9g$K$O(B 
                              # true $B$K%;%C%H$9$k(B

#thumb.img_width  = #{@img_width}
                              # $B2hA|%U%!%$%k%5%$%:(B ($BI}(B)

#thumb.img_height = #{@img_height}
                              # $B2hA|%U%!%$%k%5%$%:(B ($B9b$5(B)

#thumb.figtable_num = #{@figtable_num}
                              # $B2#$K$J$i$Y$k%U%!%$%k?t(B

#thumb.style = <<-STYLE
#  a:link { color:#269900; }
#  a:visited { color:#269900; }
#  a:hover { color:#99FF33; }
#STYLE
                              # $B%9%?%$%k%7!<%H$rD>@\@_Dj$9$k$?$a$N$b$N(B 
                              # (css $B%U%!%$%k$K=q$-9~$`>pJs$rD>@\;XDj(B
                              # $B$G$-$k(B)

#thumb.html_author  = "#{@html_author}"
                              # html $B$N:n@.<T>pJs(B ($B%G%U%)%k%H$O%f!<%6(B
                              # $B%"%+%&%s%HL>$,<+F0<hF@$5$l$k(B)

thumb.title     = "#{@title}"
                              # html $B%X%C%@$N%?%$%H%k(B

                              # $BK\BN$K=q$-=P$9%a%C%;!<%8!#%5%`%M%$%k$N(B
                              # $BItJ,$h$j$b>e$K=PNO$5$l$k!#$3$NJQ?t<+BN(B
                              # $B$O(B Array $B%*%V%8%'%/%H$G!"$=$NFbIt$K(B 
                              # String $B%*%V%8%'%/%H$,3JG<$5$l$k!#(B

                              # $B%U%C%?!<%a%C%;!<%8!#(B
                              # "=" $B$G$O$J$/!"(B"<<" $B$GBeF~$9$k$3$H$KCm0U!*!*(B
thumb.footer    = Array.new
#thumb.footer    << <<-Footer
# #{@footer.join("\n\n")}
#Footer

                              # $B%a%C%;!<%8!#(B
                              # "=" $B$G$O$J$/!"(B"<<" $B$GBeF~$9$k$3$H$KCm0U!*!*(B
thumb.message   = Array.new
thumb.message   << <<-Message
#{@message.join("\n\n")}
Message

    EndOfFile

    #
    # $B%U%!%$%k$N:n@.(B
    #
    ifile = open(filename, "w:utf-8")
    ifile.print "#{rb_file_body}"
    ifile.close

    #
    # $B%Q!<%_%C%7%g%s$N@_Dj(B
    #
    File.chmod(0755, filename)

  end


  #
  # $B%G%P%C%0=PNOMQ%a%=%C%I!#AH$_9~$_4X?t(B $DEBUG $B$,??$N>l9g(B ($B$D$^$j!"(B
  # $B%W%m%0%i%`$r(B $ ruby -d ./xxxxxx.rb $B$H$7$F8F$S=P$7$?>l9g(B) $B$K(B
  # debug $B%a%=%C%I$KBeF~$5$l$?JQ?t$r=PNO$9$k!#(B
  #
  def debug(*args)
    p [caller.first, *args] if $DEBUG
  end
  private :debug

  #
  # $B7Y9p$^$?$O%(%i!<!#(B
  # err $B$,(B nil $B$d(B false $B$N>l9g!"(Bmes $B$KM?$($i$l$?%a%C%;!<%8$r(B
  # $B7Y9p$H$7$FI=<($9$k!#(Berr $B$,??$N>l9g$O$=$N%a%C%;!<%8$N=PNO(B
  # $B$HF1;~$K%(%i!<$rH/@8$5$;!"%W%m%0%i%`$r=*N;$5$;$k!#(B
  # errvar $B$KJQ?t$rM?$($k$H!"%(%i!<$N<oN`$r;XDj$G$-$k!#(B
  # quiet $B$r(B true $B$K$9$k$H!"(Berr $B$,(B nil $B$N>l9g!"2?$bF0:n$7$J$/$J$k!#(B
  #
  def warn_or_err(mes=nil, err=nil, quiet=nil, errvar=nil)
    return nil if !mes

    errvar = RuntimeError if !errvar

    if err then
      raise errvar, "Error: #{mes}"
    elsif !quiet
      $stdout.print "[#{caller.first}] \n     Warning: #{mes}"
      return nil
    end
  end
  private :warn_or_err

  #
  #$B2hA|%U%!%$%kL>!&=$>~>pJs!&%3%a%s%H$r4^$`!V>pJs%U%!%$%k!W$r:n@.$9$k$?$a$N(B
  #$B%a%=%C%I!#(B
  #
  #figdir (String $B%*%V%8%'%/%H(B)
  #$BFb$N3HD%;R(B ext_list (Array $B%*%V%8%'%/%H(B) $B$K%R%C%H$9$k%U%!%$%kL>(B
  #$B$r%j%9%H$K$7!"(Binfofile (String $B%*%V%8%'%/%H(B) $B$K=q$-=P$9!#(B
  #
  #headlimit (String $B%*%V%8%'%/%H(B) $B$rEO$9$H!"%U%!%$%kL>$NF,$,(B
  #headlimit $B$K%R%C%H$9$k$b$N$@$1$r=&$$!"%j%9%H$+$i$O$=$NItJ,$r(B
  #$B<h$j=|$/$h$&$K$9$k!#(B
  #
  #overwrite $B$r(B true $B$K$9$k$H!"(Binfofile $B$,B8:_$9$k>l9g$G$b(B
  #$B>e=q$-$9$k!#$^$?!"(Bquiet $B$r(B true $B$K$9$k$H7Y9p%a%C%;!<%8$rI=<($7$J$$!#(B
  #
  #delimiter (String $B%*%V%8%'%/%H(B) $B$O>pJs%U%!%$%k$N(B
  #$B2hA|%U%!%$%kL>!&=$>~>pJs!&%3%a%s%H$N6h@Z$jJ8;z$r@_Dj$9$k(B
  #$B$b$N$G$"$j!"%G%U%)%k%H$ODj?t(B INFO_DELIMITER $B$K$F@_Dj$5$l$F$$$k!#(B
  #$B0l1~JQ99$G$-$k$h$&$K$J$C$F$$$k$,!"86B'E*$KJQ99$7$J$$(B
  #$B;v$rA&$a$k!#(B
  #
  #$B%U%!%$%k$r:n@.$7$?$H$-$O(B "create"$B!"4{B8$N$b$N$,$9$G$KB8:_$9$k(B
  #$B>l9g$K$O(B "exist" $B$rJV$9!#2hA|%U%!%$%k$,0l$D$bFI$_9~$a$J$$!"(B
  #$B$9$J$o$A6u$N%U%!%$%k$r:n@.$7$F$7$^$C$?;~$d!"4{B8$N$b$N$,L5$/!"(B
  #$B$J$*$+$D:n@.$K<:GT$7$?>l9g$O%(%i!<$r5/$3$9!#(B($B0z?t(B err $B$r(B
  #false $B$K$7$?>l9g$K$O7Y9p$rI=<($9$k$@$1$G$"$k(B)
  #
  #$B$3$3$G:n@.$5$l$k%U%!%$%k$O(B DCModelThumbnail.info_get $B$G<hF@$5$l$k(B
  #$B%U%!%$%k$N?w7A$G$"$k!#(B
  #
  def info_make(figdir=nil, infofile=nil, ext_list=nil,
                headlimit=nil, overwrite=nil, delimiter=nil,
                quiet=nil, err=true)

    # infofile $B$,$"$j!"(Boverwrite $B$,(B false $B$N>l9g$O=*N;!#(B
    if File.exist?(infofile) && !overwrite then
      warn_or_err("Infofile \"#{infofile}\" already exist. " +
                  "So not generate infofile once again.\n",
                  nil, quiet)
      return "exist"
    end

    # $B0z?t$NM-8z@-$N8!>Z(B
    if !(str_and_notspace?(figdir)) then
      return warn_or_err("\"figdir\" is not specified. " + 
                         "So \"infofile\" is not generated. \n",
                         err, quiet, ArgumentError)

    elsif !(str_and_notspace?(infofile)) then
      return warn_or_err("\"infofile\" is not specified. " + 
                         "So \"infofile\" is not generated. \n",
                         err, quiet, ArgumentError)

    elsif !(array_and_notzero?(ext_list)) then
      return warn_or_err("\"ext_list\" is not specified. " + 
                         "So \"infofile\" is not generated. \n",
                         err, quiet, ArgumentError)
    end

    # delimiter $B$N%;%C%H(B
    if !(str_and_notspace?(delimiter)) then
      delimiter = INFO_DELIMITER
    end

    # headlimit $B$N@07A(B
    if !(str_and_notspace?(headlimit)) then
      headlimit = ""
    end

    # figdir $B$+$i2hA|%U%!%$%kL>0lMw$r$H$j$@$7(B, $BG[Ns(B imgfiles $B$XBeF~(B
    imgfiles = Array.new
    Dir.foreach("#{figdir}") { |item|
      ext_list.each{ |ext|
        next if !(str_and_notspace?(ext))

        # $B%I%C%H$,IU$$$F$$$J$$>l9g$O%I%C%H$r$D$1$k(B
        if !(/^\.(.*)/ =~ ext) then
          ext = "." + ext.chomp.strip
        end

        # $B3HD%$+$iM-8z$+H=Dj(B
        next unless /#{ext}$/i =~ item

        # headlimit $B$+$iM-8z$+H=Dj(B
        if str_and_notspace?(headlimit) then
          if /^#{headlimit}(.+)$/ =~ item
            bodyname = $1
          else
            next
          end
        else
          bodyname = item
        end

        # imgfiles $B$X$N3JG<(B
        #imgfiles.push( (File.basename(bodyname, ext) )  )
        imgfiles.push( bodyname )
      }
    }

    # $B$b$7$b2hA|>pJs$,<h$j=P$;$F$$$J$+$C$?$i7Y9p(B or $B%(%i!<(B
    if !(imgfiles.size > 0) then
      if str_and_notspace?(headlimit)
        errmsg = "Image files \"#{headlimit}...\" are not found in \"#{figdir}\".\n"
      else
        errmsg = "Image files are not found in \"#{figdir}\".\n"
      end
      return warn_or_err(errmsg, err, quiet, ArgumentError)
    end

    imgfiles = imgfiles.sort

    # infofile $B$K=q$-9~$_(B
    ifile = open(infofile, "w:utf-8")
    imgfiles.each{ |filename|
      ifile.print "#{filename}#{delimiter}#{delimiter}\n"
    }
    ifile.close

    return "create"
  end


  #
  # DCModelThumbnail.info_make $B$K$h$C$F:n@.$5$l$k!V>pJs%U%!%$%k!W(B
  # infofile $B$+$i2hA|%U%!%$%kL>$H%3%a%s%H!"$*$h$S=$>~>pJs$r<h$j=P$7!"(B
  # Array[Hash, ...] $B$K$7$FJV$9!#(B
  # $B3FMWAG$N(B Hash $B$K$O%-!<$KCM$N<oN`$NJ8;zNs$r3JG<$7$F$"$k!#(B
  # $B0J2<$O8=:_(B Hash $B$N%-!<$H$7$F<hF@$5$l$k$b$N$G$"$k!#(B
  #
  # * fig_name
  #   * $B%U%!%$%kL>$G$"$k!#(B1 $B$DL\$N6h@Z$jJ8;z(B 
  #     (DCModelThumbnail.info_make $B$N(B INFO_DELIMITER $B;2>H(B)
  #     $B$h$j$bA0$NJ8;zNs$r$3$N%-!<$NCM$H$7$F<hF@$9$k!#$J$*!"(B
  #     $B0z?t(B headlimit $B$,M?$($i$l$k>l9g!">pJs%U%!%$%k$NJ8;zNs$N(B
  #     $BF,$K(B headlimit $B$rIU2C$9$k!#(B
  # * fig_name_nohead
  #   * fig_name $B$HF1MM$K%U%!%$%kL>$G$"$k!#$?$@$7!"$3$A$i$O(B
  #     $B0z?t(B headlimit $B$,M?$($i$l$k>l9g$G$b!">pJs%U%!%$%k$+$iF@$i$l$k(B
  #     $BJ8;zNs$N$_$r3JG<$9$k!#(B
  # * comment
  #   * $B%5%`%M%$%k$N8D!9$N2hA|$N2<$KIU2C$5$l$k%3%a%s%H$G$"$k!#(B
  #     2 $B$DL\$N6h@Z$jJ8;z0J9_$NJ8;zNs$,$3$N%-!<$NCM$H$7$F<hF@$5$l$k!#(B
  #     $B$J$*!"%G%U%)%k%H$G$O2~9TJ8;z$^$G$r%3%a%s%H$H$7$FFI$_9~$`$,!"(B
  #     $B=$>~;R$K(B "m" $B$,F~$k>l9g!"$=$N8e$N(B"{" $B$+$i(B "}" $B$^$G$N4V$NJ8;z(B
  #     $B$rFI$_9~$`!#(B($B2~9TJ8;z$b4^$a$k(B)$B!#(B
  # * align
  #   * $B%3%a%s%H$NJ8;z4s$;>pJs$G$"$k!#(B1$B$DL\$H(B2$B$DL\$N6h@Z$jJ8;z$N4V$K(B
  #     $B2<5-$NJ8;zNs$rF~$l$k$3$H$G!"2<5-$N$=$l$KBP1~$9$kCM$,3JG<$5$l$k!#(B
  #     $B$J$*!"%G%U%)%k%H$G$O(B "center" $B$,3JG<$5$l$k!#(B
  #     * "<" : $B:84s$;$r<($7!"CM$K(B "left" $B$r3JG<$9$k!#(B
  #     * ">" : $B1&4s$;$r<($7!"CM$K(B "right" $B$r3JG<$9$k!#(B
  # * format
  #   * $B%U%)!<%^%C%H$N>pJs$G$"$k!#(B
  #     $B2<5-$NJ8;zNs$rF~$l$k$3$H$G!"2<5-$N$=$l$KBP1~$9$kCM$,3JG<$5$l$k!#(B
  #     $B$J$*!"%G%U%)%k%H$G$O(B "html" $B$,3JG<$5$l$k!#(B
  #     * "rd" : RD $B%U%)!<%^%C%H$G$"$k$3$H$r<($9!#(B
  #     * "rt" : RT $B%U%)!<%^%C%H$G$"$k$3$H$r<($9!#(B
  # * blankfig
  #   * HTML $B$X%U%!%$%kL>$rI=<($7$J$$!#(B
  # * line
  #   * $B>pJs%U%!%$%k$N3:Ev>pJs$N!V9T?t!W$,3JG<$5$l$k!#(B
  #     $BJ#?t9T$,;XDj$5$l$k>l9g$O(B "4-10" $B$H$$$&$h$&$K3JG<$5$l$k!#(B
  #
  # delimiter (String $B%*%V%8%'%/%H(B) $B$O>pJs%U%!%$%k$N(B
  # $B2hA|%U%!%$%kL>!&=$>~>pJs!&%3%a%s%H$N6h@Z$jJ8;z$r@_Dj$9$k(B
  # $B$b$N$G$"$j!"%G%U%)%k%H$ODj?t(B INFO_DELIMITER $B$K$F@_Dj$5$l$F$$$k!#(B
  # $B0l1~JQ99$G$-$k$h$&$K$J$C$F$$$k$,!"86B'E*$KJQ99$7$J$$(B
  # $B;v$rA&$a$k!#(B
  #
  # quiet $B$r??$K$9$k$H!"%U%!%$%k$,$J$$:]$K$b%a%C%;!<%8$rI=<($7$J$$!#(B
  #
  # err $B$r??$K$9$k$H!"%U%!%$%k$,8+$D$+$i$J$$:]$K%(%i!<=hM}$r$9$k!#(B
  #
  def info_get(infofile=nil, headlimit=nil, delimiter=nil, 
               quiet=nil, err=nil)

    # delimiter $B$N%;%C%H(B
    if !(str_and_notspace?(delimiter)) then
      delimiter = INFO_DELIMITER
    end

    info_list = Array.new

    # $B%U%!%$%k$,FI$_<h$l$k$+%A%'%C%/(B
    if !(File.readable?(infofile)) then
        return warn_or_err("\"#{infofile}\" is not readable. \n",
                           err, quiet, ArgumentError)
    end

    # $B<B:]$K%U%!%$%k$r3+$/(B
    ifile = open(infofile, "r:utf-8")

    line_num = 0
    multi_valid = false  # $BJ#?t9T<hF@MQ$N%U%i%0(B
    multi_first = true  # $BJ#?t9T<hF@MQ$N%U%i%0(B

    start_char = Regexp.quote(INFO_MULTI_START) # $BJ#?t9T3+;O(B "{"
    stop_char  = Regexp.quote(INFO_MULTI_STOP)  # $BJ#?t9TDd;_(B "}"

    info_hash_tmp = Hash.new

    ifile.each { |line|

      # $BC5:w$7$?%G!<%?$N3JG<MQG[Ns$H%O%C%7%e(B
      info_part = Array.new
      info_hash = Hash.new

      # $B9T?t$r?t$($k(B
      line_num += 1

      debug("line=", line_num, ":", "multi=", multi_valid)

      info_part = line.chomp.split(/#{delimiter}/, 3)
      info_hash['fig_name_nohead'] = info_part[0]  ||  ""
      info_hash['comment']         = info_part[2]  ||  ""
      info_hash['line']            = line_num.to_s

      # $B9TF,$,(B "#", $B$^$?$O40A4$K6u9T$N>l9g$O%3%a%s%H%"%&%H$H9M$($FL5;k!#(B
      if /^\s*#/ =~ info_part[0] then
        next
      elsif !(str_and_notspace?(line)) then
        next
      end

      # info_hash['fig_name'] $B$N@_Dj(B
      if str_and_notspace?(headlimit) then
        info_hash['fig_name'] = 
           headlimit.chomp.strip + info_hash['fig_name_nohead'].chomp.strip
      else
        info_hash['fig_name'] = info_hash['fig_name_nohead']
      end

      #
      # $B=$>~;R$N2r@O(B ($BK|$,0l$N$3$H$r9M$(!"F|K\8l$b=hM}(B)$B!#(B
      #
      if !(str_and_notspace?(info_part[1])) then
        modifier = ""
      else
        #modifier = Kconv::toeuc(info_part[1].chomp.strip)
        modifier = info_part[1].chomp.strip
        #
        # $BF|K\8l$i$7$-$b$N$,F~$C$F$$$?$i7Y9p$^$?$O%(%i!<(B
        # $B$?$@$7!"J#?t9T=hM}$N>l9g$O5$$K$7$J$$!#(B($BJ8Cf$K!V(B:$B!W$,(B
        # $BF~$C$F$$$k$3$H$b9M$($i$l$k$N$G(B
        #
#        if !(modifier == Kconv::toeuc(modifier)) ||
#           !(modifier == Kconv::tojis(modifier)) ||
#           !(modifier == Kconv::tosjis(modifier)) then

          if !(multi_valid) then
            warn_or_err(
                        "\"#{modifier}\" include 2 bite code, " +
                        "so this may not be parsed correctly.\n",
                        err, quiet, ArgumentError)
          end
#        end
      end

      #
      # $B=$>~;R$NJ,3d(B
      #
      modifier_parts = modifier.split(",")

      # $BJ8;z4s$;>pJs$N2r@O(B
      info_hash['align'] = "center"  # $B%G%U%)%k%HCM(B
      modifier_parts.each{ |char|
        if />/ =~ char.chomp.strip then
          info_hash['align'] = "right"
          break
        elsif /</ =~ char.chomp.strip then
          info_hash['align'] = "left"
          break
        end
      }

      # $B%U%)!<%^%C%H>pJs$N2r@O(B
      info_hash['format'] = "html" # $B%G%U%)%k%HCM(B
      modifier_parts.each{ |char|
        if /rd/ =~ char.chomp.strip then
          info_hash['format'] = "rd"
          break
        elsif /rt/ =~ char.chomp.strip then
          info_hash['format'] = "rt"
          break
        end
      }

      # $B%U%!%$%kL>$NHsI=<(%U%i%0(B
      info_hash['blankfig'] = false # $B%G%U%)%k%HCM(B
      modifier_parts.each{ |char|
        if /b/ =~ char.chomp.strip then
          info_hash['blankfig'] = true
          break
        end
      }

      # $BJ#?t9T$r<hF@$9$k$+$I$&$+$N2r@O(B
      modifier_parts.each{ |char|
        if /m/ =~ char.chomp.strip then
          debug(info_hash['comment'])
          debug(str_and_notspace?(info_hash['comment']))
          if str_and_notspace?(info_hash['comment']) &&
              #              /#{start_char}/e =~ Kconv::toeuc(info_hash['comment']) then
              /#{start_char}/ =~ info_hash['comment'] then
            multi_valid = true
            break
          end
        end
      }

      # $BJ#?t9T<hF@$,M-8z$K$J$C$F$$$k>l9g$O!"CM$r0l;~(B
      # $B$3$3$G;_$a!"<!$N%k!<%W$X2s$9!#(B
      if multi_valid then

        # $BJ8;z%3!<%IJQ49Ey$r$^$H$b$K9T$&$?$a!"(Bline $B$*$h$S(B
        # info_hash['comment'] $B$rJL$NJ8;zNs$KCV$-49$((B
        if !(str_and_notspace?(line)) then
          line_tmp = "\n"
        else
          line_tmp = line
        end
        if !(str_and_notspace?(info_hash['comment']))  then
          comment_tmp = "\n"
        else
          comment_tmp = info_hash['comment']
        end

        # $B=i2s$N>l9g$O!"3FCM$rJ];}$7$F$*$/!#(B
        if multi_first then
          info_hash_tmp = info_hash.dup

          # "{" $B0J9_$N$_$r(B comment $B$H$7$FJ];}(B
          if !(line_tmp.split(INFO_MULTI_START)[1])
            info_hash_tmp['comment'] = "\n"
          else
            info_hash_tmp['comment'] = 
                         line_tmp.split(INFO_MULTI_START)[1]
          end

          multi_first = false

          # $B$b$7$bF1$89T$K(B "}" $B$b$"$k>l9g$K$O$=$3$G=*N;(B
          #          if /#{stop_char}/e =~ Kconv::toeuc(info_hash_tmp['comment']) then
          if /#{stop_char}/ =~ info_hash_tmp['comment'] then
            info_hash_tmp['comment'] = 
                 info_hash_tmp['comment'].split(INFO_MULTI_STOP)[0]

            # $B%U%i%0$N=i4|2=(B
            multi_valid = false
            multi_first = true

            # $BCM$r(B info_hash $B$KLa$9!#(B
            info_hash = info_hash_tmp.dup

            # $BC&=P$7$F(B info_hash $B$r(B info_list $B$X(B (next $B$GC&=P$7$J$$(B)

          # $BF1$89T$K(B "}" $B$,L5$$>l9g$O(B info_list $B$X3JG<$;$:$K<!$N9T$X(B
          else
            next
          end

        # $B=i2s0J9_!"$^$@(B "}" $B$,%3%a%s%H$KL5$$>l9g(B
          #        elsif !(/#{stop_char}/e =~ Kconv::toeuc(line_tmp)) then
        elsif !(/#{stop_char}/ =~ line_tmp) then
          info_hash_tmp['comment'] << line_tmp

          # info_list $B$KEO$5$:$K%k!<%W$r2s$9(B
          next

        # $B%3%a%s%H$K(B "}" $B$,8=$l!"=*N;$9$k:](B
        else
          if !(line_tmp.split(INFO_MULTI_STOP)[0])
            last_comment = ""
          else
            last_comment = line_tmp.split(INFO_MULTI_STOP)[0]
          end
          info_hash_tmp['comment'] << last_comment

          # $B%U%i%0$N=i4|2=(B
          multi_valid = false
          multi_first = true

          # $BCM$r(B info_hash $B$KLa$9!#(B
          info_hash = info_hash_tmp.dup
        end
      end

      # $BCM$r(B info_list $B$K3JG<!#(B
      info_list.push(info_hash)
    }
    ifile.close

    return info_list
  end

  #
  # HTML $B$N%X%C%@ItJ,$N:n@.%a%=%C%I!#AjEv$9$kJ8;zNs$rJV$9!#(B
  # $B:n@.$7$?(B HTML $B$O(B DCModelThumbnail.html_footer $B$GF@$i$l$kJ8;zNs$G(B
  # $BJD$8$i$l$k$3$H$rA[Dj$7$F$$$k!#(B
  #
  def html_header()
    # @index $B$N%G%#%l%/%H%j$+$i8+$?!"@8@.%9%/%j%W%H$NAjBPE*$J0LCV(B
    generator = relative_str("#{$0}", @index)

    # @index $B$N%G%#%l%/%H%j$+$i8+$?!"(Bcss $B$NAjBPE*$J0LCV(B
    css       = relative_str(@css, @index)

    # @norobots $B$,(B ture $B$G$"$l$P!"(Bmeta $B%?%0$K=q$-9~$_!#(B
    if @norobots then
      robots = <<-ROBOTS
  <meta name="robots" content="noindex,nofollow" />
  <meta name="robots" content="noarchive" />
      ROBOTS
    end

    # @style $B$G;XDj$5$l$F$$$k$b$N$,$"$l$P!"$=$l$b=q$-9~$_!#(B
    if str_and_notspace?(@style) then
      style = <<-CSS
  <style type="text/css">
  <!--
    #{@style}
  -->
  </style>
      CSS
    else
      style = ""
    end

    #
    # $B%X%C%@A4BN$N@8@.(B
    #
    header = <<-HTMLHEADER
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja" xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>#{@title}</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="Author" content="#{@html_author}" />
#{robots}
  <meta name="generator" content="#{generator}" />
  <link href="#{css}" type="text/css" rel="stylesheet" />
#{style}
</head>
<body>
    HTMLHEADER
    return header
  end

  #
  # HTML $B$N%5%`%M%$%kItJ,(B ($B2hA|$N?t$K1~$8$F7+$jJV$9ItJ,(B) $B$r:n@.$9$k%a%=%C%I!#(B
  # $BAjEv$9$kJ8;zNs$rJV$9!#(Binfo_list $B$K$O(B DCModelThumbnail.info_get $B$G(B
  # $B<hF@$5$l$k7A<0$N>pJs%U%!%$%k$,M?$($i$l$k!#(B
  #
  # $B$=$l0J30$N7A$N%G!<%?$,M?$($i$l$k>l9g$K$O7Y9p$rH/$7$F(B nil $B$rJV$9!#(B
  # $B$?$@$7!"(Berr $B$K(B true $B$rM?$($k$H!"%(%i!<$,@8$8$k!#(B
  # quiet $B$,(B true $B$N>l9g$K$O7Y9p%a%C%;!<%8$bI=<($7$J$$!#(B
  #
  # $BFbIt$G(B DCModelThumbnail.html_thum_parts $B$r8F$S!"3FMWAG$O$=$A$i$G(B
  # $B:n@.$9$k!#(B
  #
  def html_thum(info_list=nil, quiet=nil, err=nil)

    #
    # $B0z?t$KM?$($i$l$?%G!<%?$N8!>Z(B
    #
    if !array_and_notzero?(info_list) then
      return warn_or_err(
                         "\"info_list\" is invalid.\n",
                         err, quiet, ArgumentError)
    end

    #
    # table $B%?%0$r:n@.(B
    #
    html_table = ""

    html_table = <<-HTMLEOF
    <table border="0" cellspacing="10" align="center">
    HTMLEOF

    #
    # $BCf?H$r:n@.(B
    #
    info_list.size.times{ |num|
      html_table << html_thum_parts(info_list, num, quiet, err)
    }

    #
    # $B$b$7$b!"(Binfo_list.size $B$,(B @figtable_num $B$G3d$j@Z$l$J$$>l9g!"(B
    # $B;D$jJ,$N6uGr(B td $B$r:n@.$9$k(B
    #
    remain = @figtable_num - (info_list.size % @figtable_num)
    td_width   = (100 / @figtable_num).truncate.to_s + "%"  # $B0l$D$N(B td $B$NI}(B

    if !(remain == 0) then
      remain.times{ |time|
        html_table << <<-HTMLEOF
       <td width="#{td_width}" valign="top">
          &nbsp;
       </td>
        HTMLEOF
      }
      html_table << <<-HTMLEOF
      </tr>
      HTMLEOF
    end

    #
    # /table $B%?%0$r:n@.(B
    #
    html_table << <<-HTMLEOF
    </table>
    HTMLEOF

    return html_table
  end


  #
  # HTML $B$N%5%`%M%$%kItJ,$NFbIt(B ($B%F!<%V%k$N(B1$BMWAGKh(B) $B$r:n@.$9$k%a%=%C%I!#(B
  # $BAjEv$9$kJ8;zNs$rJV$9!#(Binfo_list $B$K$O(B DCModelThumbnail.info_get $B$G(B
  # $B<hF@$5$l$k7A<0$N>pJs%U%!%$%k$r!"(Bnum $B$K$O2?HVL\$N%G!<%?$J$N$+$r(B
  # $B<($9(B Numerical $B%*%V%8%'%/%H$rM?$($k!#(B
  #
  # $B$=$l0J30$N7A$N%G!<%?$,M?$($i$l$k>l9g$K$O7Y9p$rH/$7$F(B nil $B$rJV$9!#(B
  # $B$?$@$7!"(Berr $B$K(B true $B$rM?$($k$H!"%(%i!<$,@8$8$k!#(B
  # quiet $B$,(B true $B$N>l9g$K$O7Y9p%a%C%;!<%8$bI=<($7$J$$!#(B
  #
  def html_thum_parts(info_list=nil, num=nil, quiet=nil, err=nil)
    #
    # $B0z?t$KM?$($i$l$?%G!<%?$N8!>Z(B
    #
    if !array_and_notzero?(info_list) then
      return warn_or_err(
                         "\"info_list\" is invalid.\n",
                         err, quiet, ArgumentError)
    end

    if !num.kind_of?(Integer)
      return warn_or_err(
                         "\"num\" is not integer.\n",
                         err, quiet, ArgumentError)
    end

    #
    # info_list $B$+$i%G!<%?$N<hF@(B
    #
    fig_name        = info_list[num]['fig_name'] # $B2hA|%U%!%$%kL>(B
    thumbnail_name  = info_list[num]['thumbnail_name'] # $B%5%`%M%$%k2hA|L>(B
    comment         = info_list[num]['comment']  # $B%3%a%s%H(B
    align           = info_list[num]['align']    # $BJ8;z4s$;(B
    fig_name_nohead = info_list[num]['fig_name_nohead'] # $B>JN,2hA|%U%!%$%kL>(B
    format          = info_list[num]['format']   # comment $B$N%U%)!<%^%C%H(B
    blankfig        = info_list[num]['blankfig'] # $B2hA|L>HsI=<((B
    debug(fig_name, comment, align, fig_name_nohead)

    #
    # format $B$+$i!"(Bcomment $B$NJQ49=hM}(B
    #
    if /rd/ =~ format then
      comment_buff = rd2html(comment)
    elsif /rt/ =~ format then
      comment_buff = rd2html(comment)
    else
      comment_buff = "#{comment}"
    end
    comment = "#{comment_buff}"

    #
    # @index $B$+$i$NAjBPE*$J(B @figdir $B$N@_Dj(B
    #
    rel_figdir = relative_str(@figdir, @index)

    #
    # @index $B$+$i$NAjBPE*$J(B @thumbaildir $B$N@_Dj(B
    #
    rel_thumbnaildir = relative_str(@thumbnaildir, @index)

    #
    # $B%F!<%V%k$NG[CV$K$h$C$F(B <tr> $B$N$D$1$?$7$r$*$3$J$&!#(B
    # (num $B$O%<%m$+$i%9%?!<%H$9$k$3$H$KCm0U(B)
    # $B:8C<(B : @figtable_num * n       (remainder == 0)
    # $B1&C<(B : @figtable_num * n - 1   (remainder == @figtable - 1)
    #
    remainder  = num % @figtable_num    # $BM>$j(B
    figtable_1 = @figtable_num - 1      # $BNs?t(B - 1
    td_width   = (100 / @figtable_num).truncate.to_s + "%"  # $B0l$D$N(B td $B$NI}(B
    debug(num, remainder, figtable_1, @figtable_num, td_width)

    html_table_part  = ""

    # $B:8C<MQ$N(B <tr> $B%?%0(B
    if remainder == 0 then
      html_table_part = <<-HTMLEOF
      <tr valign="center">
      HTMLEOF
    end

    # $B2hA|%U%!%$%kL>$,(B "label" $B$N>l9g$K$O(B comment $B$r$=$N$^$^=q$-=P$9!#(B
    if /^label$/ =~ fig_name_nohead.chomp.strip then
      html_table_part << <<-HTMLEOF
       <td align="#{align}" width="#{td_width}" valign="center">
        <small>
         #{comment}
        </small>
       </td>
      HTMLEOF

    # $B2hA|%U%!%$%kL>$,B8:_$7$J$$>l9g$O6uGr$r=q$-=P$9!#(B
    elsif !(str_and_notspace?(fig_name_nohead)) then
      html_table_part << <<-HTMLEOF
       <td align="#{align}" width="#{td_width}" valign="top">
          &nbsp;
       </td>
      HTMLEOF

    # $B>e5-0J30$N>l9g$K$O!"3($N=L>.HG$H$=$N%j%s%/$rD%$j9~$`(B
    else
      if blankfig || @blankfig
        fig_name_show = ""
      else
        fig_name_show = "\n             #{fig_name_nohead}<br>\n"
      end
      html_table_part << <<-HTMLEOF
       <td align="center" width="#{td_width}" valign="top">
         <a href="#{rel_figdir}/#{fig_name}">
         <img src="#{rel_thumbnaildir}/#{thumbnail_name}" border="1" width="#{@img_width.to_s}" height="#{@img_height.to_s}">
         </a>
         <div align="#{align}">
           <small>#{fig_name_show}
             #{comment}<br><br>
           </small>
         </div>
       </td>
      HTMLEOF
    end

    # $B1&C<MQ$N(B </tr> $B%?%0(B
    if remainder == figtable_1 then
      html_table_part << <<-HTMLEOF
      </tr>
      HTMLEOF
    end

    return html_table_part
  end

  #
  # $B%U%C%?!<:n@.MQ%a%=%C%I!#AjEv$9$kJ8;zNs$rJV$9!#(B
  # DCModelThumbnail.html_header $B$GF@$i$l$kJ8;zNs$G;O$^$k(B HTML $B$r(B
  # $BJD$8$k$3$H$rA[Dj$7$F$$$k!#(B
  #
  def html_footer()
    # @index $B$N%G%#%l%/%H%j$+$i8+$?!"@8@.%9%/%j%W%H$NAjBPE*$J0LCV(B
    generator = relative_str("#{$0}", @index)

    # @index $B$N%G%#%l%/%H%j$+$i8+$?!">pJs%U%!%$%k$NAjBPE*$J0LCV(B
    infofile  = relative_str(@infofile, @index)

    #
    # $B%U%C%?!<$H$7$F=q$-=P$7(B
    #
    html_footer = <<-HTMLEOF
<hr size="1">
<center>
<small>
  This page is generated by <a href=\"#{generator}\">#{generator}</a>
  and <a href=\"#{infofile}\">#{infofile}</a>
  (#{Time.now.strftime("%Y/%m/%d %H:%M:%S")} #{username_from_uid})<br>
  #{@self_name} 
  [<a href="#{PUB_BIN_URL}">Script</a> |
  <a href="#{PUB_DOC_URL}">Doc</a> | <a href="#{PUB_SAMPLE_URL}">Sample</a>]
  is provided by 
  <a href="http://www.gfd-dennou.org/library/dcmodel">dcmodel project</a> 
  in
  <a href="http://www.gfd-dennou.org">GFD Dennou Club</a> <br>
  Copyright &copy; #{@copyright} #{Time.now.strftime("%Y")}
</small>
</center>
</body>
</html>
    HTMLEOF
    return html_footer
  end

  #
  # mes $B$GM?$($i$l$kK\J8$N9TF,$r2r@O$7!"$=$NK\J8$,(B HTML $B$G$"$k$+!"(B
  # RD $B$G$"$k$+!"(BRT $B$G$"$k$N$+$rH=JL$9$k!#8=:_!"0J2<$N$h$&$KH=Dj$7$F$$$k!#(B
  #
  # * $B9TF,J8;z$,!V(B=begin$B!W!"!V(B=begin RD$B!W!"!V(B=begin rd$B!W(B
  #   * RD $B$N%U%)!<%^%C%H$G$"$k$HH=JL(B
  #
  # * $B9TF,J8;z$,!V(B=begin RT$B!W!"!V(B=begin rt$B!W(B
  #   * RT $B$N%U%)!<%^%C%H$G$"$k$HH=JL(B
  #
  # * $B>e5-0J30(B
  #   * HTML $B%U%)!<%^%C%H$G$"$k$HH=JL(B
  #
  # $BJV$jCM$O(B "html", "rd", "rt" $B$N$$$E$l$+$G$"$k!#$J$*!"(Bbody $B$K(B
  # String $B%*%V%8%'%/%H0J30!"$b$7$/$O40A4$K6uGr$N$_$,F~$C$F$$$k>l9g!"(B
  # nil $B$rJV$9!#(B
  #
  def format_parser(body=nil)
    debug(body)
    if !(str_and_notspace?(body)) then
      return warn_or_err("\"body\" is not String Object.\n")
    end

    #Kconv::toeuc(body)
    body
    body_parts = body.split("\n")

    body_parts.each{ |line|
      next unless /\w+/ =~ line.chomp.strip
      if /=begin\s+(rt)/i =~ line.chomp.strip
        return "rt"
      elsif /=begin/i =~ line.chomp.strip
        return "rd"
      elsif /=begin\s+(rd)/i =~ line.chomp.strip
        return "rd"
      else
        return "html"
      end
    }
    return nil
  end

  #
  # $B0z?t(B rd $B$KM?$($i$l$?J8;zNs$r(B rd2html $B$r3]$1$?J8;zNs$H$7$F(B
  # $BJV$9!#%G%U%)%k%H$G$O(B "=begin" $B$d(B "=end" $B$,B8:_$7$J$$J8;zNs$r(B
  # $BA[Dj$7$F$$$k!#$3$N>l9g!"(Brd $BJ8;zNs$r(B "=begin" $B$H(B "=end"
  # $B$G$O$5$^$l$?$b$N$H$7$F<+F0E*$K2r<a$9$k!#$b$7$b(B "=begin"
  # $B$d(B "=end" $B$,=q$-9~$^$l$?J8;zNs$r(B rd $B$H$7$FM?$($?$$>l9g$O(B
  # $B0z?t(B beginend $B$r(B true $B$K$9$k$3$H!#JV$5$l$k(B html $B$O(B <body> $B0J>e$H(B
  # </body> $B0J2<$O>J$+$l$?K\J8ItJ,$N$_$G$"$k!#(B
  #
  # err $B$,(B nil $B$d(B false $B$N>l9g!"(Bmes $B$KM?$($i$l$?%a%C%;!<%8$r(B
  # $B7Y9p$H$7$FI=<($9$k!#(Berr $B$,??$N>l9g$O$=$N%a%C%;!<%8$N=PNO(B
  # $B$HF1;~$K%(%i!<$rH/@8$5$;!"%W%m%0%i%`$r=*N;$5$;$k!#(B
  #
  # $B$b$7$b(B rd2 $B%3%^%s%I$,B8:_$7$J$$>l9g$K$O(B nil $B$rJV$9!#(B
  #
  # $B$J$*!"8=:_$O(B rd2html-ext-lib $B$rI,$:MxMQ$9$k$h$&$K$J$C$F$$$k$N$G(B
  # $B%$%s%9%?%s%9JQ?t(B rd2htmlextlib $B$rE,59@_Dj$7$J$$$H$^$H$b$K(B
  # $BF0$+$J$$$N$GCm0U$9$k$3$H!#(B
  #
  # $BJV$5$l$kJ8;zNs$rC5::$7!"(BA $B%?%0$N(B NAME, HREF $BB0@-$KMQ$$$i$l$k(B
  # "label-XX" $B$N%J%s%P!<$rJ];}$7$F$*$-!":FEY$3$N%a%=%C%I$,8F$P$l$?>l9g$K$O!"(B
  # $BJ8;zNsFb$N(B "label-XX" $B$N%J%s%P!<$r<+F0E*$K7+$j>e$2$k!#(B
  #
  # relabel $B%a%=%C%I$r8F$V$3$H$G!"JL!9$N(B rd2html $B$G(B HTML $B$KJQ49$5$l$?(B
  # $BJ8;zNsFb$N%i%Y%k$N%j%s%/$r:n@.$9$k!#(B
  #
  def rd2html(rd=nil, beginend=true, quiet=nil, err=nil)
    debug(rd)

    if !(FileTest.executable?(@rd2_path)) then
      return warn_or_err(
                         "\"#{@rd2_path}\" is not excutable.\n",
                         err, quiet, ArgumentError)
    elsif !rd
      return warn_or_err(
                         "\"rd\" is invalid.\n",
                         err, quiet, ArgumentError)
    end

    debug(@rd2_path)

    # "=begin" $B$d(B "=end" $B$r>C5n$9$k$?$a$N=hM}(B ($B9TF,$N$b$N$7$+>C$5$J$$(B)
    rd_body = ""
    if beginend then
      rd_parts = rd.split("\n")
      debug(rd_parts)
      rd_parts.each { |line|
        if /^=begin\s+.*/ =~ line then
          next
        elsif /^=begin$/ =~ line then
          next
        elsif /^=end\s+.*/ =~ line then
          next
        elsif /^=end$/ =~ line then
          next
        else
          rd_body << line + "\n"
        end
      }
    else
      rd_body = "#{rd}"
    end
    debug(rd_body)


    # rd $B$GF@$i$l$?J8;zNs$r(B /tmp/dcmodel-thum-$$.rd $B$K0l;~E*$K3JG<(B
    rdfile_tmp = @tmp + "/" + File.basename($0.to_s) + "-" + $$.to_s
    debug(rdfile_tmp)

    tmpfile = open(rdfile_tmp, "w:utf-8")
    tmpfile.print "=begin\n"
    tmpfile.print rd_body
    tmpfile.print "\n=end\n"
    tmpfile.close

    debug(open(rdfile_tmp, "r:utf-8"){|io| io.read})
#    print "#{open(rdfile_tmp){|io| io.read}}"

#    # $B%i%$%V%i%j%Q%9$r(B $: $B$KDI2C(B
#    @rd2lib.each{ |path|
#      next if !(str_and_notspace?(path))
##      $:.push(path)
#      $:.unshift(path)
#    }
#    debug($:)

    #
    # $B%3%^%s%I$NJ8;zNs$r@07A(B
    #
    cmd  = "#{@rd2_path}"
    cmd << " -r rd/rd2html-ext-lib"
    cmd << " --with-css=#{@css}"
    cmd << " --with-part=\'RT:rt\'"
    cmd << " --with-part=\'HTML:html\'"
    cmd << " --out-code=utf8"
    cmd << " --ref-extension"
    cmd << " --native-inline"
    cmd << " --head-element"
#    cmd << " --headline-secno"
#    cmd << " --enable-br"

    debug(cmd)
    html_org = IO.popen("export RUBYLIB=#{@rd2htmlextlib} ; #{cmd} #{rdfile_tmp}", "r:utf-8").read
    debug(html_org)

    html_body_each_line = html_org.split(/\n/)
    debug(html_body_each_line)

    html_body = ""
    bodyflag = false
    html_body_each_line.each{ |line|
      if /^.*<body.*$/ =~ line then
        bodyflag  = true
        next
      elsif /^.*<\/body.*$/ =~ line
        bodyflag  = false
      else
        html_body << line + "\n" if bodyflag
      end
    }

    # $B%i%Y%k$ND%$jBX$((B
    html_body_relabeled = "#{html_body}"

    last_label_num = -1
    while html_body =~ /\<a\s+name\=\"label\-(\d+)\"\s+id\=\"label\-\d+\"\>(.*?)\<\/a\>/i
      last_label_num = $1.to_i
      html_body = $~.post_match
      labeled_str = $2
      @label_num_header_hash.store(last_label_num + @label_num, labeled_str)
    end

    if last_label_num >= 0
      if @label_num < 1
        @label_num = last_label_num + 1
      else
        last_label_num.downto(0){|i|
          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")
          html_body_relabeled.gsub!(/(\<a\s+href\=\"\#label\-)#{i.to_s}(\"\>)/i, "\\1#{(i + @label_num).to_s}\\2")
        }
        @label_num = @label_num + last_label_num + 1
      end
    end

    # $B%F%s%]%i%j%U%!%$%k$r:o=|(B
    File.delete(rdfile_tmp)

    debug(html_body_relabeled)
    return html_body_relabeled
  end

  #
  # rd2html $B%a%=%C%I$G8F$P$l$?JL!9$N(B HTML $BF1;N$N%i%Y%k4V$K4X$7$F(B
  # $B%O%$%Q!<%j%s%/$rE=$k(B. rd2html $B$r0lDL$j8F$S=*$o$C$?8e$K(B, $B$=$N(B
  # rd2html $B$+$iJV$k(B HTML $B$r$^$H$a$?$b$N$r0z?t(B *html* $B$H$7$FM?$($k(B.
  #
  def relabel(html=nil, quiet=nil, err=nil)
    debug(html)

    if !html
      return warn_or_err(
                         "\"html\" is invalid.\n",
                         err, quiet, ArgumentError)
    end

    html_relabeled = "#{html}"
    @label_num_header_hash.each{|num, word|
      html_relabeled.gsub!(
                           /\<\!\-\-\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, 
                           "<a href=\"#label-#{num.to_s}\">#{word}</a>")
    }

    debug(html_relabeled)
    return html_relabeled
  end

  #
  # target $B$GM?$($i$l$?%Q%9(B (String $B%*%V%8%'%/%H(B) $B$r(B from (String 
  # $B%*%V%8%'%/%H(B) $B$+$i8+$?AjBP%Q%9$H$7$F(B String $B%*%V%8%'%/%H$GJV$9!#(B
  # $BFbIt$G(B Pathname $B%/%i%9$rMxMQ$7$F$$$k!#(B
  # $BM?$($i$l$k%Q%9$O@dBP%Q%9$G$bAjBP%Q%9$G$b$+$^$o$J$$!#(B
  #
  def relative_str(target=nil, from=nil)
    return nil    unless str_and_notspace?(target)
    return target unless str_and_notspace?(from)

    from_dir     = File.dirname(from)
    target_dir   = File.dirname(target)
    target_base  = File.basename(target)

    from_ab_path   = Pathname.new(File.expand_path(from_dir))
    target_ab_path = Pathname.new(File.expand_path(target_dir))

    target_re_path = target_ab_path.relative_path_from(from_ab_path)

    result = target_re_path.to_s + "/" + target_base

    return result
  end

  #
  # SIGEN $B%U%!%$%k:n@.%a%=%C%I!#(B
  # $B=q<0Ey>\$7$$$3$H$O(B
  # <http://www.gfd-dennou.org/library/cc-env/mksigen/desc.htm>
  # $B$r;2>H$N$3$H(B
  #
  def mksigen_write(file=nil  , subject=nil    , maintainer=nil, 
                    update=nil, update_info=nil,
                    desc=nil  , note=nil       , prune=nil     , 
                    quiet=nil , err=true)
    # $B0z?t$N8!::(B
    if !(str_and_notspace?(file)) then
      return warn_or_err("\"file\" is not specified.",
                         err, quiet, ArgumentError)
    end
    if !(str_and_notspace?(subject)) then
      return warn_or_err("\"subject\" is not specified.",
                         err, quiet, ArgumentError)
    end

    # $B0z?t$,L58z$G$bJd40$9$k$b$N(B
    if !(str_and_notspace?(maintainer)) then
      maintainer = jpname_from_uid || username_from_uid || "Unknown"
    end
    if !(str_and_notspace?(update)) then
      update = Time.now.strftime("%Y/%m/%d")
    end
    if !(str_and_notspace?(update_info)) then
      update_info  = ""
    end
    if !(str_and_notspace?(desc)) then
      desc   = ""
    end
    if !(str_and_notspace?(note)) then
      note   = ""
    end
    if prune then
      prune  = "Prune: 1"
    else
      prune  = ""
    end

    #
    # $B=PNOFbMF$N3JG<(B
    #
    sigen = <<-SIGEN
Subject:	#{subject.chomp}
Maintainer:	#{maintainer.chomp}
Description:	#{desc.chomp}
Note:		#{note.chomp}
Update:		#{update.chomp}  #{update_info.chomp}
#{prune}
    SIGEN

    #
    # $BJ8;z%3!<%I@_Dj(B
    #
    #Kconv::toeuc(sigen)
    sigen

    #
    # $B%U%!%$%k$N:n@.(B
    #
    ifile = open(file, "w:euc-jp")
    ifile.print "#{sigen}"
    ifile.close

  end


  #
  # $B0J9_$O(B Private $B%a%=%C%I(B
  #

  #
  # $B0z?t(B uid $B$KBP1~$9$k%f!<%6L>(B ($B%m%0%$%sL>(B) $B$rJV$9!#(B
  # uid $B$K(B nil $B$rM?$($?>l9g$O%W%m%;%9$N(B uid $B$KBP1~$9$k%f!<%6L>(B ($B%m%0%$%sL>(B)
  # $B$rJV$9!#(Buid $B$,L58z$J$b$N$G$"$k>l9g!"%(%i!<$rJV$9!#(B
  #
  def username_from_uid(uid=nil)
    unless uid
      pw = Etc.getpwuid(Process.uid) or return nil
    else
      pw = Etc.getpwuid(uid) or return nil
    end

    user_name = pw.name
    return user_name
  end
  private :username_from_uid

  #
  # $B0z?t(B gid $B$KBP1~$9$k%f!<%6L>(B ($B%m%0%$%sL>(B) $B$rJV$9!#(B
  # gid $B$K(B nil $B$rM?$($?>l9g$O%W%m%;%9$N(B gid $B$KBP1~$9$k%f!<%6L>(B ($B%m%0%$%sL>(B)
  # $B$rJV$9!#(Bgid $B$,L58z$J$b$N$G$"$k>l9g!"%(%i!<$rJV$9!#(B
  #
  def username_from_gid(gid=nil)
    unless gid
      pw = Etc.getpwuid(Process.gid) or return nil
    else
      pw = Etc.getpwuid(gid) or return nil
    end

    user_name = pw.name
    return user_name
  end
  private :username_from_gid

  #
  # $B0z?t(B uid $B$KBP1~$9$k%f!<%6L>(B ($BF|K\8l(B) $B$rJV$9!#(B
  # uid $B$K(B nil $B$rM?$($?>l9g$O%W%m%;%9$N(B uid $B$KBP1~$9$k%f!<%6L>(B ($BF|K\8l(B)
  # $B$rJV$9!#(B
  #
  # $BF|K\8lL>$O(B gate-toroku-system <http://www.ep.sci.hokudai.ac.jp/~gate>
  # $B$K$h$k%G!<%?%Y!<%9$+$i<hF@$9$k$?$a!"$3$N%7%9%F%`$,%$%s%9%H!<%k$5$l$F(B
  # $B$$$J$$>l9g$K$O(B nil $B$rJV$9!#(B
  #
  # $B0z?t(B family_name $B$K(B true $B$rM?$($?>l9g!"@+$N$_$rJV$=$&$H;n$_$k!#(B
  # $B%G!<%?%Y!<%9$NOBL>$,H>3Q6uGr$^$?$OA43Q6uGr$G6h@Z$i$l$k>l9g!"(B
  # $B@+$N$_$rJV$9$3$H$,2DG=$G$"$k!#(B
  #
  def jpname_from_uid(uid=nil, family_name=nil)
    if FileTest.executable?(@gate_user_show)
      gate_user_database = IO.popen("#{@gate_user_show} #{username_from_uid(uid)}", "r:euc-jp")

      #
      # $B0J2<$O!"40A4$K(B gate-toroku-system $B$N%G!<%?%Y!<%90MB8$G$"$k!#(B
      # $B>\$7$/$O(B <http://www.ep.sci.hokudai.ac.jp/~gate/doc/gate-user-db.htm>
      # $B$r;2>H$;$h!#(B
      #
      while gate_user_data = gate_user_database.gets do
        gate_user_data.chomp!
        if /^kname/ =~ gate_user_data
          jpname_key, jpname_value = gate_user_data.split(/: /, 2)
          #Kconv::toeuc(jpname_value)
          jpname_value
        end
        # $BL>;z$@$1<h$j=P$=$&$H;n$_$k!#(B
        #   ($B@+L>$N4V$KH>3Q6uGr$^$?$OA43Q6uGr$,L5$$;~$OL5M}(B)
        if family_name && /(.+)[\s|$B!!(B]+.+/ =~ jpname_value then
          jpname = $1
        else
          jpname = jpname_value
        end
      end
      jpname..encode!("euc-jp")
    else
      jpname = nil
    end

    return jpname
  end
  private :jpname_from_uid


  #
  # $BBeF~$5$l$?JQ?t$,!"J8;zNs$G!"3n$D6uGrJ8;z$N$_$G$O$J$$$3$H$r(B
  # $BD4$Y$k%a%=%C%I!#F|K\8l$G$"$C$F$b!"J8;zNs$,F~$C$F$$$l$P(B true $B$rJV$9!#(B
  #
  def str_and_notspace?(obj)
    debug(obj)

    if !obj.instance_of?(String) then
      return false
    end

    # $BF|K\8l$NJ8;zNs$bBP1~$G$-$k$h$&$K(B
    #Kconv::toeuc(obj)
    obj

    if /\S+/ =~ obj.chomp.strip then
      return true
    else
      return false
    end
  end
  private :str_and_notspace?

  #
  # $BBeF~$5$l$?JQ?t$,!"G[Ns$G!"3n$D%<%mG[Ns$G$O$J$$$3$H$r(B
  # $BD4$Y$k%a%=%C%I(B
  #
  def array_and_notzero?(obj)
    debug(obj)

    if obj.instance_of?(Array) && obj.size > 0 then
      return true
    else
      return false
    end

  end
  private :array_and_notzero?

end

######################################################
if $0 == __FILE__
  thumb = DCModelThumbnail.new

  # $B0z?t$,M?$($i$l$?$i%X%k%W$rI=<((B
  if ARGV.size > 0 then
    $stdout.print <<-EndOfHelp

#{thumb.self_name} -- version \"#{thumb.version}\"

Please see following documents.
(Sorry, I do not prepare enough help message, and roff format for man(1).)

  #{thumb.pub_sample_url}
  #{thumb.pub_doc_url}

EndOfHelp

    exit(1)
  end

  # $B;R%W%m%0%i%`$NB8:_$r%A%'%C%/(B
  if File.exist?(thumb.sub_rb_name)
    raise IOError, "\n\n  Error : \"#{thumb.sub_rb_name}\" is already exist.\n\n"
  end

  # $B;R%W%m%0%i%`@8@.(B
  $stdout.print "\n#{thumb.self_name} -- version \"#{thumb.version}\" ...\n\n"
  $stdout.print "  Message : Generating Sample Ruby script \"#{thumb.sub_rb_name}\"...."
  thumb.create_sample_rb(thumb.sub_rb_name)
  $stdout.print "  done.\n\n"

end
