-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomponent.min.js
executable file
·117 lines (117 loc) · 18.3 KB
/
component.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
(function(){var rsplit=function(string,regex){var result=regex.exec(string),retArr=new Array(),first_idx,last_idx,first_bit;while(result!=null)
{first_idx=result.index;last_idx=regex.lastIndex;if((first_idx)!=0)
{first_bit=string.substring(0,first_idx);retArr.push(string.substring(0,first_idx));string=string.slice(first_idx);}
retArr.push(result[0]);string=string.slice(result[0].length);result=regex.exec(string);}
if(!string=='')
{retArr.push(string);}
return retArr;},chop=function(string){return string.substr(0,string.length-1);},extend=function(d,s){for(var n in s){if(s.hasOwnProperty(n))d[n]=s[n]}}
EJS=function(options){options=typeof options=="string"?{view:options}:options
this.set_options(options);if(options.precompiled){this.template={};this.template.process=options.precompiled;EJS.update(this.name,this);return;}
if(options.element)
{if(typeof options.element=='string'){var name=options.element
options.element=document.getElementById(options.element)
if(options.element==null)throw name+'does not exist!'}
if(options.element.value){this.text=options.element.value}else{this.text=options.element.innerHTML}
this.name=options.element.id
this.type='['}else if(options.url){options.url=EJS.endExt(options.url,this.extMatch);this.name=this.name?this.name:options.url;var url=options.url
var template=EJS.get(this.name,this.cache);if(template)return template;if(template==EJS.INVALID_PATH)return null;try{this.text=EJS.request(url+(this.cache?'':'?'+Math.random()));}catch(e){}
if(this.text==null){throw({type:'EJS',message:'There is no template at '+url});}}
var template=new EJS.Compiler(this.text,this.type);template.compile(options,this.name);EJS.update(this.name,this);this.template=template;};EJS.prototype={render:function(object,extra_helpers){object=object||{};this._extra_helpers=extra_helpers;var v=new EJS.Helpers(object,extra_helpers||{});return this.template.process.call(object,object,v);},update:function(element,options){if(typeof element=='string'){element=document.getElementById(element)}
if(options==null){_template=this;return function(object){EJS.prototype.update.call(_template,element,object)}}
if(typeof options=='string'){params={}
params.url=options
_template=this;params.onComplete=function(request){var object=eval(request.responseText)
EJS.prototype.update.call(_template,element,object)}
EJS.ajax_request(params)}else
{element.innerHTML=this.render(options)}},out:function(){return this.template.out;},set_options:function(options){this.type=options.type||EJS.type;this.cache=options.cache!=null?options.cache:EJS.cache;this.text=options.text||null;this.name=options.name||null;this.ext=options.ext||EJS.ext;this.extMatch=new RegExp(this.ext.replace(/\./,'\.'));}};EJS.endExt=function(path,match){if(!path)return null;match.lastIndex=0
return path+(match.test(path)?'':this.ext)}
EJS.Scanner=function(source,left,right){extend(this,{left_delimiter:left+'%',right_delimiter:'%'+right,double_left:left+'%%',double_right:'%%'+right,left_equal:left+'%=',left_comment:left+'%#'})
this.SplitRegexp=left=='['?/(\[%%)|(%%\])|(\[%=)|(\[%#)|(\[%)|(%\]\n)|(%\])|(\n)/:new RegExp('('+this.double_left+')|(%%'+this.double_right+')|('+this.left_equal+')|('+this.left_comment+')|('+this.left_delimiter+')|('+this.right_delimiter+'\n)|('+this.right_delimiter+')|(\n)');this.source=source;this.stag=null;this.lines=0;};EJS.Scanner.to_text=function(input){if(input==null||input===undefined)
return'';if(input instanceof Date)
return input.toDateString();if(input.toString)
return input.toString();return'';};EJS.Scanner.prototype={scan:function(block){scanline=this.scanline;regex=this.SplitRegexp;if(!this.source=='')
{var source_split=rsplit(this.source,/\n/);for(var i=0;i<source_split.length;i++){var item=source_split[i];this.scanline(item,regex,block);}}},scanline:function(line,regex,block){this.lines++;var line_split=rsplit(line,regex);for(var i=0;i<line_split.length;i++){var token=line_split[i];if(token!=null){try{block(token,this);}catch(e){throw{type:'EJS.Scanner',line:this.lines};}}}}};EJS.Buffer=function(pre_cmd,post_cmd){this.line=new Array();this.script="";this.pre_cmd=pre_cmd;this.post_cmd=post_cmd;for(var i=0;i<this.pre_cmd.length;i++)
{this.push(pre_cmd[i]);}};EJS.Buffer.prototype={push:function(cmd){this.line.push(cmd);},cr:function(){this.script=this.script+this.line.join('; ');this.line=new Array();this.script=this.script+"\n";},close:function(){if(this.line.length>0)
{for(var i=0;i<this.post_cmd.length;i++){this.push(pre_cmd[i]);}
this.script=this.script+this.line.join('; ');line=null;}}};EJS.Compiler=function(source,left){this.pre_cmd=['var ___ViewO = [];'];this.post_cmd=new Array();this.source=' ';if(source!=null)
{if(typeof source=='string')
{source=source.replace(/\r\n/g,"\n");source=source.replace(/\r/g,"\n");this.source=source;}else if(source.innerHTML){this.source=source.innerHTML;}
if(typeof this.source!='string'){this.source="";}}
left=left||'<';var right='>';switch(left){case'[':right=']';break;case'<':break;default:throw left+' is not a supported deliminator';break;}
this.scanner=new EJS.Scanner(this.source,left,right);this.out='';};EJS.Compiler.prototype={compile:function(options,name){options=options||{};this.out='';var put_cmd="___ViewO.push(";var insert_cmd=put_cmd;var buff=new EJS.Buffer(this.pre_cmd,this.post_cmd);var content='';var clean=function(content)
{content=content.replace(/\\/g,'\\\\');content=content.replace(/\n/g,'\\n');content=content.replace(/"/g,'\\"');return content;};this.scanner.scan(function(token,scanner){if(scanner.stag==null)
{switch(token){case'\n':content=content+"\n";buff.push(put_cmd+'"'+clean(content)+'");');buff.cr();content='';break;case scanner.left_delimiter:case scanner.left_equal:case scanner.left_comment:scanner.stag=token;if(content.length>0)
{buff.push(put_cmd+'"'+clean(content)+'")');}
content='';break;case scanner.double_left:content=content+scanner.left_delimiter;break;default:content=content+token;break;}}
else{switch(token){case scanner.right_delimiter:switch(scanner.stag){case scanner.left_delimiter:if(content[content.length-1]=='\n')
{content=chop(content);buff.push(content);buff.cr();}
else{buff.push(content);}
break;case scanner.left_equal:buff.push(insert_cmd+"(EJS.Scanner.to_text("+content+")))");break;}
scanner.stag=null;content='';break;case scanner.double_right:content=content+scanner.right_delimiter;break;default:content=content+token;break;}}});if(content.length>0)
{buff.push(put_cmd+'"'+clean(content)+'")');}
buff.close();this.out=buff.script+";";var to_be_evaled='/*'+name+'*/this.process = function(_CONTEXT,_VIEW) { try { with(_VIEW) { with (_CONTEXT) {'+this.out+" return ___ViewO.join('');}}}catch(e){e.lineNumber=null;throw e;}};";try{eval(to_be_evaled);}catch(e){if(typeof JSLINT!='undefined'){JSLINT(this.out);for(var i=0;i<JSLINT.errors.length;i++){var error=JSLINT.errors[i];if(error.reason!="Unnecessary semicolon."){error.line++;var e=new Error();e.lineNumber=error.line;e.message=error.reason;if(options.view)
e.fileName=options.view;throw e;}}}else{throw e;}}}};EJS.config=function(options){EJS.cache=options.cache!=null?options.cache:EJS.cache;EJS.type=options.type!=null?options.type:EJS.type;EJS.ext=options.ext!=null?options.ext:EJS.ext;var templates_directory=EJS.templates_directory||{};EJS.templates_directory=templates_directory;EJS.get=function(path,cache){if(cache==false)return null;if(templates_directory[path])return templates_directory[path];return null;};EJS.update=function(path,template){if(path==null)return;templates_directory[path]=template;};EJS.INVALID_PATH=-1;};EJS.config({cache:true,type:'<',ext:'.ejs'});EJS.Helpers=function(data,extras){this._data=data;this._extras=extras;extend(this,extras);};EJS.Helpers.prototype={view:function(options,data,helpers){if(!helpers)helpers=this._extras
if(!data)data=this._data;return new EJS(options).render(data,helpers);},to_text:function(input,null_text){if(input==null||input===undefined)return null_text||'';if(input instanceof Date)return input.toDateString();if(input.toString)return input.toString().replace(/\n/g,'<br />').replace(/''/g,"'");return'';}};EJS.newRequest=function(){var factories=[function(){return new ActiveXObject("Msxml2.XMLHTTP");},function(){return new XMLHttpRequest();},function(){return new ActiveXObject("Microsoft.XMLHTTP");}];for(var i=0;i<factories.length;i++){try{var request=factories[i]();if(request!=null)return request;}
catch(e){continue;}}}
EJS.request=function(path){var request=new EJS.newRequest()
request.open("GET",path,false);try{request.send(null);}
catch(e){return null;}
if(request.status==404||request.status==2||(request.status==0&&request.responseText==''))return null;return request.responseText}
EJS.ajax_request=function(params){params.method=(params.method?params.method:'GET')
var request=new EJS.newRequest();request.onreadystatechange=function(){if(request.readyState==4){if(request.status==200){params.onComplete(request)}else
{params.onComplete(request)}}}
request.open(params.method,params.url)
request.send(null)}})();
var Component={};Component.loader={};Component.compiler={};(function(){var scripts=document.getElementsByTagName("script");var head=document.getElementsByTagName("head")[0];for(var i in scripts)
if(typeof scripts[i].src!='undefined')
if(scripts[i].src.indexOf("component.js")!=-1){var basePath="./";if(scripts[i].src.indexOf("/")!=-1)
basePath=scripts[i].src.substr(0,scripts[i].src.lastIndexOf("/")+1);var parts=scripts[i].src.split("?");if(parts[1]){var files=parts[1].split(',');for(var f in files){var req=new XMLHttpRequest();req.open("GET",basePath+"component-"+files[f]+".js",false);req.send(null);if(req.status==200||req.status==304||req.status==0){var builder=new Function(req.responseText);builder.apply(this);}}}
return;}})();
(function(){var componentCacheCollection=[];Component.loader.wrapPathToElement=function(context){if(typeof componentCacheCollection[context.path]!=='undefined'){context.data=componentCacheCollection[context.path];if(context.verbose)
console.log('from cache '+context.data);return Component.loader.handleResponse(context);}
var req=new XMLHttpRequest();if(typeof context.async==="function"){req.open("GET",context.path,true);req.onreadystatechange=function(){if(req.readyState==4){if(req.status==200||req.status==304){componentCacheCollection[context.path]=req.responseText;context.data=req.responseText;if(context.verbose)
console.log('data async:'+context.data);Component.loader.handleResponse(context);}else if(req.status==404)
throw new Error("component not found "+context.path,context.path);}};req.send(null);}else{req.open("GET",context.path,false);req.send(null);if(req.status==200||req.status==304||req.status==0){componentCacheCollection[context.path]=req.responseText;context.data=req.responseText;if(context.verbose)
console.log('data sync:'+context.data);return Component.loader.handleResponse(context);}else if(req.status==404)
throw new Error("component not found "+context.path,context.path);else
throw new Error(req.status+" "+req.responseText);}};Component.loader.handleResponse=function(context){if(window.DOMParser){parser=new DOMParser();xmlDoc=parser.parseFromString(context.data,"text/xml");}else{xmlDoc=new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async="false";xmlDoc.loadXML(context.data);}
try{var element=Component.compiler.wrapToElement(xmlDoc.firstChild,null,context);Component.compiler.augment(element);}catch(e){throw new Error(e,context.path);}
if(typeof context.async!=="function")
return element;else
context.async(element);};Component.loader.executeScriptFromPath=function(context){var req=new XMLHttpRequest();var content;if(componentCacheCollection[context.path+".js"]===undefined){req.open("GET",context.path+".js",false);req.send(null);if(req.status!=200&&req.status!=304)
throw new Error("script not found "+context.path,context.parent.path);componentCacheCollection[context.path+".js"]=req.responseText;content=req.responseText;}else
content=componentCacheCollection[path+".js"];Component.compiler.compileAndExecute(context.scriptContext,content,context);};})();
(function(){function override(f,g){return function(){return g.apply(f,arguments);};};if(typeof Component.loader.handleResponse==="undefined")
throw new Error("Component.loader.handleResponse is not found to override. fix the load order");Component.loader.handleResponse=override(Component.loader.handleResponse,function(context){context.data=new EJS({text:context.data+"",type:'['}).render({});return this(context);});})();
(function(){Component.compiler.augment=function(context,element){};Component.compiler.compileAndExecute=function(scriptContext,content,context){try{var builder=new Function(content);builder.apply(scriptContext);}catch(e){throw new Error(e.message+" @file: "+context.path,context.path);}};Component.compiler.executeScript=function(scriptContext,node,context){for(var i=0;i<node.childNodes.length;i++){var content=node.childNodes[i].data.replace(/^\s+|\s+$/g,"");Component.compiler.compileAndExecute(scriptContext,content,context);}};Component.compiler.resolvePath=function(path,context){if(context.verbose)
console.log(context.path+"|"+path);return context.path.substr(0,context.path.lastIndexOf("/")+1)+path;};Component.compiler.copyAttributes=function(src,dest,ignore){if(typeof src.attributes==="undefined"||src.attributes===null)
return;if(typeof ignore=="undefined")
ignore=[];for(var i=0;i<src.attributes.length;i++){var ignoreAttr=false;for(var k=0;k<ignore.length;k++)
if(src.attributes[i].name==ignore[k])
ignoreAttr=true;if(ignoreAttr==true)
continue;if(src.attributes[i].namespaceURI!=null)
dest.setAttributeNS(src.attributes[i].namespaceURI,src.attributes[i].name,src.attributes[i].value);else
dest.setAttribute(src.attributes[i].name,src.attributes[i].value);}};Component.compiler.wrapToElement=function(node,parentDomNode,context){if(node.nodeName=="link"){var head=document.getElementsByTagName("head")[0];var currentLinks=head.getElementsByTagName("link");for(var l=0;i<currentLinks.length;l++)
if(currentLinks[l].getAttribute('href')==node.getAttribute('href')){if(context.verbose)
console.log("skipping appending link to head, already exists such "+node.getAttribute('href'));return null;}
var link=document.createElement(node.nodeName);Component.compiler.copyAttributes(node,link);link.href=Component.compiler.resolvePath(node.getAttribute('href'),context);head.appendChild(link);return null;}else if(node.nodeName=="script"&&node.getAttribute("type")==="component-code"){var path=Component.compiler.resolvePath(node.getAttribute("source"),context);Component.loader.executeScriptFromPath({scriptContext:parentDomNode,path:path,parent:context});if(node.childNodes.length!=0)
Component.compiler.executeScript(parentDomNode,node,context);return null;}else if(node.nodeName=="script"&&node.getAttribute("src")!==null){var script=document.createElement(node.nodeName);script.setAttribute('src',node.getAttribute("src"));if(node.childNodes.length!=0)
Component.compiler.executeScript(script,node,context);return script;}else if(node.nodeName=="script"&&node.getAttribute("source")!==null){var path=Component.compiler.resolvePath(node.getAttribute("source"),context);var element=Component.loader.wrapPathToElement({path:path,parent:context});if(typeof parentDomNode!=='undefined'&&node.getAttribute("id"))
parentDomNode[node.getAttribute("id")]=element;Component.compiler.copyAttributes(node,element,['source','type']);if(node.childNodes.length!=0)
Component.compiler.executeScript(element,node,context);return element;}else if(node.nodeName=="script"&&node.getAttribute("source")===null){Component.compiler.executeScript(parentDomNode,node,context);return null;}else{var e=null;if(node.namespaceURI!=null)
e=document.createElementNS(node.namespaceURI,node.nodeName);else
e=document.createElement(node.nodeName);Component.compiler.copyAttributes(node,e);for(var i=0;i<node.childNodes.length;i++){if(node.childNodes[i].nodeType==8)
continue;if(node.childNodes[i].nodeType==3){var text=document.createTextNode(node.childNodes[i].data);e.appendChild(text);}else{var value=Component.compiler.wrapToElement(node.childNodes[i],e,context);if(value){e.appendChild(value);if(value.getAttribute('id'))
e[value.getAttribute('id')]=value;}}}
return e;}};})();
(function(){function override(f,g){return function(){return g.apply(f,arguments);};};if(typeof Component.compiler.augment==="undefined")
throw new Error("Component.compiler.augment is not found to override. fix the load order");Component.compiler.augment=override(Component.compiler.augment,function(element){element.$eventHandlers=[];element.on=function(eventName,handler){for(var i in this.$eventHandlers)
if(this.$eventHandlers[i].name===eventName&&this.$eventHandlers[i].handle===handler)
return;this.$eventHandlers.push({name:eventName,handle:handler});};element.emit=function(eventName,eventData){for(var i in this.$eventHandlers)
if(this.$eventHandlers[i].name==eventName)
if(!this.$eventHandlers[i].handle(eventData))
return false;return true;};element.stopListen=function(eventName,handler){for(var i in this.$eventHandlers)
if(this.$eventHandlers[i].name==eventName){this.$eventHandlers[i].splice(i,1);i-=1;}};return this(element);});})();
(function(){Component.fromPath=function(path,async){return Component.loader.wrapPathToElement({path:path,async:async});};Component.overrideFromPath=function(scriptElement,path,async){var parentElement=scriptElement.parentNode;if(typeof async!=="function"){var component=Component.loader.wrapPathToElement({path:path});if(scriptElement.getAttribute('id'))
parentElement[scriptElement.getAttribute('id')]=component;Component.compiler.copyAttributes(scriptElement,component,['source','type']);parentElement.replaceChild(component,scriptElement);}else{Component.loader.wrapPathToElement({path:path,async:function(component){if(scriptElement.getAttribute('id'))
parentElement[scriptElement.getAttribute('id')]=component;async(component);Component.compiler.copyAttributes(scriptElement,component,['source','type']);parentElement.replaceChild(component,scriptElement);}});}};Component.appendFromPath=function(parentElement,path,async){if(typeof async!=="function"){var component=Component.loader.wrapPathToElement({path:path});parentElement.appendChild(component);return component;}else{Component.loader.wrapPathToElement({path:path,async:function(component){async(component);parentElement.appendChild(component);}});}};Component.process=function(domElement){var hasComponents=true;while(hasComponents){hasComponents=false;var x=domElement.getElementsByTagName("script");for(var i=0;i<x.length;i++){if(x[i].getAttribute('source')){if(x[i].getAttribute('type')=="component"){Component.overrideFromPath(x[i],x[i].getAttribute('source'));hasComponents=true;break;}}}}};})();