Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
15 lines
No EOL
3.4 KiB
JavaScript
15 lines
No EOL
3.4 KiB
JavaScript
;;;;;;;;(function(define){'use strict';define(function(require,exports,module){var debug=0?console.log.bind(console,'[poplar]'):function(){};var elements=new WeakMap();var regex={content:/>([^<]+)</g,var:/\$\{([^\}]+)\}/g,attrs:/(<[a-z\-]+ )(.+?)( ?\/>|>)/g,attr:/([a-z\-]+)="([^\"]+\$\{[^\"]+|\$[^"]+)"/g};module.exports=poplar;function poplar(html){return poplar.create(poplar.parse(html));}
|
|
poplar.parse=function(html){debug('parse',html);var formatted=html.replace(/\s*\n\s*/g,'').replace(/ +/g,'').replace(regex.attrs,function(match,start,content,end){var dynamic=[];var simple=content.replace(regex.attr,function(match,name,prop){dynamic.push(name+'='+encodeURIComponent(prop));return'';});if(!dynamic.length)return match;var dataBindAttrs=dynamic.join(' ');var tag=start+
|
|
simple+' data-poplar-attrs="'+dataBindAttrs+'"'+
|
|
end;return tag.replace(/ +/g,' ');}).replace(regex.content,function(m,content){return m.replace(regex.var,function(m,group){return'<span data-poplar-text="'+group+'"></span>';});});return elementify(formatted);};poplar.create=function(parent){debug('create');var el=parent.firstElementChild;elements.set(el,{textNodes:replaceTextPlaceholders(parent),attrs:replaceAttrPlaceholders(parent)});return el;};poplar.populate=function(el,data){debug('poplate',el,data);var bindings=elements.get(el);if(!bindings){debug('unknown element');return false;}
|
|
var textNodes=bindings.textNodes;var attrs=bindings.attrs;var i=textNodes.length;var j=attrs.length;while(i--){var node=textNodes[i].node;var newData=getProp(data,textNodes[i].key);if(node.data!==newData){node.data=newData;}}
|
|
while(j--){var item=attrs[j];var value=item.template?interpolate(item.template,data):getProp(data,item.prop);item.el.setAttribute(item.name,value);}
|
|
debug('populated');return true;};function interpolate(string,data){return string.replace(regex.var,function(match,group){return getProp(data,group);});}
|
|
function replaceTextPlaceholders(el){var placeholders=el.querySelectorAll('[data-poplar-text]');var i=placeholders.length;var result=[];while(i--){var node=document.createTextNode('');placeholders[i].parentNode.replaceChild(node,placeholders[i]);result.push({key:placeholders[i].dataset.poplarText,node:node});}
|
|
return result;}
|
|
function replaceAttrPlaceholders(el){var placeholders=el.querySelectorAll('[data-poplar-attrs]');var i=placeholders.length;var result=[];while(i--){var attrs=placeholders[i].dataset.poplarAttrs.split(' ');var j=attrs.length;while(j--){var parts=attrs[j].split('=');var value=decodeURIComponent(parts[1]);var attr={name:parts[0],el:placeholders[i]};if(isPartial(value))attr.template=value;else attr.prop=value.replace(regex.var,'$1');result.push(attr);}
|
|
placeholders[i].removeAttribute('data-poplar-attrs');}
|
|
return result;}
|
|
function isPartial(value){return!/^\$\{.+\}$/.test(value);}
|
|
function elementify(html){var div=document.createElement('div');div.innerHTML=html;return div;}
|
|
function getProp(object,path){if(!path)return;var parts=path.split('.');if(parts.length==1)return object[parts[0]];if(parts.length==2)return object[parts[0]][parts[1]];return(function getDeep(object,parts){var part=parts.shift();return parts.length?getDeep(object[part],parts):object[part];})(object,parts);}});})(typeof define=='function'&&define.amd?define:(function(n,w){'use strict';return typeof module=='object'?function(c){c(require,exports,module);}:function(c){var m={exports:{}};c(function(n){return w[n];},m.exports,m);w[n]=m.exports;};})('poplar',this)); |