From: gotoken@... (GOTO Kentaro) Date: 1997-03-27T09:58:37+09:00 Subject: [ruby-list:2439] url escape どシロウトの後藤です. python のWWWライブラリを ruby にチマチマ移そうとしてます. とりあえず練習に URL のエスケープ関数を書いてみたので, 誰か添削してもらえませんか? 40行ほどなので添付しました. # なんかダサいような気がしてます. 特に, unquote Uppercase などはどこかで定義されるかと思ったのですが 見つけきれませんでした. それと質問なのですが近い将来この urllib.rb に p = URL.open("http://www.caelum.co.jp/~matz/ruby/) page = p.readlines() p.close() のようなのも付け加えたいのですが, その場合, この場合 URL は module でなくて class にすべきなのでしょうか? URL.quote しか使わないかも知れないのにクラスが初期化されるのは モッタイナイので module にしようかと思っているのです. が, それは勘違いのような気がしてるので. - -- beg urllib.rb # usage: # URL.quote(str, *extra) # return escaped URL String # URL.unquote(str) # return decoded URL String module URL Uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Lowercase = "abcdefghijklmnopqrstuvwxyz" Letter = Uppercase + Lowercase Digits = "0123456789" Alwaysafe = Letter + Digits + '_,.-' def quote(s, *extra) safe = Alwaysafe safe += extra.join if extra res = [] s.each_byte{|b| c = sprintf("%c",b) if safe.index(c) res << "" + c + "" else res << "%" + sprintf("%2X",b) + "" end } return res.join end module_function :quote Quoteprog = Regexp.compile(/%[0-9a-fA-F][0-9a-fA-F]/) def unquote(s) i = 0 n = s.length res = [] while 0 <= i and i < n j = (Quoteprog =~ s[i..n]) unless j res << s[i..n] break else res << s[i,j] + s[i+j+1,2].hex.chr i += j+3 end end return res.join end module_function :unquote end - -- end urllib.rb -- 後藤 謙太郎@北海道大学大学院理学研究科数学専攻博士課程 mailto:gotoken@math.hokudai.ac.jp