Hikiのサイト内リンクと、内部的なファイル名をRuby PunyCodeで エンコードしてみるパッチ。xn-- で始まる識別子がどっかに紛れ込んだりするとダメだけど、そーゆーことは 実際に国際化ドメインが軌道に乗らない限り多分ないであろう。
既存コードへの変更は hiki/command.rb に対して3行だけ。
cvs server: Diffing hiki
Index: hiki/command.rb
===================================================================
RCS file: /cvsroot/hiki/hiki/hiki/command.rb,v
retrieving revision 1.4.2.33
diff -u -r1.4.2.33 command.rb
--- hiki/command.rb 17 Jul 2003 11:49:03 -0000 1.4.2.33
+++ hiki/command.rb 21 Jul 2003 22:59:29 -0000
@@ -5,6 +5,7 @@
require 'hiki/page'
require 'hiki/util'
+require 'hiki/utilpuny'
require 'hiki/plugin'
require 'hiki/aliaswiki'
require "style/#{$style}/parser"
@@ -19,14 +20,14 @@
class Command
def initialize(cgi, db)
@db = db
- @params = cgi.params
+ @params = cgi.params.unescapePuny
@cgi = cgi
@cmd = @params['c'][0]
@p = case @params.keys.size
when 0
'FrontPage'
when 1
- @params['c'][0] ? nil : @params.keys[0]
+ @params['c'][0] ? nil : @params.keys[0].unescapePuny
else
if @cmd == "create"
@params['key'][0] ? @params['key'][0] : nil
実際に変換を行う hiki/utilpuny.rb は以下の通り。String,Hash,Arrayにメソッドを追加した。 組み込みクラスへのメソッド追加による実装はRubyパワー全開でとても気持ちいい。
require 'uconv'
require 'punycode.so'
class String
def escape
CGI::escape(Punycode.euctopuny(self))
end
def unescapePuny
if self =~ /^xn\-\-/ then
Punycode::punytoeuc(self)
else
self
end
end
end
class Hash
def unescapePuny # unescape all values (do NOT unescape keys)
self.keys.each { |k|
self[k] = self[k].unescapePuny
}
self
end
end
class Array
def unescapePuny
self.map { |v| v.unescapePuny }
end
end
SideMenu内は無事PunyCode化されたけど、ページ内のリンクは普通のURLエンコードになっていたのはRD+のフォーマッタが 内部でCGI::escapeを直接呼んでいたのが原因。これについてはHiki-devに報告して取り込んでもらおう。