オートコンプリートとGoogle Suggestion APIを組合わせる

Curl External Library のオートコンプリート機能にGoogle Suggestion APIを組み合わせたサンプルです。

まずは、Google Suggestionからデータを取得する方法です。以下はキーワードを入力すると候補文字のリストを返してくれます。

{define-proc {find-google-suggestions
                 word:String,
                 host-locale:Locale = {get-host-locale}
             }:{Array-of String}
    def query =
        “http://suggestqueries.google.com/complete/search?hl=%s&qu=%s&json=t
    def suggestions = {{Array-of String}}
    def qu = {url-encode-string word}
    {with-open-streams
        tis = {read-open {url {format query, host-locale.name, qu}}}
     do
        def results = {JsonValue-parse tis} asa JsonArray
        {for v in results[1] asa JsonArray do
            {suggestions.append v asa String}
        }
    }
    {return suggestions}
}

次にAutocompleteTextFieldで、データの候補を表示するためのAutocompleteProviderクラスを作成します。例えば以下のようにGoogleSuggestionProviderクラスをAutocompleteProviderを継承して作成します。

 

{define-class public open GoogleSuggestionProvider
  {inherits AutocompleteProvider}

  {method public open {refresh acf:AutocompleteMixin}:void
    def word = acf.text-field.value
    {if word.size > 0 then
        {acf.populate-from-strings
            {find-google-suggestions word}
        }
    }
  }

  {constructor public {default max-results:int = 10}
    {construct-super max-results}
  }
}

最後にAutocompleteTextFieldを利用して、データを表示させます。

{AutocompleteTextField
    {GoogleSuggestionProvider},
    {on FocusIn at acf:AutocompleteTextField do
        {acf.provider.refresh acf}
    }
}