jenkins-bot has submitted this change and it was merged.
Change subject: Introduce Wikibase API and replace every other usage with it
......................................................................
Introduce Wikibase API and replace every other usage with it
Change-Id: I2f9a3021ad5c0e838fa7acd9911774126b98415f
---
M index.html
M wikibase/config.js
M wikibase/init.js
A wikibase/queryService/api/Wikibase.js
M wikibase/queryService/ui/App.js
M wikibase/queryService/ui/editor/Editor.js
M wikibase/queryService/ui/editor/hint/Rdf.js
M wikibase/queryService/ui/editor/hint/Sparql.js
R wikibase/queryService/ui/editor/tooltip/Rdf.js
M wikibase/queryService/ui/visualEditor/SelectorBox.js
M wikibase/queryService/ui/visualEditor/VisualEditor.js
11 files changed, 211 insertions(+), 97 deletions(-)
Approvals:
Smalyshev: Looks good to me, approved
jenkins-bot: Verified
diff --git a/index.html b/index.html
index 75040a9..1c57c1c 100644
--- a/index.html
+++ b/index.html
@@ -208,11 +208,11 @@
<script src="vendor/d3/d3.min.js"></script>
<script src="vendor/select2/dist/js/select2.min.js"></script>
- <script
src="wikibase/codemirror/addon/tooltip/WikibaseRDFTooltip.js"></script>
<script src="wikibase/queryService/ui/App.js"></script>
<script src="wikibase/queryService/ui/editor/hint/Sparql.js"></script>
<script src="wikibase/queryService/ui/editor/hint/Rdf.js"></script>
+ <script src="wikibase/queryService/ui/editor/tooltip/Rdf.js"></script>
<script src="wikibase/queryService/ui/editor/Editor.js"></script>
<script
src="wikibase/queryService/ui/visualEditor/VisualEditor.js"></script>
<script
src="wikibase/queryService/ui/visualEditor/SelectorBox.js"></script>
@@ -227,6 +227,7 @@
<script
src="wikibase/queryService/ui/resultBrowser/BubbleChartResultBrowser.js"></script>
<script src="wikibase/queryService/api/Sparql.js"></script>
<script src="wikibase/queryService/api/QuerySamples.js"></script>
+ <script src="wikibase/queryService/api/Wikibase.js"></script>
<script src="wikibase/queryService/RdfNamespaces.js"></script>
<script src="wikibase/config.js"></script>
<script src="wikibase/init.js"></script>
diff --git a/wikibase/config.js b/wikibase/config.js
index 7c2eb82..8de6159 100644
--- a/wikibase/config.js
+++ b/wikibase/config.js
@@ -6,10 +6,10 @@
api : {
sparql : {
uri : '/bigdata/namespace/wdq/sparql'
+ },
+ wikibase: {
+ uri :
'https://www.wikidata.org/w/api.php'
}
- },
- visualEditor: {
- entitySearchEndpointPath :
'https://www.wikidata.org/w/'
}
};
diff --git a/wikibase/init.js b/wikibase/init.js
index bda4d5c..5650686 100644
--- a/wikibase/init.js
+++ b/wikibase/init.js
@@ -2,10 +2,14 @@
'use strict';
$( document ).ready( function () {
+ var wikibaseApi = new wikibase.queryService.api.Wikibase(
config.api.wikibase.uri );
+ var rdfHint = new wikibase.queryService.ui.editor.hint.Rdf(
wikibaseApi );
+ var rdfTooltip = new
wikibase.queryService.ui.editor.tooltip.Rdf( wikibaseApi );
+
new wikibase.queryService.ui.App(
$( '.wikibase-queryservice ' ),
- null,
- new
wikibase.queryService.ui.visualEditor.VisualEditor(
config.visualEditor.entitySearchEndpointPath ),
+ new wikibase.queryService.ui.editor.Editor(
rdfHint, null, rdfTooltip ),
+ new
wikibase.queryService.ui.visualEditor.VisualEditor( wikibaseApi ),
new wikibase.queryService.api.Sparql(
config.api.sparql.uri )
);
} );
diff --git a/wikibase/queryService/api/Wikibase.js
b/wikibase/queryService/api/Wikibase.js
new file mode 100644
index 0000000..fbf0d03
--- /dev/null
+++ b/wikibase/queryService/api/Wikibase.js
@@ -0,0 +1,73 @@
+var wikibase = wikibase || {};
+wikibase.queryService = wikibase.queryService || {};
+wikibase.queryService.api = wikibase.queryService.api || {};
+
+wikibase.queryService.api.Wikibase = ( function( $ ) {
+ 'use strict';
+
+ var API_ENDPOINT = 'https://www.wikidata.org/w/api.php';
+ var LANGUAGE = 'en';
+
+ var SEARCH_ENTITES = {
+ action: 'wbsearchentities',
+ format: 'json',
+ contiunue: 0,
+ language: LANGUAGE,
+ uselang: LANGUAGE
+ };
+
+
+ /**
+ * API for the Wikibase API
+ *
+ * @class wikibase.queryService.api.Wikibase
+ * @license GNU GPL v2+
+ *
+ * @author Jonas Kress
+ * @constructor
+ * @param {string} endpoint default:
'https://www.wikidata.org/w/api.php'
+ */
+ function SELF( endpoint, defaultLanguage ) {
+ this._endpoint = API_ENDPOINT;
+
+ if( endpoint ){
+ this._endpoint = endpoint;
+ }
+ }
+
+ /**
+ * @property {string}
+ * @private
+ */
+ SELF.prototype._endpoint= null;
+
+ /**
+ * Search an entity with using wbsearchentities
+ *
+ * @param {string} term search string
+ * @param {string} type entity type to search for
+ * @param {string} language of search string default:en
+ *
+ * @return {jQuery.Deferred}
+ */
+ SELF.prototype.searchEntities = function( term, type, language ) {
+ var query = SEARCH_ENTITES;
+ query.search = term;
+
+ if( type ){
+ query.type = type;
+ }
+
+ if( language ){
+ query.type = type;
+ }
+
+ return $.ajax( {
+ url: this._endpoint + '?' + jQuery.param( query ),
+ dataType: 'jsonp'
+ } );
+ };
+
+ return SELF;
+
+}( jQuery ) );
diff --git a/wikibase/queryService/ui/App.js b/wikibase/queryService/ui/App.js
index b4f95e9..50f00b7 100644
--- a/wikibase/queryService/ui/App.js
+++ b/wikibase/queryService/ui/App.js
@@ -19,8 +19,8 @@
* @constructor
*
* @param {jQuery} $element
- * @param {wikibase.queryService.ui.editor.Editor}
- * @param {wikibase.queryService.api.Sparql}
+ * @param {wikibase.queryService.ui.editor.Editor} editor
+ * @param {wikibase.queryService.api.Sparql} visualEditor
*/
function SELF( $element, editor, visualEditor, sparqlApi,
querySamplesApi ) {
diff --git a/wikibase/queryService/ui/editor/Editor.js
b/wikibase/queryService/ui/editor/Editor.js
index 70e4b00..cf1a118 100644
--- a/wikibase/queryService/ui/editor/Editor.js
+++ b/wikibase/queryService/ui/editor/Editor.js
@@ -3,7 +3,7 @@
wikibase.queryService.ui = wikibase.queryService.ui || {};
wikibase.queryService.ui.editor = wikibase.queryService.ui.editor || {};
-wikibase.queryService.ui.editor.Editor = ( function( $, CodeMirror,
WikibaseRDFTooltip, localStorage ) {
+wikibase.queryService.ui.editor.Editor = ( function( $, wikibase, CodeMirror,
WikibaseRDFTooltip, localStorage ) {
"use strict";
var CODEMIRROR_DEFAULTS = {
@@ -28,8 +28,24 @@
* @author Stanislav Malyshev
* @author Jonas Kress
* @constructor
+ * @param {wikibase.queryService.ui.editor.hint.Rdf} rdfHint
+ * @param {wikibase.queryService.ui.editor.hint.Sparql} sparqlHint
+ * @param {wikibase.queryService.ui.editor.tooltip.Rdf} rdfTooltip
*/
- function SELF() {
+ function SELF( rdfHint, sparqlHint, rdfTooltip ) {
+ this._rdfHint = rdfHint;
+ this._sparqlHint = sparqlHint;
+ this._rdfTooltip = rdfTooltip;
+
+ if( !this._sparqlHint ){
+ this._sparqlHint = new
wikibase.queryService.ui.editor.hint.Sparql();
+ }
+ if( !this._rdfHint ){
+ this._rdfHint = new
wikibase.queryService.ui.editor.hint.Rdf();
+ }
+ if ( !this._rdfTooltip ){
+ this._rdfTooltip = new
wikibase.queryService.ui.editor.tooltip.Rdf();
+ }
}
/**
@@ -52,6 +68,12 @@
SELF.prototype._rdfHint = null;
/**
+ * @property {wikibase.queryService.ui.editor.tooltip.Rdf}
+ * @private
+ **/
+ SELF.prototype._rdfTooltip = null;
+
+ /**
* Construct an this._editor on the given textarea DOM element
*
* @param {Element} element
@@ -65,12 +87,12 @@
self.clearError();
if( changeObj.text[0] === '?' ||
changeObj.text[0] === '#' ){
- editor.showHint({closeCharacters: /[\s]/});
+ editor.showHint( {closeCharacters: /[\s]/} );
}
} );
this._editor.focus();
- new WikibaseRDFTooltip(this._editor);
+ this._rdfTooltip.setEditor( this._editor );
this._registerHints();
};
@@ -98,12 +120,6 @@
SELF.prototype._getHints = function( editorContent, lineContent,
lineNum, cursorPos ) {
var deferred = new $.Deferred(),
self = this;
- if( !this._sparqlHint ){
- this._sparqlHint = new
wikibase.queryService.ui.editor.hint.Sparql();
- }
- if( !this._rdfHint ){
- this._rdfHint = new
wikibase.queryService.ui.editor.hint.Rdf();
- }
this._rdfHint.getHint( editorContent, lineContent, lineNum,
cursorPos ).done( function( hint ){
hint.from = CodeMirror.Pos( hint.from.line, hint.from.char );
@@ -238,4 +254,4 @@
return SELF;
-}( jQuery, CodeMirror, WikibaseRDFTooltip, window.localStorage ) );
+}( jQuery, wikibase, CodeMirror, window.localStorage ) );
diff --git a/wikibase/queryService/ui/editor/hint/Rdf.js
b/wikibase/queryService/ui/editor/hint/Rdf.js
index 4547984..0039a48 100755
--- a/wikibase/queryService/ui/editor/hint/Rdf.js
+++ b/wikibase/queryService/ui/editor/hint/Rdf.js
@@ -21,22 +21,27 @@
'http://www.wikidata.org/prop/reference/value/':
'property',
'http://www.wikidata.org/wiki/Special:EntityData/':
'item',
'http://www.wikidata.org/entity/': 'item'
- },
- ENTITY_SEARCH_API_ENDPOINT =
'https://www.wikidata.org/w/api.php?action=wbsearchentities&' +
-
'search={term}&format=json&language=en&uselang=en&type={entityType}&continue=0';
+ };
/**
* Code completion for Wikibase entities RDF prefixes in SPARQL
* completes SPARQL keywords and ?variables
*
+ * @class wikibase.queryService.ui.editor.hint.Rdf
* licence GNU GPL v2+
*
* @author Jonas Kress
+ * @param {wikibase.queryService.api.Wikibase} api
* @param {wikibase.queryService.RdfNamespace} rdfNamespace
* @constructor
*/
- var SELF = MODULE.Rdf = function( rdfNamespaces ) {
+ var SELF = MODULE.Rdf = function( api, rdfNamespaces ) {
+ this._api = api;
this._rdfNamespaces = rdfNamespaces;
+
+ if( !this._api ){
+ this._api = new wikibase.queryService.api.Wikibase();
+ }
if( !this._rdfNamespaces ){
this._rdfNamespaces =
wikibase.queryService.RdfNamespaces;
@@ -48,6 +53,12 @@
* @private
**/
SELF.prototype._rdfNamespaces = null;
+
+ /**
+ * @property {wikibase.queryService.api.Wikibase}
+ * @private
+ **/
+ SELF.prototype._api = null;
/**
* Get list of hints
@@ -111,10 +122,7 @@
var entityList = [],
deferred = $.Deferred();
- $.ajax( {
- url: ENTITY_SEARCH_API_ENDPOINT.replace( '{term}', term
).replace( '{entityType}', type ),
- dataType: 'jsonp'
- } ).done( function ( data ) {
+ this._api.searchEntities( term, type ).done( function ( data ) {
$.each( data.search, function ( key, value ) {
entityList.push( {
className: 'wikibase-rdf-hint',
diff --git a/wikibase/queryService/ui/editor/hint/Sparql.js
b/wikibase/queryService/ui/editor/hint/Sparql.js
index 0cd4d23..c52fa55 100755
--- a/wikibase/queryService/ui/editor/hint/Sparql.js
+++ b/wikibase/queryService/ui/editor/hint/Sparql.js
@@ -48,6 +48,7 @@
* Code completion for Wikibase entities RDF prefixes in SPARQL
* completes SPARQL keywords and ?variables
*
+ * @class wikibase.queryService.ui.editor.hint.Sparql
* licence GNU GPL v2+
*
* @author Jonas Kress
diff --git a/wikibase/codemirror/addon/tooltip/WikibaseRDFTooltip.js
b/wikibase/queryService/ui/editor/tooltip/Rdf.js
similarity index 74%
rename from wikibase/codemirror/addon/tooltip/WikibaseRDFTooltip.js
rename to wikibase/queryService/ui/editor/tooltip/Rdf.js
index 64ce007..4f900d2 100644
--- a/wikibase/codemirror/addon/tooltip/WikibaseRDFTooltip.js
+++ b/wikibase/queryService/ui/editor/tooltip/Rdf.js
@@ -1,17 +1,28 @@
-var WikibaseRDFTooltip = ( function ( CodeMirror, $ ) {
+var wikibase = wikibase || {};
+wikibase.queryService = wikibase.queryService || {};
+wikibase.queryService.ui = wikibase.queryService.ui || {};
+wikibase.queryService.ui.editor = wikibase.queryService.ui.editor || {};
+wikibase.queryService.ui.editor.tooltip =
wikibase.queryService.ui.editor.tooltip || {};
+
+wikibase.queryService.ui.editor.tooltip.Rdf = ( function ( CodeMirror, $ ) {
'use strict';
/**
* Wikibase RDF tooltip for codemirror editor
*
- * @class WikibaseRdfTooltip
* @license GNU GPL v2+
+ * @class wikibase.queryService.ui.editor.tooltip.Rdf
+ *
* @author Jonas Kress
* @constructor
+ * @param {wikibase.queryService.api.Wikibase} api
*/
- function SELF( editor ) {
- this.editor = editor;
- this._registerHandler();
+ function SELF( api ) {
+ this._api = api;
+
+ if ( !this._api ){
+ this._api = new wikibase.queryService.api.Wikibase();
+ }
}
SELF.prototype.editor = null;
@@ -31,11 +42,19 @@
'http://www.wikidata.org/entity/': 'item'
};
- var ENTITY_SEARCH_API_ENDPOINT =
'https://www.wikidata.org/w/api.php?action=wbsearchentities&search={term}&format=json&language=en&uselang=en&type={entityType}&continue=0';
+ /**
+ * Set the editor the onmouseover callback is registered to
+ *
+ * @param {wikibase.queryService.ui.editor.Editor} editor
+ */
+ SELF.prototype.setEditor = function ( editor ) {
+ this.editor = editor;
+ this._registerHandler();
+ };
SELF.prototype._registerHandler = function () {
CodeMirror.on( this.editor.getWrapperElement(), 'mouseover',
$.proxy( this._triggerTooltip, this ) );
- };
+ };//TODO: Remove CodeMirror dependency
SELF.prototype._triggerTooltip = function ( e ) {
clearTimeout( this.tooltipTimeoutHandler );
@@ -99,7 +118,7 @@
$.each( lines, function ( index, line ) {
// PREFIX wd: <http://www.wikidata.org/entity/>
- if ( matches = line.match( /(PREFIX) (\S+): <([^>]+)>/
) ) {
+ if ( ( matches = line.match( /(PREFIX) (\S+):
<([^>]+)>/ ) ) ) {
if ( ENTITY_TYPES[ matches[ 3 ] ] ) {
prefixes[ matches[ 2 ] ] =
ENTITY_TYPES[ matches[ 3 ] ];
}
@@ -113,14 +132,11 @@
var entityList = [],
deferred = $.Deferred();
- $.ajax( {
- url: ENTITY_SEARCH_API_ENDPOINT.replace( '{term}', term
).replace( '{entityType}', type ),
- dataType: 'jsonp'
- } ).done( function ( data ) {
+ this._api.searchEntities( term, type ).done( function ( data ) {
$.each( data.search, function ( key, value ) {
- entityList.push( value.label + ' (' + value.id
+ ')\n'
- +
(value.description?value.description:'') );
+ entityList.push( value.label + ' (' + value.id
+ ')\n' +
+ (
value.description ? value.description: '' ) );
} );
deferred.resolve( entityList );
diff --git a/wikibase/queryService/ui/visualEditor/SelectorBox.js
b/wikibase/queryService/ui/visualEditor/SelectorBox.js
index 86449f2..80f5c7e 100644
--- a/wikibase/queryService/ui/visualEditor/SelectorBox.js
+++ b/wikibase/queryService/ui/visualEditor/SelectorBox.js
@@ -3,13 +3,8 @@
wikibase.queryService.ui = wikibase.queryService.ui || {};
wikibase.queryService.ui.visualEditor = wikibase.queryService.ui.visualEditor
|| {};
-wikibase.queryService.ui.visualEditor.SelectorBox = ( function( $ ) {
+wikibase.queryService.ui.visualEditor.SelectorBox = ( function( $, wikibase ) {
"use strict";
-
- var ENTITY_SEARCH_API_ENDPOINT_REQUEST =
'api.php?action=wbsearchentities&search={term}&format=json&language=en&uselang=en&type={entityType}&continue=0';
-
- var ENTITY_SEARCH_API_ENDPOINT_PATH = 'https://www.wikidata.org/w/';
-
/**
* A selector box for selecting and changing properties and items
@@ -20,13 +15,25 @@
* @author Jonas Kress
* @constructor
* @param {jQuery} $element
+ * @param {wikibase.queryService.api.Wikibase} api
*/
- function SELF( $element ) {
- this._entitySearchEndpoint = ENTITY_SEARCH_API_ENDPOINT_PATH +
ENTITY_SEARCH_API_ENDPOINT_REQUEST;
+ function SELF( $element, api ) {
this._$element = $element;
+
+ if ( api ){
+ this._api = api;
+ }else{
+ this._api = new wikibase.queryService.api.Wikibase();
+ }
this._create();
}
+
+ /**
+ * @property {wikibase.queryService.api.Wikibase}
+ * @private
+ */
+ SELF.prototype._api = null;
/**
* @property {function}
@@ -134,35 +141,31 @@
'</span><br/><small>' +
item.data.description + '</small>' );
};
+ var transport = function( params, success, failure ) {
+ self._api.searchEntities( params.data.term, type
).done( function( data ){
+ var r = data.search.map( function( d ) {
+ return {
+ id : d.id,
+ text : d.label,
+ data : d
+ };
+ } );
+ success( { results:r } );
+ }).fail( failure );
+ };
+
$select.select2({
- placeholder: 'Select an option',
- width: 'auto',
- minimumInputLength: 1,
- templateResult: formatter,
- ajax: {//TODO: implement inversion of control
- url: self._entitySearchEndpoint.replace(
'&search={term}', '' ).replace( '{entityType}', type ),
- dataType: 'jsonp',
- delay: 250,
- data: function (params) {
- return {
- search: params.term, // search term
- };
- },
- processResults: function (data, params) {
- return {
- results: data.search.map( function( d ){
- return {
- id: d.id,
- text: d.label,
- data: d
- };
- } ),
- };
- },
- cache: true
- }
+ placeholder : 'Select an option',
+ width : 'auto',
+ minimumInputLength : 1,
+ templateResult : formatter,
+ ajax : {
+ delay: 250,
+ transport : transport
+ },
+ cache : true
});
};
return SELF;
-}( jQuery) );
+}( jQuery, wikibase ) );
diff --git a/wikibase/queryService/ui/visualEditor/VisualEditor.js
b/wikibase/queryService/ui/visualEditor/VisualEditor.js
index c89069c..95a67b5 100644
--- a/wikibase/queryService/ui/visualEditor/VisualEditor.js
+++ b/wikibase/queryService/ui/visualEditor/VisualEditor.js
@@ -3,12 +3,8 @@
wikibase.queryService.ui = wikibase.queryService.ui || {};
wikibase.queryService.ui.visualEditor = wikibase.queryService.ui.visualEditor
|| {};
-wikibase.queryService.ui.visualEditor.VisualEditor = ( function( $ ) {
+wikibase.queryService.ui.visualEditor.VisualEditor = ( function( $, wikibase )
{
"use strict";
-
- var ENTITY_SEARCH_API_ENDPOINT_REQUEST =
'api.php?action=wbsearchentities&search={term}&format=json&language=en&uselang=en&type={entityType}&continue=0';
-
- var ENTITY_SEARCH_API_ENDPOINT_PATH = 'https://www.wikidata.org/w/';
var FILTER_PREDICATES = {
'http://www.w3.org/2000/01/rdf-schema#label': true,
@@ -25,21 +21,21 @@
*
* @author Jonas Kress
* @constructor
- * @param {string} entitySearchEndpoint
+ * @param {wikibase.queryService.api.Wikibase} api
*/
- function SELF( entitySearchEndpointPath ) {
- if ( entitySearchEndpointPath ){
- this._entitySearchEndpoint = entitySearchEndpointPath +
ENTITY_SEARCH_API_ENDPOINT_REQUEST;
- }else{
- this._entitySearchEndpoint =
ENTITY_SEARCH_API_ENDPOINT_PATH + ENTITY_SEARCH_API_ENDPOINT_REQUEST;
+ function SELF( api ) {
+ this._api = api;
+
+ if ( !this._api ){
+ this._api = new wikibase.queryService.api.Wikibase();
}
}
/**
- * @property {string}
+ * @property {wikibase.queryService.api.Wikibase}
* @private
*/
- SELF.prototype._entitySearchEndpoint = null;
+ SELF.prototype._api = null;
/**
* @property {function}
@@ -384,11 +380,9 @@
};
/**
- * TODO: Implement inversion of control
* @private
*/
SELF.prototype._getLabel = function( url ) {
- var self = this;
var deferred = $.Deferred();
var entity = url.match(/(Q|P)([0-9]+)/);//TODO: make use of Rdf
namespaces
@@ -400,10 +394,7 @@
type = type[entity[1]];
var term = entity[0];
- $.ajax( {
- url: self._entitySearchEndpoint.replace( '{term}', term
).replace( '{entityType}', type ),
- dataType: 'jsonp'
- } ).done( function ( data ) {
+ this._api.searchEntities( term, type ).done( function ( data ) {
$.each( data.search, function ( key, value ) {
deferred.resolve( value.label,
value.id, value.description, type );
return false;
@@ -420,7 +411,8 @@
SELF.prototype._valuleChanger = function( $element ) {
var deferred = $.Deferred();
- var $selector = new
wikibase.queryService.ui.visualEditor.SelectorBox( $element );
+ //TODO Use only one instance and make that instance injectable
+ var $selector = new
wikibase.queryService.ui.visualEditor.SelectorBox( $element, this._api );
$selector.setEntitySearchEndpoint( this._entitySearchEndpoint );
$selector.setChangeListener( function( id ){
@@ -431,4 +423,4 @@
};
return SELF;
-}( jQuery) );
+}( jQuery, wikibase ) );
--
To view, visit https://gerrit.wikimedia.org/r/283180
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I2f9a3021ad5c0e838fa7acd9911774126b98415f
Gerrit-PatchSet: 2
Gerrit-Project: wikidata/query/gui
Gerrit-Branch: master
Gerrit-Owner: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Smalyshev <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits