diff --git a/examples/code/mapframe.txt b/examples/code/mapframe.txt new file mode 100644 index 00000000..4f5f29c0 --- /dev/null +++ b/examples/code/mapframe.txt @@ -0,0 +1,8 @@ + + +{ + "type": "ExternalData", + "service": "geopoint", + "query": {SPARQL_QUERY} +} + diff --git a/wikibase/queryService/api/CodeSamples.js b/wikibase/queryService/api/CodeSamples.js index da60e1f4..64264cd8 100644 --- a/wikibase/queryService/api/CodeSamples.js +++ b/wikibase/queryService/api/CodeSamples.js @@ -1,251 +1,254 @@ var wikibase = window.wikibase || {}; wikibase.queryService = wikibase.queryService || {}; wikibase.queryService.api = wikibase.queryService.api || {}; wikibase.queryService.api.CodeSamples = ( function ( $ ) { 'use strict'; /** * CodeSamples API for the Wikibase query service * * @class wikibase.queryService.api.CodeSamples * @license GNU GPL v2+ * * @author Lucas Werkmeister * @author Jonas Kress * @constructor */ function SELF( endpoint, root, index ) { var self = this; if ( endpoint.startsWith( '/' ) ) { var origin; if ( window.location.origin ) { origin = window.location.origin; } else { origin = window.location.protocol + '//' + window.location.host; } endpoint = origin + endpoint; } this._endpoint = endpoint; this._languages = { URL: { code: function( query ) { return endpoint + '?query=' + encodeURIComponent( query ); } }, HTML: { code: function( query ) { return ''; }, mimetype: 'text/html' }, Wikilink: { code: function( query ) { return '[' + index + '#' + encodeURIComponent( query ) + ' Query]'; } }, PHP: { escape: function( query ) { // try nowdoc first var identifiers = [ 'SPARQL', 'QUERY', 'EOF' ]; for ( var index in identifiers ) { var identifier = identifiers[ index ]; if ( !( new RegExp( '^' + identifier + '$', 'm' ).test( query ) ) ) { return '<<< \'' + identifier + '\'\n' + query + '\n' + identifier; } } // fall back to double quoted var escapedQuery = query .replace( /\\/g, '\\\\' ) .replace( /"/g, '\\"' ) .replace( /\$/g, '\\$' ) .replace( /\n/g, '\\n' ); return '"' + escapedQuery + '"'; } }, 'JavaScript (jQuery)': { escape: function( query ) { var code = ''; var lines = query.split( '\n' ); for ( var index in lines ) { var line = lines[ index ]; var escapedLine = line .replace( /\\/g, '\\\\' ) .replace( /"/g, '\\"' ); if ( index > 0 ) { code += '\\n" +\n '; } code += '"' + escapedLine; } if ( index >= 0 ) { code += '"'; } return code; }, mimetype: 'application/javascript' }, 'JavaScript (modern)': { escape: function( query ) { var escapedQuery = query .replace( /\\/g, '\\\\' ) .replace( /`/g, '\\`' ) .replace( /\$/g, '\\$' ); return '`' + escapedQuery + '`'; }, mimetype: 'application/javascript' }, Java: { escape: function( query ) { var code = ''; var lines = query.split( '\n' ); for ( var index in lines ) { var line = lines[ index ]; var escapedLine = line .replace( /\\/g, '\\\\' ) .replace( /"/g, '\\"' ); if ( index > 0 ) { code += '\\n" +\n '; } code += '"' + escapedLine; } if ( index >= 0 ) { code += '"'; } return code; } }, Perl: { escape: function( query ) { var escapedQuery = query.replace( /#.*\n/g, '' ); return '<<\'_SPARQL_QUERY_\';\n' + escapedQuery + '\n_SPARQL_QUERY_'; } }, Python: { escape: function( query ) { var escapedQuery = query .replace( /\\/g, '\\\\' ) .replace( /"""/g, '""\\"' ); return '"""' + escapedQuery + '"""'; } }, 'Python (Pywikibot)': { escape: function( query ) { return self._languages.Python.escape( query ); } }, Ruby: { escape: function( query ) { // try heredoc first var identifiers = [ 'SPARQL', 'QUERY', 'EOF' ]; for ( var index in identifiers ) { var identifier = identifiers[ index ]; if ( !( new RegExp( '^' + identifier + '$', 'm' ).test( query ) ) ) { return '<<\'' + identifier + '\'.chop\n' // .chop removes the trailing newline + query + '\n' + identifier; } } // fall back to double quoted var escapedQuery = query .replace( /\\/g, '\\\\' ) .replace( /"/g, '\\"' ) .replace( /#/g, '\\#' ) .replace( /\n/g, '\\n' ); return '"' + escapedQuery + '"'; } }, R: { escape: function( query ) { var escapedQuery = query .replace( /\\/g, '\\\\' ) .replace( /'/g, '\\\'' ) .replace( /\n/g, '\\n' ); return '\'' + escapedQuery + '\''; }, mimetype: 'text/x-rsrc' }, Matlab: { escape: function( query ) { var escapedQuery = query .replace( /\\/g, '\\\\' ) .replace( /'/g, '\'\'' ) .replace( /\n/g, '\\n' ); return '\'' + escapedQuery + '\''; }, mimetype: 'text/x-octave' }, listeria: { escape: function( query ) { var escapedQuery = query .replace( /\|/g, '{{!}}' ) .replace( /}}/g, '} }' ); // TODO try to exactly preserve query return escapedQuery; } + }, + mapframe: { + escape: JSON.stringify } }; } /** * @property {string} * @private */ SELF.prototype._endpoint = null; /** * @return {jQuery.Promise} yields a list of code examples for the current query * ({ code: string, mimetype: string }) */ SELF.prototype.getExamples = function ( currentQuery ) { var self = this, deferred = new $.Deferred(), data = {}, loadFiles = []; $.each( this._languages, function ( name, language ) { data[name] = { mimetype: 'mimetype' in language ? language.mimetype : 'text/x-' + name.toLowerCase() }; var query = currentQuery; if ( 'escape' in language ) { query = language.escape( query ); } if ( 'code' in language ) { data[name].code = language.code( query ); } else { loadFiles.push( $.get( 'examples/code/' + name + '.txt', function ( code ) { data[name].code = code .replace( '{ENDPOINT_URL}', self._endpoint ) .replace( '{SPARQL_QUERY}', query ); }, 'text' ) ); } } ); $.when.apply( $, loadFiles ).then( function () { deferred.resolve( data ); }, deferred.reject.bind( deferred ) ); return deferred.promise(); }; return SELF; }( jQuery ) );