ruby-reference-manual:637
From: "原 悠" <yhara@k...>
Date: Tue, 25 Dec 2007 14:48:43 +0900
Subject: [ruby-reference-manual:637] refeのエンコーディング指定パッチ
yharaです。 できれば1.9.0リリースにrefeを含めたいのですが、Windowsで文字化けしてしまう ようなので、[ruby-reference-manual:549] の須藤さんパッチを元にエンコーディングを 指定できるパッチを書きました。 これによって * 現在のロケールから出力エンコーディングを自動的に設定するようになります。 * -eオプションで出力エンコーディングを設定できるようになります。 一応手元では正しく動いているようですが、手が空いてる方がおられましたら 確認していただけると有難いです(特にロケールがutf-8な方)。 -- 原 悠 yhara@k... yhara@k... *** searcher.rb Tue Dec 25 14:44:12 2007 --- _searcher.rb Tue Dec 25 14:34:00 2007 *************** *** 14,19 **** --- 14,20 ---- require 'uri' require 'rbconfig' require 'optparse' + require 'nkf' module BitClust *************** *** 27,32 **** --- 28,34 ---- @name = (/\Abitclust/ =~ cmd ? 'bitclust search' : 'refe') @describe_all = false @linep = false + @encoding = nil @target_type = nil @listen_url = nil @foreground = false *************** *** 51,56 **** --- 53,61 ---- opt.on('-l', '--line', 'Prints one entry in one line.') { @linep = true } + opt.on('-e', '--encoding=ENCODING', 'Select encoding.') {|enc| + @encoding = enc + } opt.on('--class', 'Search class or module.') { @target_type = :class } *************** *** 126,132 **** #compiler = RDCompiler::Text.new compiler = Plain.new @view = TerminalView.new(compiler, ! {:describe_all => @describe_all, :line => @linep}) end def spawn_server(db) --- 131,139 ---- #compiler = RDCompiler::Text.new compiler = Plain.new @view = TerminalView.new(compiler, ! {:describe_all => @describe_all, ! :line => @linep, ! :encoding => @encoding}) end def spawn_server(db) *************** *** 140,146 **** end def new_database ! Database.connect(@dblocation || dblocation()) end def dblocation_name --- 147,155 ---- end def new_database ! db = Database.connect(@dblocation || dblocation()) ! @view.database = db if @view ! db end def dblocation_name *************** *** 288,294 **** --- 297,307 ---- @compiler = compiler @describe_all = opts[:describe_all] @line = opts[:line] + @encoding = opts[:encoding] + @database = nil end + + attr_accessor :database def show_class(cs) if cs.size == 1 *************** *** 393,398 **** --- 406,456 ---- end puts @compiler.compile(rec.entry.source.strip) puts + end + + def puts(*args) + super(*args.collect {|arg| convert(arg)}) + end + + def convert(string) + return string if @database.nil? + _output_encoding = output_encoding + return string if _output_encoding.nil? + input_nkf_option = encoding_to_nkf_option(@database.encoding) + output_nkf_option = encoding_to_nkf_option(_output_encoding) + if input_nkf_option and output_nkf_option + NKF.nkf("-#{input_nkf_option.upcase}#{output_nkf_option}", string) + else + string + end + end + + def output_encoding + return @encoding if @encoding + + locale = ENV["LC_ALL"] || ENV["LC_MESSAGE"] || ENV["LANG"] + case locale + when /\.([a-z\d\-]+)\z/i + $1 + else + nil + end + end + + def encoding_to_nkf_option(encoding) + return nil if encoding.nil? + case encoding + when /\A(?:euc[-_]?jp|ujis)\z/i + "e" + when /\Autf[-_]?8\z/i + "w" + when /\As(?:hift[-_]?)?jis\z/i + "s" + when /\Aiso-2022-jp\z/i + "j" + else + nil + end end end -- ML: ruby-reference-manual@m... 使い方: http://QuickML.com/