143 lines
4.0 KiB
JavaScript
143 lines
4.0 KiB
JavaScript
|
|
|||
|
/**
|
|||
|
* Adaptation of the suggest widget to query the Wikibase autocomplete API directly
|
|||
|
*/
|
|||
|
|
|||
|
(function() {
|
|||
|
|
|||
|
/**
|
|||
|
* Options:
|
|||
|
* mediawiki_endpoint: url of the MediaWiki API
|
|||
|
* entity_type: type of entity to suggest (one of form, item, lexeme, property, sense, mediainfo…)
|
|||
|
* language: language code of the language to search in
|
|||
|
*/
|
|||
|
|
|||
|
$.suggest(
|
|||
|
"suggestWikibase",
|
|||
|
$.extend(
|
|||
|
true,
|
|||
|
{},
|
|||
|
$.suggest.suggest.prototype,
|
|||
|
{
|
|||
|
create_item: function(data, response_data) {
|
|||
|
var css = this.options.css;
|
|||
|
|
|||
|
var li = $("<li>").addClass(css.item);
|
|||
|
|
|||
|
var name = $("<div>")
|
|||
|
.addClass(css.item_name)
|
|||
|
.append(
|
|||
|
$("<label>")
|
|||
|
.append($.suggest.strongify(data.name || data.guid, response_data.prefix)));
|
|||
|
|
|||
|
data.name = name.text(); // this converts html escaped strings like "&" back to "&"
|
|||
|
if (data.description) {
|
|||
|
var descriptionSpan = $("<span></span>").text(data.description);
|
|||
|
name.append(descriptionSpan);
|
|||
|
}
|
|||
|
|
|||
|
li.append(name);
|
|||
|
|
|||
|
name.prepend($("<div>").addClass(css.item_type).text(data.id));
|
|||
|
|
|||
|
return li;
|
|||
|
},
|
|||
|
|
|||
|
request: function(val, cursor) {
|
|||
|
var self = this,
|
|||
|
o = this.options;
|
|||
|
|
|||
|
var query = val;
|
|||
|
|
|||
|
var entity_type = o.entity_type || 'item';
|
|||
|
|
|||
|
var data = {
|
|||
|
action: 'wbsearchentities',
|
|||
|
language: o.language,
|
|||
|
search: query,
|
|||
|
type: entity_type,
|
|||
|
format: 'json',
|
|||
|
origin: '*'
|
|||
|
};
|
|||
|
|
|||
|
if (cursor) {
|
|||
|
data['continue'] = cursor;
|
|||
|
}
|
|||
|
|
|||
|
var url = o.mediawiki_endpoint + "?" + $.param(data, true);
|
|||
|
var cached = $.suggest.cache[url];
|
|||
|
if (cached) {
|
|||
|
this.response(cached, cursor ? cursor : -1, true);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
clearTimeout(this.request.timeout);
|
|||
|
|
|||
|
var ajax_options = {
|
|||
|
url: o.mediawiki_endpoint,
|
|||
|
data: data,
|
|||
|
traditional: true,
|
|||
|
beforeSend: function(xhr) {
|
|||
|
var calls = self.input.data("request.count.suggest") || 0;
|
|||
|
if (!calls) {
|
|||
|
self.trackEvent(self.name, "start_session");
|
|||
|
}
|
|||
|
calls += 1;
|
|||
|
self.trackEvent(self.name, "request", "count", calls);
|
|||
|
self.input.data("request.count.suggest", calls);
|
|||
|
},
|
|||
|
success: function(data) {
|
|||
|
$.suggest.cache[url] = data;
|
|||
|
// translate the results of the MediaWiki API to that of the reconciliation API
|
|||
|
var translated = {
|
|||
|
prefix: val, // keep track of prefix to match up response with input value
|
|||
|
result: (data.search || []).map(result => { return {
|
|||
|
id: result.id,
|
|||
|
name: result.label,
|
|||
|
description: result.description};})
|
|||
|
};
|
|||
|
self.response(translated, cursor ? cursor : -1);
|
|||
|
},
|
|||
|
error: function(xhr) {
|
|||
|
self.status_error();
|
|||
|
self.trackEvent(self.name, "request", "error", {
|
|||
|
url: this.url,
|
|||
|
response: xhr ? xhr.responseText : ''
|
|||
|
});
|
|||
|
self.input.trigger("fb-error", Array.prototype.slice.call(arguments));
|
|||
|
},
|
|||
|
complete: function(xhr) {
|
|||
|
if (xhr) {
|
|||
|
self.trackEvent(self.name, "request", "tid",
|
|||
|
xhr.getResponseHeader("X-Metaweb-TID"));
|
|||
|
}
|
|||
|
},
|
|||
|
dataType: "json",
|
|||
|
cache: true
|
|||
|
};
|
|||
|
|
|||
|
this.request.timeout = setTimeout(function() {
|
|||
|
$.ajax(ajax_options);
|
|||
|
}, o.xhr_delay);
|
|||
|
}
|
|||
|
|
|||
|
}));
|
|||
|
|
|||
|
$.extend(
|
|||
|
$.suggest.suggestWikibase,
|
|||
|
{
|
|||
|
defaults: $.extend(
|
|||
|
true,
|
|||
|
{},
|
|||
|
$.suggest.suggest.defaults, {
|
|||
|
scoring: "schema",
|
|||
|
css: { pane: "fbs-pane fbs-pane-type" }
|
|||
|
}
|
|||
|
)
|
|||
|
}
|
|||
|
);
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
|