c
c
うおっ、こんなところでバグが・・・
<HTML> <HEAD> <meta http-equiv="content-type" content="text/html; charset=euc-jp"> <TITLE>判別</TITLE> </HEAD> <BODY> <% ERuby.charset = "EUC-JP" #$KCODE="euc" require "postgres" require "cgi" cgi = CGI.new conn = PGconn.connect("localhost", 5432, "","","parttimer") %> <H1>判別</H1> <FORM METHOD="GET" ACTION="/part.rhtml"> <DIV>名前:<SELECT SIZE="1" NAME="who"> <% list = conn.exec("select name from member;") list.each{|i| print "<OPTION VALUE="#{i}" " print "SELECTED" if cgi.has_key?('who') && /#{i}/.match(cgi['who'][0]) puts ">#{i}</OPTION>" } %> </SELECT></DIV> <DIV>:<INPUT NAME="ANS" <% if cgi.has_key?('who') who = cgi['who'][0] #"AL2A01" conn = PGconn.connect("localhost", 5432, "","","parttimer") member = conn.exec("select passwd from member where name='#{who}';") print "VALUE="#{member.result}"" end%>></DIV> <BR> <INPUT TYPE="SUBMIT" VALUE="検索"> <INPUT TYPE="reset" VALUE="取消"> </FORM> </BODY> </HTML>
#!/usr/bin/ruby -Ke require 'cgi' require "date" class Wiki2html Multi={' '=>'pre','|'=>'table',','=>'csv','>'=>'indent','='=>'nlist','-'=>'list'} def existlink(name="Top") # wikiで実際に利用するときにはこれをオーバライドする #Page::exist(name) true end class Line # wikiにおける行を出力するクラス include Enumerable def initialize(s="") @s=s end def each # @mを含む行は複数行で返す s=@s.split("\n") while a=s.shift while !s.empty? && Multi[a[0..0]] && Multi[a[0..0]] == Multi[s[0][0..0]] a+="\n"+s.shift end yield a # イテレータ使用 end end end class Macro # マクロ計算用(主に日付計算に特化) def initialize(s="") @s=s @d end def self.do(s="") new(s).do end def do # $$関数用 return("###error macro #{@s} ###") unless /(today|>>|<<|[0-9\+\-\*\/])+/.match(@s) @s.gsub!('today'){@d=Date.today;'@d'} eval(@s) end end class Calendar Days=[0,31,28,31,30,31,30,31,31,30,31,30,31] Week=['日','月','火','水','木','金','土'] def initialize(date="日記-2002/10/10") raise "error String" unless /^(.+)-([0-9]{4})\/([0-9]{1,2})\/([0-9]{1,2})/.match(date) @date=Date.new($2.to_i,$3.to_i,$4.to_i) @h,@t=$1,Date.today end def self.month(date="日記-2002/10/10") new(date).month end def self.week(date="日記-2002/10/10") new(date).week end def month # eday=((fday=@date-@date.day+1)>>1)-1 r="|#{Week.join('|')}|\n|#{' |'*(fday.wday)}" (fday).upto(eday){|d|r+="[[#{sprintf("%2d",d.day)}:#{@h}-#{d.year}/#{sprintf("%02d",d.mon)}/#{sprintf("%02d",d.day)}]]|#{"\n" if d.wday==6}#{'|' if d.wday==6 && d!=eday}"} "#{r}#{' |'*(6-eday.wday)}" end def week # r="" (@date-@date.wday).upto(@date-@date.wday+6){|d| r+="[[#{d.mon}/#{d.day}(#{Week[d.wday]}):#{@h}-#{d.year}/#{sprintf("%02d",d.mon)}/#{sprintf("%02d",d.day)}]]#{"-今日" if d==@t}\n" } r end end def initialize(string="",url="./",wikiname="Top",mode="view") @s,@u,@n,@m=string,url,wikiname,mode @capnum=[0]*10 # 見出し 段数はとりあえず10 @caption="" # caption格納用文字列 @footnum=0 # 脚注の番号 @footnote="" # 脚注 end def esc(str="") CGI::escape(str) end def convline(a="") # リンク及び文字飾りを処理する a=a.gsub(/(http:\/\/[a-zA-Z0-9\.\?\&=\/%;\-~:]+)/){"<A HREF=\"#{$1}\">#{$1}</A>"} a=a.gsub(/\[\[(.+?)::(.+?)::(.+?)\]\]/){"<A HREF=\"#{@u}?n=#{esc($2)}&m=view&s=#{esc($3)}\">#{$1}</A>"} #パックアップwikiリンク a=a.gsub(/\[\[(.+?):(<A[^>]*>)(.+?)(<\/A>)\]\]/i){$2+$1+$4} # URLを含むalias a=a.gsub(/\[\[(.+?):(.+?):#(.+?)\]\]/){"<A HREF=\"#{@u}?n=#{esc($2)}##{esc($3)}\">#{$1}</A>"} #見出しwikiリンク別名 a=a.gsub(/\[\[(.+?):#(.+?)\]\]/){"<A HREF=\"#{@u}?n=#{esc($1)}##{esc($2)}\">#{$2}</A>"} #見出しwikiリンク a=a.gsub(/\[\[(.+?):(.+?)\]\]/){"<A HREF=\"#{@u}?n=#{esc($2)}\" class=\"#{((existlink($2))?"link":"nolink")}\">#{$1}</A>"} #aliasのwikiリンク a=a.gsub(/\[\[(.+?)\]\]/){"<A HREF=\"#{@u}?n=#{esc($1)}\" class=\"#{(existlink($1)?"link":"nolink")}\">#{$1}</A>"} #通常wikiリンク(wikiリンクのヒット順序は気をつけること(バグの元) a=a.gsub(/'''(.*?)'''/){"<I>#{$1}</I>"} # イタリック a=a.gsub(/''(.*?)''/){"<B>#{$1}</B>"} # ボールド a=a.gsub(/__(.*?)__/){"<U>#{$1}</U>"} # 下線 a=a.gsub(/%%(.*?)%%/){"<STRIKE>#{$1}</STRIKE>"} # 打ち消し線 a=a.gsub(/\(\((.*?)\)\)/){@footnum+=1;@footnote+="\n<A NAME=\"F#{@footnum}\"><SUP>*#{$1}</SUP></A>";"<A HREF=\"#F#{@footnum}\"><SUP>*#{@footnum}</SUP></A>"} # 脚注 a end def noedit(str="") # 整形無 "<PRE>\n"+str.split("\n").map{|b|b.gsub(/^ /,'').gsub('&','&').gsub('<','<').gsub('>','>')}.join("\n")+"\n</PRE>" end def caption_with_number(str="") # 番号付き見出し str.gsub!(/^(\*+)/,'') @capnum[$1.size]+=1 @capnum[$1.size+1..@capnum.size]=[0]*(@capnum.size-$1.size) @caption+='-'*$1.size+"#{@capnum[1..$1.size].join(".")} [[#{@n}:##{str}]]\n" "<H#{$1.size+1}><A NAME=\"#{esc(str)}\">#{@capnum[1..$1.size].join(".")} #{str}</A></H#{$1.size+1}>" end def caption(str="") # 番号無し見出し str.gsub!(/^(\++)/,'') @caption+='-'*$1.size+"[[#{@n}:##{str}]]\n" "<H#{$1.size+1}><A NAME=\"#{esc(str)}\">#{str}</A></H#{$1.size+1}>" end OList=['1','a','A','i','I'] # OLのtype=には未対応(何とかせねば) def list(str="",mode='-',stab='<UL>',node='<LI>',etab='</UL>') # リスト r,level="",0 str.split("\n").each{|ln| /^(#{mode}+)/.match(ln) l=$1.size-level r+=stab*l if l>0 r+=etab*(-l) if l<0 level=$1.size r+=node+ln.sub($1,'')+"\n" } r+etab*level end def command(str="") case str when /#line/ #水平線 "<HR>" when /#comment/ #コメントモード 未実装 "<FORM ACTION=\"\"></FORM>" when /#calendar\(([^\-]+)-([0-9]{4})\/([0-9]{1,2})\/([0-9]{1,2})\)/ #カレンダー convline(table(Calendar.month("#{$1}-#{$2}/#{$3}/#{$4}"))) when /#calendarw\(([^\-]+)-([0-9]{4})\/([0-9]{1,2})\/([0-9]{1,2})\)/ #カレンダー convline(Calendar.week("#{$1}-#{$2}/#{$3}/#{$4}").gsub("\n","<BR>\n")) else str+"<BR>" end end def table(str="") "<TABLE>\n"+str.split("\n").map{|b| b.gsub(/^\|/,'<TR><TD>').gsub(/\|[^\|]*$/,'</TD></TR>').gsub(/\|/,'</TD><TD>') }.join("\n")+"\n</TABLE>" end def to_view # Line.new(@s).map{|line| if line[0..0]==' ' noedit(line) else line.gsub!(/\$([^\$]+)\$/){Macro.do($1)} line=line.gsub('&','&').gsub('<','<').gsub('>','>') case line[0..0] when '*' caption_with_number(line) when '+' caption(line) when '-' convline(list(line)) when '=' convline(list(line,'=','<OL>','<LI>','</OL>')) when '>' convline(list(line,'>','<BLOCKQUOTE>','','</BLOCKQUOTE>')) when ':' # 説明文 convline("<DL><DT>#{$1}</DT><DD>#{$2}</DD></DL>") if /^:([^:]*):(.+)$/.match(line) when '|' # 表 convline(table(line)) when '#' command(line) else "#{convline(line)}<BR>" end end }.join.gsub(/^#contents/m,convline(list(@caption)))+convline(@footnote) end def to_edit # ブラウザに変換される文字列のみ修正する @s.gsub('&','&').gsub('<','<').gsub('>','>') end def to_s # (@m=="view")?(self.to_view):(self.to_edit) end end if __FILE__==$0 # ライブラリテスト用コード class CGI CGI_PARAMS={'form'=>['value']} CGI_COOKIES= nil end File.open("helpdata.txt"){|f| puts Wiki2html.new(f.read).to_view } end [[ホームページ:http://www.karo.no-ip.com]] *[BIND] 勘違いの痕跡 [[DNS]]を参照のこと *[BIND] BIND8のインストール >|| apt-get install bind