仕様

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="&timestamp="+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 &#39;cgi&#39;
 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(&#39;.&#39;)+" "+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 &#39;cgi&#39;
 require &#39;date&#39;
 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 &#39;contents&#39;
     %Q(<!-- contents -->)
   when &#39;img&#39;
     %Q(<img src="#{a}">)
   when &#39;line&#39;
     %Q(<hr class="line">)
   when &#39;calendar&#39;
     week=[&#39;日&#39;,&#39;月&#39;,&#39;火&#39;,&#39;水&#39;,&#39;木&#39;,&#39;金&#39;,&#39;土&#39;]
     raise &#39;error String&#39; 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(&#39;</td><td>&#39;)}</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 &#39;calendarw&#39;
     week=[&#39;日&#39;,&#39;月&#39;,&#39;火&#39;,&#39;水&#39;,&#39;木&#39;,&#39;金&#39;,&#39;土&#39;]
     raise &#39;error String&#39; 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 &#39;cgi&#39;
 require &#39;date&#39;
 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(&#39;today&#39;){&#39;Date::today&#39;}).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)})
   }
 }

wiki_edit

 <wiki:edit>
  <wiki:name>ページ名</wiki:name>
  <wiki:content>内容</wiki:content>
 </wiki:edit>

wiki_history

 <wiki:history>
  <wiki:name>ページ名</wiki:name>
 </wiki:history>

wiki_reference

 <wiki:reference>
  <wiki:name>ページ名</wiki:name>
 </wiki:reference>