colorful rat Ratfactor.com > Dave's Repos

retrov

A tiny browser-native Virtual DOM rendering library.
git clone http://ratfactor.com/repos/retrov/retrov.git

retrov/retrov.min.js

Download raw file: retrov.min.js

1 2 (function RetroV(){var create_callbacks=[];function user_render(dom_container,v){var vlist=[v];var old_vlist=[];var new_vlist=make_children(vlist);if(dom_container.rv_old_vlist){old_vlist=dom_container.rv_old_vlist;} 3 else 4 {dom_container.replaceChildren();} 5 dom_container.rv_old_vlist=new_vlist;render_children(dom_container,old_vlist,new_vlist);create_callbacks.forEach(function(cc){cc.fn(cc.el);});create_callbacks=[];} 6 function render(dom_container,old_v,new_v,dom_index){var child=dom_container.childNodes[dom_index];if(typeof new_v==='undefined'){dom_container.removeChild(child);return;} 7 if(new_v.t===false){if(typeof old_v==='undefined'){dom_container.append(placeholder('false'));} 8 return;} 9 if(typeof old_v==='undefined'){dom_container.appendChild(create(new_v));return;} 10 if(old_v.t!==new_v.t){child.replaceWith(create(new_v));return;} 11 if(!new_v.t||new_v.t==='!'){return;} 12 update(child,old_v,new_v);} 13 function create(v){if(v.t==='"'){return document.createTextNode(v.text);} 14 if(v.t===null){return placeholder('null');} 15 if(v.t===false){return placeholder('false');} 16 if(v.t==='!'){return placeholder('undefined');} 17 if(v.t==='<'){return create_html(v.html);} 18 try{var el=document.createElement(v.t);}catch(e){if(e instanceof DOMException){console.error("RetroV: Bad element name: ",v.t);} 19 throw e;} 20 Object.keys(v.p).forEach(function(k){if(k==='style'){set_or_update_style(el,{},v);return;} 21 if(k==='for'){el['htmlFor']=v.p['for'];return;} 22 if(k==='rvid'){RV.id[v.p[k]]=el;} 23 if(k==='oncreate'&&typeof v.p[k]==='function'){create_callbacks.push({el:el,fn:v.p[k]});return;} 24 el[k]=v.p[k];});v.c.forEach(function(child){el.append(create(child));});return el;} 25 function create_html(html){var d=document.createElement('div');d.innerHTML=html;return d.childNodes[0];} 26 function placeholder(t){return document.createComment('RV:'+t+'-placeholder');} 27 function set_or_update_style(dom_elem,old_v,new_v){var old_style=(old_v.p&&old_v.p.style?old_v.p.style:{});Object.keys(new_v.p.style).forEach(function(sk){if(new_v.p.style[sk]!=old_style[sk]){dom_elem.style[sk]=new_v.p.style[sk];}});} 28 function update(dom_elem,old_v,new_v){if(new_v.t==='"'){dom_elem.data=new_v.text;return;} 29 if(new_v.t==='<'&&new_v.html!==old_v.html){dom_elem.replaceWith(create_html(new_v.html));return;} 30 Object.keys(new_v.p).forEach(function(k){if(k==='style'){set_or_update_style(dom_elem,old_v,new_v);return;} 31 if(k==='value'||k==='checked'){dom_elem[k]=new_v.p[k];return;} 32 if(new_v.p[k]!==old_v.p[k]){dom_elem[k]=new_v.p[k];}});render_children(dom_elem,old_v.c,new_v.c);} 33 function render_children(dom_elem,old_c,new_c){if(old_c.length>new_c.length){for(var i=old_c.length-1;i>=0;i--){render(dom_elem,old_c[i],new_c[i],i);}} 34 else{for(var i=0;i<new_c.length;i++){render(dom_elem,old_c[i],new_c[i],i);}}} 35 function make_obj(v){if(typeof v==='string'||typeof v==='number'){return{t:'"',text:v};} 36 if(Array.isArray(v)&&typeof v[0]==='string'&&v[0][0]==='<'){return{t:'<',html:v};} 37 if(v===null){return{t:null};} 38 if(v===false){return{t:false};} 39 if(v===undefined){return{t:'!'};} 40 if(Array.isArray(v)&&typeof v[0]==='string'){var child_start=1;var props={};if(v[1]&&typeof v[1]==='object'&&!Array.isArray(v[1])){props=v[1];if(typeof props['class']!=='undefined'){props['className']=props['class'];delete props['class'];} 41 if(typeof props['for']!=='undefined'){props['htmlFor']=props['for'];delete props['for'];} 42 child_start=2;} 43 var tag=v[0];var myclasses=[];var m=tag.split('.');var mytag=m.shift();if(mytag.length===0){mytag='div';} 44 m.forEach(function(v){myclasses.push(v);});if(myclasses.length>0){props.className=props.className?props.className+' '+myclasses.join(' '):myclasses.join(' ');} 45 var children=make_children(v.slice(child_start));return{t:mytag,p:props,c:children};} 46 console.error("RetroV: make_obj() cannot handle this:",v);} 47 function make_children(vlist){var objs=[];vlist.forEach(function(v){if(!Array.isArray(v)||typeof v[0]==='string'){objs.push(make_obj(v));} 48 else{make_children(v).forEach(function(flat_v){objs.push(flat_v);});}});return objs;} 49 window.RV={render:user_render,id:[]};})();