[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]