muu

DEPRECATED lightweight JS framework
git clone https://git.ce9e.org/muu.git

commit
40091da832c3a4e6bc98bae06c2a53acb6335020
parent
cddee052173f6a3a7ab401963a9f78f92016f8ad
Author
Tobias Bengfort <tobias.bengfort@gmx.net>
Date
2015-08-28 19:57
bump to 0.1.0

Diffstat

A CHANGES.md 35 +++++++++++++++++++++++++++++++++++
M bower.json 2 +-
M dist/muu.js 192 +++++++++++++++++++++++++++++++------------------------------
M dist/muu.min.js 28 ++++++++++++++--------------

4 files changed, 149 insertions, 108 deletions


diff --git a/CHANGES.md b/CHANGES.md

@@ -0,0 +1,35 @@
   -1     1 # 0.1.0
   -1     2 
   -1     3 ## Breaking changes
   -1     4 
   -1     5 -   The public API has changed: Instead of many AMD modules there is now one
   -1     6     UMD module exporting an object that provides access to the following
   -1     7     resources:
   -1     8 
   -1     9     -   `Registry` (formally exported from module `muu`)
   -1    10     -   `$` (formally exported from module `muu-dom-helpers`
   -1    11     -   `$location` (formally exported from module `muu-location`)
   -1    12 
   -1    13     There is now also a minimal build in `dist/muu-core.js` that does not
   -1    14     contain   `muu-template`, `muu-js-helpers`, `muu-location` or `muu-search`.
   -1    15     Instead, it depends on lodash.
   -1    16 
   -1    17 -   `updateDOM` does no longer change the Node it is called on. As a
   -1    18     consequence, the `<div>` wrapper inside of a `<muu>` element is no longer
   -1    19     required and was removed.
   -1    20 
   -1    21 ## Enhancements
   -1    22 
   -1    23 -   The build-in templating system has two new features:
   -1    24     -   inverted loops render the content once if the value is falsy
   -1    25     -   `this` can now be used to refer to the scope as a whole
   -1    26 
   -1    27 ## Bugfixes
   -1    28 
   -1    29 -   A bug in `$.destroy` that caused it to always use the fallback
   -1    30     implementation was fixed.
   -1    31 
   -1    32 
   -1    33 # 0.0.0 (2015-10-23)
   -1    34 
   -1    35 *initial release*

diff --git a/bower.json b/bower.json

@@ -1,6 +1,6 @@
    1     1 {
    2     2   "name": "muu",
    3    -1   "version": "0.0.0",
   -1     3   "version": "0.1.0",
    4     4   "authors": [
    5     5     "Tobias Bengfort <tobias.bengfort@posteo.de>"
    6     6   ],

diff --git a/dist/muu.js b/dist/muu.js

@@ -938,7 +938,7 @@
  938   938                     return q;
  939   939                 }
  940   940 
  941    -1                 var a = []
   -1   941                 var a = [];
  942   942                 for (var key in q) {
  943   943                     if (q.hasOwnProperty(key)) {
  944   944                         a = a.concat(unparseItem(key, q[key]));
@@ -1023,19 +1023,28 @@
 1023  1023             var openTag = '{{';
 1024  1024             var closeTag = '}}';
 1025  1025 
   -1  1026             /**
   -1  1027              * @param {string} key
   -1  1028              * @param {Object} data
   -1  1029              * @return {*}
   -1  1030              * @nosideeffects
   -1  1031              */
 1026  1032             var getValue = function(key, data) {
 1027  1033                 return key === 'this' ? data : data[key];
 1028  1034             };
 1029  1035 
 1030    -1             var parseVariableTemplate = function(template) {
 1031    -1                 var content = template.slice(2, -2);
 1032    -1 
 1033    -1                 if (template.indexOf(':') === -1) {
   -1  1036             /**
   -1  1037              * @param {string} tag
   -1  1038              * @return {function(*): string}
   -1  1039              * @nosideeffects
   -1  1040              */
   -1  1041             var parseVariable = function(tag) {
   -1  1042                 if (tag.indexOf(':') === -1) {
 1034  1043                     return function(data) {
 1035    -1                         return $.escapeHtml(getValue(content, data) || '');
   -1  1044                         return $.escapeHtml(getValue(tag, data) || '');
 1036  1045                     };
 1037  1046                 } else {
 1038    -1                     var pairs = content.split(',').map(function(pair) {
   -1  1047                     var pairs = _.map(tag.split(','), function(pair) {
 1039  1048                         var v = pair.split(':');
 1040  1049                         var key = v[0].trim();
 1041  1050                         var value = v.slice(1).join(':').trim();
@@ -1043,81 +1052,65 @@
 1043  1052                     });
 1044  1053 
 1045  1054                     return function(data) {
 1046    -1                         var results = [];
 1047    -1 
 1048    -1                         for (var i = 0; i < pairs.length; i++) {
 1049    -1                             var key = pairs[i][0];
 1050    -1                             var value = pairs[i][1];
 1051    -1 
 1052    -1                             if (getValue(value, data)) {
 1053    -1                                 results.push(key);
 1054    -1                             }
 1055    -1                         }
   -1  1055                         var results = _.map(_.filter(pairs, function(pair) {
   -1  1056                             return getValue(pair[1], data);
   -1  1057                         }), function(pair) {
   -1  1058                             return pair[0];
   -1  1059                         });
 1056  1060 
 1057  1061                         return $.escapeHtml(results.join(' '));
 1058  1062                     };
 1059  1063                 }
 1060  1064             };
 1061  1065 
 1062    -1             var parseLoopTemplate = function(tag, afterTag, inverted) {
 1063    -1                 var tagName = tag.slice(3, -2);
   -1  1066             /**
   -1  1067              * @param {string} tag
   -1  1068              * @param {string} afterTag
   -1  1069              * @param {boolean} [inverted]
   -1  1070              * @return {{render: function(*): string, afterBlock: string}}
   -1  1071              * @nosideeffects
   -1  1072              */
   -1  1073             var parseLoop = function(tag, afterTag, inverted) {
   -1  1074                 var inner = parseTemplate(afterTag, tag);
 1064  1075 
 1065    -1                 var v = parseTemplate(afterTag, tagName);
 1066    -1                 var inner = v[0];
 1067    -1                 var afterLoop = v[1];
   -1  1076                 return {
   -1  1077                     render: function(data) {
   -1  1078                         var value = getValue(tag, data);
   -1  1079                         var result = '';
 1068  1080 
 1069    -1                 var render = function(data) {
 1070    -1                     if (inverted) {
 1071    -1                         if (getValue(tagName, data)) {
 1072    -1                             return '';
 1073    -1                         } else {
 1074    -1                             return inner(data);
 1075    -1                         }
 1076    -1                     } else {
 1077    -1                         if (_.isArray(getValue(tagName, data))) {
 1078    -1                             var result = '';
 1079    -1                             for (var i = 0; i < getValue(tagName, data).length; i++) {
 1080    -1                                 result += inner(getValue(tagName, data)[i]);
   -1  1081                         if (inverted) {
   -1  1082                             if (!value) {
   -1  1083                                 result += inner.render(data);
 1081  1084                             }
 1082    -1                             return result;
 1083    -1                         } else if (getValue(tagName, data)) {
 1084    -1                             return inner(data);
 1085  1085                         } else {
 1086    -1                             return '';
   -1  1086                             if (_.isArray(value)) {
   -1  1087                                 for (var i = 0; i < value.length; i++) {
   -1  1088                                     result += inner.render(value[i]);
   -1  1089                                 }
   -1  1090                             } else if (value) {
   -1  1091                                 result += inner.render(data);
   -1  1092                             }
 1087  1093                         }
 1088    -1                     }
 1089    -1                 };
 1090    -1 
 1091    -1                 return [render, afterLoop];
 1092    -1             };
 1093    -1 
 1094    -1             var concat = function(a) {
 1095    -1                 var last = a.pop();
 1096    -1 
 1097    -1                 if (_.isArray(last)) {
 1098    -1                     a.push(last[0]);
 1099    -1                     return [concat(a), last[1]];
 1100    -1                 } else {
 1101    -1                     a.push(last);
 1102  1094 
 1103    -1                     return function(data) {
 1104    -1                         return a.map(function(item) {
 1105    -1                             if (_.isString(item)) {
 1106    -1                                 return item;
 1107    -1                             } else if (_.isFunction(item)) {
 1108    -1                                 return item(data);
 1109    -1                             }
 1110    -1                         }).join('');
 1111    -1                     };
 1112    -1                 }
   -1  1095                         return result;
   -1  1096                     },
   -1  1097                     afterBlock: inner.afterBlock
   -1  1098                 };
 1113  1099             };
 1114  1100 
   -1  1101             /**
   -1  1102              * @param {string} template
   -1  1103              * @param {string} [loopName]
   -1  1104              * @return {{render: function(*): string, afterBlock: string}}
   -1  1105              * @nosideeffects
   -1  1106              */
 1115  1107             var parseTemplate = function(template, loopName) {
 1116  1108                 var openIndex = template.indexOf(openTag);
 1117  1109                 if (openIndex === -1) {
 1118  1110                     if (loopName === undefined) {
 1119    -1                         return function() {
 1120    -1                             return template;
   -1  1111                         return {
   -1  1112                             render: function() { return template; },
   -1  1113                             afterBlock: ''
 1121  1114                         };
 1122  1115                     } else {
 1123  1116                         throw new Error('unclosed loop: ' + loopName);
@@ -1126,45 +1119,58 @@
 1126  1119                     var beforeTag = template.slice(0, openIndex);
 1127  1120                     var tmp = template.slice(openIndex);
 1128  1121 
 1129    -1                     var closeIndex = tmp.indexOf(closeTag) + 2;
 1130    -1                     if (closeIndex === 1) {
   -1  1122                     var closeIndex = tmp.indexOf(closeTag);
   -1  1123                     if (closeIndex === -1) {
 1131  1124                         throw new Error('unclosed tag: ' + tmp);
 1132  1125                     }
 1133    -1                     var tag = tmp.slice(0, closeIndex);
 1134    -1                     var afterTag = tmp.slice(closeIndex);
 1135    -1 
 1136    -1                     if (tag.lastIndexOf('{{#', 0) === 0) {
 1137    -1                         var v = parseLoopTemplate(tag, afterTag);
 1138    -1                         var loop = v[0];
 1139    -1                         var after = parseTemplate(v[1], loopName);
 1140    -1                         return concat([beforeTag, loop, after]);
 1141    -1                     } else if (tag.lastIndexOf('{{^', 0) === 0) {
 1142    -1                         var v = parseLoopTemplate(tag, afterTag, true);
 1143    -1                         var loop = v[0];
 1144    -1                         var after = parseTemplate(v[1], loopName);
 1145    -1                         return concat([beforeTag, loop, after]);
 1146    -1                     } else if (tag.lastIndexOf('{{!', 0) === 0) {
 1147    -1                         var after = parseTemplate(afterTag, loopName);
 1148    -1                         return concat([beforeTag, after]);
 1149    -1                     } else if (tag.lastIndexOf('{{/', 0) === 0) {
 1150    -1                         if (tag.slice(3, -2) === loopName) {
 1151    -1                             var render = function() {
 1152    -1                                 return beforeTag;
 1153    -1                             };
 1154    -1                             return [render, afterTag];
 1155    -1                         } else {
   -1  1126                     var tag = tmp.slice(openTag.length, closeIndex);
   -1  1127                     var afterTag = tmp.slice(closeIndex + closeTag.length);
   -1  1128 
   -1  1129                     var loadNext = true;
   -1  1130                     var current = {
   -1  1131                         render: function() { return ''; },
   -1  1132                         afterBlock: afterTag
   -1  1133                     };
   -1  1134 
   -1  1135                     if (tag.lastIndexOf('#', 0) === 0) {
   -1  1136                         current = parseLoop(tag.substr(1), afterTag);
   -1  1137                     } else if (tag.lastIndexOf('^', 0) === 0) {
   -1  1138                         current = parseLoop(tag.substr(1), afterTag, true);
   -1  1139                     } else if (tag.lastIndexOf('/', 0) === 0) {
   -1  1140                         loadNext = false;
   -1  1141                         if (tag.substr(1) !== loopName) {
 1156  1142                             throw new Error('unexpected closing loop: ' + tag);
 1157  1143                         }
   -1  1144                     } else if (tag.lastIndexOf('!', 0) !== 0) {
   -1  1145                         current.render = parseVariable(tag);
   -1  1146                     }
   -1  1147 
   -1  1148                     if (loadNext) {
   -1  1149                         var next = parseTemplate(current.afterBlock, loopName);
   -1  1150                         return {
   -1  1151                             render: function(data) {
   -1  1152                                 return beforeTag + current.render(data) + next.render(data);
   -1  1153                             },
   -1  1154                             afterBlock: next.afterBlock
   -1  1155                         };
 1158  1156                     } else {
 1159    -1                         var render = parseVariableTemplate(tag);
 1160    -1                         var after = parseTemplate(afterTag, loopName);
 1161    -1                         return concat([beforeTag, render, after]);
   -1  1157                         return {
   -1  1158                             render: function(data) {
   -1  1159                                 return beforeTag + current.render(data);
   -1  1160                             },
   -1  1161                             afterBlock: current.afterBlock
   -1  1162                         };
 1162  1163                     }
 1163  1164                 }
 1164  1165             };
 1165  1166 
   -1  1167             var cache = {};
   -1  1168 
 1166  1169             return function(template, data) {
 1167    -1                 return parseTemplate(template)(data);
   -1  1170                 if (cache[template] === undefined) {
   -1  1171                     cache[template] = parseTemplate(template);
   -1  1172                 }
   -1  1173                 return cache[template].render(data);
 1168  1174             };
 1169  1175         });
 1170  1176         /**

diff --git a/dist/muu.min.js b/dist/muu.min.js

@@ -1,19 +1,19 @@
    1    -1 (function(r,q,h){(function(h){"function"===typeof define&&define.amd?define("muu",[],h):r.muu=h(r._)})(function(m){var p={};p["muu-js-helpers"]={instance:m};var v=function(c,b){for(var e=[],a=0;a<c.length;a++)e.push(b(c[a]));return e};m=function(c,b,e){p[c]={deps:b,factory:e}};var t=function(c){if(!p[c])return h;p[c].instance||(p[c].instance=p[c].factory.apply(h,v(p[c].deps,t)));return p[c].instance};m("muu-directive",["muu-dom-helpers","muu-js-helpers","muu-update-dom"],function(c,b,e){return function(a,
    2    -1 d,g){var f=this;a.innerHTML="";var k=function(d){var b="data-on"+d.type;d.target.hasAttribute(b)&&(b=d.target.getAttribute(b),d=c.createEvent("muu-"+b,d),a.dispatchEvent(d))};this.update=function(s){var u=q.createElement("div");u.innerHTML=g.renderer(d,s);e(a,u);b.forEach(["keydown","keyup","click","change","search"],function(a){b.forEach(f.querySelectorAll("[data-on"+a+"]"),function(d){d.addEventListener(a,k,!1)})});var n=c.createEvent("muu-parent-update");s=this.querySelectorAll("muu.muu-initialised");
    3    -1 b.forEach(s,function(a){a.dispatchEvent(n)});g.linkAll(f)};this.querySelectorAll=function(d){var k=a.querySelectorAll(d),c=a.querySelectorAll(".muu-isolate"),c=b.union(b.map(c,function(a){return a.querySelectorAll(d)}));return b.difference(k,c)};this.querySelector=function(a){a=f.querySelectorAll(a);if(0<a.length)return a[0]};this.getModel=function(a,d){if(a===h){var k={};b.forEach(f.querySelectorAll("[name]"),function(a){k[a.name]=f.getModel(a.name)});return k}var e=f.querySelector("[name="+a+"]");
   -1     1 (function(r,p,h){(function(h){"function"===typeof define&&define.amd?define("muu",[],h):r.muu=h(r._)})(function(m){var n={};n["muu-js-helpers"]={instance:m};var v=function(c,b){for(var e=[],a=0;a<c.length;a++)e.push(b(c[a]));return e};m=function(c,b,e){n[c]={deps:b,factory:e}};var t=function(c){if(!n[c])return h;n[c].instance||(n[c].instance=n[c].factory.apply(h,v(n[c].deps,t)));return n[c].instance};m("muu-directive",["muu-dom-helpers","muu-js-helpers","muu-update-dom"],function(c,b,e){return function(a,
   -1     2 d,g){var f=this;a.innerHTML="";var l=function(d){var b="data-on"+d.type;d.target.hasAttribute(b)&&(b=d.target.getAttribute(b),d=c.createEvent("muu-"+b,d),a.dispatchEvent(d))};this.update=function(k){var u=p.createElement("div");u.innerHTML=g.renderer(d,k);e(a,u);b.forEach(["keydown","keyup","click","change","search"],function(a){b.forEach(f.querySelectorAll("[data-on"+a+"]"),function(d){d.addEventListener(a,l,!1)})});var s=c.createEvent("muu-parent-update");k=this.querySelectorAll("muu.muu-initialised");
   -1     3 b.forEach(k,function(a){a.dispatchEvent(s)});g.linkAll(f)};this.querySelectorAll=function(d){var l=a.querySelectorAll(d),c=a.querySelectorAll(".muu-isolate"),c=b.union(b.map(c,function(a){return a.querySelectorAll(d)}));return b.difference(l,c)};this.querySelector=function(a){a=f.querySelectorAll(a);if(0<a.length)return a[0]};this.getModel=function(a,d){if(a===h){var l={};b.forEach(f.querySelectorAll("[name]"),function(a){l[a.name]=f.getModel(a.name)});return l}var e=f.querySelector("[name="+a+"]");
    4     4 return e===h?d:"checkbox"===e.type?e.checked:"radio"===e.type?(e=f.querySelectorAll("[name="+a+"]"),c.getRadio(e)||d):e.value};this.setModel=function(a,d){var b=f.querySelector("[name="+a+"]");"checkbox"===b.type?b.checked=d:"radio"===b.type?(b=f.querySelectorAll("[name="+a+"]"),c.setRadio(b,d)):b.value=d}}});m("muu-dom-helpers",["muu-js-helpers"],function(c){var b={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"},e={DELAY:1E3,escapeHtml:function(a){return String(a).replace(/[&<>"'\/]/g,
    5    -1 function(a){return b[a]})},createEvent:function(a,d){if("function"===typeof CustomEvent)return new CustomEvent(a,{detail:d});var b=q.createEvent("CustomEvent");b.initCustomEvent(a,!1,!0,d);return b},on:function(a,d,b){a.addEventListener(d,b,!1);return function(){a.removeEventListener(d,b,!1)}},ready:function(a){a=c.once(a);if("complete"===q.readyState)return a(),function(){};var d=e.on(q,"DOMContentLoaded",a),b=e.on(r,"load",a);return function(){d();b()}},isDescendant:function(a,d){return!!a&&(a===
    6    -1 d||e.isDescendant(a.parentNode,d))},destroy:function(a,d){var b;if(r.MutationObserver){var f=new MutationObserver(function(){e.isDescendant(a,q)||(d(),b())});f.observe(q,{childList:!0,subtree:!0});b=c.once(function(){f.disconnect();f=h})}else{var k=setInterval(function(){e.isDescendant(a,q)||(d(),b())},e.DELAY);b=function(){clearInterval(k)}}return b},getRadio:function(a){for(var d=0;d<a.length;d++)if(a[d].checked)return a[d].value},setRadio:function(a,d){for(var b=0;b<a.length;b++)a[b].checked=a[b].value===
    7    -1 d?!0:!1}};return e});m("muu-js-helpers",[],function(){var c={isString:function(b){return"string"===typeof b||"[object String]"===Object.prototype.toString.call(b)}};c.isArray=Array.isArray;c.isFunction=function(b){return"function"===typeof b};c.once=function(b){var e,a=!1;return function(){a||(e=b.apply(this,arguments),a=!0);return e}};c.indexOf=function(b,e){if("indexOf"in b)return b.indexOf(e);for(var a=0;a<b.length;a++)if(b[a]===e)return a;return-1};c.forEach=function(b,e){if("forEach"in b)return b.forEach(e);
    8    -1 for(var a=0;a<b.length;a++)e(b[a])};c.map=function(b,e){if("map"in b)return b.map(e);for(var a=[],d=0;d<b.length;d++)a.push(e(b[d]));return a};c.filter=function(b,e){if("filter"in b)return b.filter(e);for(var a=[],d=0;d<b.length;d++)e(b[d])&&a.push(b[d]);return a};c.union=function(b){for(var e=[],a=0;a<b.length;a++)for(var d=0;d<b[a].length;d++)-1===c.indexOf(e,b[a][d])&&e.push(b[a][d]);return e};c.difference=function(b,e){for(var a=[],d=0;d<b.length;d++)-1===c.indexOf(e,b[d])&&a.push(b[d]);return a};
   -1     5 function(a){return b[a]})},createEvent:function(a,d){if("function"===typeof CustomEvent)return new CustomEvent(a,{detail:d});var b=p.createEvent("CustomEvent");b.initCustomEvent(a,!1,!0,d);return b},on:function(a,d,b){a.addEventListener(d,b,!1);return function(){a.removeEventListener(d,b,!1)}},ready:function(a){a=c.once(a);if("complete"===p.readyState)return a(),function(){};var d=e.on(p,"DOMContentLoaded",a),b=e.on(r,"load",a);return function(){d();b()}},isDescendant:function(a,d){return!!a&&(a===
   -1     6 d||e.isDescendant(a.parentNode,d))},destroy:function(a,d){var b;if(r.MutationObserver){var f=new MutationObserver(function(){e.isDescendant(a,p)||(d(),b())});f.observe(p,{childList:!0,subtree:!0});b=c.once(function(){f.disconnect();f=h})}else{var l=setInterval(function(){e.isDescendant(a,p)||(d(),b())},e.DELAY);b=function(){clearInterval(l)}}return b},getRadio:function(a){for(var d=0;d<a.length;d++)if(a[d].checked)return a[d].value},setRadio:function(a,d){for(var b=0;b<a.length;b++)a[b].checked=a[b].value===
   -1     7 d?!0:!1}};return e});m("muu-js-helpers",[],function(){var c={isString:function(b){return"string"===typeof b||"[object String]"===Object.prototype.toString.call(b)}};c.isArray=Array.isArray;c.isFunction=function(b){return"function"===typeof b};c.once=function(b){var c,a=!1;return function(){a||(c=b.apply(this,arguments),a=!0);return c}};c.indexOf=function(b,c){if("indexOf"in b)return b.indexOf(c);for(var a=0;a<b.length;a++)if(b[a]===c)return a;return-1};c.forEach=function(b,c){if("forEach"in b)return b.forEach(c);
   -1     8 for(var a=0;a<b.length;a++)c(b[a])};c.map=function(b,c){if("map"in b)return b.map(c);for(var a=[],d=0;d<b.length;d++)a.push(c(b[d]));return a};c.filter=function(b,c){if("filter"in b)return b.filter(c);for(var a=[],d=0;d<b.length;d++)c(b[d])&&a.push(b[d]);return a};c.union=function(b){for(var e=[],a=0;a<b.length;a++)for(var d=0;d<b[a].length;d++)-1===c.indexOf(e,b[a][d])&&e.push(b[a][d]);return e};c.difference=function(b,e){for(var a=[],d=0;d<b.length;d++)-1===c.indexOf(e,b[d])&&a.push(b[d]);return a};
    9     9 c.flatten=function(b){var e=[];c.forEach(b,function(a){c.isArray(a)?e=e.concat(c.flatten(a)):e.push(a)});return e};return c});m("muu-location",["muu-search"],function(c){var b={absUrl:function(){return location.href},url:function(a,d){if(a===h)return location.pathname+location.search+location.hash;d?history.replaceState(null,null,a):history.pushState(null,null,a);return b},protocol:function(){return location.protocol},host:function(){return location.host},port:function(){return location.port},path:function(a,
   10    10 d){if(a===h)return location.pathname;b.url(a+location.search+location.hash,d);return b}},e=function(a,d){if(a===h)return location.search;a&&"?"!==a[0]&&(a="?"+a);1===a.length&&(a="");b.url(location.pathname+a+location.hash,d);return b};b.search=function(a,b,g){if(a!==h){if(b!==h){var f=c.parse(e());f[a]=b;return e(c.unparse(f),g)}return e(c.unparse(a),g)}return c.parse(e())};b.hash=function(a,d){if(a===h)return location.hash?location.hash.slice(1):"";b.url(location.pathname+location.search+"#"+a,
   11    11 d);return b};b.addEventListener=function(a,d){"change"===a&&r.addEventListener("popstate",d,!1);return b};b.removeEventListener=function(a,d){"change"===a&&r.removeEventListener("popstate",d,!1);return b};return b});m("muu-registry",["muu-template","muu-directive","muu-js-helpers","muu-dom-helpers"],function(c,b,e,a){return function(d){var g=this,f={};this.config=d||{};this.renderer=g.config.renderer||c;this.registerDirective=function(a,b,d){f[a]={template:b,link:d};return g};this.registerModule=
   12    -1 function(a){a(g);return g};this.link=function(d,e){e===h&&(e=d.getAttribute("type"));if(!f.hasOwnProperty(e))throw Error("Unknown directive type: "+e);var c=f[e].link,n=new b(d,f[e].template,g),c=c(n,d);d.classList.add("muu-isolate");d.classList.add("muu-initialised");g.config.debug&&(d.directive=n);c!==h&&a.destroy(d,c);return n};this.linkAll=function(a){a=e.filter(a.querySelectorAll("muu"),function(a){return!a.classList.contains("muu-initialised")});return e.map(a,function(a){return g.link(a)})}}});
   -1    12 function(a){a(g);return g};this.link=function(d,c){c===h&&(c=d.getAttribute("type"));if(!f.hasOwnProperty(c))throw Error("Unknown directive type: "+c);var e=f[c].link,s=new b(d,f[c].template,g),e=e(s,d);d.classList.add("muu-isolate");d.classList.add("muu-initialised");g.config.debug&&(d.directive=s);e!==h&&a.destroy(d,e);return s};this.linkAll=function(a){a=e.filter(a.querySelectorAll("muu"),function(a){return!a.classList.contains("muu-initialised")});return e.map(a,function(a){return g.link(a)})}}});
   13    13 m("muu-search",["muu-js-helpers"],function(c){var b={parse:function(a){var d={},b=function(a,b){d.hasOwnProperty(a)?c.isArray(d[a])?d[a].push(b):d[a]=[d[a],b]:d[a]=b};c.forEach(a.substring(1).split("&"),function(a){a=c.map(a.split("="),decodeURIComponent);2===a.length?b(a[0],a[1]):a[0]&&b(a[0],!0)});return d}},e=function(a,b){return b===h||null===b||!1===b?[]:c.isArray(b)?c.flatten(c.map(b,function(b){return e(a,b)})):!0===b?[encodeURIComponent(a)]:[encodeURIComponent(a)+"="+encodeURIComponent(b)]};
   14    -1 b.unparse=function(a){if(c.isString(a))return a;var b=[],g;for(g in a)a.hasOwnProperty(g)&&(b=b.concat(e(g,a[g])));return 0<b.length?"?"+b.join("&"):""};return b});m("muu-template",["muu-js-helpers","muu-dom-helpers"],function(c,b){var e=function(a,b){return"this"===a?b:b[a]},a=function(a){var d=a.slice(2,-2);if(-1===a.indexOf(":"))return function(a){return b.escapeHtml(e(d,a)||"")};var c=d.split(",").map(function(a){var b=a.split(":");a=b[0].trim();b=b.slice(1).join(":").trim();return[a,b]});return function(a){for(var d=
   15    -1 [],k=0;k<c.length;k++){var f=c[k][0];e(c[k][1],a)&&d.push(f)}return b.escapeHtml(d.join(" "))}},d=function(a,b,d){var g=a.slice(3,-2);a=f(b,g);var l=a[0];return[function(a){if(d)return e(g,a)?"":l(a);if(c.isArray(e(g,a))){for(var b="",k=0;k<e(g,a).length;k++)b+=l(e(g,a)[k]);return b}return e(g,a)?l(a):""},a[1]]},g=function(a){var b=a.pop();if(c.isArray(b))return a.push(b[0]),[g(a),b[1]];a.push(b);return function(b){return a.map(function(a){if(c.isString(a))return a;if(c.isFunction(a))return a(b)}).join("")}},
   16    -1 f=function(b,e){var c=b.indexOf("{{");if(-1===c){if(e===h)return function(){return b};throw Error("unclosed loop: "+e);}var n=b.slice(0,c),l=b.slice(c),m=l.indexOf("}}")+2;if(1===m)throw Error("unclosed tag: "+l);c=l.slice(0,m);l=l.slice(m);if(0===c.lastIndexOf("{{#",0))return l=d(c,l),c=l[0],l=f(l[1],e),g([n,c,l]);if(0===c.lastIndexOf("{{^",0))return l=d(c,l,!0),c=l[0],l=f(l[1],e),g([n,c,l]);if(0===c.lastIndexOf("{{!",0))return l=f(l,e),g([n,l]);if(0===c.lastIndexOf("{{/",0)){if(c.slice(3,-2)===
   17    -1 e)return[function(){return n},l];throw Error("unexpected closing loop: "+c);}c=a(c);l=f(l,e);return g([n,c,l])};return function(a,b){return f(a)(b)}});m("muu-update-dom",["muu-js-helpers"],function(c){var b=function(a,b){var e=c.map(a.attributes,function(a){return a.name}),f=c.map(b.attributes,function(a){return a.name});c.forEach(e,function(c){b.hasAttribute(c)||"__IE8__"===c.substr(0,7)||a.removeAttribute(c)});c.forEach(f,function(c){a.getAttribute(c)!==b.getAttribute(c)&&a.setAttribute(c,b.getAttribute(c))})},
   18    -1 e=function(a,d){for(var g=a.childNodes.length,f=d.childNodes.length,k=f;k<g;k++)a.removeChild(a.childNodes[f]);for(k=g;k<f;k++)a.appendChild(d.childNodes[g]);for(k=0;k<g&&k<f;k++){var h=a.childNodes[k],m=d.childNodes[k];if(h.nodeType===m.nodeType&&h.nodeName===m.nodeName&&h.type===m.type){if(1===h.nodeType){var n=c.filter(h.classList,function(a){return 0===a.lastIndexOf("muu-",0)});b(h,m);c.forEach(n,function(a){h.classList.add(a)})}else 3===h.nodeType&&(h.nodeValue=m.nodeValue);3===h.nodeType||h.classList.contains("muu-isolate")||
   19    -1 e(h,m)}else h.parentNode.replaceChild(m,h)}};return e});m("muu",["muu-registry","muu-dom-helpers","muu-location"],function(c,b,e){var a={};a.Registry=c;a.$=b;a.$location=e;return a});return t("muu")})})(window,document,void 0);
   -1    14 b.unparse=function(a){if(c.isString(a))return a;var b=[],g;for(g in a)a.hasOwnProperty(g)&&(b=b.concat(e(g,a[g])));return 0<b.length?"?"+b.join("&"):""};return b});m("muu-template",["muu-js-helpers","muu-dom-helpers"],function(c,b){var e=function(a,b){return"this"===a?b:b[a]},a=function(a){if(-1===a.indexOf(":"))return function(d){return b.escapeHtml(e(a,d)||"")};var d=c.map(a.split(","),function(a){var b=a.split(":");a=b[0].trim();b=b.slice(1).join(":").trim();return[a,b]});return function(a){var l=
   -1    15 c.map(c.filter(d,function(b){return e(b[1],a)}),function(a){return a[0]});return b.escapeHtml(l.join(" "))}},d=function(a,b,d){var f=g(b,a);return{render:function(b){var g=e(a,b),k="";if(d)g||(k+=f.render(b));else if(c.isArray(g))for(b=0;b<g.length;b++)k+=f.render(g[b]);else g&&(k+=f.render(b));return k},afterBlock:f.afterBlock}},g=function(b,c){var e=b.indexOf("{{");if(-1===e){if(c===h)return{render:function(){return b},afterBlock:""};throw Error("unclosed loop: "+c);}var f=b.slice(0,e),q=b.slice(e),
   -1    16 m=q.indexOf("}}");if(-1===m)throw Error("unclosed tag: "+q);var e=q.slice(2,m),q=q.slice(m+2),m=!0,n={render:function(){return""},afterBlock:q};if(0===e.lastIndexOf("#",0))n=d(e.substr(1),q);else if(0===e.lastIndexOf("^",0))n=d(e.substr(1),q,!0);else if(0===e.lastIndexOf("/",0)){if(m=!1,e.substr(1)!==c)throw Error("unexpected closing loop: "+e);}else 0!==e.lastIndexOf("!",0)&&(n.render=a(e));if(m){var p=g(n.afterBlock,c);return{render:function(a){return f+n.render(a)+p.render(a)},afterBlock:p.afterBlock}}return{render:function(a){return f+
   -1    17 n.render(a)},afterBlock:n.afterBlock}},f={};return function(a,b){f[a]===h&&(f[a]=g(a));return f[a].render(b)}});m("muu-update-dom",["muu-js-helpers"],function(c){var b=function(a,b){var e=c.map(a.attributes,function(a){return a.name}),f=c.map(b.attributes,function(a){return a.name});c.forEach(e,function(c){b.hasAttribute(c)||"__IE8__"===c.substr(0,7)||a.removeAttribute(c)});c.forEach(f,function(c){a.getAttribute(c)!==b.getAttribute(c)&&a.setAttribute(c,b.getAttribute(c))})},e=function(a,d){for(var g=
   -1    18 a.childNodes.length,f=d.childNodes.length,l=f;l<g;l++)a.removeChild(a.childNodes[f]);for(l=g;l<f;l++)a.appendChild(d.childNodes[g]);for(l=0;l<g&&l<f;l++){var k=a.childNodes[l],h=d.childNodes[l];if(k.nodeType===h.nodeType&&k.nodeName===h.nodeName&&k.type===h.type){if(1===k.nodeType){var m=c.filter(k.classList,function(a){return 0===a.lastIndexOf("muu-",0)});b(k,h);c.forEach(m,function(a){k.classList.add(a)})}else 3===k.nodeType&&(k.nodeValue=h.nodeValue);3===k.nodeType||k.classList.contains("muu-isolate")||
   -1    19 e(k,h)}else k.parentNode.replaceChild(h,k)}};return e});m("muu",["muu-registry","muu-dom-helpers","muu-location"],function(c,b,e){var a={};a.Registry=c;a.$=b;a.$location=e;return a});return t("muu")})})(window,document,void 0);