2003-07-22 6781歩

λ HikiのエンコードをPunyCodeにしてみる

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に報告して取り込んでもらおう。

λ 3年B組金八先生

最近の半身浴の友は金八先生(第五シリーズ)の再放送。

Googleで 3年B組金八先生 RFC3492 を検索すると…RFCに金八っあんが登場するとは思わなんだ。

[]