X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Ftranslator.rb;h=933969a1a7f1aa62ffb388fefcf41f5a96443309;hb=052217de30c59206d7025b582d4604557a747470;hp=9fb74e8a5da879109d2ed9179fdffd0bcf4acc98;hpb=027b6965f5abf5d05a95d4dc627f19a71b7a7076;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/translator.rb b/data/rbot/plugins/translator.rb index 9fb74e8a..933969a1 100644 --- a/data/rbot/plugins/translator.rb +++ b/data/rbot/plugins/translator.rb @@ -39,6 +39,14 @@ class Translator @cache = cache end + # Many translators use Mechanize, which changed namespace around version 1.0 + # To support both pre-1.0 and post-1.0 namespaces, we use these auxiliary + # method. The translator still needs to require 'mechanize' on initialization + # if it needs it. + def mechanize + return Mechanize if defined? Mechanize + return WWW::Mechanize + end # whether the translator supports this direction def support?(from, to) @@ -113,7 +121,7 @@ class NiftyTranslator < Translator end def do_translate(text, from, to) - @form ||= WWW::Mechanize.new. + @form ||= mechanize.new. get('http://nifty.amikai.com/amitext/indexUTF8.jsp'). forms_with(:name => 'translateForm').last @radio = @form.radiobuttons_with(:name => 'langpair').first @@ -150,7 +158,7 @@ class ExciteTranslator < Translator end def open_form(name) - WWW::Mechanize.new.get("http://www.excite.co.jp/world/#{name}"). + mechanize.new.get("http://www.excite.co.jp/world/#{name}"). forms_with(:name => 'world').first end @@ -215,18 +223,24 @@ class BabelfishTranslator < Translator def initialize(cache) require 'mechanize' - form = WWW::Mechanize.new.get('http://babelfish.altavista.com/babelfish/'). - forms_with(:name => 'frmTrText').first - lang_list = form.fields_with(:name => 'lp').first + (_, lang_list) = parse_page language_pairs = lang_list.options.map {|o| o.value.split('_')}. reject {|p| p.empty?} super(Translator::Direction.pairs(language_pairs), cache) end - def do_translate(text, from, to) - @form ||= WWW::Mechanize.new.get('http://babelfish.altavista.com/babelfish/'). - forms_with(:name => 'frmTrText').first + def parse_page + form = mechanize.new.get('http://babelfish.altavista.com/babelfish/'). + forms_with(:name => 'frmTrText').first + lang_list = form.fields_with(:name => 'lp').first + [form, lang_list] + end + def do_translate(text, from, to) + unless @form && @lang_list + @form, @lang_list = parse_page + end + if @form.fields_with(:name => 'trtext').empty? @form.add_field!('trtext', text) else @@ -368,7 +382,7 @@ class TranslatorPlugin < Plugin translator = @default_translators.find {|t| @translators[t].support?(params[:from], params[:to])} if translator - cmd_translate m, params.merge({:translator => translator, :show_provider => true}) + cmd_translate m, params.merge({:translator => translator, :show_provider => false}) else # When translate command is used without source language, "auto" as source # language is assumed. It means that google translator is used and we let google @@ -419,11 +433,30 @@ class TranslatorPlugin < Plugin m.reply _('No translator called %{name}') % {:name => tname} end end + + # URL translation has nothing to do with Translators so let's make it + # separate, and Google exclusive for now + def cmd_translate_url(m, params) + params[:to] = @bot.config['translator.destination'] if params[:to].nil? + params[:from] ||= 'auto' + + translate_url = "http://translate.google.com/translate?sl=%{from}&tl=%{to}&u=%{url}" % { + :from => params[:from], + :to => params[:to], + :url => CGI.escape(params[:url].to_s) + } + + m.reply(translate_url) + end end plugin = TranslatorPlugin.new req = Hash[*%w(from to).map { |e| [e.to_sym, /#{plugin.languages.join("|")}/] }.flatten] +plugin.map 'translate [:from] [:to] :url', + :action => :cmd_translate_url, :requirements => req.merge(:url => %r{^https?://[^\s]*}) +plugin.map 'translator [:from] [:to] :url', + :action => :cmd_translate_url, :requirements => req.merge(:url => %r{^https?://[^\s]*}) plugin.map 'translate [:from] [:to] *phrase', :action => :cmd_translator, :thread => true, :requirements => req plugin.map 'translator [:from] [:to] *phrase',