$B"#(B CGI: man2html

Linux $B$J$I$N(B man $B%3%^%s%I$K$h$k%*%s%i%$%s%^%K%e%"%k$rl$G(B HTML $B$KJQ49$9$k(B CGI $BMQ(B Ruby $B%9%/%j%W%H$G$9!#(B $B!V6/D4!W$d!V%"%s%@!<%i%$%s!W$K$bBP1~$7$F$$$^$9$7!"!V(Bman(1)$B!W$N$h$&$J5-=R$O!"$=$N$^$^%O%$%Q!<%F%-%9%H$i$7$/%/%j%C%/0l$D$G;2>H$G$-$k$h$&$K$J$C$F$$$^$9!#(B UNIX $B7O$N%7%9%F%`$r;HMQ$5$l$F$$$F(B Web $B%5!<%P$rN)$A>e$2$F$$$kJ}$O;n$7$F$_$F$O$$$+$,$G$7$g$&(B? $B%^%K%e%"%k$rFI$_?J$`$N$b

$B"#(B $B;H$$J}(B

CGI $B$H$7$F;HMQ$7$^$9!#(B CGI $B$H$7$F8F$S$@$5$l$k$H!"$=$N>l$G(B man $B%3%^%s%I$r$,(B jman $B$K$J$C$F$$$^$9$N$G!"$3$l$O%7%9%F%`$K9g$o$;$F=$@5$/$@$5$$!#(B

CGI $B$N@_Dj$G(B URL $B$H$7$F(B http://localhost/cgi-bin/man2html.rb $B$G8F$S$@$7$,2DG=$H$$$&A0Ds$G?J$a$5$;$F$/$@$5$$!#(B

$B!V(B http://localhost/cgi-bin/man2html.rb $B!W(B $B$G!"%^%K%e%"%k$r;2>H$9$k$?$a$NF~NO2hLL$K$J$j$^$9!#(B $B$3$NF~NO2hLL$G$O!"4JC1$KF~NOJ}K!$N@bL@$,$"$j$^$9!#(B

$B$^$?!"(B $B!V(B http://localhost/cgi-bin/man2html.rb?man $B!W(B $B$H!"D>@\0z?t$rIU$12C$($k$3$H$G!V(Bman$B!W$N%*%s%i%$%s%^%K%e%"%k$r;2>H$9$k$3$H$,2DG=$G$9!#(B

$B%^%K%e%"%k$N%;%/%7%g%s$r;XDj$9$k>l9g$K$O(B $B!V(B http://localhost/cgi-bin/man2html.rb?2+intro $B!W(B $B$d(B $B!V(B http://localhost/cgi-bin/man2html.rb?3+intro $B!W(B $B$H;XDj$7$^$9!#(B

$B!|(B CGI $B$N@_Dj(B

$B;HMQ$7$F$$$k(B Web $B%5!<%P$N%^%K%e%"%k$r;2>H$7$F!"(BCGI $B$N@_Dj$r$7$F$/$@$5$$!#(B CGI $B$N.rb$B!W$N3HD%;R$G$O!"$=$N$^$^;H$($J$$2DG=@-$,$"$j$^$9!#(B

$B0J2<$K(B Apache $B$r;HMQ$7$?>l9g$N@_Dj$K$D$$$F=q$-$^$9!#(B Apache $B$N(B version $B$K$h$j!"@_Dj%U%!%$%k$G$N(B CGI $B4XO"$N%U%!%$%kL>$,0c$&>l9g$,$"$j$^$9$,!"9`L\$H$7$F$O$[$\F1$8$H;W$$$^$9!#(B

$B@_Dj%U%!%$%kCf$G!"(B

ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/
$B$N@_Dj$,M-8z$K$J$C$F$$$k$+3NG'$7$F$/$@$5$$!#(B $B$3$N@_Dj$H!"%9%/%j%W%H$Ke5-(B CGI $B%G%#%l%/%H%j$K%9%/%j%W%H$r0\F0$7$F$/$@$5$$!#(B

$B"#(B $B%=!<%9%3!<%I(B

$B$3$N%9%/%j%W%H$O!"4A;z%3!<%I$r(B EUC $B$H$7$F%;!<%V$7$F;HMQ$7$F$/$@$5$$!#(B $B0lIt4A;z%3!<%I$K0MB8$7$F$$$k5-=R$r$7$F$$$^$9!#(B

#! /usr/local/bin/ruby -Ke
# /home/tetsu/src/ruby/cgi/man2html.rb
# Created: May 25,1999 Tuesday 18:18:49
# Author: tetsu(WATANABE Tetsuya)
RCS_ID = %q$Id: man2html.rb,v 1.8 2000/02/21 02:43:37 tetsu Exp $
# usage: cgi

class Benchmark
  def initialize
    @bench = []
    @s = nil
  end
  
  def start
    @s = Time.now
  end

  def stop
    @bench.push((Time.now - @s).to_f)
    @s = nil
  end

  def to_f
    sum = 0.0
    @bench.each do |a|
      sum += a
    end
    sum / @bench.size
  end

  def to_s
    sprintf('%f', self.to_f)
  end
end

# jman -> HTML

class OnlineMan
  def initialize(str)
    lang = ENV['LANG']
    if File.exist? '/stand/vmunix'
      euc_lang = 'ja_JP.eucJP'
      man_cmd = 'man'
      if File.exist? '/etc/MANPATH'
        mp = File.open('/etc/MANPATH')
        ENV['MANPATH'] = mp.read
        mp.close
      end
    else
      euc_lang = 'ja_JP.ujis'
      man_cmd = 'jman'
    end
    ENV['LANG'] = euc_lang
    foo = IO.popen(man_cmd + ' ' + str)
    man_arr = foo.readlines
    foo.close
    ENV['LANG'] = lang
    foo_arr = [''] * 6
    0.step(man_arr.size, 66) do |i|
      man_arr[i, 6] = foo_arr
      man_arr[i + 60, 6] = foo_arr
    end
    @man = man_arr.join('')
  end
  
  def to_html
    me = if ENV.key?('SCRIPT_NAME')
           ENV['SCRIPT_NAME']
         else
           '/cgi-bin/man2html.rb'
         end

    @man.gsub("\n{3,}", "\n\n").
      tr('<>&"', "\001\002\003\004").
      gsub(/((?:_[\b][^_\b])+)/) {
      '<i>' + $1.gsub(/_[\b]/, '') + '</i>'
    }.gsub(/((?:(?:[^_\b][\b])+[^_\b])+)/) {
      '<b>' + $1.gsub(/[\b][^_\b]/, '') + '</b>'
    }.gsub(/((?:__[\b]{2}[^_\b]{2})+)/n) {
      '<i>' + $1.gsub(/__[\b]{2}/n, '') + '</i>'
    }.gsub(/((?:(?:[^_\b]{2}[\b]{2})+[^_\b]{2})+)/n) {
      '<b>' + $1.gsub(/[\b]{2}[^_\b]{2}/n, '') + '</b>'
    }.gsub(/.[\b]/, '').
      gsub(/<\/i>_<i>/, '_').
      gsub(/<\/b>_<b>/, '_').
      gsub(/([\w\d.\$-]+)\s?\((\d\w?)\)/n) {
      '<A HREF="' + me + '?' + $2 + '+' + $1 + '">' + $1 + '(' + $2 + ')</A>'
    }.gsub(/<i>([\w\d.\$-]+)<\/i>\((\d\w?)\)/n) {
      '<A HREF="' + me + '?' + $2 + '+' + $1 + '">' + $1 + '(' + $2 + ')</A>'
    }.gsub(/<i>([\w\d.\$-]+)<\/i>\(<i>(\d\w?)<\/i>\)/n) {
      '<A HREF="' + me + '?' + $2 + '+' + $1 + '">' + $1 + '(' + $2 + ')</A>'
    }.gsub(/<b>([\w\d.\$-]+)<\/b>\((\d\w?)\)/n) {
      '<A HREF="' + me + '?' + $2 + '+' + $1 + '">' + $1 + '(' + $2 + ')</A>'
    }.gsub(/<b>([\w\d.\$-]+)<\/b>\(<b>(\d\w?)<\/b>\)/n) {
      '<A HREF="' + me + '?' + $2 + '+' + $1 + '">' + $1 + '(' + $2 + ')</A>'
    }.gsub(/([$B!!(B-$Btp(B]+) +(?![^$B!!(B-$Btp(B])/e, '\1').
      gsub(/\001/, '&lt;').
      gsub(/\002/, '&gt;').
      gsub(/\003/, '&amp;').
      gsub(/\004/, '&quot;')
  end
end

require 'cgi-lib'

def mkLastMod
  t = Time.at(0)
  [
    if ENV.key?('SCRIPT_FILENAME')
      ENV['SCRIPT_FILENAME']
    else
      '/home/httpd/cgi-bin/man2html.rb'
    end
  ].each do |f|
    next if not File.exist?(f)
    w = File.mtime(f)
    t = w if w > t
  end
  t
end

require 'nkf'

def man_page(cgi)
  last_mod = mkLastMod.gmtime.strftime('%a, %d %b %Y %X %Z')

  b = Benchmark.new
  b.start
  man_opt = ''
  cgi.each_key {|k|
    man_opt.concat(k)
  }

  man = OnlineMan.new(man_opt)
  msg = NKF.nkf('-Ej', man.to_html)
  b.stop

  CGI::print("Content-Type: text/html", "Last-Modified: " + last_mod) {
    CGI::tag("html") {
      CGI::tag("head") {
        CGI::tag("meta",
                 {"http-equiv"=>"Content-Type",
                   "content"=>"text/html; charset=ISO-2022-JP"}) +\
        CGI::tag("title") {"man pages: " }
      } +\
      CGI::tag("body",
               {"bgcolor"=>"#e0e0e0",
                 "text"=>"#0f0f0f",
                 "link"=>"#0000ff",
                 "vlink"=>"#000080",
                 "alink"=>"#ff0000"
               }) {
        CGI::tag("script", "language"=>"JavaScript") {
          '<!--' + "\n" + 'document.writeln("Last Modified: ",document.lastModified);' + "\n" + '//-->' + "\n"
        } +\
        CGI::tag("hr") +\
        CGI::tag("pre") { msg } +\
        CGI::tag("i") { "time: " + sprintf("%.2f", b.to_f) } +\
        CGI::tag("hr")
      }
    }
  }
end

def welcome_page
  last_mod = mkLastMod.gmtime.strftime('%a, %d %b %Y %X %Z')
  
  CGI::print("Content-Type: text/html", "Last-Modified: " + last_mod) {
    NKF.nkf('-EjZ',
    CGI::tag("html") {
      CGI::tag("head") {
        CGI::tag("meta",
                 {"http-equiv"=>"Content-Type",
                   "content"=>"text/html; charset=ISO-2022-JP"}) +\
        CGI::tag("title") {"search of patch catalog"}
      } +\
      CGI::tag("body",
               {"bgcolor"=>"#e0e0e0",
                 "text"=>"#0f0f0f",
                 "link"=>"#0000ff",
                 "vlink"=>"#000080",
                 "alink"=>"#ff0000"}) {
          # action $B$N!V<+J,!W$O!"Dj5A$G(B...
          action_script = if ENV.key?('REQUEST_URI') then ENV['REQUEST_URI'] else $0 end

        CGI::tag("script", "language"=>"JavaScript") {
          '<!--' + "\n" + 'document.writeln("Last Modified: ",document.lastModified);' + "\n" + '//-->' + "\n"
        } +\
        CGI::tag("hr") +\
        CGI::tag("i") { RCS_ID } +\
        CGI::tag("br") +\
        CGI::tag("b") { `uptime` } +\
        CGI::tag("br") +\
        CGI::tag("p") { '$B%*%s%i%$%s%^%K%e%"%k$+$i(B HTML $B$X$N%2!<%H%&%'%$$G$9!#(B' } +\
        CGI::tag("isindex", "prompt"=>"man") +\
        CGI::tag("p") { 'BOX $B$K%(%s%H%j!$rF~NO$7$F$/$@$5$$!#(B
$BFC$K%(%s%H%j!$r;XDj$7$?$$>l9g$K$O(B "1 chmod" $B$N$h$&$K(B BOX $B$NCf$K%^%K%e%"%k$N%;%/%7%g%s$r4^$a$k$3$H$,$G$-$^$9!#(B
"-k string" $B$N$h$&$K%-!<%o!<%I$r;XDj$9$k$3$H$b$G$-$^$9!#(B
' } +\
        CGI::tag("hr")
      }
    }
  )
  }

end

cgi = CGI.new

if cgi.size == 0
  welcome_page
else
  man_page(cgi)
end

print "\n"

exit

$B"#(B $B2r@b(B

$BFbMF$H$7$F$O!"(Bman $B%3%^%s%I$N=PNO$r(B HTML $B$KJQ49$7$F$$$^$9!#(B man $B%3%^%s%I$O!"(Bless $B$J$I$N%Z!<%8%c$G6/D4$d%"%s%@!<%i%$%s$r=PNO$9$k$N$K!"%P%C%/%9%Z!<%9$r$&$^$/;H$C$F$$$^$9!#(B $B$3$l$O%i%$%s%W%j%s%?$N%$%a!<%8$G!"!V=E$M$&$A!W$NA0!W$r6/D4$9$k$N$K!VL>(B\b\b$BL>A0(B\b\b$BA0!W$H=PNO$5$l$F$$$^$9!#(B

$ jman man | hd.rb -e | less
  $B>JN,(B
00000040  6e283129 0a0a0acc be0808cc bec1b008  n(1)...$BL>(B..$BL>A0(B.
00000050  08c1b00a 20202020 2020206d 616e202d  .$BA0(B.       man -
00000060  20a5aaa5 f3a5e9a5 a4a5f3a5 dea5cba5   $B%*%s%i%$%s%^%K(B.
  $B>JN,(B
00000290  20a4cbc1 aaa4d9a4 eba1a320 5f08735f   $B$KA*$Y$k!#(B _.s_
000002a0  08655f08 635f0874 5f08695f 086f5f08  .e_.c_.t_.i_.o_.
000002b0  6e20a4f2 bbd8c4ea a4b9a4eb a4c8a1a2  n $B$r;XDj$9$k$H!"(B
  $B>JN,(B
000004c0  20206308 636f086f 6e086e66 08666908    c.co.on.nf.fi.
000004d0  69670867 5f085f66 08666908 696c086c  ig.g_._f.fi.il.l
000004e0  6508650a 20202020 20202020 20202020  e.e.            
$BF1MM$K%"%s%@!<%i%$%s$b=hM}$5$l$F$$$^$9!#(B $B$3$3$G;HMQ$7$F$$$k(B hd.rb $B$O(B $B!V(B hex dump $B%3%^%s%I(B $B!W(B $B$G$9!#(B

$B6/D4$r(B HTML $B$N6/D4(B($B$N0UL#$G(B?)$B%\!<%k%IBN$r;XDj$7!"%"%s%@!<%i%$%s$r(B HTML $B$N%$%?%j%C%/BN$K$7$F$$$^$9!#(B $B$3$l$i$N=hM}$N$?$a$K$A$g$C$HBg$-$J@55,I=8=$r;H$C$F$$$^$9!#(B $B$3$N@55,I=8=!"0lIt!V4A;zA4BN!W$r<($9$?$a$KI=<(IT2DG=$J!V(B/([$B!!(B-$Btp(B]+) +(?![^$B!!(B-$Btp(B])/e$B!W$H$$$&$b$N$r;HMQ$7$F$$$^$9!#(B $BI=<(2DG=$JHO0O$NJ8;z$r;HMQ$9$l$P$h$+$C$?$N$G$9$,(B...

$B

a1a1: $B!!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0(B
  $B>JN,(B
f4a1: $Bt!t"t#t$(B
$BI=<(2DG=J8;z$KD>$9$N$b0l$D$N
#! /usr/local/bin/ruby
# /home/tetsu/src/ruby/mkeuc.rb
# Created: March 01,1998 Sunday 14:20:11
# Author: tetsu(WATANABE Tetsuya)
# $Id$
# usage:

for i in 0241 .. 0376
  for j in 0241 .. 0376
    printf("\n%02x%02x: ", i.to_i, j.to_i) if j % 16 == 1
    printf("%c%c", i, j)
  end
end

$B$$$+$,$G$7$g$&(B? $B%*%s%i%$%s%^%K%e%"%k$r$=$N$^$^(B HTML $B%U%!%$%k$K$7$F$7$^$&$b$N$b$"$j$^$9$,!"!V$=$N>l$GJQ49$7$F$7$^$&!W$H$$$&$N$b$R$H$D$NJ}K!$H;W$$$^$9!#(B $B8!:w%(%s%8%s$N(B Namazu $B$r;HMQ$9$k>l9g$K$O!"(BHTML $B2=$5$l$F$$$?J}$,JXMx$J$s$G$9$,(B...

$B@55,I=8=$H%/%i%9Dj5A$O$b$&>/$78+D>$7$?J}$,$$$$$+$J$H;W$C$F$$$^$9!#(B $B6a$/=$@5$9$kM=Dj$G$O$$$^$9$,!"$$$^$N$H$3$mF0:n$K$O:$$C$F$$$J$$$N$G(B...


$BEOJUE/Li(B(WATANABE Tetsuya): Tetsuya.WATANABE atmark nifty.com