Skip to content

Instantly share code, notes, and snippets.

@iratqq
Created January 22, 2011 14:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iratqq/791169 to your computer and use it in GitHub Desktop.
Save iratqq/791169 to your computer and use it in GitHub Desktop.
(require-extension (srfi 1))
(require "http-client.scm")
(require "util.scm")
(require-dynlib "expat")
(define google-suggest-charset-alist
'((ja . "Shift-JIS")))
(define (parse-google-suggest xml-str)
(let ((parser (xml-parser-create "UTF-8"))
(path '())
(data '()))
(define (elem-start name atts)
(if (and (equal? name "suggestion")
(equal? path '("toplevel" "CompleteSuggestion")))
(set! data (append data
(map cdr
(filter (lambda (x) (equal? (car x) "data")) atts)))))
(set! path (append path (list name))))
(define (elem-end name)
(set! path (drop-right path 1)))
(if xml-str
(begin
(xml-element-handler-set! parser elem-start elem-end)
(xml-parse parser xml-str 1)
data)
'())))
(define (google-suggest str lang encode use-ssl?)
(define (iconv-convert to-code from-code from-str)
(if (equal? to-code from-code)
from-str
(and-let* ((ic (iconv-open to-code from-code))
(to-str (iconv-code-conv ic from-str)))
(iconv-release ic)
to-str)))
(define (google-suggest-server use-ssl?)
(if use-ssl?
"encrypted.google.com"
"google.com"))
(define (make-lang-query)
(if (assq lang google-suggest-charset-alist)
(format "&hl=~a" (symbol->string lang))
""))
(define (string->lang str)
(if (assq lang
google-suggest-charset-alist)
(iconv-convert "UTF-8"
(assq-cdr lang
google-suggest-charset-alist)
str)
str))
(and-let* ((uri-string (http:encode-uri-string (iconv-convert "UTF-8" encode str)))
(server (google-suggest-server use-ssl?)))
(let* ((proxy (make-http-proxy-from-custom))
(ssl (and use-ssl?
(make-http-ssl (SSLv3-client-method) 443)))
(result (http:get server
(format "/complete/search?output=toolbar&q=~a~a"
uri-string
(make-lang-query))
80
proxy
ssl))
(parsed (parse-google-suggest (string->lang result))))
(map (lambda (s)
(iconv-convert encode "UTF-8" s))
parsed))))
(print (google-suggest "foo" #f "UTF-8" #t))
(print (google-suggest "あ" 'ja "EUC-JP" #t))
(print (google-suggest "い" 'ja "EUC-JP" #t))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment