仕様
url
<wiki:url> <wiki:uri>URI</wiki:uri> <wiki:title>タイトル</wiki:title> </wiki:url>
<a href="URI">タイトル</a>
試験スクリプト
#!/usr/bin/ruby -Ke data=<<DATA <wiki:url> <wiki:uri>http://www.n9d.no-ip.com/wiki/a</wiki:uri> <wiki:title>タイトル</wiki:title> </wiki:url> DATA data.gsub!(%r(<wiki:url>[^<]*<wiki:uri>(.+?)</wiki:uri>[^<]*(?:<wiki:title>(.+?)</wiki:title>)?[^<]*</wiki:url>)m){ %Q(<a href="#{$1}">#{$2==nil ? $1 : $2}</a>) } puts data
wiki_anchor
<wiki:anchor> <wiki:title>タイトル</wiki:title> <wiki:name>ページ名</wiki:name> <wiki:id>見出しタイトル</wiki:id> <wiki:timestamp>タイムスタンプ</wiki:timestamp> <wiki:mode>モード</wiki:mode> <wiki:mtime>on</wiki:mtime> </wiki:anchor>
<a href="/wiki/ページ名?timestamp=タイムスタンプ&mode=モード&mtime=on#見出しタイトル">タイトル</a>
試験スクリプト
#!/usr/bin/ruby -Ke require "cgi" data = <<DATA <wiki:anchor> <wiki:title>タイトル</wiki:title> <wiki:name>ページ名</wiki:name> <wiki:id>見出しタイトル</wiki:id> <wiki:timestamp>タイムスタンプ</wiki:timestamp> <wiki:mode>モード</wiki:mode> <wiki:mtime>on</wiki:mtime> </wiki:anchor> DATA data.gsub!(%r(<wiki:anchor>[^<]*(?:<wiki:title>([^<]+)</wiki:title>)[^<]*(?:<wiki:name>([^<]+)</wiki:name>)[^<]*(?:<wiki:id>([^<]+)</wiki:id>)?[^<]*(?:<wiki:timestamp>([^<]+)</wiki:timestamp>)?[^<]*(?:<wiki:mode>([^<]+)</wiki:mode>)?[^<]*(?:<wiki:mtime>([^<]+)</wiki:mtime>)?[^<]*</wiki:anchor>)m){ wikihome="/wiki/" name,title,timestamp,mode,mtime,midasi=$2,$1,"","","","" midasi="#"+CGI::escape($3) if $3!=nil timestamp="×tamp="+CGI::escape($4) if $4!=nil mode="&mode="+CGI::escape($5) if $5!=nil mtime="&mtime="+CGI::escape($6) if $6!=nil arg = timestamp+mode+mtime arg = arg.sub!("&","?") if arg!="" %Q(<a href="#{wikihome}#{name}#{arg}#{midasi}">#{title}</a>) } puts data
あれ? [^<]じゃあ、タグの入れ子に対応できないな。最短一致にしないといけないのね。
ということで修正後
data.gsub!(%r(<wiki:anchor>[^<]*(?:<wiki:title>(.+?)</wiki:title>)[^<]*(?:<wiki:name>(.+?)</wiki:name>)[^<]*(?:<wiki:id>(.+?)</wiki:id>)?[^<]*(?:<wiki:timestamp>(.+?)</wiki:timestamp>)?[^<]*(?:<wiki:mode>(.+?)</wiki:mode>)?[^<]*(?:<wiki:mtime>(.+?)</wiki:mtime>)?[^<]*</wiki:anchor>)m){
<a href="/wiki/ページ名?timestamp=%A5%BF%A5%A4%A5%E0%A5%B9%A5%BF%A5%F3%A5%D7&mode=%A5%E2%A1%BC%A5%C9&mtime=on#%B8%AB%BD%D0%A4%B7%A5%BF%A5%A4%A5%C8%A5%EB">タイトル</a>
wiki_sup
<wiki:sup>内容</wiki:sup>
試験スクリプト
footnum=1 footnote=[] data=<<DATA <wiki:sup>内容1</wiki:sup> <wiki:sup>内容2</wiki:sup> DATA puts data.gsub!(%r(<wiki:sup>(.+?)</wiki:sup>)){ f=footnum footnum+=1 footnote.push(%Q(<a name="#{f}"><sup>*#{$1}</sup></a>)) %Q(<a href="#{f}"><sup>*#{f}</sup></a>) } puts footnote
wiki_caption
<wiki:caption> <wiki:level>段付けレベル</wiki:level> <wiki:content>内容</wiki:content> <wiki:number>on</wiki:number> </wiki:caption>
試験スクリプト
#!/usr/bin/ruby -Ke require 'cgi' caption=[] capnum=[1]*10 data=<<DATA <wiki:caption> <wiki:level>1</wiki:level> <wiki:content>内容1</wiki:content> <wiki:number>on</wiki:number> </wiki:caption> <wiki:caption> <wiki:level>1</wiki:level> <wiki:content>内容2</wiki:content> <wiki:number>off</wiki:number> </wiki:caption> <wiki:caption> <wiki:level>3</wiki:level> <wiki:content>内容2</wiki:content> <wiki:number>on</wiki:number> </wiki:caption> <wiki:caption> <wiki:level>1</wiki:level> <wiki:content>内容3</wiki:content> <wiki:number>on</wiki:number> </wiki:caption> DATA puts data.gsub!(%r(<wiki:caption>[^<]*<wiki:level>(.+?)</wiki:level>[^<]*<wiki:content>(.+?)</wiki:content>[^<]*<wiki:number>(.+?)</wiki:number>[^<]*</wiki:caption>)){ cs=$2 if $3=="on" cs=capnum[1..$1.to_i].join('.')+" "+cs capnum[$1.to_i]+=1 end caption.push(cs) %Q(<h#{$1} class="caption"><a name="#{CGI::escape(cs)}">#{cs}</a></h#{$1} class="caption">) } puts caption
wiki_command
<wiki:command> <wiki:cmd>コマンド名</wiki:cmd> <wiki:name>ページ名</wiki:name> <wiki:arg>引数</wiki:arg> </wiki:command>
試験スクリプト
途中
#!/usr/bin/ruby -Ke require 'cgi' require 'date' data=<<DATA <wiki:command> <wiki:cmd>calendar</wiki:cmd> <wiki:name>ページ名</wiki:name> <wiki:arg>引数-2003/06/15</wiki:arg> </wiki:command> DATA wikihome="/wiki/" puts data.gsub!(%r(<wiki:command>[^<]*<wiki:cmd>(.+?)</wiki:cmd>[^<]*<wiki:name>(.+?)</wiki:name>[^<]*<wiki:arg>(.+?)</wiki:arg>[^<]*</wiki:command>)){ c,n,a=$1,$2,$3 case c when 'contents' %Q(<!-- contents -->) when 'img' %Q(<img src="#{a}">) when 'line' %Q(<hr class="line">) when 'calendar' week=['日','月','火','水','木','金','土'] raise 'error String' unless %r!^(.+)-(\d{4})/(\d{1,2})/(\d{1,2})!.match(a) t,dt=$1,Date.new($2.to_i,$3.to_i,$4.to_i) eday=((fday=dt-dt.day+1)>>1)-1 r=%Q(<table class="calendar">\n<tr class="week"><td>#{week.join('</td><td>')}</td></tr>\n<tr>#{%Q(<td><br></td>)*(fday.wday)}) (fday).upto(eday){|d| r+=%Q(<td#{%Q( class="today") if Date.today==d}><a href="#{wikihome}#{CGI::escape(t)}-#{d.year}/#{sprintf("%02d",d.mon)}/#{sprintf("%02d",d.day)}">#{sprintf("%2d",d.day)}</a></td>) r+="</tr>\n<tr>" if d.wday==6 } %Q(#{r}#{%Q(<td><br></td>)*(6-eday.wday)}</tr>\n</table class="calendar">) when 'calendarw' week=['日','月','火','水','木','金','土'] raise 'error String' unless %r!^(.+)-(\d{4})/(\d{1,2})/(\d{1,2})!.match(a) t,dt=$1,Date.new($2.to_i,$3.to_i,$4.to_i) r=%Q(<table class="calendarw">\n) (dt-dt.wday).upto(dt-dt.wday+6){|d| r+=%Q(<tr><td#{%Q( class="today") if Date.today==d}><a href="#{wikihome}#{CGI::escape(t)}-#{d.year}/#{sprintf("%02d",d.mon)}/#{sprintf("%02d",d.day)}">#{d.mon}/#{d.day}</a>(#{week[d.wday]})</td></tr>\n) } %Q(#{r}</table class="calendarw">) end }
wiki_macro
<wiki:macro> <wiki:cmd>コマンド</wiki:cmd> <wiki:name>ページ名</wiki:name> </wiki:macro>
試験スクリプト
#!/usr/bin/ruby -Ke require 'cgi' require 'date' data=<<DATA <wiki:macro> <wiki:cmd>today+1</wiki:cmd> <wiki:name>ページ名</wiki:name> </wiki:macro> DATA puts data.gsub!(%r(<wiki:macro>[^<]*<wiki:cmd>(.+?)</wiki:cmd>[^<]*<wiki:name>(.+?)</wiki:name>[^<]*</wiki:macro>)){ c,p=$1,$2 eval(c.gsub('today'){'Date::today'}).to_s.gsub(/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/){ %Q(#{$1}/#{sprintf("%02d",$2.to_i)}/#{sprintf("%02d",$3.to_i)}) } }