4 # :title: Dictionary lookup plugin for rbot
\r
6 # Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
\r
7 # Copyright:: (C) 2006-2007 Giuseppe Bilotta
\r
10 # Provides a link to the definition of a word in one of the supported
\r
11 # dictionaries. Currently available are
\r
12 # * the Oxford dictionary for (British) English
\r
13 # * the De Mauro/Paravia dictionary for Italian
\r
14 # * the Chambers dictionary for English (accepts both US and UK)
\r
16 # Other plugins can use this one to check if a given word is valid in italian
\r
17 # or english by using the is_italian?/is_british?/is_english? methods
\r
19 # TODO: cache results and reuse them if get_cached returns a cache copy
\r
23 DEMAURO_LEMMA = /<anchor>(.*?)(?: - (.*?))<go href="lemma.php\?ID=(\d+)"\/><\/anchor>/
\r
25 class DictPlugin < Plugin
\r
26 BotConfig.register BotConfigIntegerValue.new('dict.hits',
\r
28 :desc => "Number of hits to return from a dictionary lookup")
\r
29 BotConfig.register BotConfigIntegerValue.new('dict.first_par',
\r
31 :desc => "When set to n > 0, the bot will return the first paragraph from the first n dictionary hits")
\r
35 @dmurl = "http://www.demauroparavia.it/"
\r
36 @dmwapurl = "http://wap.demauroparavia.it/index.php?lemma=%s"
\r
37 @dmwaplemma = "http://wap.demauroparavia.it/lemma.php?ID=%s"
\r
38 @oxurl = "http://www.askoxford.com/concise_oed/%s"
\r
39 @chambersurl = "http://www.chambersharrap.co.uk/chambers/features/chref/chref.py/main?query=%s&title=21st"
\r
43 def help(plugin, topic="")
\r
46 return "demauro <word> => provides a link to the definition of <word> from the De Mauro/Paravia dictionary"
\r
48 return "oxford <word> => provides a link to the definition of <word> (it can also be an expression) from the Concise Oxford dictionary"
\r
50 return "chambers <word> => provides a link to the definition of <word> (it can also be an expression) from the Chambers 21st Century Dictionary"
\r
52 return "<dictionary> <word>: check for <word> on <dictionary> where <dictionary> can be one of: demauro, oxford, chambers"
\r
55 def demauro(m, params)
\r
56 justcheck = params[:justcheck]
\r
58 word = params[:word].downcase
\r
59 url = @dmwapurl % URI.escape(word)
\r
60 xml = @bot.httputil.get_cached(url)
\r
62 info = @bot.httputil.last_response
\r
63 info = info ? " (#{info.code} - #{info.message})" : ""
\r
64 return false if justcheck
\r
65 m.reply "An error occurred while looking for #{word}#{info}"
\r
68 if xml=~ /Non ho trovato occorrenze per/
\r
69 return false if justcheck
\r
70 m.reply "Nothing found for #{word}"
\r
73 entries = xml.scan(DEMAURO_LEMMA)
\r
76 if !entries.assoc(word) and !entries.assoc(word.upcase)
\r
77 return false if justcheck
\r
78 text += " not found. Similar words"
\r
80 return true if justcheck
\r
83 hits = @bot.config['dict.hits']
\r
84 text += entries[0...hits].map { |ar|
\r
86 urls << @dmwaplemma % ar[2]
\r
87 "#{n}. #{Bold}#{ar[0]}#{Bold} - #{ar[1].gsub(/<\/?em>/,'')}: #{@dmurl}#{ar[2]}"
\r
91 first_pars = @bot.config['dict.first_par']
\r
93 return unless first_pars > 0
\r
95 Utils.get_first_pars urls, first_pars, :http_util => @bot.httputil, :message => m,
\r
96 :strip => /^\S+\s+-\s+/
\r
100 def is_italian?(word)
\r
101 return demauro(nil, :word => word, :justcheck => true)
\r
105 def oxford(m, params)
\r
106 justcheck = params[:justcheck]
\r
108 word = params[:word].join
\r
109 [word, word + "_1"].each { |check|
\r
110 url = @oxurl % URI.escape(check)
\r
111 h = @bot.httputil.head(url)
\r
113 m.reply("#{word} found: #{url}") unless justcheck
\r
117 return false if justcheck
\r
118 m.reply "#{word} not found"
\r
121 def is_british?(word)
\r
122 return oxford(nil, :word => word, :justcheck => true)
\r
126 def chambers(m, params)
\r
127 justcheck = params[:justcheck]
\r
129 word = params[:word].to_s.downcase
\r
130 url = @chambersurl % URI.escape(word)
\r
131 xml = @bot.httputil.get_cached(url)
\r
134 info = @bot.httputil.last_response
\r
135 info = info ? " (#{info.code} - #{info.message})" : ""
\r
136 return false if justcheck
\r
137 m.reply "An error occurred while looking for #{word}#{info}"
\r
139 when /Sorry, no entries for <b>.*?<\/b> were found./
\r
140 return false if justcheck
\r
141 m.reply "Nothing found for #{word}"
\r
143 when /No exact matches for <b>.*?<\/b>, but the following may be helpful./
\r
144 return false if justcheck
\r
145 m.reply "Nothing found for #{word}, but see #{url} for possible suggestions"
\r
147 return true if justcheck
\r
148 m.reply "#{word}: #{url}"
\r
152 def is_english?(word)
\r
153 return chambers(nil, :word => word, :justcheck => true)
\r
158 plugin = DictPlugin.new
\r
159 plugin.map 'demauro :word', :action => 'demauro'
\r
160 plugin.map 'oxford *word', :action => 'oxford'
\r
161 plugin.map 'chambers *word', :action => 'chambers'
\r