vue-bokeh
Version:
A wrapper around bokehjs embedded
1,263 lines (1,128 loc) • 1.89 MB
JavaScript
window.Bokeh = Bokeh = (function() { var define = undefined; return (function outer(modules, cache, entry) {
function newRequire(name) {
if (!cache[name]) {
if (!modules[name]) {
var err = new Error('Cannot find module \'' + name + '\'');
err.code = 'MODULE_NOT_FOUND';
throw err;
}
var m = cache[name] = {exports: {}};
var moduleRequire = function foo(x) {
var id = modules[name][1][x];
return newRequire(id ? id : x);
}
moduleRequire.modules = newRequire.modules;
modules[name][0].call(m.exports, moduleRequire, m, m.exports, outer, modules, cache, entry);
}
return cache[name].exports;
}
newRequire.modules = modules;
var lastEntryResult = null;
for (var i = 0; i < entry.length; i++) {
lastEntryResult = newRequire(entry[i]);
}
return lastEntryResult;
})
({"base":[function(require,module,exports){
var Models, _, _get_mod_cache, _mod_cache, index, locations, logger, make_cache, overrides,
hasProp = {}.hasOwnProperty;
_ = require("underscore");
logger = require("./core/logging").logger;
require("./core/util/underscore").patch();
locations = require("./common/models");
overrides = {};
make_cache = function(locations) {
var mod, modname, name, ref, result, spec, subname, subspec, suffix;
result = {};
for (name in locations) {
spec = locations[name];
if (_.isArray(spec)) {
subspec = spec[0];
suffix = (ref = spec[1]) != null ? ref : "";
for (subname in subspec) {
mod = subspec[subname];
modname = subname + suffix;
result[modname] = mod;
}
} else {
result[name] = spec;
}
}
return result;
};
_mod_cache = null;
_get_mod_cache = function() {
if (_mod_cache == null) {
_mod_cache = make_cache(locations);
}
return _mod_cache;
};
Models = function(typename) {
var mod, mod_cache;
mod_cache = _get_mod_cache();
if (overrides[typename]) {
return overrides[typename];
}
mod = mod_cache[typename];
if (mod == null) {
throw new Error("Module `" + typename + "' does not exists. The problem may be two fold. Either a model was requested that's available in an extra bundle, e.g. a widget, or a custom model was requested, but it wasn't registered before first usage.");
}
return mod.Model;
};
Models.register = function(name, model) {
return overrides[name] = model;
};
Models.unregister = function(name) {
return delete overrides[name];
};
Models.register_locations = function(locations, force, errorFn) {
var cache, mod_cache, module, name, results;
if (force == null) {
force = false;
}
if (errorFn == null) {
errorFn = null;
}
mod_cache = _get_mod_cache();
cache = make_cache(locations);
results = [];
for (name in cache) {
if (!hasProp.call(cache, name)) continue;
module = cache[name];
if (force || !mod_cache.hasOwnProperty(name)) {
results.push(mod_cache[name] = module);
} else {
results.push(typeof errorFn === "function" ? errorFn(name) : void 0);
}
}
return results;
};
Models.registered_names = function() {
return Object.keys(_get_mod_cache());
};
index = {};
module.exports = {
overrides: overrides,
index: index,
Models: Models
};
},{"./common/models":"common/models","./core/logging":"core/logging","./core/util/underscore":"core/util/underscore","underscore":"underscore"}],"client":[function(require,module,exports){
var ClientConnection, ClientSession, DEFAULT_SERVER_WEBSOCKET_URL, DEFAULT_SESSION_ID, Document, HasProps, Message, ModelChangedEvent, Promise, RootAddedEvent, RootRemovedEvent, _, logger, message_handlers, pull_session, ref;
_ = require("underscore");
Promise = require("es6-promise").Promise;
HasProps = require("./core/has_props");
logger = require("./core/logging").logger;
ref = require("./document"), Document = ref.Document, ModelChangedEvent = ref.ModelChangedEvent, RootAddedEvent = ref.RootAddedEvent, RootRemovedEvent = ref.RootRemovedEvent;
DEFAULT_SERVER_WEBSOCKET_URL = "ws://localhost:5006/ws";
DEFAULT_SESSION_ID = "default";
Message = (function() {
function Message(header1, metadata1, content1) {
this.header = header1;
this.metadata = metadata1;
this.content = content1;
this.buffers = [];
}
Message.assemble = function(header_json, metadata_json, content_json) {
var content, e, error1, header, metadata;
try {
header = JSON.parse(header_json);
metadata = JSON.parse(metadata_json);
content = JSON.parse(content_json);
return new Message(header, metadata, content);
} catch (error1) {
e = error1;
logger.error("Failure parsing json " + e + " " + header_json + " " + metadata_json + " " + content_json, e);
throw e;
}
};
Message.create_header = function(msgtype, options) {
var header;
header = {
'msgid': _.uniqueId(),
'msgtype': msgtype
};
return _.extend(header, options);
};
Message.create = function(msgtype, header_options, content) {
var header;
if (content == null) {
content = {};
}
header = Message.create_header(msgtype, header_options);
return new Message(header, {}, content);
};
Message.prototype.send = function(socket) {
var content_json, e, error1, header_json, metadata_json;
try {
header_json = JSON.stringify(this.header);
metadata_json = JSON.stringify(this.metadata);
content_json = JSON.stringify(this.content);
socket.send(header_json);
socket.send(metadata_json);
return socket.send(content_json);
} catch (error1) {
e = error1;
logger.error("Error sending ", this, e);
throw e;
}
};
Message.prototype.complete = function() {
if ((this.header != null) && (this.metadata != null) && (this.content != null)) {
if ('num_buffers' in this.header) {
return this.buffers.length === this.header['num_buffers'];
} else {
return true;
}
} else {
return false;
}
};
Message.prototype.add_buffer = function(buffer) {
return this.buffers.push(buffer);
};
Message.prototype._header_field = function(field) {
if (field in this.header) {
return this.header[field];
} else {
return null;
}
};
Message.prototype.msgid = function() {
return this._header_field('msgid');
};
Message.prototype.msgtype = function() {
return this._header_field('msgtype');
};
Message.prototype.sessid = function() {
return this._header_field('sessid');
};
Message.prototype.reqid = function() {
return this._header_field('reqid');
};
Message.prototype.problem = function() {
if (!('msgid' in this.header)) {
return "No msgid in header";
} else if (!('msgtype' in this.header)) {
return "No msgtype in header";
} else {
return null;
}
};
return Message;
})();
message_handlers = {
'PATCH-DOC': function(connection, message) {
return connection._for_session(function(session) {
return session._handle_patch(message);
});
},
'OK': function(connection, message) {
return logger.debug("Unhandled OK reply to " + (message.reqid()));
},
'ERROR': function(connection, message) {
return logger.error("Unhandled ERROR reply to " + (message.reqid()) + ": " + message.content['text']);
}
};
ClientConnection = (function() {
ClientConnection._connection_count = 0;
function ClientConnection(url1, id, _on_have_session_hook, _on_closed_permanently_hook) {
this.url = url1;
this.id = id;
this._on_have_session_hook = _on_have_session_hook;
this._on_closed_permanently_hook = _on_closed_permanently_hook;
this._number = ClientConnection._connection_count;
ClientConnection._connection_count = this._number + 1;
if (this.url == null) {
this.url = DEFAULT_SERVER_WEBSOCKET_URL;
}
if (this.id == null) {
this.id = DEFAULT_SESSION_ID;
}
logger.debug("Creating websocket " + this._number + " to '" + this.url + "' session '" + this.id + "'");
this.socket = null;
this.closed_permanently = false;
this._fragments = [];
this._partial = null;
this._current_handler = null;
this._pending_ack = null;
this._pending_replies = {};
this.session = null;
}
ClientConnection.prototype._for_session = function(f) {
if (this.session !== null) {
return f(this.session);
}
};
ClientConnection.prototype.connect = function() {
var error, error1, versioned_url;
if (this.closed_permanently) {
return Promise.reject(new Error("Cannot connect() a closed ClientConnection"));
}
if (this.socket != null) {
return Promise.reject(new Error("Already connected"));
}
this._fragments = [];
this._partial = null;
this._pending_replies = {};
this._current_handler = null;
try {
versioned_url = this.url + "?bokeh-protocol-version=1.0&bokeh-session-id=" + this.id;
if (window.MozWebSocket != null) {
this.socket = new MozWebSocket(versioned_url);
} else {
this.socket = new WebSocket(versioned_url);
}
return new Promise((function(_this) {
return function(resolve, reject) {
_this.socket.binarytype = "arraybuffer";
_this.socket.onopen = function() {
return _this._on_open(resolve, reject);
};
_this.socket.onmessage = function(event) {
return _this._on_message(event);
};
_this.socket.onclose = function(event) {
return _this._on_close(event);
};
return _this.socket.onerror = function() {
return _this._on_error(reject);
};
};
})(this));
} catch (error1) {
error = error1;
logger.error("websocket creation failed to url: " + this.url);
logger.error(" - " + error);
return Promise.reject(error);
}
};
ClientConnection.prototype.close = function() {
if (!this.closed_permanently) {
logger.debug("Permanently closing websocket connection " + this._number);
this.closed_permanently = true;
if (this.socket != null) {
this.socket.close(1000, "close method called on ClientConnection " + this._number);
}
this._for_session(function(session) {
return session._connection_closed();
});
if (this._on_closed_permanently_hook != null) {
this._on_closed_permanently_hook();
return this._on_closed_permanently_hook = null;
}
}
};
ClientConnection.prototype._schedule_reconnect = function(milliseconds) {
var retry;
retry = (function(_this) {
return function() {
if (true || _this.closed_permanently) {
if (!_this.closed_permanently) {
logger.info("Websocket connection " + _this._number + " disconnected, will not attempt to reconnect");
}
} else {
logger.debug("Attempting to reconnect websocket " + _this._number);
return _this.connect();
}
};
})(this);
return setTimeout(retry, milliseconds);
};
ClientConnection.prototype.send = function(message) {
var e, error1;
try {
if (this.socket === null) {
throw new Error("not connected so cannot send " + message);
}
return message.send(this.socket);
} catch (error1) {
e = error1;
return logger.error("Error sending message ", e, message);
}
};
ClientConnection.prototype.send_with_reply = function(message) {
var promise;
promise = new Promise((function(_this) {
return function(resolve, reject) {
_this._pending_replies[message.msgid()] = [resolve, reject];
return _this.send(message);
};
})(this));
return promise.then(function(message) {
if (message.msgtype() === 'ERROR') {
throw new Error("Error reply " + message.content['text']);
} else {
return message;
}
}, function(error) {
throw error;
});
};
ClientConnection.prototype._pull_doc_json = function() {
var message, promise;
message = Message.create('PULL-DOC-REQ', {});
promise = this.send_with_reply(message);
return promise.then(function(reply) {
if (!('doc' in reply.content)) {
throw new Error("No 'doc' field in PULL-DOC-REPLY");
}
return reply.content['doc'];
}, function(error) {
throw error;
});
};
ClientConnection.prototype._repull_session_doc = function() {
if (this.session === null) {
logger.debug("Pulling session for first time");
} else {
logger.debug("Repulling session");
}
return this._pull_doc_json().then((function(_this) {
return function(doc_json) {
var document, patch, patch_message;
if (_this.session === null) {
if (_this.closed_permanently) {
return logger.debug("Got new document after connection was already closed");
} else {
document = Document.from_json(doc_json);
patch = Document._compute_patch_since_json(doc_json, document);
if (patch.events.length > 0) {
logger.debug("Sending " + patch.events.length + " changes from model construction back to server");
patch_message = Message.create('PATCH-DOC', {}, patch);
_this.send(patch_message);
}
_this.session = new ClientSession(_this, document, _this.id);
logger.debug("Created a new session from new pulled doc");
if (_this._on_have_session_hook != null) {
_this._on_have_session_hook(_this.session);
return _this._on_have_session_hook = null;
}
}
} else {
_this.session.document.replace_with_json(doc_json);
return logger.debug("Updated existing session with new pulled doc");
}
};
})(this), function(error) {
throw error;
})["catch"](function(error) {
if (console.trace != null) {
console.trace(error);
}
return logger.error("Failed to repull session " + error);
});
};
ClientConnection.prototype._on_open = function(resolve, reject) {
logger.info("Websocket connection " + this._number + " is now open");
this._pending_ack = [resolve, reject];
return this._current_handler = (function(_this) {
return function(message) {
return _this._awaiting_ack_handler(message);
};
})(this);
};
ClientConnection.prototype._on_message = function(event) {
var e, error1;
try {
return this._on_message_unchecked(event);
} catch (error1) {
e = error1;
return logger.error("Error handling message: " + e + ", " + event);
}
};
ClientConnection.prototype._on_message_unchecked = function(event) {
var msg, problem;
if (this._current_handler == null) {
logger.error("got a message but haven't set _current_handler");
}
if (event.data instanceof ArrayBuffer) {
if ((this._partial != null) && !this._partial.complete()) {
this._partial.add_buffer(event.data);
} else {
this._close_bad_protocol("Got binary from websocket but we were expecting text");
}
} else if (this._partial != null) {
this._close_bad_protocol("Got text from websocket but we were expecting binary");
} else {
this._fragments.push(event.data);
if (this._fragments.length === 3) {
this._partial = Message.assemble(this._fragments[0], this._fragments[1], this._fragments[2]);
this._fragments = [];
problem = this._partial.problem();
if (problem !== null) {
this._close_bad_protocol(problem);
}
}
}
if ((this._partial != null) && this._partial.complete()) {
msg = this._partial;
this._partial = null;
return this._current_handler(msg);
}
};
ClientConnection.prototype._on_close = function(event) {
var pop_pending, promise_funcs;
logger.info("Lost websocket " + this._number + " connection, " + event.code + " (" + event.reason + ")");
this.socket = null;
if (this._pending_ack != null) {
this._pending_ack[1](new Error("Lost websocket connection, " + event.code + " (" + event.reason + ")"));
this._pending_ack = null;
}
pop_pending = function() {
var promise_funcs, ref1, reqid;
ref1 = this._pending_replies;
for (reqid in ref1) {
promise_funcs = ref1[reqid];
delete this._pending_replies[reqid];
return promise_funcs;
}
return null;
};
promise_funcs = pop_pending();
while (promise_funcs !== null) {
promise_funcs[1]("Disconnected");
promise_funcs = pop_pending();
}
if (!this.closed_permanently) {
return this._schedule_reconnect(2000);
}
};
ClientConnection.prototype._on_error = function(reject) {
logger.debug("Websocket error on socket " + this._number);
return reject(new Error("Could not open websocket"));
};
ClientConnection.prototype._close_bad_protocol = function(detail) {
logger.error("Closing connection: " + detail);
if (this.socket != null) {
return this.socket.close(1002, detail);
}
};
ClientConnection.prototype._awaiting_ack_handler = function(message) {
if (message.msgtype() === "ACK") {
this._current_handler = (function(_this) {
return function(message) {
return _this._steady_state_handler(message);
};
})(this);
this._repull_session_doc();
if (this._pending_ack != null) {
this._pending_ack[0](this);
return this._pending_ack = null;
}
} else {
return this._close_bad_protocol("First message was not an ACK");
}
};
ClientConnection.prototype._steady_state_handler = function(message) {
var promise_funcs;
if (message.reqid() in this._pending_replies) {
promise_funcs = this._pending_replies[message.reqid()];
delete this._pending_replies[message.reqid()];
return promise_funcs[0](message);
} else if (message.msgtype() in message_handlers) {
return message_handlers[message.msgtype()](this, message);
} else {
return logger.debug("Doing nothing with message " + (message.msgtype()));
}
};
return ClientConnection;
})();
ClientSession = (function() {
function ClientSession(_connection, document1, id) {
this._connection = _connection;
this.document = document1;
this.id = id;
this._current_patch = null;
this.document_listener = (function(_this) {
return function(event) {
return _this._document_changed(event);
};
})(this);
this.document.on_change(this.document_listener);
}
ClientSession.prototype.close = function() {
return this._connection.close();
};
ClientSession.prototype._connection_closed = function() {
return this.document.remove_on_change(this.document_listener);
};
ClientSession.prototype.request_server_info = function() {
var message, promise;
message = Message.create('SERVER-INFO-REQ', {});
promise = this._connection.send_with_reply(message);
return promise.then(function(reply) {
return reply.content;
});
};
ClientSession.prototype.force_roundtrip = function() {
return this.request_server_info().then(function(ignored) {
return void 0;
});
};
ClientSession.prototype._should_suppress_on_change = function(patch, event) {
var event_json, i, j, k, l, len, len1, len2, len3, patch_new, ref1, ref2, ref3, ref4;
if (event instanceof ModelChangedEvent) {
ref1 = patch.content['events'];
for (i = 0, len = ref1.length; i < len; i++) {
event_json = ref1[i];
if (event_json['kind'] === 'ModelChanged' && event_json['model']['id'] === event.model.id && event_json['attr'] === event.attr) {
patch_new = event_json['new'];
if (event.new_ instanceof HasProps) {
if (typeof patch_new === 'object' && 'id' in patch_new && patch_new['id'] === event.new_.id) {
return true;
}
} else if (_.isEqual(patch_new, event.new_)) {
return true;
}
}
}
} else if (event instanceof RootAddedEvent) {
ref2 = patch.content['events'];
for (j = 0, len1 = ref2.length; j < len1; j++) {
event_json = ref2[j];
if (event_json['kind'] === 'RootAdded' && event_json['model']['id'] === event.model.id) {
return true;
}
}
} else if (event instanceof RootRemovedEvent) {
ref3 = patch.content['events'];
for (k = 0, len2 = ref3.length; k < len2; k++) {
event_json = ref3[k];
if (event_json['kind'] === 'RootRemoved' && event_json['model']['id'] === event.model.id) {
return true;
}
}
} else if (event instanceof TitleChangedEvent) {
ref4 = patch.content['events'];
for (l = 0, len3 = ref4.length; l < len3; l++) {
event_json = ref4[l];
if (event_json['kind'] === 'TitleChanged' && event_json['title'] === event.title) {
return true;
}
}
}
return false;
};
ClientSession.prototype._document_changed = function(event) {
var patch;
if ((this._current_patch != null) && this._should_suppress_on_change(this._current_patch, event)) {
return;
}
if (event instanceof ModelChangedEvent && !(event.attr in event.model.serializable_attributes())) {
return;
}
patch = Message.create('PATCH-DOC', {}, this.document.create_json_patch([event]));
return this._connection.send(patch);
};
ClientSession.prototype._handle_patch = function(message) {
this._current_patch = message;
try {
return this.document.apply_json_patch(message.content);
} finally {
this._current_patch = null;
}
};
return ClientSession;
})();
pull_session = function(url, session_id) {
var connection, promise, rejecter;
rejecter = null;
connection = null;
promise = new Promise(function(resolve, reject) {
connection = new ClientConnection(url, session_id, function(session) {
var e, error1;
try {
return resolve(session);
} catch (error1) {
e = error1;
logger.error("Promise handler threw an error, closing session " + error);
session.close();
throw e;
}
}, function() {
return reject(new Error("Connection was closed before we successfully pulled a session"));
});
return connection.connect().then(function(whatever) {}, function(error) {
logger.error("Failed to connect to Bokeh server " + error);
throw error;
});
});
promise.close = function() {
return connection.close();
};
return promise;
};
module.exports = {
pull_session: pull_session,
DEFAULT_SERVER_WEBSOCKET_URL: DEFAULT_SERVER_WEBSOCKET_URL,
DEFAULT_SESSION_ID: DEFAULT_SESSION_ID
};
},{"./core/has_props":"core/has_props","./core/logging":"core/logging","./document":"document","es6-promise":"es6-promise","underscore":"underscore"}],"common/build_views":[function(require,module,exports){
var _, build_views, jQueryUIPrefixer;
_ = require("underscore");
build_views = function(view_storage, view_models, options, view_types) {
var created_views, i, i_model, j, key, len, len1, model, newmodels, to_remove, view_specific_option;
if (view_types == null) {
view_types = [];
}
created_views = [];
newmodels = _.filter(view_models, function(x) {
return !_.has(view_storage, x.id);
});
for (i_model = i = 0, len = newmodels.length; i < len; i_model = ++i) {
model = newmodels[i_model];
view_specific_option = _.extend({}, options, {
'model': model
});
if (i_model < view_types.length) {
view_storage[model.id] = new view_types[i_model](view_specific_option);
} else {
view_storage[model.id] = new model.default_view(view_specific_option);
}
view_storage[model.id].$el.find("*[class*='ui-']").each(function(idx, el) {
return el.className = jQueryUIPrefixer(el);
});
created_views.push(view_storage[model.id]);
}
to_remove = _.difference(_.keys(view_storage), _.pluck(view_models, 'id'));
for (j = 0, len1 = to_remove.length; j < len1; j++) {
key = to_remove[j];
view_storage[key].remove();
delete view_storage[key];
}
return created_views;
};
jQueryUIPrefixer = function(el) {
var classList, prefixedClassList;
if (el.className == null) {
return;
}
classList = el.className.split(" ");
prefixedClassList = _.map(classList, function(a) {
a = a.trim();
if (a.indexOf("ui-") === 0) {
return "bk-" + a;
} else {
return a;
}
});
return prefixedClassList.join(" ");
};
build_views.jQueryUIPrefixer = jQueryUIPrefixer;
module.exports = build_views = build_views;
},{"underscore":"underscore"}],"common/hittest":[function(require,module,exports){
var HitTestResult, check_2_segments_intersect, create_hit_test_result, dist_2_pts, dist_to_segment, dist_to_segment_squared, nullreturner, point_in_poly, sqr, validate_bbox_coords;
point_in_poly = function(x, y, px, py) {
var i, inside, j, ref, x1, x2, y1, y2;
inside = false;
x1 = px[px.length - 1];
y1 = py[py.length - 1];
for (i = j = 0, ref = px.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
x2 = px[i];
y2 = py[i];
if ((y1 < y) !== (y2 < y)) {
if (x1 + (y - y1) / (y2 - y1) * (x2 - x1) < x) {
inside = !inside;
}
}
x1 = x2;
y1 = y2;
}
return inside;
};
nullreturner = function() {
return null;
};
HitTestResult = (function() {
function HitTestResult() {
this['0d'] = {
glyph: null,
get_view: nullreturner,
indices: []
};
this['1d'] = {
indices: []
};
this['2d'] = {};
}
Object.defineProperty(HitTestResult.prototype, '_0d', {
get: function() {
return this['0d'];
}
});
Object.defineProperty(HitTestResult.prototype, '_1d', {
get: function() {
return this['1d'];
}
});
Object.defineProperty(HitTestResult.prototype, '_2d', {
get: function() {
return this['2d'];
}
});
HitTestResult.prototype.is_empty = function() {
return this._0d.indices.length === 0 && this._1d.indices.length === 0;
};
return HitTestResult;
})();
create_hit_test_result = function() {
return new HitTestResult();
};
validate_bbox_coords = function(arg, arg1) {
var ref, ref1, x0, x1, y0, y1;
x0 = arg[0], x1 = arg[1];
y0 = arg1[0], y1 = arg1[1];
if (x0 > x1) {
ref = [x1, x0], x0 = ref[0], x1 = ref[1];
}
if (y0 > y1) {
ref1 = [y1, y0], y0 = ref1[0], y1 = ref1[1];
}
return {
minX: x0,
minY: y0,
maxX: x1,
maxY: y1
};
};
sqr = function(x) {
return x * x;
};
dist_2_pts = function(vx, vy, wx, wy) {
return sqr(vx - wx) + sqr(vy - wy);
};
dist_to_segment_squared = function(p, v, w) {
var l2, t;
l2 = dist_2_pts(v.x, v.y, w.x, w.y);
if (l2 === 0) {
return dist_2_pts(p.x, p.y, v.x, v.y);
}
t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;
if (t < 0) {
return dist_2_pts(p.x, p.y, v.x, v.y);
}
if (t > 1) {
return dist_2_pts(p.x, p.y, w.x, w.y);
}
return dist_2_pts(p.x, p.y, v.x + t * (w.x - v.x), v.y + t * (w.y - v.y));
};
dist_to_segment = function(p, v, w) {
return Math.sqrt(dist_to_segment_squared(p, v, w));
};
check_2_segments_intersect = function(l0_x0, l0_y0, l0_x1, l0_y1, l1_x0, l1_y0, l1_x1, l1_y1) {
/* Check if 2 segments (l0 and l1) intersect. Returns a structure with
the following attributes:
* hit (boolean): whether the 2 segments intersect
* x (float): x coordinate of the intersection point
* y (float): y coordinate of the intersection point
*/
var a, b, den, num1, num2, x, y;
den = ((l1_y1 - l1_y0) * (l0_x1 - l0_x0)) - ((l1_x1 - l1_x0) * (l0_y1 - l0_y0));
if (den === 0) {
return {
hit: false,
x: null,
y: null
};
} else {
a = l0_y0 - l1_y0;
b = l0_x0 - l1_x0;
num1 = ((l1_x1 - l1_x0) * a) - ((l1_y1 - l1_y0) * b);
num2 = ((l0_x1 - l0_x0) * a) - ((l0_y1 - l0_y0) * b);
a = num1 / den;
b = num2 / den;
x = l0_x0 + (a * (l0_x1 - l0_x0));
y = l0_y0 + (a * (l0_y1 - l0_y0));
return {
hit: (a > 0 && a < 1) && (b > 0 && b < 1),
x: x,
y: y
};
}
};
module.exports = {
point_in_poly: point_in_poly,
HitTestResult: HitTestResult,
create_hit_test_result: create_hit_test_result,
dist_2_pts: dist_2_pts,
dist_to_segment: dist_to_segment,
check_2_segments_intersect: check_2_segments_intersect,
validate_bbox_coords: validate_bbox_coords
};
},{}],"common/models":[function(require,module,exports){
module.exports = {
SelectionManager: require('./selection_manager'),
Selector: require('./selector'),
ToolEvents: require('./tool_events'),
Arrow: require('../models/annotations/arrow'),
BoxAnnotation: require('../models/annotations/box_annotation'),
ColorBar: require('../models/annotations/color_bar'),
Label: require('../models/annotations/label'),
LabelSet: require('../models/annotations/label_set'),
Legend: require('../models/annotations/legend'),
PolyAnnotation: require('../models/annotations/poly_annotation'),
Span: require('../models/annotations/span'),
Title: require('../models/annotations/title'),
Tooltip: require('../models/annotations/tooltip'),
OpenHead: require('../models/annotations/arrow_head').OpenHead,
NormalHead: require('../models/annotations/arrow_head').NormalHead,
VeeHead: require('../models/annotations/arrow_head').VeeHead,
CategoricalAxis: require('../models/axes/categorical_axis'),
DatetimeAxis: require('../models/axes/datetime_axis'),
LinearAxis: require('../models/axes/linear_axis'),
LogAxis: require('../models/axes/log_axis'),
CustomJS: require('../models/callbacks/customjs'),
OpenURL: require('../models/callbacks/open_url'),
Canvas: require('../models/canvas/canvas'),
CartesianFrame: require('../models/canvas/cartesian_frame'),
BasicTickFormatter: require('../models/formatters/basic_tick_formatter'),
CategoricalTickFormatter: require('../models/formatters/categorical_tick_formatter'),
DatetimeTickFormatter: require('../models/formatters/datetime_tick_formatter'),
LogTickFormatter: require('../models/formatters/log_tick_formatter'),
FuncTickFormatter: require('../models/formatters/func_tick_formatter'),
NumeralTickFormatter: require('../models/formatters/numeral_tick_formatter'),
PrintfTickFormatter: require('../models/formatters/printf_tick_formatter'),
AnnularWedge: require('../models/glyphs/annular_wedge'),
Annulus: require('../models/glyphs/annulus'),
Arc: require('../models/glyphs/arc'),
Bezier: require('../models/glyphs/bezier'),
Circle: require('../models/glyphs/circle'),
Ellipse: require('../models/glyphs/ellipse'),
Gear: require('../models/glyphs/gear'),
HBar: require('../models/glyphs/hbar'),
Image: require('../models/glyphs/image'),
ImageRGBA: require('../models/glyphs/image_rgba'),
ImageURL: require('../models/glyphs/image_url'),
Line: require('../models/glyphs/line'),
MultiLine: require('../models/glyphs/multi_line'),
Oval: require('../models/glyphs/oval'),
Patch: require('../models/glyphs/patch'),
Patches: require('../models/glyphs/patches'),
Quad: require('../models/glyphs/quad'),
Quadratic: require('../models/glyphs/quadratic'),
Ray: require('../models/glyphs/ray'),
Rect: require('../models/glyphs/rect'),
Segment: require('../models/glyphs/segment'),
Text: require('../models/glyphs/text'),
VBar: require('../models/glyphs/vbar'),
Wedge: require('../models/glyphs/wedge'),
Grid: require('../models/grids/grid'),
Column: require('../models/layouts/column'),
Row: require('../models/layouts/row'),
Spacer: require('../models/layouts/spacer'),
WidgetBox: require('../models/layouts/widget_box'),
CategoricalMapper: require('../models/mappers/categorical_mapper'),
GridMapper: require('../models/mappers/grid_mapper'),
LinearColorMapper: require('../models/mappers/linear_color_mapper'),
LinearMapper: require('../models/mappers/linear_mapper'),
LogColorMapper: require('../models/mappers/log_color_mapper'),
LogMapper: require('../models/mappers/log_mapper'),
Transform: require('../models/transforms/transform'),
Jitter: require('../models/transforms/jitter'),
Interpolator: require('../models/transforms/interpolator'),
LinearInterpolator: require('../models/transforms/linear_interpolator'),
StepInterpolator: require('../models/transforms/step_interpolator'),
Asterisk: require('../models/markers/index').Asterisk,
CircleCross: require('../models/markers/index').CircleCross,
CircleX: require('../models/markers/index').CircleX,
Cross: require('../models/markers/index').Cross,
Diamond: require('../models/markers/index').Diamond,
DiamondCross: require('../models/markers/index').DiamondCross,
InvertedTriangle: require('../models/markers/index').InvertedTriangle,
Square: require('../models/markers/index').Square,
SquareCross: require('../models/markers/index').SquareCross,
SquareX: require('../models/markers/index').SquareX,
Triangle: require('../models/markers/index').Triangle,
X: require('../models/markers/index').X,
Plot: require('../models/plots/plot'),
GMapPlot: require('../models/plots/gmap_plot'),
DataRange1d: require('../models/ranges/data_range1d'),
FactorRange: require('../models/ranges/factor_range'),
Range1d: require('../models/ranges/range1d'),
GlyphRenderer: require('../models/renderers/glyph_renderer'),
AjaxDataSource: require('../models/sources/ajax_data_source'),
ColumnDataSource: require('../models/sources/column_data_source'),
GeoJSONDataSource: require('../models/sources/geojson_data_source'),
AdaptiveTicker: require('../models/tickers/adaptive_ticker'),
BasicTicker: require('../models/tickers/basic_ticker'),
CategoricalTicker: require('../models/tickers/categorical_ticker'),
CompositeTicker: require('../models/tickers/composite_ticker'),
ContinuousTicker: require('../models/tickers/continuous_ticker'),
DatetimeTicker: require('../models/tickers/datetime_ticker'),
DaysTicker: require('../models/tickers/days_ticker'),
FixedTicker: require('../models/tickers/fixed_ticker'),
LogTicker: require('../models/tickers/log_ticker'),
MonthsTicker: require('../models/tickers/months_ticker'),
SingleIntervalTicker: require('../models/tickers/single_interval_ticker'),
YearsTicker: require('../models/tickers/years_ticker'),
TileRenderer: require('../models/tiles/tile_renderer'),
TileSource: require('../models/tiles/tile_source'),
TMSTileSource: require('../models/tiles/tms_tile_source'),
WMTSTileSource: require('../models/tiles/wmts_tile_source'),
QUADKEYTileSource: require('../models/tiles/quadkey_tile_source'),
BBoxTileSource: require('../models/tiles/bbox_tile_source'),
DynamicImageRenderer: require('../models/tiles/dynamic_image_renderer'),
ImageSource: require('../models/tiles/image_source'),
Toolbar: require('../models/tools/toolbar'),
ToolbarBox: require('../models/tools/toolbar_box'),
ButtonTool: require('../models/tools/button_tool'),
ActionTool: require('../models/tools/actions/action_tool'),
SaveTool: require('../models/tools/actions/save_tool'),
UndoTool: require('../models/tools/actions/undo_tool'),
RedoTool: require('../models/tools/actions/redo_tool'),
ResetTool: require('../models/tools/actions/reset_tool'),
HelpTool: require('../models/tools/actions/help_tool'),
BoxSelectTool: require('../models/tools/gestures/box_select_tool'),
BoxZoomTool: require('../models/tools/gestures/box_zoom_tool'),
GestureTool: require('../models/tools/gestures/gesture_tool'),
LassoSelectTool: require('../models/tools/gestures/lasso_select_tool'),
PanTool: require('../models/tools/gestures/pan_tool'),
PolySelectTool: require('../models/tools/gestures/poly_select_tool'),
SelectTool: require('../models/tools/gestures/select_tool'),
ResizeTool: require('../models/tools/gestures/resize_tool'),
TapTool: require('../models/tools/gestures/tap_tool'),
WheelZoomTool: require('../models/tools/gestures/wheel_zoom_tool'),
CrosshairTool: require('../models/tools/inspectors/crosshair_tool'),
HoverTool: require('../models/tools/inspectors/hover_tool'),
InspectTool: require('../models/tools/inspectors/inspect_tool')
};
},{"../models/annotations/arrow":"models/annotations/arrow","../models/annotations/arrow_head":"models/annotations/arrow_head","../models/annotations/box_annotation":"models/annotations/box_annotation","../models/annotations/color_bar":"models/annotations/color_bar","../models/annotations/label":"models/annotations/label","../models/annotations/label_set":"models/annotations/label_set","../models/annotations/legend":"models/annotations/legend","../models/annotations/poly_annotation":"models/annotations/poly_annotation","../models/annotations/span":"models/annotations/span","../models/annotations/title":"models/annotations/title","../models/annotations/tooltip":"models/annotations/tooltip","../models/axes/categorical_axis":"models/axes/categorical_axis","../models/axes/datetime_axis":"models/axes/datetime_axis","../models/axes/linear_axis":"models/axes/linear_axis","../models/axes/log_axis":"models/axes/log_axis","../models/callbacks/customjs":"models/callbacks/customjs","../models/callbacks/open_url":"models/callbacks/open_url","../models/canvas/canvas":"models/canvas/canvas","../models/canvas/cartesian_frame":"models/canvas/cartesian_frame","../models/formatters/basic_tick_formatter":"models/formatters/basic_tick_formatter","../models/formatters/categorical_tick_formatter":"models/formatters/categorical_tick_formatter","../models/formatters/datetime_tick_formatter":"models/formatters/datetime_tick_formatter","../models/formatters/func_tick_formatter":"models/formatters/func_tick_formatter","../models/formatters/log_tick_formatter":"models/formatters/log_tick_formatter","../models/formatters/numeral_tick_formatter":"models/formatters/numeral_tick_formatter","../models/formatters/printf_tick_formatter":"models/formatters/printf_tick_formatter","../models/glyphs/annular_wedge":"models/glyphs/annular_wedge","../models/glyphs/annulus":"models/glyphs/annulus","../models/glyphs/arc":"models/glyphs/arc","../models/glyphs/bezier":"models/glyphs/bezier","../models/glyphs/circle":"models/glyphs/circle","../models/glyphs/ellipse":"models/glyphs/ellipse","../models/glyphs/gear":"models/glyphs/gear","../models/glyphs/hbar":"models/glyphs/hbar","../models/glyphs/image":"models/glyphs/image","../models/glyphs/image_rgba":"models/glyphs/image_rgba","../models/glyphs/image_url":"models/glyphs/image_url","../models/glyphs/line":"models/glyphs/line","../models/glyphs/multi_line":"models/glyphs/multi_line","../models/glyphs/oval":"models/glyphs/oval","../models/glyphs/patch":"models/glyphs/patch","../models/glyphs/patches":"models/glyphs/patches","../models/glyphs/quad":"models/glyphs/quad","../models/glyphs/quadratic":"models/glyphs/quadratic","../models/glyphs/ray":"models/glyphs/ray","../models/glyphs/rect":"models/glyphs/rect","../models/glyphs/segment":"models/glyphs/segment","../models/glyphs/text":"models/glyphs/text","../models/glyphs/vbar":"models/glyphs/vbar","../models/glyphs/wedge":"models/glyphs/wedge","../models/grids/grid":"models/grids/grid","../models/layouts/column":"models/layouts/column","../models/layouts/row":"models/layouts/row","../models/layouts/spacer":"models/layouts/spacer","../models/layouts/widget_box":"models/layouts/widget_box","../models/mappers/categorical_mapper":"models/mappers/categorical_mapper","../models/mappers/grid_mapper":"models/mappers/grid_mapper","../models/mappers/linear_color_mapper":"models/mappers/linear_color_mapper","../models/mappers/linear_mapper":"models/mappers/linear_mapper","../models/mappers/log_color_mapper":"models/mappers/log_color_mapper","../models/mappers/log_mapper":"models/mappers/log_mapper","../models/markers/index":"models/markers/index","../models/plots/gmap_plot":"models/plots/gmap_plot","../models/plots/plot":"models/plots/plot","../models/ranges/data_range1d":"models/ranges/data_range1d","../models/ranges/factor_range":"models/ranges/factor_range","../models/ranges/range1d":"models/ranges/range1d","../models/renderers/glyph_renderer":"models/renderers/glyph_renderer","../models/sources/ajax_data_source":"models/sources/ajax_data_source","../models/sources/column_data_source":"models/sources/column_data_source","../models/sources/geojson_data_source":"models/sources/geojson_data_source","../models/tickers/adaptive_ticker":"models/tickers/adaptive_ticker","../models/tickers/basic_ticker":"models/tickers/basic_ticker","../models/tickers/categorical_ticker":"models/tickers/categorical_ticker","../models/tickers/composite_ticker":"models/tickers/composite_ticker","../models/tickers/continuous_ticker":"models/tickers/continuous_ticker","../models/tickers/datetime_ticker":"models/tickers/datetime_ticker","../models/tickers/days_ticker":"models/tickers/days_ticker","../models/tickers/fixed_ticker":"models/tickers/fixed_ticker","../models/tickers/log_ticker":"models/tickers/log_ticker","../models/tickers/months_ticker":"models/tickers/months_ticker","../models/tickers/single_interval_ticker":"models/tickers/single_interval_ticker","../models/tickers/years_ticker":"models/tickers/years_ticker","../models/tiles/bbox_tile_source":"models/tiles/bbox_tile_source","../models/tiles/dynamic_image_renderer":"models/tiles/dynamic_image_renderer","../models/tiles/image_source":"models/tiles/image_source","../models/tiles/quadkey_tile_source":"models/tiles/quadkey_tile_source","../models/tiles/tile_renderer":"models/tiles/tile_renderer","../models/tiles/tile_source":"models/tiles/tile_source","../models/tiles/tms_tile_source":"models/tiles/tms_tile_source","../models/tiles/wmts_tile_source":"models/tiles/wmts_tile_source","../models/tools/actions/action_tool":"models/tools/actions/action_tool","../models/tools/actions/help_tool":"models/tools/actions/help_tool","../models/tools/actions/redo_tool":"models/tools/actions/redo_tool","../models/tools/actions/reset_tool":"models/tools/actions/reset_tool","../models/tools/actions/save_tool":"models/tools/actions/save_tool","../models/tools/actions/undo_tool":"models/tools/actions/undo_tool","../models/tools/button_tool":"models/tools/button_tool","../models/tools/gestures/box_select_tool":"models/tools/gestures/box_select_tool","../models/tools/gestures/box_zoom_tool":"models/tools/gestures/box_zoom_tool","../models/tools/gestures/gesture_tool":"models/tools/gestures/gesture_tool","../models/tools/gestures/lasso_select_tool":"models/tools/gestures/lasso_select_tool","../models/tools/gestures/pan_tool":"models/tools/gestures/pan_tool","../models/tools/gestures/poly_select_tool":"models/tools/gestures/poly_select_tool","../models/tools/gestures/resize_tool":"models/tools/gestures/resize_tool","../models/tools/gestures/select_tool":"models/tools/gestures/select_tool","../models/tools/gestures/tap_tool":"models/tools/gestures/tap_tool","../models/tools/gestures/wheel_zoom_tool":"models/tools/gestures/wheel_zoom_tool","../models/tools/inspectors/crosshair_tool":"models/tools/inspectors/crosshair_tool","../models/tools/inspectors/hover_tool":"models/tools/inspectors/hover_tool","../models/tools/inspectors/inspect_tool":"models/tools/inspectors/inspect_tool","../models/tools/toolbar":"models/tools/toolbar","../models/tools/toolbar_box":"models/tools/toolbar_box","../models/transforms/interpolator":"models/transforms/interpolator","../models/transforms/jitter":"models/transforms/jitter","../models/transforms/linear_interpolator":"models/transforms/linear_interpolator","../models/transforms/step_interpolator":"models/transforms/step_interpolator","../models/transforms/transform":"models/transforms/transform","./selection_manager":"common/selection_manager","./selector":"common/selector","./tool_events":"common/tool_events"}],"common/selection_manager":[function(require,module,exports){
var HasProps, SelectionManager, Selector, _, hittest, logger, p,
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
hasProp = {}.hasOwnProperty;
_ = require("underscore");
HasProps = require("../core/has_props");
logger = require("../core/logging").logger;
Selector = require("./selector");
hittest = require("./hittest");
p = require("../core/properties");
SelectionManager = (function(superClass) {
extend(SelectionManager, superClass);
function SelectionManager() {
return SelectionManager.__super__.constructor.apply(this, arguments);
}
SelectionManager.prototype.type = 'SelectionManager';
SelectionManager.internal({
source: [p.Any]
});
SelectionManager.prototype.initialize = function(attrs, options) {
SelectionManager.__super__.initialize.call(this, attrs, options);
this.selectors = {};
this.inspectors = {};
return this.last_inspection_was_empty = {};
};
SelectionManager.prototype.select = function(tool, renderer_view, geometry, final, append) {
var indices, selector, source;
if (append == null) {
append = false;
}
source = this.get('source');
if (source !== renderer_view.mget('data_source')) {
logger.warn('select called with mis-matched data sources');
}
indices = renderer_view.hit_test(geometry);
if (indices != null) {
selector = this._get_selector(renderer_view);
selector.update(indices, final, append);
this.get('source').set({
"selected": selector.get('indices')
});
source.trigger('select');
source.trigger('select-' + renderer_view.mget('id'));
return !indices.is_empty();
} else {
return false;
}
};
SelectionManager.prototype.inspect = function(tool, renderer_view, geometry, data) {
var indices, inspector, r_id, source;
source = this.get('source');
if (source !== renderer_view.mget('data_source')) {
logger.warn('inspect called with mis-matched data sources');
}
indices = renderer_view.hit_test(geometry);
if (indices != null) {
r_id = renderer_view.model.id;
if (indices.is_empty()) {
if (this.last_inspection_was_empty[r_id] == null) {
this.last_inspection_was_empty[r_id] = false;
}
if (this.last_inspection_was_empty[r_id]) {
return;
} else {
this.last_inspection_was_empty[r_id] = true;
}
} else {
this.last_inspection_was_empty[r_id] = false;
}
inspector = this._get_inspector(renderer_view);
inspector.update(indices, true, false, true);
this.get('source').set({
"inspected": inspector.get('indices')
}, {
"silent": true
});
source.trigger('inspect', indices, tool, renderer_view, source, data);
source.trigger("inspect" + (renderer_view.mget('id')), indices, tool, renderer_view, source, data);
return !indices.is_empty();
} else {
return false;
}
};
SelectionManager.prototype.clear = function(rview) {
var k, ref, s, selector;
if (rview != null) {
selector = this._get_selector(rview);
selector.clear();
} else {
ref = this.selectors;
for (k in ref) {
s = ref[k];
s.clear();
}
}
return this.get('source').set({
"selected": hittest.create_hit_test_result()
});
};
SelectionManager.prototype._get_selector = function(rview) {
_.setdefault(this.selectors, rview.model.id, new Selector());
return this.selectors[rview.model.id];
};
SelectionManager.prototype._get_inspector = function(rview) {
_.setdefault(this.inspectors, rview.model.id, new Selector());
return this.inspectors[rview.model.id];
};
return SelectionManager;
})(HasProps);
module.exports = SelectionManager;
},{"../core/has_props":"core/has_props","../core/logging":"core/logging","../core/properties":"core/properties","./hittest":"common/hittest","./selector":"common/selector","underscore":"underscore"}],"common/selector":[function(require,module,exports){
var HasProps, Selector, _, hittest, logger, p,
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
hasProp = {}.hasOwnProperty;
_ = require("underscore");
HasProps = require("../core/has_props");
hittest = require("./hittest");
logger = require("../core/logging").logger;
p = require("../core/properties");
Selector = (function(superClass) {
extend(Selector, superClass);
function Selector() {
return Selector.__super__.constructor.apply(this, arguments);
}
Selector.prototype.type = 'Selector';
Selector.prototype.update = function(indices, final, append, silent) {
if (silent == null) {
silent = false;
}
this.set('timestamp', new Date(), {
silent: silent
});
this.set('final', final, {
silent: silent
});
if (append) {
indices['0d'].indices = _.union(this.get('indices')['0d'].indices, indices['0d'].indices);
indices['0d'].glyph = this.get('indices')['0d'].glyph || indices['0d'].glyph;
indices['1d'].indices = _.union(this.get('indices')['1d'].indices, indices['1d'].indices);
in