diff options
author | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2006-07-05 16:19:40 +0000 |
---|---|---|
committer | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2006-07-05 16:19:40 +0000 |
commit | ec67cbca6543d4eb7a95e83fb10f340383bb47e7 (patch) | |
tree | fdacd2f08723c53ffedc2293e20c0bea3e8c056b /data/rbot | |
parent | 602da36df14da2cf1bab2b440e8f39018bba0b3f (diff) |
Add plugin for dictionary lookup using the (Italian) De Mauro/Paravia online dictionary
Diffstat (limited to 'data/rbot')
-rw-r--r-- | data/rbot/plugins/demauro.rb | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/data/rbot/plugins/demauro.rb b/data/rbot/plugins/demauro.rb new file mode 100644 index 00000000..7e5705a1 --- /dev/null +++ b/data/rbot/plugins/demauro.rb @@ -0,0 +1,95 @@ +# TODO: cache definitions
+
+require 'erb'
+
+class DeMauroPlugin < Plugin
+ include ERB::Util
+
+ def initialize
+ super
+ @dmurl = "http://www.demauroparavia.it/"
+ end
+
+
+ def help(plugin, topic="")
+ return "demauro <parola> => fornisce il link della definizione della parola dal dizionario De Mauro/Paravia"
+ end
+
+ def demauro(m, params)
+ parola = params[:parola]
+ url = @dmurl + "cerca?stringa=#{url_encode(parola)}"
+ uri = URI.parse(url)
+ http = @bot.httputil.get_proxy(uri)
+ xml = nil
+ defurls = Array.new
+ begin
+ http.start() { |http|
+ resp = http.get(uri)
+ case resp.code
+ when "200"
+ xml = resp.body
+ when "302"
+ loc = resp['location']
+ if loc =~ /#{@dmurl}\d+/
+ defurls << loc
+ end
+ else
+ debug resp.to_a
+ end
+ }
+ rescue => e
+ debug "HttpUtil.get exception: #{e}, while trying to get #{uri}"
+ m.reply "Errore"
+ return
+ end
+ if xml
+ if xml=~ /Non ho trovato occorrenze per/
+ m.reply "Parola non trovata"
+ return
+ else
+ xml.gsub(/href="(\d+)"/) { |match|
+ debug match.to_a.join(" || ")
+ defurls << "#{@dmurl}#{$1}"
+ }
+ end
+ end
+ lemmas = Array.new
+ defurls.each { |url|
+ uri = URI.parse(url)
+ http = @bot.httputil.get_proxy(uri)
+ begin
+ debug "Scanning #{url}"
+ http.start() { |http|
+ resp = http.get(uri)
+ case resp.code
+ when "200"
+ debug "Got data"
+ matched = /<span class="lemma">(.*)<\/span><br\/><span class="qualifica".*?>(.*?)<\/span><br\/>/.match(resp.body)
+ dirtylemma = matched[1]
+ qual = matched[2]
+ lemma = dirtylemma.gsub(/<\/?span(?: class="pipelemma")?>/,"")
+ debug lemma
+ lemma = lemma.gsub(/<sup>1<\/sup>/,'¹').gsub(/<sup>2<\/sup>/,'²').gsub(/<sup>3<\/sup>/,'³')
+ lemma = lemma.gsub(/<sup>4<\/sup>/,'⁴').gsub(/<sup>5<\/sup>/,'⁵').gsub(/<sup>6<\/sup>/,'⁶')
+ lemma = lemma.gsub(/<sup>7<\/sup>/,'⁷').gsub(/<sup>8<\/sup>/,'⁸').gsub(/<sup>9<\/sup>/,'⁹')
+ debug lemma
+ lemma += " #{qual} (#{uri})"
+ lemmas << lemma
+ else
+ debug resp.to_a.join("\r")
+ end
+ }
+ rescue => e
+ debug "Exception '#{e}' while trying to get and parse #{uri}"
+ m.reply "Errore"
+ return
+ end
+ }
+ pre = lemmas.length > 1 ? "Lemmi trovati" : "Lemma trovato"
+ m.reply "#{pre}: #{lemmas.join(' ; ')}"
+ end
+end
+
+plugin = DeMauroPlugin.new
+plugin.map 'demauro :parola', :action => 'demauro'
+
|