1 ;;; riece-google.el --- Interface to Google API
2 ;; Copyright (C) 2005 OHASHI Akira
4 ;; Author: OHASHI Akira <bg66@koka-in.org>
5 ;; SASADA Koichi <ko1 at atdot.net>
6 ;; Keywords: IRC, riece
8 ;; This file is part of Riece.
10 ;; This program is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; This program is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
27 ;; This add-on searches keywords by Google.
29 ;; Ruby code was stolen (and modified) from nadoka.
31 ;; To use, add the following line to your ~/.riece/init.el:
32 ;; (add-to-list 'riece-addons 'riece-google)
36 (require 'riece-message)
38 (defgroup riece-google nil
39 "Interface to Google API."
43 (defcustom riece-google-ruby-command "ruby"
44 "Command name for Ruby interpreter."
48 (defcustom riece-google-program
50 # Copyright (c) 2004 SASADA Koichi <ko1 at atdot.net>
52 # This program is free software with ABSOLUTELY NO WARRANTY.
53 # You can re-distribute and/or modify this program under
54 # the same terms of the Ruby's lisence.
56 require 'soap/wsdlDriver'
61 keywords = '" keywords "'
62 max_results = " max-results "
63 license_key = '" license-key "'
64 default_lang = '" lang "'
65 google_wsdl = 'http://api.google.com/GoogleSearch.wsdl'
66 google = SOAP::WSDLDriverFactory.new(google_wsdl).create_driver
69 CGI.unescapeHTML(str.gsub(/\\<.+?\\>/, ''))
73 if lang.empty? || /^lang_/ =~ lang
80 def show_char_code_and_erace_tag str
83 CGI.unescapeHTML(str.gsub(/\\<.+?\\>/, '')).tojis
86 str = Iconv.conv(\"EUC-JP\", \"UTF-8\", str)
87 CGI.unescapeHTML(str.gsub(/\\<.+?\\>/, '')).tojis
89 \"(char code problem: #{e.class}[#{e.message.dump}])\"
96 def search_char_code str
102 Iconv.conv(\"UTF-8\", \"EUC-JP\", str.toeuc)
104 \"(char code problem: #{e.class})\"
114 lang = lang_check(default_lang)
115 word = search_char_code(keywords)
116 result = google.doGoogleSearch(
117 license_key, word, 0, max_results, false, \"\",
118 false, lang, 'utf-8', 'utf-8'
121 count = result.estimatedTotalResultsCount
123 word = show_char_code_and_erace_tag(keywords)
124 count = count.to_s.gsub(/(\\d)(?=\\d{3}+$)/, '\\\\1,')
125 time = result.searchTime.to_s
126 print \"Search results for #{word} (Hits: #{count}: Time: #{time}):\\n\"
128 result.resultElements.each_with_index{|e, i|
129 title = show_char_code_and_erace_tag(e.title)
131 print \"#{title} - #{url}\\n\"
134 print \"no match\\n\"
137 rescue Exception => e
138 print \"#{e.class}(#{e.message})\"
141 "Ruby program for searching by Google."
143 :group 'riece-google)
145 (defcustom riece-google-license-key nil
146 "*License key for Google API."
148 :group 'riece-google)
150 (defcustom riece-google-default-lang "lang_ja"
151 "*Default language for search keywords."
153 :group 'riece-google)
155 (defconst riece-google-regexp
156 "^go\\(o+\\)gle\\(:\\([a-z]+\\)\\)?>\\s-*\\(.*\\)")
158 (defvar riece-google-enabled nil)
160 (defconst riece-google-description
161 "Search keywords by Google.")
163 (defvar riece-google-target nil)
165 (defun riece-google-display-message-function (message)
166 (when (and riece-google-enabled
167 (stringp riece-google-license-key)
168 (string-match riece-google-regexp (riece-message-text message)))
169 (let ((keywords (match-string 4 (riece-message-text message)))
170 (max-results (number-to-string
172 (match-string 1 (riece-message-text message)))))
173 (lang (or (match-string 3 (riece-message-text message))
174 riece-google-default-lang))
175 (process-connection-type nil)
177 (coding-system-for-read 'binary)
178 (coding-system-for-write 'binary)
179 (process (start-process "Google" (generate-new-buffer " *Google*")
180 riece-google-ruby-command)))
181 (setq riece-google-target (riece-message-target message))
182 (process-send-string process
184 (riece-google-substitute-variables
185 (riece-google-substitute-variables
186 (riece-google-substitute-variables
187 (riece-google-substitute-variables
190 'max-results max-results)
191 'license-key riece-google-license-key)
193 (process-send-eof process)
194 (with-current-buffer (process-buffer process)
195 (set-buffer-multibyte t)
197 (set-buffer-modified-p nil))
198 (set-process-filter process #'riece-google-filter)
199 (set-process-sentinel process #'riece-google-sentinel))))
201 (defun riece-google-filter (process output)
202 (when (buffer-live-p (process-buffer process))
203 (with-current-buffer (process-buffer process)
204 (goto-char (point-max))
206 (goto-char (point-min))
207 (while (progn (end-of-line) (and (not (eobp)) (eq (char-after) ?\n)))
208 (if (eq (char-after (1- (point))) ?\r) ; cut off preceding LF
209 (delete-region (1- (point)) (point)))
210 (riece-google-send-string riece-google-target
211 (buffer-substring (point-min) (point)))
212 (delete-region (point-min) (progn (beginning-of-line 2) (point)))))))
214 (defun riece-google-sentinel (process string)
215 (delete-process process))
217 (defun riece-google-send-string (target message)
219 (format "NOTICE %s :%s\r\n" (riece-identity-prefix target) message))
220 (riece-display-message
221 (riece-make-message (riece-current-nickname) target message 'notice)))
223 (defun riece-google-substitute-variables (program variable value)
224 (setq program (copy-sequence program))
225 (let ((pointer program))
227 (setq pointer (memq variable program))
229 (setcar pointer value)))
232 (defun riece-google-insinuate ()
233 (add-hook 'riece-after-display-message-functions
234 'riece-google-display-message-function))
236 (defun riece-google-enable ()
237 (setq riece-google-enabled t))
239 (defun riece-google-disable ()
240 (setq riece-google-enabled nil))
242 (provide 'riece-google)
244 ;;; riece-google.el ends here