diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/res/smw/data/ext.smw.data.js')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/res/smw/data/ext.smw.data.js | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/res/smw/data/ext.smw.data.js b/www/wiki/extensions/SemanticMediaWiki/res/smw/data/ext.smw.data.js new file mode 100644 index 00000000..75644105 --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/res/smw/data/ext.smw.data.js @@ -0,0 +1,183 @@ +/** + * This file is part of the Semantic MediaWiki JavaScript DataItem module + * @see https://semantic-mediawiki.org/ + * + * @section LICENSE + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * + * @file + * @ignore + * + * @since 1.9 + * @ingroup SMW + * + * @licence GNU GPL v2+ + * @author mwjames + */ +( function( $, mw, smw ) { + 'use strict'; + + /** + * Constructor to create an object to interact with data objects and Api + * + * @since 1.9 + * + * @class + * @alias smw.data + * @constructor + */ + smw.Data = function() {}; + + /* Public methods */ + + smw.Data.prototype = { + + /** + * List of properties used + * + * @property + * @static + */ + properties: null, + + /** + * Factory methods that maps an JSON.parse key/value to an dataItem object + * This function is normally only called during smw.Api.parse/fetch() + * + * Structure will be similar to + * + * Subject (if exists is of type smw.dataItem.wikiPage otherwise a simple object) + * |--> property -> smw.dataItem.property + * |--> smw.dataItem.wikiPage + * |--> ... + * |--> property -> smw.dataItem.property + * |--> smw.dataItem.uri + * |--> ... + * |--> property -> smw.dataItem.property + * |--> smw.dataItem.time + * |--> ... + * + * @since 1.9 + * + * @param {string} key + * @param {mixed} value + * + * @return {object} + */ + factory: function( key, value ) { + var self = this; + + // Map printrequests in order to be used as key accessible reference object + // which enables type hinting for all items that exists within in this list + if ( key === 'printrequests' && value !== undefined ){ + var list = {}; + $.map( value, function( key, index ) { + list[key.label] = { typeid: key.typeid, position: index }; + } ); + self.properties = list; + } + + // Map the entire result object, for objects that have a subject as + // full fledged head item and rebuild the entire object to ensure + // that wikiPage is invoked at the top as well + if ( key === 'results' ){ + var nResults = {}; + + $.each( value, function( subjectName, subject ) { + if( subject.hasOwnProperty( 'fulltext' ) ){ + var nSubject = new smw.dataItem.wikiPage( subject.fulltext, subject.fullurl, subject.namespace, subject.exists, subject.displaytitle ); + nSubject.printouts = subject.printouts; + nResults[subjectName] = nSubject; + } else { + // Headless entry without a subject + nResults = value; + } + } ); + + return nResults; + } + + // Map individual properties according to its type + if ( typeof value === 'object' && self.properties !== null ){ + if ( key !== '' && value.length > 0 && self.properties.hasOwnProperty( key ) ){ + var property = new smw.dataItem.property( key ), + typeid = self.properties[key].typeid, + factoredValue = []; + + // Assignment of individual classes + switch ( typeid ) { + case '_wpg': + $.map( value, function( w ) { + factoredValue.push( new smw.dataItem.wikiPage( w.fulltext, w.fullurl, w.namespace, w.exists, w.displaytitle ) ); + } ); + break; + case '_uri': + $.map( value, function( u ) { + factoredValue.push( new smw.dataItem.uri( u ) ); + } ); + break; + case '_dat': + $.map( value, function( t ) { + // API 2.4+ + if ( t.hasOwnProperty( 'raw' ) ) { + var time = new smw.dataItem.time( t.timestamp, t.raw ); + } else { + var time = new smw.dataItem.time( t, undefined ); + } + + factoredValue.push( time ); + } ); + break; + case '_num': + $.map( value, function( n ) { + factoredValue.push( new smw.dataItem.number( n ) ); + } ); + break; + case '_qty': + $.map( value, function( q ) { + factoredValue.push( new smw.dataValue.quantity( q.value, q.unit ) ); + } ); + break; + case '_str': + case '_txt': + $.map( value, function( s ) { + factoredValue.push( new smw.dataItem.text( s, typeid ) ); + } ); + break; + case '_geo': + $.map( value, function( g ) { + factoredValue.push( new smw.dataItem.geo( g, typeid ) ); + } ); + break; + default: + // Register all non identifiable types as unknown + $.map( value, function( v ) { + factoredValue.push( new smw.dataItem.unknown( v, typeid ) ); + } ); + } + + return $.extend( property, factoredValue ); + } + } + + // Return all other values + return value; + } + }; + + // Alias + smw.data = smw.Data; + +} )( jQuery, mediaWiki, semanticMediaWiki ); |