[Hiki-dev] mismatch of '[[...]]'

アーカイブの一覧に戻る

yowa yowak****@cool*****
2003年 6月 13日 (金) 02:24:37 JST


ょゎです。

From: HOSONO Hidetomo <h12o****@h12o*****>
Subject: Re: [Hiki-dev] mismatch of '[[...]]'
Date: Thu, 12 Jun 2003 23:55:42 +0900 (JST)
Message-ID: <20030****@mail*****>

> 絶対安全な方法でも見つからない限りは、
> さすがにそこまでは許容というか、考慮しなくていいような気がします。
> 
> * ([]はともかく)[[]]を入れなければならないケースはかなり希。
> * エスケープを強いるのはソースの可読性を落とすので、Wikiとしてカッコ悪い。
> 
> …つまり「運用でカバー」派なんですが、ダメですかね?

線の引きどころはどこかなあと思って ']]' を例に上げましたが、
私も基本的に「運用でカバー」派です。:-)



話は変わって。

From: yowa <yowak****@cool*****>
Subject: Re: [Hiki-dev] mismatch of '[[...]]'
Date: Thu, 12 Jun 2003 08:12:18 +0900 (JST)
Message-ID: <20030****@cool*****>

> # 個人的には、/\[\[(.+?)\]\]/ でまず切り出しておいて、その後で
> # どのタイプかを判定する方が、処理をすっきり書けるのではと思います。

と言いっぱなしなのもアレなので、実装してみました。

深くテストしてないのですが、ほそのさんの例と smbd さんの例は両方通ります。
また [[ふー|ばー]] の右辺に InterWiki が来るパターンも parse 出来るので、

  [[Google で Hiki を検索|GoogleJ:Hiki]]

みたいなのも(html_formatter.rb をいじれば)可能になるかと思います。

------------------------------
ょゎ <mailto:yowak****@cool*****> 
     <http://yowaken.dip.jp/>



Index: style/default/parser.rb
===================================================================
RCS file: /cvsroot/hiki/hiki/style/default/Attic/parser.rb,v
retrieving revision 1.1.2.8
diff -u -r1.1.2.8 parser.rb
--- style/default/parser.rb  1 Jun 2003 07:10:37 -0000  1.1.2.8
+++ style/default/parser.rb  12 Jun 2003 16:55:05 -0000
@@ -30,9 +30,7 @@
     STRONG     = "'''"
     DELETE     = "=="
     URL        = '(?:http|https|ftp|mailto):[a-zA-Z0-9;/?:@&=+$,\-_.!~*\'()#%]+'
-    REF1       = '\[\[([^|]+?)\|(.+?)\]\]'
-    REF2       =  '\[\[([^\|:]+?)\]\]'
-    INTERWIKI  = '\[\[([^\]:]+?):([^\]]+)\]\]'
+    REF        = '\[\[(.+?)\]\]'
     WIKINAME   = '((?:[A-Z][a-z0-9]+){2,})([^A-Za-z0-9])?'
     IMAGE      = '\.(?:jpg|jpeg|png|gif)'
     PLUGIN     = '\{\{([^\(\)]+?)(?:\((.*?)\))?\s*\}\}'
@@ -46,9 +44,7 @@
     NORMAL_TEXT_RE = /^[^#{SPECIAL}]+/
     URL_RE         = /^#{URL}/
     WIKINAME_RE    = /^#{WIKINAME}/
-    REF1_RE        = /^#{REF1}/
-    REF2_RE        = /^#{REF2}/
-    INTERWIKI_RE   = /^#{INTERWIKI}/
+    REF_RE         = /^#{REF}/
     IMAGE_RE       = /#{IMAGE}$/i
     PLUGIN_RE      = /^#{PLUGIN}/
     TABLE_RE       = /^#{TABLE}/
@@ -160,23 +156,26 @@
             a << :delete_close
           end
           str = $'
-        when REF2_RE
-          str = $'
-          @cur_stack.push ( {:e => :wikiname, :s => $1} )
-        when REF1_RE
-          href = $2
-          s    = $1
-          str  = $'
-          match_pattern = $&
-          
-          if IMAGE_RE =~ href
-            @cur_stack.push ( {:e => :image, :href => href.escapeHTML, :s => s} )
-          else
-            @cur_stack.push ( {:e => :reference, :href => href.escapeHTML, :s => s} )
-          end
-        when INTERWIKI_RE
-          @cur_stack.push ( {:e => :interwiki, :href => $1, :s => $2} )
-          str = $'          
+        when REF_RE
+          str = $'
+          matched = $1
+          if /\A(?:(.+)\|)?(.+)\z/ =~ matched
+            s = $1
+            href = $2
+            if URL_RE =~ href
+              if IMAGE_RE =~ href
+                h = {:e => :image, :href => href.escapeHTML} 
+              else
+                h = {:e => :reference, :href => href.escapeHTML} 
+              end
+            elsif /\A(.+?):(.+)\z/ =~ href
+              h = {:e => :interwiki, :href => $1, :s => $2 }
+            else
+              h = {:e => :wikiname}
+            end
+            h[:s] = s || href unless h.key?(:s)            
+            @cur_stack.push ( h )
+          end
         when URL_RE
           href = $&
           str  = $'



Hiki-dev メーリングリストの案内
アーカイブの一覧に戻る