UNPKG

autograph

Version:

A visual data routing automation tool.

843 lines (842 loc) 30 kB
(function () { var t = this; var e = t.Backbone; var i = []; var r = i.push; var s = i.slice; var n = i.splice; var a; if (typeof exports !== "undefined") { a = exports } else { a = t.Backbone = {} } a.VERSION = "1.0.0"; var h = t._; if (!h && typeof require !== "undefined")h = require("underscore"); a.$ = t.jQuery || t.Zepto || t.ender || t.$; a.noConflict = function () { t.Backbone = e; return this }; a.emulateHTTP = false; a.emulateJSON = false; var o = a.Events = {on: function (t, e, i) { if (!l(this, "on", t, [e, i]) || !e)return this; this._events || (this._events = {}); var r = this._events[t] || (this._events[t] = []); r.push({callback: e, context: i, ctx: i || this}); return this }, once: function (t, e, i) { if (!l(this, "once", t, [e, i]) || !e)return this; var r = this; var s = h.once(function () { r.off(t, s); e.apply(this, arguments) }); s._callback = e; return this.on(t, s, i) }, off: function (t, e, i) { var r, s, n, a, o, u, c, f; if (!this._events || !l(this, "off", t, [e, i]))return this; if (!t && !e && !i) { this._events = {}; return this } a = t ? [t] : h.keys(this._events); for (o = 0, u = a.length; o < u; o++) { t = a[o]; if (n = this._events[t]) { this._events[t] = r = []; if (e || i) { for (c = 0, f = n.length; c < f; c++) { s = n[c]; if (e && e !== s.callback && e !== s.callback._callback || i && i !== s.context) { r.push(s) } } } if (!r.length)delete this._events[t] } } return this }, trigger: function (t) { if (!this._events)return this; var e = s.call(arguments, 1); if (!l(this, "trigger", t, e))return this; var i = this._events[t]; var r = this._events.all; if (i)c(i, e); if (r)c(r, arguments); return this }, stopListening: function (t, e, i) { var r = this._listeners; if (!r)return this; var s = !e && !i; if (typeof e === "object")i = this; if (t)(r = {})[t._listenerId] = t; for (var n in r) { r[n].off(e, i, this); if (s)delete this._listeners[n] } return this }}; var u = /\s+/; var l = function (t, e, i, r) { if (!i)return true; if (typeof i === "object") { for (var s in i) { t[e].apply(t, [s, i[s]].concat(r)) } return false } if (u.test(i)) { var n = i.split(u); for (var a = 0, h = n.length; a < h; a++) { t[e].apply(t, [n[a]].concat(r)) } return false } return true }; var c = function (t, e) { var i, r = -1, s = t.length, n = e[0], a = e[1], h = e[2]; switch (e.length) { case 0: while (++r < s)(i = t[r]).callback.call(i.ctx); return; case 1: while (++r < s)(i = t[r]).callback.call(i.ctx, n); return; case 2: while (++r < s)(i = t[r]).callback.call(i.ctx, n, a); return; case 3: while (++r < s)(i = t[r]).callback.call(i.ctx, n, a, h); return; default: while (++r < s)(i = t[r]).callback.apply(i.ctx, e) } }; var f = {listenTo: "on", listenToOnce: "once"}; h.each(f, function (t, e) { o[e] = function (e, i, r) { var s = this._listeners || (this._listeners = {}); var n = e._listenerId || (e._listenerId = h.uniqueId("l")); s[n] = e; if (typeof i === "object")r = this; e[t](i, r, this); return this } }); o.bind = o.on; o.unbind = o.off; h.extend(a, o); var d = a.Model = function (t, e) { var i; var r = t || {}; e || (e = {}); this.cid = h.uniqueId("c"); this.attributes = {}; h.extend(this, h.pick(e, p)); if (e.parse)r = this.parse(r, e) || {}; if (i = h.result(this, "defaults")) { r = h.defaults({}, r, i) } this.set(r, e); this.changed = {}; this.initialize.apply(this, arguments) }; var p = ["url", "urlRoot", "collection"]; h.extend(d.prototype, o, {changed: null, validationError: null, idAttribute: "id", initialize: function () { }, toJSON: function (t) { return h.clone(this.attributes) }, sync: function () { return a.sync.apply(this, arguments) }, get: function (t) { return this.attributes[t] }, escape: function (t) { return h.escape(this.get(t)) }, has: function (t) { return this.get(t) != null }, set: function (t, e, i) { var r, s, n, a, o, u, l, c; if (t == null)return this; if (typeof t === "object") { s = t; i = e } else { (s = {})[t] = e } i || (i = {}); if (!this._validate(s, i))return false; n = i.unset; o = i.silent; a = []; u = this._changing; this._changing = true; if (!u) { this._previousAttributes = h.clone(this.attributes); this.changed = {} } c = this.attributes, l = this._previousAttributes; if (this.idAttribute in s)this.id = s[this.idAttribute]; for (r in s) { e = s[r]; if (!h.isEqual(c[r], e))a.push(r); if (!h.isEqual(l[r], e)) { this.changed[r] = e } else { delete this.changed[r] } n ? delete c[r] : c[r] = e } if (!o) { if (a.length)this._pending = true; for (var f = 0, d = a.length; f < d; f++) { this.trigger("change:" + a[f], this, c[a[f]], i) } } if (u)return this; if (!o) { while (this._pending) { this._pending = false; this.trigger("change", this, i) } } this._pending = false; this._changing = false; return this }, unset: function (t, e) { return this.set(t, void 0, h.extend({}, e, {unset: true})) }, clear: function (t) { var e = {}; for (var i in this.attributes)e[i] = void 0; return this.set(e, h.extend({}, t, {unset: true})) }, hasChanged: function (t) { if (t == null)return!h.isEmpty(this.changed); return h.has(this.changed, t) }, changedAttributes: function (t) { if (!t)return this.hasChanged() ? h.clone(this.changed) : false; var e, i = false; var r = this._changing ? this._previousAttributes : this.attributes; for (var s in t) { if (h.isEqual(r[s], e = t[s]))continue; (i || (i = {}))[s] = e } return i }, previous: function (t) { if (t == null || !this._previousAttributes)return null; return this._previousAttributes[t] }, previousAttributes: function () { return h.clone(this._previousAttributes) }, fetch: function (t) { t = t ? h.clone(t) : {}; if (t.parse === void 0)t.parse = true; var e = this; var i = t.success; t.success = function (r) { if (!e.set(e.parse(r, t), t))return false; if (i)i(e, r, t); e.trigger("sync", e, r, t) }; R(this, t); return this.sync("read", this, t) }, save: function (t, e, i) { var r, s, n, a = this.attributes; if (t == null || typeof t === "object") { r = t; i = e } else { (r = {})[t] = e } if (r && (!i || !i.wait) && !this.set(r, i))return false; i = h.extend({validate: true}, i); if (!this._validate(r, i))return false; if (r && i.wait) { this.attributes = h.extend({}, a, r) } if (i.parse === void 0)i.parse = true; var o = this; var u = i.success; i.success = function (t) { o.attributes = a; var e = o.parse(t, i); if (i.wait)e = h.extend(r || {}, e); if (h.isObject(e) && !o.set(e, i)) { return false } if (u)u(o, t, i); o.trigger("sync", o, t, i) }; R(this, i); s = this.isNew() ? "create" : i.patch ? "patch" : "update"; if (s === "patch")i.attrs = r; n = this.sync(s, this, i); if (r && i.wait)this.attributes = a; return n }, destroy: function (t) { t = t ? h.clone(t) : {}; var e = this; var i = t.success; var r = function () { e.trigger("destroy", e, e.collection, t) }; t.success = function (s) { if (t.wait || e.isNew())r(); if (i)i(e, s, t); if (!e.isNew())e.trigger("sync", e, s, t) }; if (this.isNew()) { t.success(); return false } R(this, t); var s = this.sync("delete", this, t); if (!t.wait)r(); return s }, url: function () { var t = h.result(this, "urlRoot") || h.result(this.collection, "url") || U(); if (this.isNew())return t; return t + (t.charAt(t.length - 1) === "/" ? "" : "/") + encodeURIComponent(this.id) }, parse: function (t, e) { return t }, clone: function () { return new this.constructor(this.attributes) }, isNew: function () { return this.id == null }, isValid: function (t) { return this._validate({}, h.extend(t || {}, {validate: true})) }, _validate: function (t, e) { if (!e.validate || !this.validate)return true; t = h.extend({}, this.attributes, t); var i = this.validationError = this.validate(t, e) || null; if (!i)return true; this.trigger("invalid", this, i, h.extend(e || {}, {validationError: i})); return false }}); var v = ["keys", "values", "pairs", "invert", "pick", "omit"]; h.each(v, function (t) { d.prototype[t] = function () { var e = s.call(arguments); e.unshift(this.attributes); return h[t].apply(h, e) } }); var g = a.Collection = function (t, e) { e || (e = {}); if (e.url)this.url = e.url; if (e.model)this.model = e.model; if (e.comparator !== void 0)this.comparator = e.comparator; this._reset(); this.initialize.apply(this, arguments); if (t)this.reset(t, h.extend({silent: true}, e)) }; var m = {add: true, remove: true, merge: true}; var y = {add: true, merge: false, remove: false}; h.extend(g.prototype, o, {model: d, initialize: function () { }, toJSON: function (t) { return this.map(function (e) { return e.toJSON(t) }) }, sync: function () { return a.sync.apply(this, arguments) }, add: function (t, e) { return this.set(t, h.defaults(e || {}, y)) }, remove: function (t, e) { t = h.isArray(t) ? t.slice() : [t]; e || (e = {}); var i, r, s, n; for (i = 0, r = t.length; i < r; i++) { n = this.get(t[i]); if (!n)continue; delete this._byId[n.id]; delete this._byId[n.cid]; s = this.indexOf(n); this.models.splice(s, 1); this.length--; if (!e.silent) { e.index = s; n.trigger("remove", n, this, e) } this._removeReference(n) } return this }, set: function (t, e) { e = h.defaults(e || {}, m); if (e.parse)t = this.parse(t, e); if (!h.isArray(t))t = t ? [t] : []; var i, s, a, o, u, l; var c = e.at; var f = this.comparator && c == null && e.sort !== false; var d = h.isString(this.comparator) ? this.comparator : null; var p = [], v = [], g = {}; for (i = 0, s = t.length; i < s; i++) { if (!(a = this._prepareModel(t[i], e)))continue; if (u = this.get(a)) { if (e.remove)g[u.cid] = true; if (e.merge) { u.set(a.attributes, e); if (f && !l && u.hasChanged(d))l = true } } else if (e.add) { p.push(a); a.on("all", this._onModelEvent, this); this._byId[a.cid] = a; if (a.id != null)this._byId[a.id] = a } } if (e.remove) { for (i = 0, s = this.length; i < s; ++i) { if (!g[(a = this.models[i]).cid])v.push(a) } if (v.length)this.remove(v, e) } if (p.length) { if (f)l = true; this.length += p.length; if (c != null) { n.apply(this.models, [c, 0].concat(p)) } else { r.apply(this.models, p) } } if (l)this.sort({silent: true}); if (e.silent)return this; for (i = 0, s = p.length; i < s; i++) { (a = p[i]).trigger("add", a, this, e) } if (l)this.trigger("sort", this, e); return this }, reset: function (t, e) { e || (e = {}); for (var i = 0, r = this.models.length; i < r; i++) { this._removeReference(this.models[i]) } e.previousModels = this.models; this._reset(); this.add(t, h.extend({silent: true}, e)); if (!e.silent)this.trigger("reset", this, e); return this }, push: function (t, e) { t = this._prepareModel(t, e); this.add(t, h.extend({at: this.length}, e)); return t }, pop: function (t) { var e = this.at(this.length - 1); this.remove(e, t); return e }, unshift: function (t, e) { t = this._prepareModel(t, e); this.add(t, h.extend({at: 0}, e)); return t }, shift: function (t) { var e = this.at(0); this.remove(e, t); return e }, slice: function (t, e) { return this.models.slice(t, e) }, get: function (t) { if (t == null)return void 0; return this._byId[t.id != null ? t.id : t.cid || t] }, at: function (t) { return this.models[t] }, where: function (t, e) { if (h.isEmpty(t))return e ? void 0 : []; return this[e ? "find" : "filter"](function (e) { for (var i in t) { if (t[i] !== e.get(i))return false } return true }) }, findWhere: function (t) { return this.where(t, true) }, sort: function (t) { if (!this.comparator)throw new Error("Cannot sort a set without a comparator"); t || (t = {}); if (h.isString(this.comparator) || this.comparator.length === 1) { this.models = this.sortBy(this.comparator, this) } else { this.models.sort(h.bind(this.comparator, this)) } if (!t.silent)this.trigger("sort", this, t); return this }, sortedIndex: function (t, e, i) { e || (e = this.comparator); var r = h.isFunction(e) ? e : function (t) { return t.get(e) }; return h.sortedIndex(this.models, t, r, i) }, pluck: function (t) { return h.invoke(this.models, "get", t) }, fetch: function (t) { t = t ? h.clone(t) : {}; if (t.parse === void 0)t.parse = true; var e = t.success; var i = this; t.success = function (r) { var s = t.reset ? "reset" : "set"; i[s](r, t); if (e)e(i, r, t); i.trigger("sync", i, r, t) }; R(this, t); return this.sync("read", this, t) }, create: function (t, e) { e = e ? h.clone(e) : {}; if (!(t = this._prepareModel(t, e)))return false; if (!e.wait)this.add(t, e); var i = this; var r = e.success; e.success = function (s) { if (e.wait)i.add(t, e); if (r)r(t, s, e) }; t.save(null, e); return t }, parse: function (t, e) { return t }, clone: function () { return new this.constructor(this.models) }, _reset: function () { this.length = 0; this.models = []; this._byId = {} }, _prepareModel: function (t, e) { if (t instanceof d) { if (!t.collection)t.collection = this; return t } e || (e = {}); e.collection = this; var i = new this.model(t, e); if (!i._validate(t, e)) { this.trigger("invalid", this, t, e); return false } return i }, _removeReference: function (t) { if (this === t.collection)delete t.collection; t.off("all", this._onModelEvent, this) }, _onModelEvent: function (t, e, i, r) { if ((t === "add" || t === "remove") && i !== this)return; if (t === "destroy")this.remove(e, r); if (e && t === "change:" + e.idAttribute) { delete this._byId[e.previous(e.idAttribute)]; if (e.id != null)this._byId[e.id] = e } this.trigger.apply(this, arguments) }}); var _ = ["forEach", "each", "map", "collect", "reduce", "foldl", "inject", "reduceRight", "foldr", "find", "detect", "filter", "select", "reject", "every", "all", "some", "any", "include", "contains", "invoke", "max", "min", "toArray", "size", "first", "head", "take", "initial", "rest", "tail", "drop", "last", "without", "indexOf", "shuffle", "lastIndexOf", "isEmpty", "chain"]; h.each(_, function (t) { g.prototype[t] = function () { var e = s.call(arguments); e.unshift(this.models); return h[t].apply(h, e) } }); var w = ["groupBy", "countBy", "sortBy"]; h.each(w, function (t) { g.prototype[t] = function (e, i) { var r = h.isFunction(e) ? e : function (t) { return t.get(e) }; return h[t](this.models, r, i) } }); var b = a.View = function (t) { this.cid = h.uniqueId("view"); this._configure(t || {}); this._ensureElement(); this.initialize.apply(this, arguments); this.delegateEvents() }; var x = /^(\S+)\s*(.*)$/; var E = ["model", "collection", "el", "id", "attributes", "className", "tagName", "events"]; h.extend(b.prototype, o, {tagName: "div", $: function (t) { return this.$el.find(t) }, initialize: function () { }, render: function () { return this }, remove: function () { this.$el.remove(); this.stopListening(); return this }, setElement: function (t, e) { if (this.$el)this.undelegateEvents(); this.$el = t instanceof a.$ ? t : a.$(t); this.el = this.$el[0]; if (e !== false)this.delegateEvents(); return this }, delegateEvents: function (t) { if (!(t || (t = h.result(this, "events"))))return this; this.undelegateEvents(); for (var e in t) { var i = t[e]; if (!h.isFunction(i))i = this[t[e]]; if (!i)continue; var r = e.match(x); var s = r[1], n = r[2]; i = h.bind(i, this); s += ".delegateEvents" + this.cid; if (n === "") { this.$el.on(s, i) } else { this.$el.on(s, n, i) } } return this }, undelegateEvents: function () { this.$el.off(".delegateEvents" + this.cid); return this }, _configure: function (t) { if (this.options)t = h.extend({}, h.result(this, "options"), t); h.extend(this, h.pick(t, E)); this.options = t }, _ensureElement: function () { if (!this.el) { var t = h.extend({}, h.result(this, "attributes")); if (this.id)t.id = h.result(this, "id"); if (this.className)t["class"] = h.result(this, "className"); var e = a.$("<" + h.result(this, "tagName") + ">").attr(t); this.setElement(e, false) } else { this.setElement(h.result(this, "el"), false) } }}); a.sync = function (t, e, i) { var r = k[t]; h.defaults(i || (i = {}), {emulateHTTP: a.emulateHTTP, emulateJSON: a.emulateJSON}); var s = {type: r, dataType: "json"}; if (!i.url) { s.url = h.result(e, "url") || U() } if (i.data == null && e && (t === "create" || t === "update" || t === "patch")) { s.contentType = "application/json"; s.data = JSON.stringify(i.attrs || e.toJSON(i)) } if (i.emulateJSON) { s.contentType = "application/x-www-form-urlencoded"; s.data = s.data ? {model: s.data} : {} } if (i.emulateHTTP && (r === "PUT" || r === "DELETE" || r === "PATCH")) { s.type = "POST"; if (i.emulateJSON)s.data._method = r; var n = i.beforeSend; i.beforeSend = function (t) { t.setRequestHeader("X-HTTP-Method-Override", r); if (n)return n.apply(this, arguments) } } if (s.type !== "GET" && !i.emulateJSON) { s.processData = false } if (s.type === "PATCH" && window.ActiveXObject && !(window.external && window.external.msActiveXFilteringEnabled)) { s.xhr = function () { return new ActiveXObject("Microsoft.XMLHTTP") } } var o = i.xhr = a.ajax(h.extend(s, i)); e.trigger("request", e, o, i); return o }; var k = {create: "POST", update: "PUT", patch: "PATCH", "delete": "DELETE", read: "GET"}; a.ajax = function () { return a.$.ajax.apply(a.$, arguments) }; var S = a.Router = function (t) { t || (t = {}); if (t.routes)this.routes = t.routes; this._bindRoutes(); this.initialize.apply(this, arguments) }; var $ = /\((.*?)\)/g; var T = /(\(\?)?:\w+/g; var H = /\*\w+/g; var A = /[\-{}\[\]+?.,\\\^$|#\s]/g; h.extend(S.prototype, o, {initialize: function () { }, route: function (t, e, i) { if (!h.isRegExp(t))t = this._routeToRegExp(t); if (h.isFunction(e)) { i = e; e = "" } if (!i)i = this[e]; var r = this; a.history.route(t, function (s) { var n = r._extractParameters(t, s); i && i.apply(r, n); r.trigger.apply(r, ["route:" + e].concat(n)); r.trigger("route", e, n); a.history.trigger("route", r, e, n) }); return this }, navigate: function (t, e) { a.history.navigate(t, e); return this }, _bindRoutes: function () { if (!this.routes)return; this.routes = h.result(this, "routes"); var t, e = h.keys(this.routes); while ((t = e.pop()) != null) { this.route(t, this.routes[t]) } }, _routeToRegExp: function (t) { t = t.replace(A, "\\$&").replace($, "(?:$1)?").replace(T,function (t, e) { return e ? t : "([^/]+)" }).replace(H, "(.*?)"); return new RegExp("^" + t + "$") }, _extractParameters: function (t, e) { var i = t.exec(e).slice(1); return h.map(i, function (t) { return t ? decodeURIComponent(t) : null }) }}); var I = a.History = function () { this.handlers = []; h.bindAll(this, "checkUrl"); if (typeof window !== "undefined") { this.location = window.location; this.history = window.history } }; var N = /^[#\/]|\s+$/g; var P = /^\/+|\/+$/g; var O = /msie [\w.]+/; var C = /\/$/; I.started = false; h.extend(I.prototype, o, {interval: 50, getHash: function (t) { var e = (t || this).location.href.match(/#(.*)$/); return e ? e[1] : "" }, getFragment: function (t, e) { if (t == null) { if (this._hasPushState || !this._wantsHashChange || e) { t = this.location.pathname; var i = this.root.replace(C, ""); if (!t.indexOf(i))t = t.substr(i.length) } else { t = this.getHash() } } return t.replace(N, "") }, start: function (t) { if (I.started)throw new Error("Backbone.history has already been started"); I.started = true; this.options = h.extend({}, {root: "/"}, this.options, t); this.root = this.options.root; this._wantsHashChange = this.options.hashChange !== false; this._wantsPushState = !!this.options.pushState; this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState); var e = this.getFragment(); var i = document.documentMode; var r = O.exec(navigator.userAgent.toLowerCase()) && (!i || i <= 7); this.root = ("/" + this.root + "/").replace(P, "/"); if (r && this._wantsHashChange) { this.iframe = a.$('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow; this.navigate(e) } if (this._hasPushState) { a.$(window).on("popstate", this.checkUrl) } else if (this._wantsHashChange && "onhashchange"in window && !r) { a.$(window).on("hashchange", this.checkUrl) } else if (this._wantsHashChange) { this._checkUrlInterval = setInterval(this.checkUrl, this.interval) } this.fragment = e; var s = this.location; var n = s.pathname.replace(/[^\/]$/, "$&/") === this.root; if (this._wantsHashChange && this._wantsPushState && !this._hasPushState && !n) { this.fragment = this.getFragment(null, true); this.location.replace(this.root + this.location.search + "#" + this.fragment); return true } else if (this._wantsPushState && this._hasPushState && n && s.hash) { this.fragment = this.getHash().replace(N, ""); this.history.replaceState({}, document.title, this.root + this.fragment + s.search) } if (!this.options.silent)return this.loadUrl() }, stop: function () { a.$(window).off("popstate", this.checkUrl).off("hashchange", this.checkUrl); clearInterval(this._checkUrlInterval); I.started = false }, route: function (t, e) { this.handlers.unshift({route: t, callback: e}) }, checkUrl: function (t) { var e = this.getFragment(); if (e === this.fragment && this.iframe) { e = this.getFragment(this.getHash(this.iframe)) } if (e === this.fragment)return false; if (this.iframe)this.navigate(e); this.loadUrl() || this.loadUrl(this.getHash()) }, loadUrl: function (t) { var e = this.fragment = this.getFragment(t); var i = h.any(this.handlers, function (t) { if (t.route.test(e)) { t.callback(e); return true } }); return i }, navigate: function (t, e) { if (!I.started)return false; if (!e || e === true)e = {trigger: e}; t = this.getFragment(t || ""); if (this.fragment === t)return; this.fragment = t; var i = this.root + t; if (this._hasPushState) { this.history[e.replace ? "replaceState" : "pushState"]({}, document.title, i) } else if (this._wantsHashChange) { this._updateHash(this.location, t, e.replace); if (this.iframe && t !== this.getFragment(this.getHash(this.iframe))) { if (!e.replace)this.iframe.document.open().close(); this._updateHash(this.iframe.location, t, e.replace) } } else { return this.location.assign(i) } if (e.trigger)this.loadUrl(t) }, _updateHash: function (t, e, i) { if (i) { var r = t.href.replace(/(javascript:|#).*$/, ""); t.replace(r + "#" + e) } else { t.hash = "#" + e } }}); a.history = new I; var j = function (t, e) { var i = this; var r; if (t && h.has(t, "constructor")) { r = t.constructor } else { r = function () { return i.apply(this, arguments) } } h.extend(r, i, e); var s = function () { this.constructor = r }; s.prototype = i.prototype; r.prototype = new s; if (t)h.extend(r.prototype, t); r.__super__ = i.prototype; return r }; d.extend = g.extend = S.extend = b.extend = I.extend = j; var U = function () { throw new Error('A "url" property or function must be specified') }; var R = function (t, e) { var i = e.error; e.error = function (r) { if (i)i(t, r, e); t.trigger("error", t, r, e) } } }).call(this); /* //@ sourceMappingURL=backbone-min.map */