Emacsでエキサイト翻訳を利用する
昨日からずっとやってて, やっと出来た.
つまらないところではまりまくった.
テキスト1行づつとってきて, 正規表現に一致するかどうかチェックしてるのに, 一度に複数行マッチしねえなあなんでだろうとかやったり・・・.
疲れた・・・.
とりあえず, 出来たモノを.
まず, Rubyのスクリプト. こいつを使って, 「エキサイト翻訳→正規表現で翻訳された部分だけの抜き出し」をしている.
文字コードとかで正常に動かなかったりするかも.
とりあえず, 自分は, Shift_JISで保存してる. 文字コード, 大丈夫かなあ. やっかいだ.
自分は, こいつを「~/lib/translate.rb」へ保存した.
# エキサイト翻訳をする Ruby プログラム # 文字コードに注意 require "net/http" require "kconv" class ExciteTranslate # エキサイト翻訳 英語→日本語 def excite_en ( word ) Net::HTTP.start( 'www.excite.co.jp', 80 ) do |http| response = http.post( '/world/english/', 'wb_lp=ENJA&before=' + word ) get_translated_text( response.body ) end end # エキサイト翻訳 日本語→英語 def excite_ja ( word ) Net::HTTP.start( 'www.excite.co.jp', 80 ) do |http| response = http.post( '/world/english/', 'wb_lp=JAEN&before=' + word ) get_translated_text( response.body ) end end # 正規表現で翻訳された部分だけを切り出す. def get_translated_text( text ) # if /<textarea cols=36 rows=15 name=\"after\" wrap=\"virtual\" style=\"width:320px;\">([^<]*)/m =~ text if /<input type="hidden" name="after" value="([^"]*)/ =~ text # UTF-8で返戻させる puts $1.toutf8 end end end if ARGV[0] == "-en" ExciteTranslate.new.excite_en( ARGV[1].to_s ) elsif ARGV[0] == "-ja" # Japanese_Shift_Jis へ変換して投入する必要がある ExciteTranslate.new.excite_ja( ARGV[1].to_s.tosjis ) else abort( "Error" ) end #ExciteTranslate.new.excite_en( "Japanese" ) #ExciteTranslate.new.excite_ja( "やっと, エキサイト翻訳を使って, 英語から日本語へ翻訳できた. #やった. #疲れたよ, 本当." )
次に, Emacs-Lispプログラム.
関数「translate-by-excite」内で ruby コマンドを実行している.
上記スクリプト, translate.rb を「~/lib」以外へ保存した場合は, 関数「shell-command」の引数の内容をいじる必要がある.
(defun excite-ja () "エキサイト翻訳 日本語→英語" (interactive) (if mark-active (progn (translate-by-excite "-ja" (buffer-substring (region-beginning) (region-end))) (setq mark-active nil)) ;; ミニバッファから文字列を読み込んでそれを翻訳する (translate-by-excite "-ja" (read-string "日本語→英語翻訳 : ")))) (defun excite-en () "エキサイト翻訳 英語→日本語" (interactive) (if mark-active (progn (translate-by-excite "-en" (buffer-substring (region-beginning) (region-end))) (setq mark-active nil)) ;; ミニバッファから文字列を読み込んでそれを翻訳する (translate-by-excite "-en" (read-string "英語→日本語翻訳 : ")))) ;; Rubyのスクリプトを使用して, 実際に翻訳する (defun translate-by-excite (type string) (get-buffer-create "*translated*") (display-buffer "*translated*") (shell-command (concat "ruby ~/lib/translate.rb " type " \"" string "\"") "*translated*"))
それで使い方.
日本語の文字列をリージョンに入れて, M-x excite-ja とすると,
新しいバッファ「*translated*」が作成され(存在しなかった場合), ウィンドウが分割後, そこに翻訳結果が表示される.
リージョンを選択せずに起動したら, ミニバッファに翻訳したい文字列を入れるよう促される.
英語→日本語の場合は, M-x excite-en とする.
挙動は, M-x excite-ja の場合と同じ.
最初は, emacs-w3m の w3m-search 使って作ろうとした.
それで一応エキサイト翻訳するのは出来たんだけど, これだと色々問題が.
こんな感じ.
- 一々 w3m を起動させて遅い.
- テキストエリアの内容が見づらい
ソースを表示してそこから翻訳された部分だけを取ってこようともしたけど,
どうしても結果が出るまでに時間がかかるし,
カレントバッファが w3m に変わっちゃう.
どうしたもんかなあって考えてたら,
他の言語で翻訳してくる部分だけ作っちゃってそれを表示させればいいんじゃって思いついた.
最初は, 昔課題で超簡単なHTTPクライアントを作ったことがあるから, Cでやろうかなあと思ったけど,
どうせだから, 研究でも使ってる Ruby でやることにした. 簡単にできそうだし.
妙なところではまりまくって, クソ時間かかったけど, 出来てよかった.
参考にしたもの
- Rubyist Magazine - 標準添付ライブラリ紹介 【第 3 回】 Kconv/NKF/Iconv
- プログラミング Ruby 第2版 言語編, ライブラリ編