[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(DTPtechNote:1651) [ruby]ドラッグ&ドロップ



「ドラッグ&ドロップでさ、テキスト処理したいんですよ。MacPerlみたいに」
ってリクエストは多い。
そういう時は、たいていこう答える。
「えー、Tarminal.appもドラッグ&ドロップだけど、それでもいいですか?」
答えはたいてい決まっていて
「ターミナルは使わない方向で」

これがどういう意味なのか、一応解説しておきます。
ドラッグ&ドロップするってことは、なにがドラッグ&ドロップされるか不明なんですね。
文字コードUnicodeなのか、EUCなのか、SJISなのか、JISなのかとか。
改行はLFなのか、CRなのか、CR+LFなのか、
BOMはついてるのか、ないのか。LEなのか、BEなのか。。。
もしかしたら、テキストじゃないものだって、入れられちゃうかもしれない。がくがくぶるぶる。

つまり、テキストなんて、なんにも保証されていないのと同じです。互換性が乏しいフォーマットと言ってもいいかもしれない。
みんながSJIS使っていた頃とは、状況違うんですよね。
そしてこれを解決するのは、簡単なことをわざわざ面倒に考える必要があります。

ターミナルを使うってことは、文字コードとか、改行とかにちゃんと注意を払っていますよっていうスキルが暗黙に了解されてるってことです。
そしたら、nkfも普通にインストール済みだろうし^^
これって教育的見地からも、意義のあることだと思うんだけど、なんでそんなにターミナルが嫌われるのかしら。

と言っていても仕方がないので、
ちょっとメモリ喰いかもしれないけど、対象ファイルを全部読み込んで、さらにnkfライブラリで変換して、さらに一行づつ処理する。
AppleScriptのドロップレットをラッパーにして、バンドル内のスクリプトにつなげる。

こんな感じかなあ。

#! /usr/bin/ruby -Ku

#rubyのバージョン確認
if RUBY_VERSION <= "1.8.1" then
	print 'Error! -> This Script Running Version over Ruby 1.8.2'
	exit
end

#nkfライブラリの読み込みとコード名の定数
require "nkf"
CODE_NAME = Hash.new("ASCII")
CODE_NAME[NKF::JIS] = 'JIS'
CODE_NAME[NKF::EUC] = 'EUC'
CODE_NAME[NKF::SJIS] = 'SJIS'
CODE_NAME[NKF::BINARY] = 'BINARY'
CODE_NAME[NKF::UTF8] = 'UTF8' if NKF.const_defined?(:UTF8)


#ファイルを回す
ARGV.each { |crrent_rile|
	
	#ファイルの全読み込み
	my_data = File.read(crrent_rile)
	
	#文字コード、改行コード変換
	tmp_data = NKF.nkf("-w -Lu -m0", my_data)
	
	#行ごとの処理
	tmp_data.each { |line|
		
		#やりたいこと

		print line
	}#tmp_data.each
	
}#ARGV.each