1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-09-29 15:00:51 +00:00
gnosygnu_xowa/res/bin/any/xowa/xtns/Graph/Xograph.js

156 lines
4.1 KiB
JavaScript

xo.xtns = xo.xtns || {};
xo.xtns.graph = new function() {
var xolog = new xo.logs.logger('xo.xtns.graph');
var vega_cbks = {} // map of callbacks for tabular
// var page_cache = {}; // TOMBSTONE: do not try to cache requests; multiple requests for same page may start at same time
this.load_xowa = function(url, opt, callback) {
this.init_xowa_props(opt);
// cache callback
var vega_cbk_guid = Uuid_.make();
vega_cbks[vega_cbk_guid] = callback;
// call xo_server
var page_guid = xowa.page.guid;
xolog.info("get_page.bgn", "page", opt.xowa_page);
xo.server.send_by_bridge('xowa.app.util.misc', 'page_get',
{ 'page_get_cbk':'xo.xtns.graph.load_xowa_recv'
, 'protocol':opt.xowa_protocol
, 'wiki':opt.xowa_wiki
, 'page':opt.xowa_page
, 'page_guid':page_guid
, 'vega_cbk_guid':vega_cbk_guid
});
}
this.load_xowa_recv = function(msg_str) {
// parse msg
var msg = JSON.parse(msg_str);
xolog.info("get_page.end", "page", msg.page);
// get page_text
var page_text = msg.page_text;
var protocol = msg.protocol;
switch (protocol) {
case 'map:':
case 'tabular:':
page_text = "{\"jsondata\":" + page_text + "}"; // format as "{jsondata:page_text}"; note that this is done by JsonConfig api
break;
}
// get callback and process page_text
var callback = vega_cbks[msg.vega_cbk_guid];
callback(null, page_text);
return "pass:load_xowa_recv"; // return something for xoajax
}
this.init_xowa_props = function(opt) {
// get protocol
var url = opt.url;
var protocol_end = url.indexOf(':/');
var protocol = 'unknown';
if (protocol_end != -1) {
protocol = url.substring(0, protocol_end + 1).toLowerCase(); // +1 to capture ":"; note that graph2.compiled.js compares to "wikiraw:", "map:", etc.
}
// get page
var page = '';
var wiki = 'commons.wikimedia.org';
switch (protocol) {
case 'map:':
page = replace_at_bgn_or_null(url, "map:///", "Data:");
break;
case 'tabular:':
page = replace_at_bgn_or_null(url, "tabular:///", "Data:");
break;
case 'wikiraw:':
page = replace_at_bgn_or_null(url, "wikiraw:///", "");
wiki = xowa.page.wiki;
break;
}
if (page == null) {
xolog.warn("unknown page protocol", "protocol", protocol, "url", url);
}
// set xowa_props
opt.xowa_protocol = protocol;
opt.xowa_wiki = wiki;
opt.xowa_page = page;
}
// XOWA: from /modules/graph1.js|graph2.js; modified b/c MW use mw.hook('wikipage.content'); DATE:2018-02-25
this.drawVegaGraph = function(version, elem, data, callback)
{
if (version == 1)
{
vg.parse.spec
( data
, function (chart)
{
if (chart)
{
chart({el: elem}).update();
}
}
);
}
else
{
vg.parse.spec
( data
, function (error, chart)
{
if (!error)
{
chart({el:elem}).update();
}
if (callback)
{
callback(error);
}
}
);
}
};
this.exec = function()
{
xolog.info("running graphs");
var $ = jQuery;
var $content = $('#content');
// from graph2.compiled.js; modified b/c MW saves data in mw.config.get('wgGraphSpecs')
$content.find( '.mw-graph' ).each
( function ()
{
var elem = this;
var version = $(this).attr('xo-graph-version');
var html = $(this).html();
var spec = JSON.parse(Html_.decode(html));
xolog.info("running graph", "version", version); //, "data", html);
// blank out html; run graph
$(this).html('');
xo.xtns.graph.drawVegaGraph
( version
, this
, spec
, function (error)
{
if (error)
console.log(error);
}
);
}
);
}
var replace_at_bgn_or_null = function(str, find, repl) {
if (str.startsWith(find))
return repl + str.substring(find.length, str.length);
else
return null;
}
}