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-w3mw3m-search 使って作ろうとした.
それで一応エキサイト翻訳するのは出来たんだけど, これだと色々問題が.
こんな感じ.

  • 一々 w3m を起動させて遅い.
  • テキストエリアの内容が見づらい

ソースを表示してそこから翻訳された部分だけを取ってこようともしたけど,
どうしても結果が出るまでに時間がかかるし,
カレントバッファが w3m に変わっちゃう.



どうしたもんかなあって考えてたら,
他の言語で翻訳してくる部分だけ作っちゃってそれを表示させればいいんじゃって思いついた.
最初は, 昔課題で超簡単なHTTPクライアントを作ったことがあるから, Cでやろうかなあと思ったけど,
どうせだから, 研究でも使ってる Ruby でやることにした. 簡単にできそうだし.
妙なところではまりまくって, クソ時間かかったけど, 出来てよかった.

参考にしたもの