throttle m.route redraws
This commit is contained in:
parent
7368cf6f26
commit
2ffd2fb7e4
9 changed files with 161 additions and 119 deletions
27
api/mount.js
27
api/mount.js
|
|
@ -3,27 +3,6 @@
|
|||
var Vnode = require("../render/vnode")
|
||||
|
||||
module.exports = function(redrawService) {
|
||||
function throttle(callback) {
|
||||
//60fps translates to 16.6ms, round it down since setTimeout requires int
|
||||
var time = 16
|
||||
var last = 0, pending = null
|
||||
var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout
|
||||
return function() {
|
||||
var now = Date.now()
|
||||
if (last === 0 || now - last >= time) {
|
||||
last = now
|
||||
callback()
|
||||
}
|
||||
else if (pending === null) {
|
||||
pending = timeout(function() {
|
||||
pending = null
|
||||
callback()
|
||||
last = Date.now()
|
||||
}, time - (now - last))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return function(root, component) {
|
||||
if (component === null) {
|
||||
redrawService.render(root, [])
|
||||
|
|
@ -33,10 +12,10 @@ module.exports = function(redrawService) {
|
|||
|
||||
if (component.view == null) throw new Error("m.mount(element, component) expects a component, not a vnode")
|
||||
|
||||
var run = throttle(function() {
|
||||
var run = function() {
|
||||
redrawService.render(root, Vnode(component))
|
||||
})
|
||||
}
|
||||
redrawService.subscribe(root, run)
|
||||
run()
|
||||
redrawService.redraw()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,27 @@
|
|||
|
||||
var coreRenderer = require("../render/render")
|
||||
|
||||
function throttle(callback) {
|
||||
//60fps translates to 16.6ms, round it down since setTimeout requires int
|
||||
var time = 16
|
||||
var last = 0, pending = null
|
||||
var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout
|
||||
return function() {
|
||||
var now = Date.now()
|
||||
if (last === 0 || now - last >= time) {
|
||||
last = now
|
||||
callback()
|
||||
}
|
||||
else if (pending === null) {
|
||||
pending = timeout(function() {
|
||||
pending = null
|
||||
callback()
|
||||
last = Date.now()
|
||||
}, time - (now - last))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = function($window) {
|
||||
var renderService = coreRenderer($window)
|
||||
renderService.setEventCallback(function(e) {
|
||||
|
|
@ -11,7 +32,7 @@ module.exports = function($window) {
|
|||
var callbacks = []
|
||||
function subscribe(key, callback) {
|
||||
unsubscribe(key)
|
||||
callbacks.push(key, callback)
|
||||
callbacks.push(key, throttle(callback))
|
||||
}
|
||||
function unsubscribe(key) {
|
||||
var index = callbacks.indexOf(key)
|
||||
|
|
|
|||
|
|
@ -17,11 +17,11 @@ module.exports = function($window, redrawService) {
|
|||
current.resolve = null
|
||||
redrawService.render(root, current.render(Vnode(component, undefined, params)))
|
||||
}
|
||||
var run = routeService.defineRoutes(routes, function(component, params, path, route, isRouteChange) {
|
||||
var run = routeService.defineRoutes(routes, function(component, params, path, route, isAction) {
|
||||
if (component.view) render({}, component, params, path)
|
||||
else {
|
||||
if (component.onmatch) {
|
||||
if (isRouteChange === false && current.path === path || current.resolve != null) render(current, current.component, params)
|
||||
if (isAction === false && current.path === path || current.resolve != null) render(current, current.component, params)
|
||||
else {
|
||||
current.resolve = function(resolved) {
|
||||
render(component, resolved, params, path)
|
||||
|
|
|
|||
|
|
@ -221,14 +221,16 @@ o.spec("mount", function() {
|
|||
mount(root, {view: function() {i++}})
|
||||
var before = i
|
||||
|
||||
redrawService.redraw()
|
||||
redrawService.redraw()
|
||||
redrawService.redraw()
|
||||
redrawService.redraw()
|
||||
|
||||
var after = i
|
||||
|
||||
setTimeout(function(){
|
||||
o(before).equals(1)
|
||||
o(after).equals(1)
|
||||
o(before).equals(1) // mounts synchronously
|
||||
o(after).equals(1) // throttles rest
|
||||
o(i).equals(2)
|
||||
done()
|
||||
},40)
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@ o.spec("redrawService", function() {
|
|||
redrawService.redraw()
|
||||
})
|
||||
|
||||
o("should run a single renderer entry", function() {
|
||||
o("should run a single renderer entry", function(done) {
|
||||
var spy = o.spy()
|
||||
|
||||
redrawService.subscribe(root, spy)
|
||||
|
||||
o(spy.callCount).equals(0)
|
||||
|
||||
redrawService.redraw()
|
||||
|
||||
o(spy.callCount).equals(1)
|
||||
|
|
@ -30,10 +32,15 @@ o.spec("redrawService", function() {
|
|||
redrawService.redraw()
|
||||
redrawService.redraw()
|
||||
|
||||
o(spy.callCount).equals(4)
|
||||
o(spy.callCount).equals(1)
|
||||
setTimeout(function() {
|
||||
o(spy.callCount).equals(2)
|
||||
|
||||
done()
|
||||
}, 20)
|
||||
})
|
||||
|
||||
o("should run all renderer entries", function() {
|
||||
o("should run all renderer entries", function(done) {
|
||||
var el1 = $document.createElement("div")
|
||||
var el2 = $document.createElement("div")
|
||||
var el3 = $document.createElement("div")
|
||||
|
|
@ -53,9 +60,17 @@ o.spec("redrawService", function() {
|
|||
|
||||
redrawService.redraw()
|
||||
|
||||
o(spy1.callCount).equals(2)
|
||||
o(spy2.callCount).equals(2)
|
||||
o(spy3.callCount).equals(2)
|
||||
o(spy1.callCount).equals(1)
|
||||
o(spy2.callCount).equals(1)
|
||||
o(spy3.callCount).equals(1)
|
||||
|
||||
setTimeout(function() {
|
||||
o(spy1.callCount).equals(2)
|
||||
o(spy2.callCount).equals(2)
|
||||
o(spy3.callCount).equals(2)
|
||||
|
||||
done()
|
||||
}, 20)
|
||||
})
|
||||
|
||||
o("should stop running after unsubscribe", function() {
|
||||
|
|
|
|||
|
|
@ -608,6 +608,30 @@ o.spec("route", function() {
|
|||
done()
|
||||
}, 30)
|
||||
})
|
||||
|
||||
o("throttles", function(done, timeout) {
|
||||
timeout(200)
|
||||
|
||||
var i = 0
|
||||
$window.location.href = prefix + "/"
|
||||
route(root, "/", {
|
||||
"/": {view: function(v) {i++}}
|
||||
})
|
||||
var before = i
|
||||
|
||||
redrawService.redraw()
|
||||
redrawService.redraw()
|
||||
redrawService.redraw()
|
||||
redrawService.redraw()
|
||||
var after = i
|
||||
|
||||
setTimeout(function(){
|
||||
o(before).equals(1) // routes synchronously
|
||||
o(after).equals(2) // redraws synchronously
|
||||
o(i).equals(3) // throttles rest
|
||||
done()
|
||||
},40)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
|
|||
74
mithril.js
74
mithril.js
|
|
@ -881,7 +881,7 @@ var coreRenderer = function($window) {
|
|||
if (!dom) throw new Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.")
|
||||
var hooks = []
|
||||
var active = $doc.activeElement
|
||||
// First time rendering into a node clears it out
|
||||
// First time0 rendering into a node clears it out
|
||||
if (dom.vnodes == null) dom.textContent = ""
|
||||
if (!(vnodes instanceof Array)) vnodes = [vnodes]
|
||||
updateNodes(dom, dom.vnodes, Vnode.normalizeChildren(vnodes), hooks, null, undefined)
|
||||
|
|
@ -891,6 +891,26 @@ var coreRenderer = function($window) {
|
|||
}
|
||||
return {render: render, setEventCallback: setEventCallback}
|
||||
}
|
||||
function throttle(callback) {
|
||||
//60fps translates to 16.6ms, round it down since setTimeout requires int
|
||||
var time = 16
|
||||
var last = 0, pending = null
|
||||
var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout
|
||||
return function() {
|
||||
var now = Date.now()
|
||||
if (last === 0 || now - last >= time) {
|
||||
last = now
|
||||
callback()
|
||||
}
|
||||
else if (pending === null) {
|
||||
pending = timeout(function() {
|
||||
pending = null
|
||||
callback()
|
||||
last = Date.now()
|
||||
}, time - (now - last))
|
||||
}
|
||||
}
|
||||
}
|
||||
var _11 = function($window) {
|
||||
var renderService = coreRenderer($window)
|
||||
renderService.setEventCallback(function(e) {
|
||||
|
|
@ -900,7 +920,7 @@ var _11 = function($window) {
|
|||
var callbacks = []
|
||||
function subscribe(key1, callback) {
|
||||
unsubscribe(key1)
|
||||
callbacks.push(key1, callback)
|
||||
callbacks.push(key1, throttle(callback))
|
||||
}
|
||||
function unsubscribe(key1) {
|
||||
var index = callbacks.indexOf(key1)
|
||||
|
|
@ -916,27 +936,6 @@ var _11 = function($window) {
|
|||
var redrawService = _11(window)
|
||||
requestService.setCompletionCallback(redrawService.redraw)
|
||||
var _16 = function(redrawService0) {
|
||||
function throttle(callback0) {
|
||||
//60fps translates to 16.6ms, round it down since setTimeout requires int
|
||||
var time = 16
|
||||
var last = 0, pending = null
|
||||
var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout
|
||||
return function() {
|
||||
var now = Date.now()
|
||||
if (last === 0 || now - last >= time) {
|
||||
last = now
|
||||
callback0()
|
||||
}
|
||||
else if (pending === null) {
|
||||
pending = timeout(function() {
|
||||
pending = null
|
||||
callback0()
|
||||
last = Date.now()
|
||||
}, time - (now - last))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return function(root, component) {
|
||||
if (component === null) {
|
||||
redrawService0.render(root, [])
|
||||
|
|
@ -946,11 +945,11 @@ var _16 = function(redrawService0) {
|
|||
|
||||
if (component.view == null) throw new Error("m.mount(element, component) expects a component, not a vnode")
|
||||
|
||||
var run0 = throttle(function() {
|
||||
var run0 = function() {
|
||||
redrawService0.render(root, Vnode(component))
|
||||
})
|
||||
}
|
||||
redrawService0.subscribe(root, run0)
|
||||
run0()
|
||||
redrawService0.redraw()
|
||||
}
|
||||
}
|
||||
m.mount = _16(redrawService)
|
||||
|
|
@ -1049,11 +1048,7 @@ var coreRouter = function($window) {
|
|||
else $window.location.href = prefix1 + path
|
||||
}
|
||||
function defineRoutes(routes, resolve, reject) {
|
||||
if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute)
|
||||
else if (prefix1.charAt(0) === "#") $window.onhashchange = resolveRoute
|
||||
resolveRoute(true)
|
||||
|
||||
function resolveRoute(isRouteChange) {
|
||||
function resolveRoute(isAction) {
|
||||
var path = getPath()
|
||||
var params = {}
|
||||
var pathname = parsePath(path, params, params)
|
||||
|
|
@ -1067,14 +1062,19 @@ var coreRouter = function($window) {
|
|||
for (var i = 0; i < keys.length; i++) {
|
||||
params[keys[i].replace(/:|\./g, "")] = decodeURIComponent(values[i])
|
||||
}
|
||||
resolve(routes[route0], params, path, route0, Boolean(isRouteChange))
|
||||
resolve(routes[route0], params, path, route0, Boolean(isAction))
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
reject(path, params)
|
||||
}
|
||||
return function() {resolveRoute(false)}
|
||||
|
||||
if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute)
|
||||
else if (prefix1.charAt(0) === "#") $window.onhashchange = resolveRoute
|
||||
resolveRoute(true)
|
||||
|
||||
return resolveRoute
|
||||
}
|
||||
function link(vnode2) {
|
||||
vnode2.dom.setAttribute("href", prefix1 + vnode2.attrs.href)
|
||||
|
|
@ -1103,11 +1103,11 @@ var _20 = function($window, redrawService0) {
|
|||
current.resolve = null
|
||||
redrawService0.render(root, current.render(Vnode(component, undefined, params)))
|
||||
}
|
||||
var run1 = routeService.defineRoutes(routes, function(component, params, path, route, isRouteChange) {
|
||||
var run1 = routeService.defineRoutes(routes, function(component, params, path, route, isAction) {
|
||||
if (component.view) render1({}, component, params, path)
|
||||
else {
|
||||
if (component.onmatch) {
|
||||
if (isRouteChange === false && current.path === path || current.resolve != null) render1(current, current.component, params)
|
||||
if (isAction === false && current.path === path || current.resolve != null) render1(current, current.component, params)
|
||||
else {
|
||||
current.resolve = function(resolved) {
|
||||
render1(component, resolved, params, path)
|
||||
|
|
@ -1131,9 +1131,9 @@ var _20 = function($window, redrawService0) {
|
|||
return route
|
||||
}
|
||||
m.route = _20(window, redrawService)
|
||||
m.withAttr = function(attrName, callback1, context) {
|
||||
m.withAttr = function(attrName, callback0, context) {
|
||||
return function(e) {
|
||||
return callback1.call(context || this, attrName in e.currentTarget ? e.currentTarget[attrName] : e.currentTarget.getAttribute(attrName))
|
||||
return callback0.call(context || this, attrName in e.currentTarget ? e.currentTarget[attrName] : e.currentTarget.getAttribute(attrName))
|
||||
}
|
||||
}
|
||||
var _27 = coreRenderer(window)
|
||||
|
|
|
|||
80
mithril.min.js
vendored
80
mithril.min.js
vendored
|
|
@ -1,41 +1,41 @@
|
|||
new function(){function t(a,f,g,c,d,h){return{tag:a,key:f,attrs:g,children:c,text:d,dom:h,domSize:void 0,state:{},events:void 0,instance:void 0,skip:!1}}function A(a){if(null==a||"string"!==typeof a&&null==a.view)throw Error("The selector must be either a string or a component.");if("string"===typeof a&&void 0===I[a]){for(var f,g,c=[],d={};f=N.exec(a);){var h=f[1],m=f[2];""===h&&""!==m?g=m:"#"===h?d.id=m:"."===h?c.push(m):"["===f[3][0]&&((h=f[6])&&(h=h.replace(/\\(["'])/g,"$1").replace(/\\\\/g,"\\")),
|
||||
"class"===f[4]?c.push(h):d[f[4]]=h||!0)}0<c.length&&(d.className=c.join(" "));I[a]=function(a,c){var h=!1,b,f,v=a.className||a["class"],r;for(r in d)a[r]=d[r];void 0!==v&&(void 0!==a["class"]&&(a["class"]=void 0,a.className=v),void 0!==d.className&&(a.className=d.className+" "+v));for(r in a)if("key"!==r){h=!0;break}c instanceof Array&&1==c.length&&null!=c[0]&&"#"===c[0].tag?f=c[0].children:b=c;return t(g||"div",a.key,h?a:void 0,b,f,void 0)}}var z;null!=arguments[1]&&("object"!==typeof arguments[1]||
|
||||
void 0!==arguments[1].tag||arguments[1]instanceof Array)?c=1:(z=arguments[1],c=2);if(arguments.length===c+1)f=arguments[c]instanceof Array?arguments[c]:[arguments[c]];else for(f=[];c<arguments.length;c++)f.push(arguments[c]);return"string"===typeof a?I[a](z||{},t.normalizeChildren(f)):t(a,z&&z.key,z||{},t.normalizeChildren(f),void 0,void 0)}t.normalize=function(a){return a instanceof Array?t("[",void 0,void 0,t.normalizeChildren(a),void 0,void 0):null!=a&&"object"!==typeof a?t("#",void 0,void 0,a,
|
||||
void 0,void 0):a};t.normalizeChildren=function(a){for(var f=0;f<a.length;f++)a[f]=t.normalize(a[f]);return a};var N=/(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g,I={};A.trust=function(a){null==a&&(a="");return t("<",void 0,void 0,a,void 0,void 0)};A.fragment=function(a,f){return t("[",a.key,a,t.normalizeChildren(f),void 0,void 0)};var u=function(a){function f(a,b){return function v(f){var k;try{if(!b||null==f||"object"!==typeof f&&"function"!==typeof f||"function"!==
|
||||
typeof(k=f.then))D(function(){b||0!==a.length||console.error("Possible unhandled promise rejection:",f);for(var c=0;c<a.length;c++)a[c](f);d.length=0;h.length=0;n.state=b;n.retry=function(){v(f)}});else{if(f===c)throw new TypeError("Promise can't be resolved w/ itself");g(k.bind(f))}}catch(H){z(H)}}}function g(a){function b(b){return function(a){0<c++||b(a)}}var c=0,d=b(z);try{a(b(m),d)}catch(r){d(r)}}if(!(this instanceof u))throw Error("Promise must be called with `new`");if("function"!==typeof a)throw new TypeError("executor must be a function");
|
||||
var c=this,d=[],h=[],m=f(d,!0),z=f(h,!1),n=c._instance={resolvers:d,rejectors:h},D="function"===typeof setImmediate?setImmediate:setTimeout;g(a)};u.prototype.then=function(a,f){function g(a,f,g,k){f.push(function(b){if("function"!==typeof a)g(b);else try{d(a(b))}catch(C){h&&h(C)}});"function"===typeof c.retry&&k===c.state&&c.retry()}var c=this._instance,d,h,m=new u(function(a,c){d=a;h=c});g(a,c.resolvers,d,!0);g(f,c.rejectors,h,!1);return m};u.prototype["catch"]=function(a){return this.then(null,
|
||||
a)};u.resolve=function(a){return a instanceof u?a:new u(function(f){f(a)})};u.reject=function(a){return new u(function(f,g){g(a)})};u.all=function(a){return new u(function(f,g){var c=a.length,d=0,h=[];if(0===a.length)f([]);else for(var m=0;m<a.length;m++)(function(m){function n(a){d++;h[m]=a;d===c&&f(h)}null==a[m]||"object"!==typeof a[m]&&"function"!==typeof a[m]||"function"!==typeof a[m].then?n(a[m]):a[m].then(n,g)})(m)})};u.race=function(a){return new u(function(f,g){for(var c=0;c<a.length;c++)a[c].then(f,
|
||||
g)})};"undefined"===typeof Promise&&("undefined"!==typeof window?window.Promise=u:"undefined"!==typeof global&&(global.Promise=u));var F=function(a){function f(a,c){if(c instanceof Array)for(var d=0;d<c.length;d++)f(a+"["+d+"]",c[d]);else if("[object Object]"===Object.prototype.toString.call(c))for(d in c)f(a+"["+d+"]",c[d]);else g.push(encodeURIComponent(a)+(null!=c&&""!==c?"="+encodeURIComponent(c):""))}if("[object Object]"!==Object.prototype.toString.call(a))return"";var g=[],c;for(c in a)f(c,
|
||||
a[c]);return g.join("&")},J=function(a,f){function g(){function b(){0===--a&&"function"===typeof k&&k()}var a=0;return function r(c){var d=c.then;c.then=function(){a++;var f=d.apply(c,arguments);f.then(b,function(a){b();throw a;});return r(f)};return c}}function c(b,a){if("string"===typeof b){var c=b;b=a||{};null==b.url&&(b.url=c)}return b}function d(b,a){if(null==a)return b;for(var c=b.match(/:[^\/]+/gi)||[],d=0;d<c.length;d++){var f=c[d].slice(1);null!=a[f]&&(b=b.replace(c[d],a[f]),delete a[f])}return b}
|
||||
function h(b,a){var c=F(a);if(""!==c){var d=0>b.indexOf("?")?"?":"&";b+=d+c}return b}function m(b){try{return""!==b?JSON.parse(b):null}catch(C){throw Error(b);}}function z(b){return b.responseText}function n(b,a){if("function"===typeof b)if(a instanceof Array)for(var c=0;c<a.length;c++)a[c]=new b(a[c]);else return new b(a);return a}var t=0,k;return{request:function(b,k){var v=g();b=c(b,k);var r=new f(function(c,f){null==b.method&&(b.method="GET");b.method=b.method.toUpperCase();var k="boolean"===
|
||||
typeof b.useBody?b.useBody:"GET"!==b.method&&"TRACE"!==b.method;"function"!==typeof b.serialize&&(b.serialize="undefined"!==typeof FormData&&b.data instanceof FormData?function(a){return a}:JSON.stringify);"function"!==typeof b.deserialize&&(b.deserialize=m);"function"!==typeof b.extract&&(b.extract=z);b.url=d(b.url,b.data);k?b.data=b.serialize(b.data):b.url=h(b.url,b.data);var g=new a.XMLHttpRequest;g.open(b.method,b.url,"boolean"===typeof b.async?b.async:!0,"string"===typeof b.user?b.user:void 0,
|
||||
"string"===typeof b.password?b.password:void 0);b.serialize===JSON.stringify&&k&&g.setRequestHeader("Content-Type","application/json; charset=utf-8");b.deserialize===m&&g.setRequestHeader("Accept","application/json, text/*");b.withCredentials&&(g.withCredentials=b.withCredentials);"function"===typeof b.config&&(g=b.config(g,b)||g);g.onreadystatechange=function(){if(4===g.readyState)try{var a=b.extract!==z?b.extract(g,b):b.deserialize(b.extract(g,b));if(200<=g.status&&300>g.status||304===g.status)c(n(b.type,
|
||||
a));else{var d=Error(g.responseText),h;for(h in a)d[h]=a[h];f(d)}}catch(G){f(G)}};k&&null!=b.data?g.send(b.data):g.send()});return!0===b.background?r:v(r)},jsonp:function(b,k){var m=g();b=c(b,k);var r=new f(function(c,f){var g=b.callbackName||"_mithril_"+Math.round(1E16*Math.random())+"_"+t++,k=a.document.createElement("script");a[g]=function(d){k.parentNode.removeChild(k);c(n(b.type,d));delete a[g]};k.onerror=function(){k.parentNode.removeChild(k);f(Error("JSONP request failed"));delete a[g]};null==
|
||||
b.data&&(b.data={});b.url=d(b.url,b.data);b.data[b.callbackKey||"callback"]=g;k.src=h(b.url,b.data);a.document.documentElement.appendChild(k)});return!0===b.background?r:m(r)},setCompletionCallback:function(a){k=a}}}(window,"undefined"!==typeof Promise?Promise:u),M=function(a){function f(e,l,a,b,c,d,f){for(;a<b;a++){var p=l[a];null!=p&&n(e,g(p,c,f),d)}}function g(e,l,a){var b=e.tag;null!=e.attrs&&u(e.attrs,e,l);if("string"===typeof b)switch(b){case "#":return e.dom=B.createTextNode(e.children);case "<":return c(e);
|
||||
case "[":var p=B.createDocumentFragment();null!=e.children&&(b=e.children,f(p,b,0,b.length,l,null,a));e.dom=p.firstChild;e.domSize=p.childNodes.length;return p;default:var d=e.tag;switch(e.tag){case "svg":a="http://www.w3.org/2000/svg";break;case "math":a="http://www.w3.org/1998/Math/MathML"}var k=(b=e.attrs)&&b.is,d=a?k?B.createElementNS(a,d,{is:k}):B.createElementNS(a,d):k?B.createElement(d,{is:k}):B.createElement(d);e.dom=d;if(null!=b)for(p in k=a,b)r(e,p,null,b[p],k);null!=e.attrs&&null!=e.attrs.contenteditable?
|
||||
D(e):(null!=e.text&&(""!==e.text?d.textContent=e.text:e.children=[t("#",void 0,void 0,e.text,void 0,void 0)]),null!=e.children&&(p=e.children,f(d,p,0,p.length,l,null,a),l=e.attrs,"select"===e.tag&&null!=l&&("value"in l&&r(e,"value",null,l.value,void 0),"selectedIndex"in l&&r(e,"selectedIndex",null,l.selectedIndex,void 0))));return d}else{e.state||(e.state={});F(e.state,e.tag);p=e.tag.view;if(null!=p.reentrantLock)e=E;else if(p.reentrantLock=!0,u(e.tag,e,l),e.instance=t.normalize(p.call(e.state,e)),
|
||||
p.reentrantLock=null,null!=e.instance){if(e.instance===e)throw Error("A view cannot return the vnode it received as arguments");l=g(e.instance,l,a);e.dom=e.instance.dom;e.domSize=null!=e.dom?e.instance.domSize:0;e=l}else e.domSize=0,e=E;return e}}function c(e){var l={caption:"table",thead:"table",tbody:"table",tfoot:"table",tr:"tbody",th:"tr",td:"tr",colgroup:"table",col:"colgroup"}[(e.children.match(/^\s*?<(\w+)/im)||[])[1]]||"div",l=B.createElement(l);l.innerHTML=e.children;e.dom=l.firstChild;e.domSize=
|
||||
l.childNodes.length;e=B.createDocumentFragment();for(var a;a=l.firstChild;)e.appendChild(a);return e}function d(e,l,a,b,c,d){if(l!==a&&(null!=l||null!=a))if(null==l)f(e,a,0,a.length,b,c,void 0);else if(null==a)k(l,0,l.length,a);else{for(var p=!1,w=0;w<a.length;w++)if(null!=a[w]){p=null==a[w].key;break}if(l.length===a.length&&p)for(w=0;w<l.length;w++)l[w]!==a[w]&&(null==l[w]?n(e,g(a[w],b,d),z(l,w+1,c)):null==a[w]?k(l,w,w+1,a):h(e,l[w],a[w],b,z(l,w+1,c),!1,d));else{a:{if(null!=l.pool&&Math.abs(l.pool.length-
|
||||
a.length)<=Math.abs(l.length-a.length)&&(p=a[0]&&a[0].children&&a[0].children.length||0,Math.abs((l.pool[0]&&l.pool[0].children&&l.pool[0].children.length||0)-p)<=Math.abs((l[0]&&l[0].children&&l[0].children.length||0)-p))){p=!0;break a}p=!1}p&&(l=l.concat(l.pool));for(var y=w=0,r=l.length-1,v=a.length-1,t;r>=w&&v>=y;){var x=l[w],q=a[y];if(x!==q||p)if(null==x)w++;else if(null==q)y++;else if(x.key===q.key)w++,y++,h(e,x,q,b,z(l,w,c),p,d),p&&x.tag===q.tag&&n(e,m(x),c);else if(x=l[r],x!==q||p)if(null==
|
||||
x)r--;else if(null==q)y++;else if(x.key===q.key)h(e,x,q,b,z(l,r+1,c),p,d),(p||y<v)&&n(e,m(x),z(l,w,c)),r--,y++;else break;else r--,y++;else w++,y++}for(;r>=w&&v>=y;){x=l[r];q=a[v];if(x!==q||p)if(null==x)r--;else{if(null!=q)if(x.key===q.key)h(e,x,q,b,z(l,r+1,c),p,d),p&&x.tag===q.tag&&n(e,m(x),c),null!=x.dom&&(c=x.dom),r--;else{if(!t){t=l;var x=r,C={},u;for(u=0;u<x;u++){var D=t[u];null!=D&&(D=D.key,null!=D&&(C[D]=u))}t=C}null!=q&&(x=t[q.key],null!=x?(C=l[x],h(e,C,q,b,z(l,r+1,c),p,d),n(e,m(C),c),l[x].skip=
|
||||
!0,null!=C.dom&&(c=C.dom)):(q=g(q,b,void 0),n(e,q,c),c=q))}v--}else r--,v--;if(v<y)break}f(e,a,y,v+1,b,c,d);k(l,w,r+1,a)}}}function h(e,a,b,f,k,y,v){var l=a.tag;if(l===b.tag){b.state=a.state;b.events=a.events;var p;var w;null!=b.attrs&&"function"===typeof b.attrs.onbeforeupdate&&(p=b.attrs.onbeforeupdate.call(b.state,b,a));"string"!==typeof b.tag&&"function"===typeof b.tag.onbeforeupdate&&(w=b.tag.onbeforeupdate.call(b.state,b,a));void 0===p&&void 0===w||p||w?p=!1:(b.dom=a.dom,b.domSize=a.domSize,
|
||||
b.instance=a.instance,p=!0);if(!p)if(null!=b.attrs&&A(b.attrs,b,f,y),"string"===typeof l)switch(l){case "#":a.children.toString()!==b.children.toString()&&(a.dom.nodeValue=b.children);b.dom=a.dom;break;case "<":a.children!==b.children?(m(a),n(e,c(b),k)):(b.dom=a.dom,b.domSize=a.domSize);break;case "[":d(e,a.children,b.children,f,k,v);a=0;f=b.children;b.dom=null;if(null!=f){for(var q=0;q<f.length;q++)e=f[q],null!=e&&null!=e.dom&&(null==b.dom&&(b.dom=e.dom),a+=e.domSize||1);1!==a&&(b.domSize=a)}break;
|
||||
default:e=v;k=b.dom=a.dom;switch(b.tag){case "svg":e="http://www.w3.org/2000/svg";break;case "math":e="http://www.w3.org/1998/Math/MathML"}"textarea"===b.tag&&(null==b.attrs&&(b.attrs={}),null!=b.text&&(b.attrs.value=b.text,b.text=void 0));y=a.attrs;v=b.attrs;l=e;if(null!=v)for(q in v)r(b,q,y&&y[q],v[q],l);if(null!=y)for(q in y)null!=v&&q in v||("className"===q&&(q="class"),"o"!==q[0]||"n"!==q[1]||L(q)?"key"!==q&&b.dom.removeAttribute(q):H(b,q,void 0));null!=b.attrs&&null!=b.attrs.contenteditable?
|
||||
D(b):null!=a.text&&null!=b.text&&""!==b.text?a.text.toString()!==b.text.toString()&&(a.dom.firstChild.nodeValue=b.text):(null!=a.text&&(a.children=[t("#",void 0,void 0,a.text,void 0,a.dom.firstChild)]),null!=b.text&&(b.children=[t("#",void 0,void 0,b.text,void 0,void 0)]),d(k,a.children,b.children,f,null,e))}else b.instance=t.normalize(b.tag.view.call(b.state,b)),A(b.tag,b,f,y),null!=b.instance?(null==a.instance?n(e,g(b.instance,f,v),k):h(e,a.instance,b.instance,f,k,y,v),b.dom=b.instance.dom,b.domSize=
|
||||
b.instance.domSize):null!=a.instance?(C(a.instance,null),b.dom=void 0,b.domSize=0):(b.dom=a.dom,b.domSize=a.domSize)}else C(a,null),n(e,g(b,f,v),k)}function m(b){var a=b.domSize;if(null!=a||null==b.dom){var e=B.createDocumentFragment();if(0<a){for(b=b.dom;--a;)e.appendChild(b.nextSibling);e.insertBefore(b,e.firstChild)}return e}return b.dom}function z(b,a,c){for(;a<b.length;a++)if(null!=b[a]&&null!=b[a].dom)return b[a].dom;return c}function n(b,a,c){c&&c.parentNode?b.insertBefore(a,c):b.appendChild(a)}
|
||||
function D(b){var a=b.children;if(null!=a&&1===a.length&&"<"===a[0].tag)a=a[0].children,b.dom.innerHTML!==a&&(b.dom.innerHTML=a);else if(null!=b.text||null!=a&&0!==a.length)throw Error("Child node of a contenteditable must be trusted");}function k(b,a,c,d){for(;a<c;a++){var e=b[a];null!=e&&(e.skip?e.skip=!1:C(e,d))}}function b(b){var a=!1;return function(){a||(a=!0,b())}}function C(a,c){function e(){if(++d===l&&(v(a),a.dom)){var b=a.domSize||1;if(1<b)for(var e=a.dom;--b;){var f=e.nextSibling,k=f.parentNode;
|
||||
null!=k&&k.removeChild(f)}b=a.dom;e=b.parentNode;null!=e&&e.removeChild(b);if(b=null!=c&&null==a.domSize)b=a.attrs,b=!(null!=b&&(b.oncreate||b.onupdate||b.onbeforeremove||b.onremove));b&&"string"===typeof a.tag&&(c.pool?c.pool.push(a):c.pool=[a])}}var l=1,d=0;a.attrs&&a.attrs.onbeforeremove&&(l++,a.attrs.onbeforeremove.call(a.state,a,b(e)));"string"!==typeof a.tag&&a.tag.onbeforeremove&&(l++,a.tag.onbeforeremove.call(a.state,a,b(e)));e()}function v(a){a.attrs&&a.attrs.onremove&&a.attrs.onremove.call(a.state,
|
||||
a);"string"!==typeof a.tag&&a.tag.onremove&&a.tag.onremove.call(a.state,a);if(null!=a.instance)v(a.instance);else if(a=a.children,a instanceof Array)for(var b=0;b<a.length;b++){var e=a[b];null!=e&&v(e)}}function r(a,b,c,d,f){var e=a.dom;if("key"!==b&&(c!==d||"value"===b||"checked"===b||"selectedIndex"===b||"selected"===b&&a.dom===B.activeElement||"object"===typeof d)&&"undefined"!==typeof d&&!L(b)){var l=b.indexOf(":");if(-1<l&&"xlink"===b.substr(0,l))e.setAttributeNS("http://www.w3.org/1999/xlink",
|
||||
b.slice(l+1),d);else if("o"===b[0]&&"n"===b[1]&&"function"===typeof d)H(a,b,d);else if("style"===b)if(a=c,a===d&&(e.style.cssText="",a=null),null==d)e.style.cssText="";else if("string"===typeof d)e.style.cssText=d;else{"string"===typeof a&&(e.style.cssText="");for(var k in d)e.style[k]=d[k];if(null!=a&&"string"!==typeof a)for(k in a)k in d||(e.style[k]="")}else b in e&&"href"!==b&&"list"!==b&&"form"!==b&&"width"!==b&&"height"!==b&&void 0===f?"input"===a.tag&&"value"===b&&a.dom.value===d&&a.dom===
|
||||
B.activeElement||"select"===a.tag&&"value"===b&&a.dom.value===d&&a.dom===B.activeElement||"option"===a.tag&&"value"===b&&a.dom.value===d||(e[b]=d):"boolean"===typeof d?d?e.setAttribute(b,""):e.removeAttribute(b):e.setAttribute("className"===b?"class":b,d)}}function L(a){return"oninit"===a||"oncreate"===a||"onupdate"===a||"onremove"===a||"onbeforeremove"===a||"onbeforeupdate"===a}function H(a,b,c){var e=a.dom,d=function(a){var b=c.call(e,a);"function"===typeof G&&G.call(e,a);return b};if(b in e)e[b]=
|
||||
"function"===typeof c?d:null;else{var f=b.slice(2);void 0===a.events&&(a.events={});null!=a.events[b]&&e.removeEventListener(f,a.events[b],!1);"function"===typeof c&&(a.events[b]=d,e.addEventListener(f,a.events[b],!1))}}function u(a,b,c){"function"===typeof a.oninit&&a.oninit.call(b.state,b);"function"===typeof a.oncreate&&c.push(a.oncreate.bind(b.state,b))}function A(a,b,c,d){d?u(a,b,c):"function"===typeof a.onupdate&&c.push(a.onupdate.bind(b.state,b))}function F(a,b){Object.keys(b).forEach(function(c){a[c]=
|
||||
b[c]})}var B=a.document,E=B.createDocumentFragment(),G;return{render:function(a,b){if(!a)throw Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.");var c=[],e=B.activeElement;null==a.vnodes&&(a.textContent="");b instanceof Array||(b=[b]);d(a,a.vnodes,t.normalizeChildren(b),c,null,void 0);a.vnodes=b;for(var f=0;f<c.length;f++)c[f]();B.activeElement!==e&&e.focus()},setEventCallback:function(a){return G=a}}},E=function(a){function f(a){a=c.indexOf(a);-1<a&&c.splice(a,
|
||||
2)}function g(){for(var a=1;a<c.length;a+=2)c[a]()}a=M(a);a.setEventCallback(function(a){!1!==a.redraw&&g()});var c=[];return{subscribe:function(a,g){f(a);c.push(a,g)},unsubscribe:f,redraw:g,render:a.render}}(window);J.setCompletionCallback(E.redraw);A.mount=function(a){function f(a){var c=0,d=null,f="function"===typeof requestAnimationFrame?requestAnimationFrame:setTimeout;return function(){var g=Date.now();0===c||16<=g-c?(c=g,a()):null===d&&(d=f(function(){d=null;a();c=Date.now()},16-(g-c)))}}return function(g,
|
||||
c){if(null===c)a.render(g,[]),a.unsubscribe(g);else{if(null==c.view)throw Error("m.mount(element, component) expects a component, not a vnode");var d=f(function(){a.render(g,t(c))});a.subscribe(g,d);d()}}}(E);var K=function(a){if(""===a||null==a)return{};"?"===a.charAt(0)&&(a=a.slice(1));a=a.split("&");for(var f={},g={},c=0;c<a.length;c++){var d=a[c].split("="),h=decodeURIComponent(d[0]),d=2===d.length?decodeURIComponent(d[1]):"";"true"===d?d=!0:"false"===d&&(d=!1);var m=h.split(/\]\[?|\[/),t=f;-1<
|
||||
h.indexOf("[")&&m.pop();for(var n=0;n<m.length;n++){var h=m[n],u=m[n+1],u=""==u||!isNaN(parseInt(u,10)),k=n===m.length-1;""===h&&(h=m.slice(0,n).join(),null==g[h]&&(g[h]=0),h=g[h]++);null==t[h]&&(t[h]=k?d:u?[]:{});t=t[h]}}return f},O=function(a){function f(c){var b=a.location[c].replace(/(?:%[a-f89][a-f0-9])+/gim,decodeURIComponent);"pathname"===c&&"/"!==b[0]&&(b="/"+b);return b}function g(a){return function(b){null==u&&(u=t(function(){u=null;a(b)}))}}function c(a,b,c){var d=a.indexOf("?"),f=a.indexOf("#"),
|
||||
g=-1<d?d:-1<f?f:a.length;if(-1<d){var d=K(a.slice(d+1,-1<f?f:a.length)),k;for(k in d)b[k]=d[k]}if(-1<f)for(k in b=K(a.slice(f+1)),b)c[k]=b[k];return a.slice(0,g)}function d(){switch(n.charAt(0)){case "#":return f("hash").slice(n.length);case "?":return f("search").slice(n.length)+f("hash");default:return f("pathname").slice(n.length)+f("search")+f("hash")}}function h(d,b,f){var g={},k={};d=c(d,g,k);if(null!=b){for(var h in b)g[h]=b[h];d=d.replace(/:([^\/]+)/g,function(a,c){delete g[c];return b[c]})}(h=
|
||||
F(g))&&(d+="?"+h);(k=F(k))&&(d+="#"+k);m?(f&&f.replace?a.history.replaceState(null,null,n+d):a.history.pushState(null,null,n+d),a.onpopstate(!0)):a.location.href=n+d}var m="function"===typeof a.history.pushState,t="function"===typeof setImmediate?setImmediate:setTimeout,n="#!",u;return{setPrefix:function(a){n=a},getPath:d,setPath:h,defineRoutes:function(f,b,h){function k(a){var g=d(),k={},m=c(g,k,k),n;for(n in f){var r=new RegExp("^"+n.replace(/:[^\/]+?\.{3}/g,"(.*?)").replace(/:[^\/]+/g,"([^\\/]+)")+
|
||||
"/?$");if(r.test(m)){m.replace(r,function(){for(var c=n.match(/:[^\/]+/g)||[],d=[].slice.call(arguments,1,-2),h=0;h<c.length;h++)k[c[h].replace(/:|\./g,"")]=decodeURIComponent(d[h]);b(f[n],k,g,n,!!a)});return}}h(g,k)}m?a.onpopstate=g(k):"#"===n.charAt(0)&&(a.onhashchange=k);k(!0);return function(){k(!1)}},link:function(a){a.dom.setAttribute("href",n+a.attrs.href);a.dom.onclick=function(a){a.ctrlKey||a.metaKey||a.shiftKey||2===a.which||(a.preventDefault(),a.redraw=!1,a=this.getAttribute("href"),0===
|
||||
a.indexOf(n)&&(a=a.slice(n.length)),h(a,void 0,void 0))}}}};A.route=function(a,f){var g=O(a),c=function(a){return a},d={render:c,component:null,path:null,resolve:null},h=function(a,h,n){if(null==a)throw Error("Ensure the DOM element that was passed to `m.route` is not undefined");var m=function(g,b,h,m){d.render=g.render||c;d.component=b;d.path=m;d.resolve=null;f.render(a,d.render(t(b,void 0,h)))};n=g.defineRoutes(n,function(a,b,c,f,g){a.view?m({},a,b,c):a.onmatch?!1===g&&d.path===c||null!=d.resolve?
|
||||
m(d,d.component,b):(d.resolve=function(d){m(a,d,b,c)},a.onmatch(function(a){d.path!==c&&null!=d.resolve&&d.resolve(a)},b,c)):m(a,"div",b,c)},function(){g.setPath(h)});f.subscribe(a,n)};h.set=g.setPath;h.get=function(){return d.path};h.prefix=g.setPrefix;h.link=g.link;return h}(window,E);A.withAttr=function(a,f,g){return function(c){return f.call(g||this,a in c.currentTarget?c.currentTarget[a]:c.currentTarget.getAttribute(a))}};var P=M(window);A.render=P.render;A.redraw=E.redraw;A.request=J.request;
|
||||
new function(){function t(a,c,g,f,d,k){return{tag:a,key:c,attrs:g,children:f,text:d,dom:k,domSize:void 0,state:{},events:void 0,instance:void 0,skip:!1}}function A(a){if(null==a||"string"!==typeof a&&null==a.view)throw Error("The selector must be either a string or a component.");if("string"===typeof a&&void 0===I[a]){for(var c,g,f=[],d={};c=N.exec(a);){var k=c[1],m=c[2];""===k&&""!==m?g=m:"#"===k?d.id=m:"."===k?f.push(m):"["===c[3][0]&&((k=c[6])&&(k=k.replace(/\\(["'])/g,"$1").replace(/\\\\/g,"\\")),
|
||||
"class"===c[4]?f.push(k):d[c[4]]=k||!0)}0<f.length&&(d.className=f.join(" "));I[a]=function(a,c){var k=!1,b,f,v=a.className||a["class"],r;for(r in d)a[r]=d[r];void 0!==v&&(void 0!==a["class"]&&(a["class"]=void 0,a.className=v),void 0!==d.className&&(a.className=d.className+" "+v));for(r in a)if("key"!==r){k=!0;break}c instanceof Array&&1==c.length&&null!=c[0]&&"#"===c[0].tag?f=c[0].children:b=c;return t(g||"div",a.key,k?a:void 0,b,f,void 0)}}var z;null!=arguments[1]&&("object"!==typeof arguments[1]||
|
||||
void 0!==arguments[1].tag||arguments[1]instanceof Array)?f=1:(z=arguments[1],f=2);if(arguments.length===f+1)c=arguments[f]instanceof Array?arguments[f]:[arguments[f]];else for(c=[];f<arguments.length;f++)c.push(arguments[f]);return"string"===typeof a?I[a](z||{},t.normalizeChildren(c)):t(a,z&&z.key,z||{},t.normalizeChildren(c),void 0,void 0)}function O(a){var c=0,g=null,f="function"===typeof requestAnimationFrame?requestAnimationFrame:setTimeout;return function(){var d=Date.now();0===c||16<=d-c?(c=
|
||||
d,a()):null===g&&(g=f(function(){g=null;a();c=Date.now()},16-(d-c)))}}t.normalize=function(a){return a instanceof Array?t("[",void 0,void 0,t.normalizeChildren(a),void 0,void 0):null!=a&&"object"!==typeof a?t("#",void 0,void 0,a,void 0,void 0):a};t.normalizeChildren=function(a){for(var c=0;c<a.length;c++)a[c]=t.normalize(a[c]);return a};var N=/(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g,I={};A.trust=function(a){null==a&&(a="");return t("<",void 0,void 0,a,void 0,
|
||||
void 0)};A.fragment=function(a,c){return t("[",a.key,a,t.normalizeChildren(c),void 0,void 0)};var u=function(a){function c(a,b){return function v(c){var h;try{if(!b||null==c||"object"!==typeof c&&"function"!==typeof c||"function"!==typeof(h=c.then))D(function(){b||0!==a.length||console.error("Possible unhandled promise rejection:",c);for(var f=0;f<a.length;f++)a[f](c);d.length=0;k.length=0;n.state=b;n.retry=function(){v(c)}});else{if(c===f)throw new TypeError("Promise can't be resolved w/ itself");
|
||||
g(h.bind(c))}}catch(H){z(H)}}}function g(a){function b(b){return function(a){0<c++||b(a)}}var c=0,d=b(z);try{a(b(m),d)}catch(r){d(r)}}if(!(this instanceof u))throw Error("Promise must be called with `new`");if("function"!==typeof a)throw new TypeError("executor must be a function");var f=this,d=[],k=[],m=c(d,!0),z=c(k,!1),n=f._instance={resolvers:d,rejectors:k},D="function"===typeof setImmediate?setImmediate:setTimeout;g(a)};u.prototype.then=function(a,c){function g(a,c,g,h){c.push(function(b){if("function"!==
|
||||
typeof a)g(b);else try{d(a(b))}catch(C){k&&k(C)}});"function"===typeof f.retry&&h===f.state&&f.retry()}var f=this._instance,d,k,m=new u(function(a,c){d=a;k=c});g(a,f.resolvers,d,!0);g(c,f.rejectors,k,!1);return m};u.prototype["catch"]=function(a){return this.then(null,a)};u.resolve=function(a){return a instanceof u?a:new u(function(c){c(a)})};u.reject=function(a){return new u(function(c,g){g(a)})};u.all=function(a){return new u(function(c,g){var f=a.length,d=0,k=[];if(0===a.length)c([]);else for(var m=
|
||||
0;m<a.length;m++)(function(m){function n(a){d++;k[m]=a;d===f&&c(k)}null==a[m]||"object"!==typeof a[m]&&"function"!==typeof a[m]||"function"!==typeof a[m].then?n(a[m]):a[m].then(n,g)})(m)})};u.race=function(a){return new u(function(c,g){for(var f=0;f<a.length;f++)a[f].then(c,g)})};"undefined"===typeof Promise&&("undefined"!==typeof window?window.Promise=u:"undefined"!==typeof global&&(global.Promise=u));var F=function(a){function c(a,f){if(f instanceof Array)for(var d=0;d<f.length;d++)c(a+"["+d+"]",
|
||||
f[d]);else if("[object Object]"===Object.prototype.toString.call(f))for(d in f)c(a+"["+d+"]",f[d]);else g.push(encodeURIComponent(a)+(null!=f&&""!==f?"="+encodeURIComponent(f):""))}if("[object Object]"!==Object.prototype.toString.call(a))return"";var g=[],f;for(f in a)c(f,a[f]);return g.join("&")},J=function(a,c){function g(){function b(){0===--a&&"function"===typeof h&&h()}var a=0;return function r(c){var d=c.then;c.then=function(){a++;var f=d.apply(c,arguments);f.then(b,function(a){b();throw a;
|
||||
});return r(f)};return c}}function f(b,a){if("string"===typeof b){var c=b;b=a||{};null==b.url&&(b.url=c)}return b}function d(b,a){if(null==a)return b;for(var c=b.match(/:[^\/]+/gi)||[],d=0;d<c.length;d++){var f=c[d].slice(1);null!=a[f]&&(b=b.replace(c[d],a[f]),delete a[f])}return b}function k(b,a){var c=F(a);if(""!==c){var d=0>b.indexOf("?")?"?":"&";b+=d+c}return b}function m(b){try{return""!==b?JSON.parse(b):null}catch(C){throw Error(b);}}function z(b){return b.responseText}function n(b,a){if("function"===
|
||||
typeof b)if(a instanceof Array)for(var c=0;c<a.length;c++)a[c]=new b(a[c]);else return new b(a);return a}var t=0,h;return{request:function(b,h){var v=g();b=f(b,h);var r=new c(function(c,f){null==b.method&&(b.method="GET");b.method=b.method.toUpperCase();var h="boolean"===typeof b.useBody?b.useBody:"GET"!==b.method&&"TRACE"!==b.method;"function"!==typeof b.serialize&&(b.serialize="undefined"!==typeof FormData&&b.data instanceof FormData?function(a){return a}:JSON.stringify);"function"!==typeof b.deserialize&&
|
||||
(b.deserialize=m);"function"!==typeof b.extract&&(b.extract=z);b.url=d(b.url,b.data);h?b.data=b.serialize(b.data):b.url=k(b.url,b.data);var g=new a.XMLHttpRequest;g.open(b.method,b.url,"boolean"===typeof b.async?b.async:!0,"string"===typeof b.user?b.user:void 0,"string"===typeof b.password?b.password:void 0);b.serialize===JSON.stringify&&h&&g.setRequestHeader("Content-Type","application/json; charset=utf-8");b.deserialize===m&&g.setRequestHeader("Accept","application/json, text/*");b.withCredentials&&
|
||||
(g.withCredentials=b.withCredentials);"function"===typeof b.config&&(g=b.config(g,b)||g);g.onreadystatechange=function(){if(4===g.readyState)try{var a=b.extract!==z?b.extract(g,b):b.deserialize(b.extract(g,b));if(200<=g.status&&300>g.status||304===g.status)c(n(b.type,a));else{var d=Error(g.responseText),h;for(h in a)d[h]=a[h];f(d)}}catch(G){f(G)}};h&&null!=b.data?g.send(b.data):g.send()});return!0===b.background?r:v(r)},jsonp:function(b,h){var m=g();b=f(b,h);var r=new c(function(c,f){var g=b.callbackName||
|
||||
"_mithril_"+Math.round(1E16*Math.random())+"_"+t++,h=a.document.createElement("script");a[g]=function(d){h.parentNode.removeChild(h);c(n(b.type,d));delete a[g]};h.onerror=function(){h.parentNode.removeChild(h);f(Error("JSONP request failed"));delete a[g]};null==b.data&&(b.data={});b.url=d(b.url,b.data);b.data[b.callbackKey||"callback"]=g;h.src=k(b.url,b.data);a.document.documentElement.appendChild(h)});return!0===b.background?r:m(r)},setCompletionCallback:function(a){h=a}}}(window,"undefined"!==typeof Promise?
|
||||
Promise:u),M=function(a){function c(e,l,a,b,c,d,f){for(;a<b;a++){var p=l[a];null!=p&&n(e,g(p,c,f),d)}}function g(e,l,a){var b=e.tag;null!=e.attrs&&u(e.attrs,e,l);if("string"===typeof b)switch(b){case "#":return e.dom=B.createTextNode(e.children);case "<":return f(e);case "[":var p=B.createDocumentFragment();null!=e.children&&(b=e.children,c(p,b,0,b.length,l,null,a));e.dom=p.firstChild;e.domSize=p.childNodes.length;return p;default:var d=e.tag;switch(e.tag){case "svg":a="http://www.w3.org/2000/svg";
|
||||
break;case "math":a="http://www.w3.org/1998/Math/MathML"}var h=(b=e.attrs)&&b.is,d=a?h?B.createElementNS(a,d,{is:h}):B.createElementNS(a,d):h?B.createElement(d,{is:h}):B.createElement(d);e.dom=d;if(null!=b)for(p in h=a,b)r(e,p,null,b[p],h);null!=e.attrs&&null!=e.attrs.contenteditable?D(e):(null!=e.text&&(""!==e.text?d.textContent=e.text:e.children=[t("#",void 0,void 0,e.text,void 0,void 0)]),null!=e.children&&(p=e.children,c(d,p,0,p.length,l,null,a),l=e.attrs,"select"===e.tag&&null!=l&&("value"in
|
||||
l&&r(e,"value",null,l.value,void 0),"selectedIndex"in l&&r(e,"selectedIndex",null,l.selectedIndex,void 0))));return d}else{e.state||(e.state={});F(e.state,e.tag);p=e.tag.view;if(null!=p.reentrantLock)e=E;else if(p.reentrantLock=!0,u(e.tag,e,l),e.instance=t.normalize(p.call(e.state,e)),p.reentrantLock=null,null!=e.instance){if(e.instance===e)throw Error("A view cannot return the vnode it received as arguments");l=g(e.instance,l,a);e.dom=e.instance.dom;e.domSize=null!=e.dom?e.instance.domSize:0;e=l}else e.domSize=
|
||||
0,e=E;return e}}function f(e){var l={caption:"table",thead:"table",tbody:"table",tfoot:"table",tr:"tbody",th:"tr",td:"tr",colgroup:"table",col:"colgroup"}[(e.children.match(/^\s*?<(\w+)/im)||[])[1]]||"div",l=B.createElement(l);l.innerHTML=e.children;e.dom=l.firstChild;e.domSize=l.childNodes.length;e=B.createDocumentFragment();for(var a;a=l.firstChild;)e.appendChild(a);return e}function d(e,l,a,b,d,f){if(l!==a&&(null!=l||null!=a))if(null==l)c(e,a,0,a.length,b,d,void 0);else if(null==a)h(l,0,l.length,
|
||||
a);else{for(var p=!1,w=0;w<a.length;w++)if(null!=a[w]){p=null==a[w].key;break}if(l.length===a.length&&p)for(w=0;w<l.length;w++)l[w]!==a[w]&&(null==l[w]?n(e,g(a[w],b,f),z(l,w+1,d)):null==a[w]?h(l,w,w+1,a):k(e,l[w],a[w],b,z(l,w+1,d),!1,f));else{a:{if(null!=l.pool&&Math.abs(l.pool.length-a.length)<=Math.abs(l.length-a.length)&&(p=a[0]&&a[0].children&&a[0].children.length||0,Math.abs((l.pool[0]&&l.pool[0].children&&l.pool[0].children.length||0)-p)<=Math.abs((l[0]&&l[0].children&&l[0].children.length||
|
||||
0)-p))){p=!0;break a}p=!1}p&&(l=l.concat(l.pool));for(var y=w=0,r=l.length-1,v=a.length-1,t;r>=w&&v>=y;){var x=l[w],q=a[y];if(x!==q||p)if(null==x)w++;else if(null==q)y++;else if(x.key===q.key)w++,y++,k(e,x,q,b,z(l,w,d),p,f),p&&x.tag===q.tag&&n(e,m(x),d);else if(x=l[r],x!==q||p)if(null==x)r--;else if(null==q)y++;else if(x.key===q.key)k(e,x,q,b,z(l,r+1,d),p,f),(p||y<v)&&n(e,m(x),z(l,w,d)),r--,y++;else break;else r--,y++;else w++,y++}for(;r>=w&&v>=y;){x=l[r];q=a[v];if(x!==q||p)if(null==x)r--;else{if(null!=
|
||||
q)if(x.key===q.key)k(e,x,q,b,z(l,r+1,d),p,f),p&&x.tag===q.tag&&n(e,m(x),d),null!=x.dom&&(d=x.dom),r--;else{if(!t){t=l;var x=r,C={},u;for(u=0;u<x;u++){var D=t[u];null!=D&&(D=D.key,null!=D&&(C[D]=u))}t=C}null!=q&&(x=t[q.key],null!=x?(C=l[x],k(e,C,q,b,z(l,r+1,d),p,f),n(e,m(C),d),l[x].skip=!0,null!=C.dom&&(d=C.dom)):(q=g(q,b,void 0),n(e,q,d),d=q))}v--}else r--,v--;if(v<y)break}c(e,a,y,v+1,b,d,f);h(l,w,r+1,a)}}}function k(e,a,b,c,h,y,v){var l=a.tag;if(l===b.tag){b.state=a.state;b.events=a.events;var p;
|
||||
var w;null!=b.attrs&&"function"===typeof b.attrs.onbeforeupdate&&(p=b.attrs.onbeforeupdate.call(b.state,b,a));"string"!==typeof b.tag&&"function"===typeof b.tag.onbeforeupdate&&(w=b.tag.onbeforeupdate.call(b.state,b,a));void 0===p&&void 0===w||p||w?p=!1:(b.dom=a.dom,b.domSize=a.domSize,b.instance=a.instance,p=!0);if(!p)if(null!=b.attrs&&A(b.attrs,b,c,y),"string"===typeof l)switch(l){case "#":a.children.toString()!==b.children.toString()&&(a.dom.nodeValue=b.children);b.dom=a.dom;break;case "<":a.children!==
|
||||
b.children?(m(a),n(e,f(b),h)):(b.dom=a.dom,b.domSize=a.domSize);break;case "[":d(e,a.children,b.children,c,h,v);a=0;c=b.children;b.dom=null;if(null!=c){for(var q=0;q<c.length;q++)e=c[q],null!=e&&null!=e.dom&&(null==b.dom&&(b.dom=e.dom),a+=e.domSize||1);1!==a&&(b.domSize=a)}break;default:e=v;h=b.dom=a.dom;switch(b.tag){case "svg":e="http://www.w3.org/2000/svg";break;case "math":e="http://www.w3.org/1998/Math/MathML"}"textarea"===b.tag&&(null==b.attrs&&(b.attrs={}),null!=b.text&&(b.attrs.value=b.text,
|
||||
b.text=void 0));y=a.attrs;v=b.attrs;l=e;if(null!=v)for(q in v)r(b,q,y&&y[q],v[q],l);if(null!=y)for(q in y)null!=v&&q in v||("className"===q&&(q="class"),"o"!==q[0]||"n"!==q[1]||L(q)?"key"!==q&&b.dom.removeAttribute(q):H(b,q,void 0));null!=b.attrs&&null!=b.attrs.contenteditable?D(b):null!=a.text&&null!=b.text&&""!==b.text?a.text.toString()!==b.text.toString()&&(a.dom.firstChild.nodeValue=b.text):(null!=a.text&&(a.children=[t("#",void 0,void 0,a.text,void 0,a.dom.firstChild)]),null!=b.text&&(b.children=
|
||||
[t("#",void 0,void 0,b.text,void 0,void 0)]),d(h,a.children,b.children,c,null,e))}else b.instance=t.normalize(b.tag.view.call(b.state,b)),A(b.tag,b,c,y),null!=b.instance?(null==a.instance?n(e,g(b.instance,c,v),h):k(e,a.instance,b.instance,c,h,y,v),b.dom=b.instance.dom,b.domSize=b.instance.domSize):null!=a.instance?(C(a.instance,null),b.dom=void 0,b.domSize=0):(b.dom=a.dom,b.domSize=a.domSize)}else C(a,null),n(e,g(b,c,v),h)}function m(b){var a=b.domSize;if(null!=a||null==b.dom){var e=B.createDocumentFragment();
|
||||
if(0<a){for(b=b.dom;--a;)e.appendChild(b.nextSibling);e.insertBefore(b,e.firstChild)}return e}return b.dom}function z(b,a,c){for(;a<b.length;a++)if(null!=b[a]&&null!=b[a].dom)return b[a].dom;return c}function n(b,a,c){c&&c.parentNode?b.insertBefore(a,c):b.appendChild(a)}function D(b){var a=b.children;if(null!=a&&1===a.length&&"<"===a[0].tag)a=a[0].children,b.dom.innerHTML!==a&&(b.dom.innerHTML=a);else if(null!=b.text||null!=a&&0!==a.length)throw Error("Child node of a contenteditable must be trusted");
|
||||
}function h(b,a,c,d){for(;a<c;a++){var e=b[a];null!=e&&(e.skip?e.skip=!1:C(e,d))}}function b(a){var b=!1;return function(){b||(b=!0,a())}}function C(a,c){function e(){if(++l===d&&(v(a),a.dom)){var b=a.domSize||1;if(1<b)for(var e=a.dom;--b;){var f=e.nextSibling,h=f.parentNode;null!=h&&h.removeChild(f)}b=a.dom;e=b.parentNode;null!=e&&e.removeChild(b);if(b=null!=c&&null==a.domSize)b=a.attrs,b=!(null!=b&&(b.oncreate||b.onupdate||b.onbeforeremove||b.onremove));b&&"string"===typeof a.tag&&(c.pool?c.pool.push(a):
|
||||
c.pool=[a])}}var d=1,l=0;a.attrs&&a.attrs.onbeforeremove&&(d++,a.attrs.onbeforeremove.call(a.state,a,b(e)));"string"!==typeof a.tag&&a.tag.onbeforeremove&&(d++,a.tag.onbeforeremove.call(a.state,a,b(e)));e()}function v(a){a.attrs&&a.attrs.onremove&&a.attrs.onremove.call(a.state,a);"string"!==typeof a.tag&&a.tag.onremove&&a.tag.onremove.call(a.state,a);if(null!=a.instance)v(a.instance);else if(a=a.children,a instanceof Array)for(var b=0;b<a.length;b++){var e=a[b];null!=e&&v(e)}}function r(a,b,c,d,f){var e=
|
||||
a.dom;if("key"!==b&&(c!==d||"value"===b||"checked"===b||"selectedIndex"===b||"selected"===b&&a.dom===B.activeElement||"object"===typeof d)&&"undefined"!==typeof d&&!L(b)){var l=b.indexOf(":");if(-1<l&&"xlink"===b.substr(0,l))e.setAttributeNS("http://www.w3.org/1999/xlink",b.slice(l+1),d);else if("o"===b[0]&&"n"===b[1]&&"function"===typeof d)H(a,b,d);else if("style"===b)if(a=c,a===d&&(e.style.cssText="",a=null),null==d)e.style.cssText="";else if("string"===typeof d)e.style.cssText=d;else{"string"===
|
||||
typeof a&&(e.style.cssText="");for(var h in d)e.style[h]=d[h];if(null!=a&&"string"!==typeof a)for(h in a)h in d||(e.style[h]="")}else b in e&&"href"!==b&&"list"!==b&&"form"!==b&&"width"!==b&&"height"!==b&&void 0===f?"input"===a.tag&&"value"===b&&a.dom.value===d&&a.dom===B.activeElement||"select"===a.tag&&"value"===b&&a.dom.value===d&&a.dom===B.activeElement||"option"===a.tag&&"value"===b&&a.dom.value===d||(e[b]=d):"boolean"===typeof d?d?e.setAttribute(b,""):e.removeAttribute(b):e.setAttribute("className"===
|
||||
b?"class":b,d)}}function L(a){return"oninit"===a||"oncreate"===a||"onupdate"===a||"onremove"===a||"onbeforeremove"===a||"onbeforeupdate"===a}function H(a,b,d){var c=a.dom,e=function(a){var b=d.call(c,a);"function"===typeof G&&G.call(c,a);return b};if(b in c)c[b]="function"===typeof d?e:null;else{var f=b.slice(2);void 0===a.events&&(a.events={});null!=a.events[b]&&c.removeEventListener(f,a.events[b],!1);"function"===typeof d&&(a.events[b]=e,c.addEventListener(f,a.events[b],!1))}}function u(a,b,c){"function"===
|
||||
typeof a.oninit&&a.oninit.call(b.state,b);"function"===typeof a.oncreate&&c.push(a.oncreate.bind(b.state,b))}function A(a,b,c,d){d?u(a,b,c):"function"===typeof a.onupdate&&c.push(a.onupdate.bind(b.state,b))}function F(a,b){Object.keys(b).forEach(function(c){a[c]=b[c]})}var B=a.document,E=B.createDocumentFragment(),G;return{render:function(a,b){if(!a)throw Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.");var c=[],e=B.activeElement;null==a.vnodes&&(a.textContent=
|
||||
"");b instanceof Array||(b=[b]);d(a,a.vnodes,t.normalizeChildren(b),c,null,void 0);a.vnodes=b;for(var f=0;f<c.length;f++)c[f]();B.activeElement!==e&&e.focus()},setEventCallback:function(a){return G=a}}},E=function(a){function c(a){a=f.indexOf(a);-1<a&&f.splice(a,2)}function g(){for(var a=1;a<f.length;a+=2)f[a]()}a=M(a);a.setEventCallback(function(a){!1!==a.redraw&&g()});var f=[];return{subscribe:function(a,g){c(a);f.push(a,O(g))},unsubscribe:c,redraw:g,render:a.render}}(window);J.setCompletionCallback(E.redraw);
|
||||
A.mount=function(a){return function(c,g){if(null===g)a.render(c,[]),a.unsubscribe(c);else{if(null==g.view)throw Error("m.mount(element, component) expects a component, not a vnode");a.subscribe(c,function(){a.render(c,t(g))});a.redraw()}}}(E);var K=function(a){if(""===a||null==a)return{};"?"===a.charAt(0)&&(a=a.slice(1));a=a.split("&");for(var c={},g={},f=0;f<a.length;f++){var d=a[f].split("="),k=decodeURIComponent(d[0]),d=2===d.length?decodeURIComponent(d[1]):"";"true"===d?d=!0:"false"===d&&(d=!1);
|
||||
var m=k.split(/\]\[?|\[/),t=c;-1<k.indexOf("[")&&m.pop();for(var n=0;n<m.length;n++){var k=m[n],u=m[n+1],u=""==u||!isNaN(parseInt(u,10)),h=n===m.length-1;""===k&&(k=m.slice(0,n).join(),null==g[k]&&(g[k]=0),k=g[k]++);null==t[k]&&(t[k]=h?d:u?[]:{});t=t[k]}}return c},P=function(a){function c(c){var b=a.location[c].replace(/(?:%[a-f89][a-f0-9])+/gim,decodeURIComponent);"pathname"===c&&"/"!==b[0]&&(b="/"+b);return b}function g(a){return function(b){null==u&&(u=t(function(){u=null;a(b)}))}}function f(a,
|
||||
b,c){var d=a.indexOf("?"),f=a.indexOf("#"),h=-1<d?d:-1<f?f:a.length;if(-1<d){var d=K(a.slice(d+1,-1<f?f:a.length)),g;for(g in d)b[g]=d[g]}if(-1<f)for(g in b=K(a.slice(f+1)),b)c[g]=b[g];return a.slice(0,h)}function d(){switch(n.charAt(0)){case "#":return c("hash").slice(n.length);case "?":return c("search").slice(n.length)+c("hash");default:return c("pathname").slice(n.length)+c("search")+c("hash")}}function k(c,b,d){var g={},h={};c=f(c,g,h);if(null!=b){for(var k in b)g[k]=b[k];c=c.replace(/:([^\/]+)/g,
|
||||
function(a,c){delete g[c];return b[c]})}(k=F(g))&&(c+="?"+k);(h=F(h))&&(c+="#"+h);m?(d&&d.replace?a.history.replaceState(null,null,n+c):a.history.pushState(null,null,n+c),a.onpopstate(!0)):a.location.href=n+c}var m="function"===typeof a.history.pushState,t="function"===typeof setImmediate?setImmediate:setTimeout,n="#!",u;return{setPrefix:function(a){n=a},getPath:d,setPath:k,defineRoutes:function(c,b,k){function h(a){var g=d(),h={},m=f(g,h,h),n;for(n in c){var r=new RegExp("^"+n.replace(/:[^\/]+?\.{3}/g,
|
||||
"(.*?)").replace(/:[^\/]+/g,"([^\\/]+)")+"/?$");if(r.test(m)){m.replace(r,function(){for(var d=n.match(/:[^\/]+/g)||[],f=[].slice.call(arguments,1,-2),k=0;k<d.length;k++)h[d[k].replace(/:|\./g,"")]=decodeURIComponent(f[k]);b(c[n],h,g,n,!!a)});return}}k(g,h)}m?a.onpopstate=g(h):"#"===n.charAt(0)&&(a.onhashchange=h);h(!0);return h},link:function(a){a.dom.setAttribute("href",n+a.attrs.href);a.dom.onclick=function(a){a.ctrlKey||a.metaKey||a.shiftKey||2===a.which||(a.preventDefault(),a.redraw=!1,a=this.getAttribute("href"),
|
||||
0===a.indexOf(n)&&(a=a.slice(n.length)),k(a,void 0,void 0))}}}};A.route=function(a,c){var g=P(a),f=function(a){return a},d={render:f,component:null,path:null,resolve:null},k=function(a,k,n){if(null==a)throw Error("Ensure the DOM element that was passed to `m.route` is not undefined");var m=function(g,b,k,m){d.render=g.render||f;d.component=b;d.path=m;d.resolve=null;c.render(a,d.render(t(b,void 0,k)))};n=g.defineRoutes(n,function(a,b,c,f,g){a.view?m({},a,b,c):a.onmatch?!1===g&&d.path===c||null!=d.resolve?
|
||||
m(d,d.component,b):(d.resolve=function(d){m(a,d,b,c)},a.onmatch(function(a){d.path!==c&&null!=d.resolve&&d.resolve(a)},b,c)):m(a,"div",b,c)},function(){g.setPath(k)});c.subscribe(a,n)};k.set=g.setPath;k.get=function(){return d.path};k.prefix=g.setPrefix;k.link=g.link;return k}(window,E);A.withAttr=function(a,c,g){return function(f){return c.call(g||this,a in f.currentTarget?f.currentTarget[a]:f.currentTarget.getAttribute(a))}};var Q=M(window);A.render=Q.render;A.redraw=E.redraw;A.request=J.request;
|
||||
A.jsonp=J.jsonp;A.parseQueryString=K;A.buildQueryString=F;A.version="1.0.0-rc.6";"undefined"!==typeof module?module.exports=A:window.m=A};
|
||||
|
|
@ -79,11 +79,7 @@ module.exports = function($window) {
|
|||
}
|
||||
|
||||
function defineRoutes(routes, resolve, reject) {
|
||||
if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute)
|
||||
else if (prefix.charAt(0) === "#") $window.onhashchange = resolveRoute
|
||||
resolveRoute(true)
|
||||
|
||||
function resolveRoute(isRouteChange) {
|
||||
function resolveRoute(isAction) {
|
||||
var path = getPath()
|
||||
var params = {}
|
||||
var pathname = parsePath(path, params, params)
|
||||
|
|
@ -98,7 +94,7 @@ module.exports = function($window) {
|
|||
for (var i = 0; i < keys.length; i++) {
|
||||
params[keys[i].replace(/:|\./g, "")] = decodeURIComponent(values[i])
|
||||
}
|
||||
resolve(routes[route], params, path, route, Boolean(isRouteChange))
|
||||
resolve(routes[route], params, path, route, Boolean(isAction))
|
||||
})
|
||||
return
|
||||
}
|
||||
|
|
@ -106,7 +102,12 @@ module.exports = function($window) {
|
|||
|
||||
reject(path, params)
|
||||
}
|
||||
return function() {resolveRoute(false)}
|
||||
|
||||
if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute)
|
||||
else if (prefix.charAt(0) === "#") $window.onhashchange = resolveRoute
|
||||
resolveRoute(true)
|
||||
|
||||
return resolveRoute
|
||||
}
|
||||
|
||||
function link(vnode) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue