diff --git a/snorql/index.html b/snorql/index.html index 2ff03eb..eddef7b 100644 --- a/snorql/index.html +++ b/snorql/index.html @@ -43,16 +43,24 @@
([\s\S]*)<\/pre>/); - if (message) { - dummy.displayErrorMessage(message[1]); - } else { - dummy.displayErrorMessage(report.responseText); - } - } - }); + service.query + ( + query, + { + success: successFunc, + failure: function(report) + { + var message = report.responseText.match(/([\s\S]*)<\/pre>/); + if (message) { + dummy.displayErrorMessage(message[1]); + } else { + dummy.displayErrorMessage(report.responseText); + } + } + }, + sendAsMethod + ); } this.setBrowserBase = function(url) { @@ -162,11 +228,6 @@ function Snorql() { $('poweredby').update(this._poweredByLabel); } - this.setNamespaces = function(namespaces) { - this._namespaces = namespaces; - this._display(document.createTextNode(this._getPrefixes()), 'prefixestext'); - } - this.switchToGraph = function(uri) { this._updateGraph(uri, true); } @@ -236,10 +297,28 @@ function Snorql() { if (mode == 'browse') { document.getElementById('queryform').action = this._browserBase; document.getElementById('query').value = document.getElementById('querytext').value; + document.getElementById('sendas').value = document.getElementById('selectsendas').value; + document.getElementById('format').disabled = true; } else { - document.getElementById('query').value = this._getPrefixes() + document.getElementById('querytext').value; + if (document.getElementById('selectsendas').value == 'update') + { + document.getElementById('query').disabled = true; + document.getElementById('update').disabled = false; + document.getElementById('update').value = this._getPrefixes() + document.getElementById('querytext').value; + document.getElementById('queryform').method = 'POST'; + } + else + { + document.getElementById('query').disabled = false; + document.getElementById('update').disabled = true; + document.getElementById('query').value = this._getPrefixes() + document.getElementById('querytext').value; + document.getElementById('queryform').method = 'GET'; + } + document.getElementById('sendas').disabled = true; document.getElementById('queryform').action = this._endpoint; } + document.getElementById('format').disabled = false; + document.getElementById('format').value = mode; document.getElementById('jsonoutput').disabled = (mode != 'json'); document.getElementById('stylesheet').disabled = (mode != 'xslt' || !document.getElementById('xsltstylesheet').value); if (mode == 'xslt') { @@ -266,10 +345,7 @@ function Snorql() { var title = document.createElement('h2'); title.appendChild(document.createTextNode(resultTitle)); div.appendChild(title); - if (value) - div.appendChild(document.createTextNode("TRUE")); - else - div.appendChild(document.createTextNode("FALSE")); + div.appendChild(document.createTextNode(value.boolean)); this._display(div, 'result'); this._updateGraph(this._graph); // refresh links in new result } @@ -289,14 +365,27 @@ function Snorql() { var title = document.createElement('h2'); title.appendChild(document.createTextNode(resultTitle)); div.appendChild(title); - if (json.results.bindings.length == 0) { - var p = document.createElement('p'); - p.className = 'empty'; - p.appendChild(document.createTextNode('[no results]')); - div.appendChild(p); - } else { - div.appendChild(new SPARQLResultFormatter(json, this._namespaces).toDOM()); - } + + if (json.results) + { + if (json.results.bindings.length == 0) { + var p = document.createElement('p'); + p.className = 'empty'; + p.appendChild(document.createTextNode('[no results]')); + div.appendChild(p); + } else { + var result = new SPARQLResultFormatter(json, this._namespaces).toDOM() + div.appendChild(result); + } + } + else + { + var p = document.createElement('p'); + p.className = 'empty'; + p.innerHTML = json; + div.appendChild(p); + } + this._display(div, 'result'); this._updateGraph(this._graph); // refresh links in new result } @@ -318,6 +407,10 @@ function Snorql() { return document.getElementById('selectoutput').value; } + this._selectedSendAs = function() { + return document.getElementById('selectsendas').value; + } + this._getPrefixes = function() { prefixes = ''; for (prefix in this._namespaces) { @@ -328,7 +421,8 @@ function Snorql() { } this._betterUnescape = function(s) { - return unescape(s.replace(/\+/g, ' ')); + return decodeURIComponent(s.replace(/\+/g, ' ')); + //return unescape(s.replace(/\+/g, ' ')); } } @@ -359,13 +453,15 @@ function SPARQLResultFormatter(json, namespaces) { this._namespaces = namespaces; this.toDOM = function() { - var table = document.createElement('table'); - table.className = 'queryresults'; + var tableUp = document.createElement('table'); + tableUp.className = 'queryresults'; + var table= document.createElement('tbody'); + tableUp.appendChild(table); table.appendChild(this._createTableHeader()); for (var i = 0; i < this._results.length; i++) { table.appendChild(this._createTableRow(this._results[i], i)); } - return table; + return tableUp; } // TODO: Refactor; non-standard link makers should be passed into the class by the caller diff --git a/snorql/sparql.js b/snorql/sparql.js index 612ea9f..147dc69 100644 --- a/snorql/sparql.js +++ b/snorql/sparql.js @@ -95,7 +95,10 @@ var SPARQL = {}; // SPARQL namespace */ SPARQL._query_transformations = { query: function (o) { return o; }, - ask: function (o) { return o["boolean"]; }, + ask: function (o) + { + return o["boolean"]; + }, selectValues: function (o) { var v = o.head.vars[0]; // assume one variable var values = []; @@ -146,7 +149,7 @@ SPARQL.Service = function(endpoint) { var _output = 'json'; var _max_simultaneous = 0; var _request_headers = {}; - + //---------- // accessors this.endpoint = function() { return _endpoint; }; @@ -217,9 +220,9 @@ SPARQL.Service = function(endpoint) { for (var query_form in SPARQL._query_transformations) { // need the extra function to properly scope query_form (qf) this[query_form] = (function(qf) { - return function(queryString, callback) { + return function(queryString, callback, sendAsMethod) { var q = this.createQuery(); - q._doQuery(queryString, callback, SPARQL._query_transformations[qf]); + q._doQuery(queryString, callback, SPARQL._query_transformations[qf], sendAsMethod); }; })(query_form); } @@ -252,6 +255,7 @@ SPARQL.Query = function(service, priority) { var _output = service.output(); var _priority = priority || 0; var _request_headers = clone_obj(service.requestHeaders()); + var _send_as = 'query'; //------------------ // private functions @@ -307,9 +311,16 @@ SPARQL.Query = function(service, priority) { //alert(xhr.responseText); SPARQL.statistics.successes++; _service._markDone(this); - this._doCallback(arg.callback, 'success', arg.transformer( - _output == 'json' ? _create_json(xhr.responseText) : xhr.responseText - )); + + var parsed_output = null; + + if (_output == 'json') + parsed_output = _create_json(xhr.responseText); + + if (parsed_output == null) + parsed_output = xhr.responseText; + + this._doCallback(arg.callback, 'success', arg.transformer(parsed_output)); }; function getXmlHttpRequest(url) { @@ -317,7 +328,8 @@ SPARQL.Query = function(service, priority) { return new XMLHttpRequest(); } - this._doQuery = function(queryString, callback, transformer) { + this._doQuery = function(queryString, callback, transformer, sendAsMethod) { + _send_as = sendAsMethod; _user_query = queryString; if (_service._canRun()) { try { @@ -433,8 +445,8 @@ SPARQL.Query = function(service, priority) { for (i = 0; i < this.namedGraphs().length; i++) urlQueryString += 'named-graph-uri=' + encodeURIComponent(this.namedGraphs()[i]) + '&'; // specify JSON output (currently output= supported by latest Joseki) (or other output) - urlQueryString += 'output=' + _output + '&'; - return urlQueryString + 'query=' + encodeURIComponent(this.queryString()); + urlQueryString += 'output=' + _output + '&format=' + _output + '&'; + return urlQueryString + _send_as + '=' + encodeURIComponent(this.queryString()); } /** diff --git a/snorql/style.css b/snorql/style.css index fbbc308..e15096d 100644 --- a/snorql/style.css +++ b/snorql/style.css @@ -8,6 +8,7 @@ h2 { font-weight: normal; font-size: 120%; margin: 0; padding: 0 0 0.2em 0; } form { margin: 0; } textarea { width: 100%; } #prefixestext { color: #555; margin: 0; } +.prefixes { white-space: pre-line; } ul { margin: 0; padding: 0; } li { margin: 0 0 0 1em; padding: 0; } img { border: none; }
([\s\S]*)<\/pre>/); + if (message) { + dummy.displayErrorMessage(message[1]); + } else { + dummy.displayErrorMessage(report.responseText); + } + } + }, + sendAsMethod + ); } this.setBrowserBase = function(url) { @@ -162,11 +228,6 @@ function Snorql() { $('poweredby').update(this._poweredByLabel); } - this.setNamespaces = function(namespaces) { - this._namespaces = namespaces; - this._display(document.createTextNode(this._getPrefixes()), 'prefixestext'); - } - this.switchToGraph = function(uri) { this._updateGraph(uri, true); } @@ -236,10 +297,28 @@ function Snorql() { if (mode == 'browse') { document.getElementById('queryform').action = this._browserBase; document.getElementById('query').value = document.getElementById('querytext').value; + document.getElementById('sendas').value = document.getElementById('selectsendas').value; + document.getElementById('format').disabled = true; } else { - document.getElementById('query').value = this._getPrefixes() + document.getElementById('querytext').value; + if (document.getElementById('selectsendas').value == 'update') + { + document.getElementById('query').disabled = true; + document.getElementById('update').disabled = false; + document.getElementById('update').value = this._getPrefixes() + document.getElementById('querytext').value; + document.getElementById('queryform').method = 'POST'; + } + else + { + document.getElementById('query').disabled = false; + document.getElementById('update').disabled = true; + document.getElementById('query').value = this._getPrefixes() + document.getElementById('querytext').value; + document.getElementById('queryform').method = 'GET'; + } + document.getElementById('sendas').disabled = true; document.getElementById('queryform').action = this._endpoint; } + document.getElementById('format').disabled = false; + document.getElementById('format').value = mode; document.getElementById('jsonoutput').disabled = (mode != 'json'); document.getElementById('stylesheet').disabled = (mode != 'xslt' || !document.getElementById('xsltstylesheet').value); if (mode == 'xslt') { @@ -266,10 +345,7 @@ function Snorql() { var title = document.createElement('h2'); title.appendChild(document.createTextNode(resultTitle)); div.appendChild(title); - if (value) - div.appendChild(document.createTextNode("TRUE")); - else - div.appendChild(document.createTextNode("FALSE")); + div.appendChild(document.createTextNode(value.boolean)); this._display(div, 'result'); this._updateGraph(this._graph); // refresh links in new result } @@ -289,14 +365,27 @@ function Snorql() { var title = document.createElement('h2'); title.appendChild(document.createTextNode(resultTitle)); div.appendChild(title); - if (json.results.bindings.length == 0) { - var p = document.createElement('p'); - p.className = 'empty'; - p.appendChild(document.createTextNode('[no results]')); - div.appendChild(p); - } else { - div.appendChild(new SPARQLResultFormatter(json, this._namespaces).toDOM()); - } + + if (json.results) + { + if (json.results.bindings.length == 0) { + var p = document.createElement('p'); + p.className = 'empty'; + p.appendChild(document.createTextNode('[no results]')); + div.appendChild(p); + } else { + var result = new SPARQLResultFormatter(json, this._namespaces).toDOM() + div.appendChild(result); + } + } + else + { + var p = document.createElement('p'); + p.className = 'empty'; + p.innerHTML = json; + div.appendChild(p); + } + this._display(div, 'result'); this._updateGraph(this._graph); // refresh links in new result } @@ -318,6 +407,10 @@ function Snorql() { return document.getElementById('selectoutput').value; } + this._selectedSendAs = function() { + return document.getElementById('selectsendas').value; + } + this._getPrefixes = function() { prefixes = ''; for (prefix in this._namespaces) { @@ -328,7 +421,8 @@ function Snorql() { } this._betterUnescape = function(s) { - return unescape(s.replace(/\+/g, ' ')); + return decodeURIComponent(s.replace(/\+/g, ' ')); + //return unescape(s.replace(/\+/g, ' ')); } } @@ -359,13 +453,15 @@ function SPARQLResultFormatter(json, namespaces) { this._namespaces = namespaces; this.toDOM = function() { - var table = document.createElement('table'); - table.className = 'queryresults'; + var tableUp = document.createElement('table'); + tableUp.className = 'queryresults'; + var table= document.createElement('tbody'); + tableUp.appendChild(table); table.appendChild(this._createTableHeader()); for (var i = 0; i < this._results.length; i++) { table.appendChild(this._createTableRow(this._results[i], i)); } - return table; + return tableUp; } // TODO: Refactor; non-standard link makers should be passed into the class by the caller diff --git a/snorql/sparql.js b/snorql/sparql.js index 612ea9f..147dc69 100644 --- a/snorql/sparql.js +++ b/snorql/sparql.js @@ -95,7 +95,10 @@ var SPARQL = {}; // SPARQL namespace */ SPARQL._query_transformations = { query: function (o) { return o; }, - ask: function (o) { return o["boolean"]; }, + ask: function (o) + { + return o["boolean"]; + }, selectValues: function (o) { var v = o.head.vars[0]; // assume one variable var values = []; @@ -146,7 +149,7 @@ SPARQL.Service = function(endpoint) { var _output = 'json'; var _max_simultaneous = 0; var _request_headers = {}; - + //---------- // accessors this.endpoint = function() { return _endpoint; }; @@ -217,9 +220,9 @@ SPARQL.Service = function(endpoint) { for (var query_form in SPARQL._query_transformations) { // need the extra function to properly scope query_form (qf) this[query_form] = (function(qf) { - return function(queryString, callback) { + return function(queryString, callback, sendAsMethod) { var q = this.createQuery(); - q._doQuery(queryString, callback, SPARQL._query_transformations[qf]); + q._doQuery(queryString, callback, SPARQL._query_transformations[qf], sendAsMethod); }; })(query_form); } @@ -252,6 +255,7 @@ SPARQL.Query = function(service, priority) { var _output = service.output(); var _priority = priority || 0; var _request_headers = clone_obj(service.requestHeaders()); + var _send_as = 'query'; //------------------ // private functions @@ -307,9 +311,16 @@ SPARQL.Query = function(service, priority) { //alert(xhr.responseText); SPARQL.statistics.successes++; _service._markDone(this); - this._doCallback(arg.callback, 'success', arg.transformer( - _output == 'json' ? _create_json(xhr.responseText) : xhr.responseText - )); + + var parsed_output = null; + + if (_output == 'json') + parsed_output = _create_json(xhr.responseText); + + if (parsed_output == null) + parsed_output = xhr.responseText; + + this._doCallback(arg.callback, 'success', arg.transformer(parsed_output)); }; function getXmlHttpRequest(url) { @@ -317,7 +328,8 @@ SPARQL.Query = function(service, priority) { return new XMLHttpRequest(); } - this._doQuery = function(queryString, callback, transformer) { + this._doQuery = function(queryString, callback, transformer, sendAsMethod) { + _send_as = sendAsMethod; _user_query = queryString; if (_service._canRun()) { try { @@ -433,8 +445,8 @@ SPARQL.Query = function(service, priority) { for (i = 0; i < this.namedGraphs().length; i++) urlQueryString += 'named-graph-uri=' + encodeURIComponent(this.namedGraphs()[i]) + '&'; // specify JSON output (currently output= supported by latest Joseki) (or other output) - urlQueryString += 'output=' + _output + '&'; - return urlQueryString + 'query=' + encodeURIComponent(this.queryString()); + urlQueryString += 'output=' + _output + '&format=' + _output + '&'; + return urlQueryString + _send_as + '=' + encodeURIComponent(this.queryString()); } /** diff --git a/snorql/style.css b/snorql/style.css index fbbc308..e15096d 100644 --- a/snorql/style.css +++ b/snorql/style.css @@ -8,6 +8,7 @@ h2 { font-weight: normal; font-size: 120%; margin: 0; padding: 0 0 0.2em 0; } form { margin: 0; } textarea { width: 100%; } #prefixestext { color: #555; margin: 0; } +.prefixes { white-space: pre-line; } ul { margin: 0; padding: 0; } li { margin: 0 0 0 1em; padding: 0; } img { border: none; }