3
* Copyright 2011 Yahoo! Inc.
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions are met:
8
* * Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* * Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
* * Neither the name of the Yahoo! Inc. nor the
14
* names of its contributors may be used to endorse or promote products
15
* derived from this software without specific prior written permission.
17
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
* DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY
21
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
YUI.add('api-search', function (Y) {
35
Y.APISearch = Y.Base.create('apiSearch', Y.Base, [Y.AutoCompleteBase], {
36
// -- Public Properties ----------------------------------------------------
38
'<li class="result {resultType}">' +
40
'<h3 class="title">{name}</h3>' +
41
'<span class="type">{resultType}</span>' +
42
'<div class="description">{description}</div>' +
43
'<span class="className">{class}</span>' +
47
// -- Initializer ----------------------------------------------------------
48
initializer: function () {
53
// -- Protected Methods ----------------------------------------------------
54
_apiResultFilter: function (query, results) {
55
// Filter components out of the results.
56
return YArray.filter(results, function (result) {
57
return result.raw.resultType === 'component' ? false : result;
61
_apiResultFormatter: function (query, results) {
62
return YArray.map(results, function (result) {
63
var raw = Y.merge(result.raw), // create a copy
64
desc = raw.description || '';
66
// Convert description to text and truncate it if necessary.
67
desc = Node.create('<div>' + desc + '</div>').get('text');
69
if (desc.length > 65) {
70
desc = Y.Escape.html(desc.substr(0, 65)) + ' …';
72
desc = Y.Escape.html(desc);
75
raw['class'] || (raw['class'] = '');
76
raw.description = desc;
78
// Use the highlighted result name.
79
raw.name = result.highlighted;
81
return Lang.sub(this.RESULT_TEMPLATE, raw);
85
_apiTextLocator: function (result) {
86
return result.displayName || result.name;
89
// -- Attributes -----------------------------------------------------------
92
valueFn: function () {
93
return this._apiResultFormatter;
98
valueFn: function () {
99
return this._apiResultFilter;
108
value: 'data.results'
112
valueFn: function () {
113
return this._apiTextLocator;
118
value: '/api/v1/search?q={query}&count={maxResults}'
123
}, '3.4.0', {requires: [
124
'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources',