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 = $'