UNPKG

lite

Version:

A cross platform template engine base on xml/html and javascript expression.

1,658 lines (1,595 loc) 508 kB
if(typeof console == 'undefined'){console = {};'log,warn,error,info,debug'.replace(/\w+/g,function(a){console[a] = print});console.dir = function(o){for(var n in o){console.log(n,o[n]);}}; console.time = console.time || function(l){this['#'+l] = +new Date}; console.timeEnd = console.timeEnd || function(l){console.log(l + (new Date-this['#'+l]));}; console.assert = console.assert || function(l){if(!l){console.error('Assert Failed!!!')}}; } function require(id){ id = id.replace(/(\/.*?)(?:\.js)?$/,'$1.js') if(id in require.module){ return require.module[id].exports; } var module = require.module[id] = {exports:{},id:id}; var dir = id.replace(/[^\/\\]+$/,''); //console.log(id) require.cached[id].call(null,function(id2){ if(id2.charAt() == '.'){ id2 = dir+id2; while(id2 != (id2 =id2.replace( /[^\/]+\/\.\.\/|(\/)?\.\//,'$1'))); } return require(id2); },module.exports,module,id,dir); return module.exports; } require.cached={} require.module={} if(typeof module == "object"){module.exports = require}; require.cached["fs"]=function (require,exports,m){ var isJavaEnv = typeof window == 'undefined' && typeof java == 'object' && typeof (java.io && java.io.File) == 'function'; if(isJavaEnv) { exports.readFileSync = function(path){ var ins = new java.io.FileInputStream(path); //Buffer return { toString:function(encoding){ var s = new java.io.InputStreamReader(ins,encoding||'utf-8') var buf = [],c; while((c = s.read())>=0){ //console.log(c) buf.push(c) } //console.log(String.fromCharCode.apply(String,buf)) return String.fromCharCode.apply(String,buf) } } }; exports.existsSync =function(path){ return new java.io.File(path).exists(); }; exports.realpathSync = function(path){ return new java.io.File(path).getAbsolutePath() } }else if(typeof module == 'object'){ m.exports = module.require('fs'); } }; require.cached["path"]=function (require,exports,m,__filename,__dirname){ var isJavaEnv = typeof window == 'undefined' && typeof java == 'object' && typeof (java.io && java.io.File) == 'function'; if(isJavaEnv) { exports.resolve = function () { var i = 0; var file = new java.io.File(arguments[i++]); while (i < arguments.length) { file = new java.io.File(file, arguments[i++]); } return file.getAbsoluteFile().getCanonicalPath(); } }else if(typeof module == 'object'){ m.exports = module.require('path'); } }; require.cached["lite/src/main/php/web-compiler.js"]=function (require,exports,module,__filename,__dirname){// node ../java/org/xidea/lite/java-proxy.js lite/src/main//web-compiler.js // jsi export ./web-compiler.js -o .wc.js var PHPTranslator=require('lite/src/main/php/php-translator').PHPTranslator; var ParseContext=require('lite/src/main/js/parse/parse-context').ParseContext; var ParseConfig=require('lite/src/main/js/parse/config').ParseConfig; var parseConfig=require('lite/src/main/js/parse/config-parser').parseConfig; var URI=require('lite/src/main/js/parse/resource').URI; var base64Encode=require('lite/src/main/js/parse/resource').base64Encode; require('fs').readFileSync = function(url){ var xhr = new XMLHttpRequest(); //var url = this.base+'?LITE_ACTION=load' xhr.open("GET", url, false); //contentType: 'application/x-www-form-urlencoded', xhr.setRequestHeader("Content-Type",'application/x-www-form-urlencoded'); ///xhr.setRequestHeader("Content-Length",''+post.length); xhr.send(); return xhr.responseText; } /** * var tf = liteFunction("<c:if test='${test}'></c:if>",{type:'xml',extension:'/scripts/lite-extends.js'}) * var tf = liteTemplate("<c:if test='${test}'></c:if>",{type:'xml',extension:'/scripts/lite-extends.js'}) */ function WebCompiler(urlbase,config){ if(urlbase.charAt() == '/'){ urlbase = location.href.replace(/([^\/])\/[^\/].*$/,'$1'+urlbase); } this.base = urlbase; //config = config && parseConfig(config) || null; this.config = new ParseConfig(urlbase,config); } WebCompiler.prototype.compile = function(path){ try{ var t = +new Date(); var context = new ParseContext(this.config,path); this.litecode = ''; this.phpcode = ''; this.path = path; context.parse(context.createURI(path)); this.compileTime = (new Date() - t - (context._loadTime ||0)) var res = context.getResources(); var configMap = context.getConfigMap(); var i = res.length; while(i--){ res[i] = res[i].path } var code = context.toList(); this.litecode = JSON.stringify([res,code,configMap]) var t = +new Date(); var pt = new PHPTranslator({waitPromise:true});//'.','/','-','!','%' this.phpcode = pt.translate(code,{ name:path.replace(/[\.\/\-!%]/g,'_') }); //console.error(this.litecode) //console.error(this.phpcode) this.translateTime = (new Date() - t ); }finally{ if(!this.phpcode){ if(!this.litecode){ prompt('build litecode failed!!'+this.path); }else{ prompt('build phpcode failed!!'+this.path); } } } } WebCompiler.prototype.save = function(){ var post = "compileTime="+this.compileTime+"&translateTime="+this.translateTime+ '&LITE_ACTION=save' + '&LITE_PATH='+encodeURIComponent(this.path)+ '&LITE_CODE='+base64Encode(this.litecode)+ '&LITE_PHP='+base64Encode(this.phpcode); var xhr = new XMLHttpRequest(); xhr.open("POST", this.base, false); //contentType: 'application/x-www-form-urlencoded', xhr.setRequestHeader("Content-Type",'application/x-www-form-urlencoded'); //try{xhr.setRequestHeader("Content-Length",''+post.length);}catch(e){} xhr.send(post); try{ window.eval('('+xhr.responseText+')') return true; }catch(e){ console.info("编译失败:",xhr.responseText); return false; } } if(typeof exports == 'object'){ exports.WebCompiler=WebCompiler; } }; require.cached["lite/src/main/php/php-translator.js"]=function (require,exports,module,__filename,__dirname){if(typeof require == 'function'){ var XA_TYPE=require('../js/parse/template-token').XA_TYPE; var ELSE_TYPE=require('../js/parse/template-token').ELSE_TYPE; var EL_TYPE=require('../js/parse/template-token').EL_TYPE; var XT_TYPE=require('../js/parse/template-token').XT_TYPE; var TranslateContext=require('../js/parse/translate-context').TranslateContext; var getELType=require('js-el/src/main/js/expression-token').getELType; var TYPE_ANY=require('js-el/src/main/js/expression-token').TYPE_ANY; var TYPE_BOOLEAN=require('js-el/src/main/js/expression-token').TYPE_BOOLEAN; var TYPE_NULL=require('js-el/src/main/js/expression-token').TYPE_NULL; var TYPE_NUMBER=require('js-el/src/main/js/expression-token').TYPE_NUMBER; var GLOBAL_DEF_MAP=require('../js/parse/js-translator').GLOBAL_DEF_MAP; var GLOBAL_VAR_MAP=require('../js/parse/js-translator').GLOBAL_VAR_MAP; }/* * List Template * License LGPL(您可以在任何地方免费使用,但请不要吝啬您对框架本身的改进) * http://www.xidea.org/project/lite/ * @author jindw * @version $Id: template.js,v 1.4 2008/02/28 14:39:06 jindw Exp $ */ /** * 将Lite中间代码转化为直接的php代码 * * function index_xhtml_php($__engine,$__context){ * $encodeURIComponent = 'lite_encodeURIComponent'; * $decodeURIComponent = 'lite_decodeURIComponent'; * $key = null; * $key2 = null; * $test = 'index_xhtml_php__test'; * extract($__context); * * * } * function index_xhtml_php__test($__engine,$arg1,$arg2){ * * } */ var FOR_STATUS_KEY = '$__for'; var VAR_LITE_TEMP="$__tmp"; //function checkEL(el){ // new Function("return "+el) //} /** * JS原生代码翻译器实现 * @param config {waitPromise:false,liteImpl:'liteImpl'} */ function PHPTranslator(config){ this.waitPromise = config.waitPromise; //TODO: replace 'lite__**' to config.liteImpl** this.liteImpl = config.liteImpl||'lite__' } PHPTranslator.prototype = { /** * * @param config {name:'functionName', * //params:['arg1','arg2'],defaults:['arg2value'] * encoding:'utf-8', * contentType:'text/html', * i18n:{}, * resources:['/path1.xhtml','/path2.xhtml'] * } */ translate:function(list,config){ //var result = JSON.stringify(context.toList()) var context = new PHPTranslateContext(list||this.code,config.name); context.waitPromise = this.waitPromise; context.htmlspecialcharsEncoding = context.encoding = config.encoding ||"UTF-8"; context.contentType = config.contentType; //i18n config context.i18n = config.i18n //for i18n find config context.resources = config.resources; context.parse(); var code = context.toSource(); return '<?php'+code ; } } function PHPTranslateContext(code,id){ TranslateContext.call(this,code); this.id = id; } function TCP(pt){ for(var n in pt){ this[n] = pt[n]; } } TCP.prototype = TranslateContext.prototype; function toArgList(params,defaults){ if(params.length){ if(defaults && defaults.length){ params = params.concat(); var i = params.length; var j = defaults.length; while(j--){ params[--i] += '='+stringifyPHP(defaults[j]); } } return '$'+params.join(',$') }else{ return ''; } } function _stringifyPHPLineArgs(line){//.*[\r\n]* var endrn="'"; line = line.replace(/['\\]|(\?>)|([\r\n]+$)|[\r\n]/gm,function(a,pend,lend){ if(lend){ endrn = ''; return "',"+JSON.stringify(a); }else if(pend){ return "?','>"; }else{//'\\ if(a == '\\'){ return '\\\\'; }else if(a == "'"){ return "\\'"; }else{ console.error("非法输出行!!"+JSON.stringify(line)); } return a == '\\'?'\\\\': "\\'"; } }); line = "'"+line+endrn; if("''," == line.substring(0,3)){ line = line.substring(3) } return line; } function _encodeEL(text,model,encoding){ //TODO: check el type if(model == -1){ var encode = "htmlspecialchars("+text+",ENT_COMPAT,"+encoding+",false)"; //this.append(prefix,"strtr(",el,",array('<'=>'&lt;','\"'=>'&#34;'));"); }else if(model == XA_TYPE){ var encode = "htmlspecialchars("+text+",ENT_COMPAT,"+encoding+')'; }else if(model == XT_TYPE){ //ENT_COMPAT var encode = "htmlspecialchars("+text+",ENT_NOQUOTES,"+encoding+')'; }else{ var encode = text; } return encode; } function _appendFunctionName(context,scope){ for(var n in scope.refMap){ if(!(n in scope.varMap || n in scope.paramMap)){ if(n in GLOBAL_DEF_MAP){ context.append('$',n,"='",n,"';"); }else if(n in GLOBAL_VAR_MAP){ }else{ context.append('$',n,"=function_exists('lite__",n,"')?'",n,"':null;"); } } } } PHPTranslateContext.prototype = new TCP({ stringifyEL:function (el){ return el?stringifyPHPEL(el,this):null; }, parse:function(){ this.depth = 0; this.out = []; //add function var defs = this.scope.defs; for(var i=0;i<defs.length;i++){ var def = this.scope.defMap[defs[i]]; var n = def.name; this.append("if(!function_exists('lite__",n,"')){function lite__", n,"(",toArgList(def.params,def.defaults),'){') this.depth++; this.append("ob_start();"); _appendFunctionName(this,def); this.appendCode(def.code); this.append("$rtv= ob_get_contents();ob_end_clean();return $rtv;"); this.depth--; this.append("}}"); } try{ this.append("function lite_template",this.id,'($__context__){') this.depth++; if(this.contentType){ this.append("if(!headers_sent())header('ContentType:"+this.contentType+"');") } this.append("mb_internal_encoding('"+this.encoding+"');") _appendFunctionName(this,this.scope); this.append("extract($__context__,EXTR_OVERWRITE);"); if(this.i18n && this.resources){ var i18ncode = new Function("return "+this.i18n)(); var resources = this.resources; var resourceMap = {}; var resourceList = []; for(var i=0;i<resources.length;i++){ resourceMap[i18nHash(resources[i],'_').slice(0,-1)] = resources[i] } //console.warn(resources,resourceMap) for(var n in i18ncode){ n = n.substring(0,n.indexOf('__')+2); if(n in resourceMap){ resourceList.push(n.slice(0,-2)); delete resourceMap[n]; } } this.append("$I18N = "+stringifyPHP(resourceList).replace(/^array/,'lite_i18n')+";") this.append("$I18N = array_merge("+stringifyPHP(i18ncode)+",$I18N);") } this.appendCode(this.scope.code); if(this.__lazy_module_){ this.append('lite_lazy_block($__lazy_module_);'); } this.depth--; this.append("}"); }catch(e){ //alert(["编译失败:",buf.join(""),code]) console.error("PHP编译失败:"+this.id,e); throw e; } //this.append("return _$out.join('');"); }, appendStatic:function(value){ //return this.append("?>"+value+"<?php"); var lines = value.match(/.+[\r\n]*|[\r\n]+/g); for(var i=0; i<lines.length; i++) { var line = lines[i]; var start = i==0?'echo ':'\t,' var end = i == lines.length-1?';':''; line = _stringifyPHPLineArgs(line); this.append(start,line,end); } }, _appendEL:function(el,model,text,prefix){ var encoding = "'"+this.htmlspecialcharsEncoding+"'"; prefix = prefix!=null? prefix : 'echo ' //@see http://notownme.javaeye.com/blog/335036 var text = text || this.stringifyEL(el); var type = getELType(el); //null,boolean if(isSimplePHPEL(text)){//var encode = var initText = text; var tmpId = text; }else{ tmpId = VAR_LITE_TEMP; initText = '('+tmpId+'='+text+')'; } if(type != TYPE_ANY){ if(type == TYPE_NULL){ this.append(prefix,"'null';"); return; }else if(type == TYPE_BOOLEAN){ this.append(prefix,text,"?'true':'false';"); return; }else if(type == TYPE_NUMBER){ this.append(prefix,text,";"); return; } // if((TYPE_NULL|TYPE_BOOLEAN)==type){//onlu null boolean this.append(prefix,initText,"?'true':(",tmpId,"===null?'null':'false');"); return; }else if(!((TYPE_NULL|TYPE_BOOLEAN) & type)){//number,string,map,array... this.append(prefix,_encodeEL(text,model,encoding),";"); return; } //v1=== null?'null':(v===true?'true':(v == false ?'false':txt)) if(!(type & TYPE_NULL)){ this.append(prefix, initText," === true?'true':", "(",tmpId,"===false?'false':",_encodeEL(tmpId,model,encoding),");"); return ; }else if(!(type & TYPE_BOOLEAN)){ this.append(prefix, initText,"===null?'null':",_encodeEL(tmpId,model,encoding),";"); return ; } } // this.append(prefix, // initText," ===null?'null':", // "(",tmpId," === true?'true':", // "(",tmpId,"===false?'false':",_encodeEL(tmpId,model,encoding),"));"); this.append(prefix,'(',initText,'===null||',tmpId,'===false || ',tmpId,'===true)?json_encode(',tmpId,'):',_encodeEL(tmpId,model,encoding),';') }, appendEL:function(item){ this._appendEL(item[1],EL_TYPE) }, appendXT:function(item){ this._appendEL(item[1],XT_TYPE) }, appendXA:function(item){ //[7,[[0,"value"]],"attribute"] var el = item[1]; var value = this.stringifyEL(el); var attributeName = item.length>2 && item[2]; var testAutoId = this.allocateId(value); if(testAutoId != value){ this.append(testAutoId,"=",value,';'); } if(attributeName){ this.append("if(",testAutoId,"!=null){"); this.depth++; this.append("echo ' "+attributeName+"=\"';"); this._appendEL(el,XA_TYPE,testAutoId) this.append("echo '\"';"); this.depth--; this.append("}"); }else{ this._appendEL(el,XA_TYPE,testAutoId); } this.freeId(testAutoId); }, appendVar:function(item){ this.append("$",item[2],"=",this.stringifyEL(item[1]),";"); }, processCapture:function(item){ var childCode = item[1]; var varName = item[2]; this.append("ob_start();"); this.appendCode(childCode); this.append("$",varName,"= ob_get_contents();ob_end_clean();"); }, appendEncodePlugin:function(item){ this._appendEL(item[1],-1,this.stringifyEL(item[1])); }, appendDatePlugin:function(pattern,date){//&#233;&#0xDDS; //this.impl_counter.d++; var pattern = this.stringifyEL(pattern[1]); var date = this.stringifyEL(date[1]); if(/^(?:'[^']+'|"[^"]+")$/.test(pattern)){ date = date + ',true'; } this.append('echo lite__2(',pattern,',',date,');') }, appendModulePlugin:function(child,config){ if(this.waitPromise){ this.append("ob_start();"); //this.append('__out__.lazy(function* __lazy_module_',config.id,'__(__out__){'); this.outputIndent++; this.appendCode(child) this.outputIndent--; //this.append('})'); if(this.__lazy_module_){ this.append('array_push($__lazy_module_,'+config.id+');'); this.append('array_push($__lazy_module_,ob_get_contents());'); }else{ this.append('$__lazy_module_=array('+config.id+',ob_get_contents());') } this.append('ob_end_clean();'); this.__lazy_module_ = true; }else{ this.appendCode(child) } }, processIf:function(code,i){ var item = code[i]; var childCode = item[1]; var testEL = item[2]; var test = this.stringifyEL(testEL); this.append("if(",php2jsBoolean(testEL,test),"){"); this.depth++; this.appendCode(childCode) this.depth--; this.append("}"); var nextElse = code[i+1]; var notEnd = true; while(nextElse && nextElse[0] == ELSE_TYPE){ i++; var childCode = nextElse[1]; var testEL = nextElse[2]; var test = this.stringifyEL(testEL); if(test){ this.append("else if(",php2jsBoolean(testEL,test),"){"); }else{ notEnd = false; this.append("else{"); } this.depth++; this.appendCode(childCode) this.depth--; this.append("}"); nextElse = code[i+1]; } return i; }, processFor:function(code,i){ var item = code[i]; var indexAutoId = this.allocateId(); var keyAutoId = this.allocateId(); var isKeyAutoId = this.allocateId(); var itemsEL = this.stringifyEL(item[2]); var varName = '$'+item[3]; //var statusNameId = item[4]; var childCode = item[1]; var forInfo = this.findForStatus(item) if(forInfo.depth){ var preForAutoId = this.allocateId(); } if(/^\$[\w_]+$/.test(itemsEL)){ var itemsAutoId = itemsEL; }else{ var itemsAutoId = this.allocateId(); this.append(itemsAutoId,'=',itemsEL,';'); } //初始化 items 开始 this.append('if(',itemsAutoId,'<=PHP_INT_MAX){',itemsAutoId,'=',itemsAutoId,'>0?range(1,',itemsAutoId,'):array();}'); //初始化 for状态 var needForStatus = forInfo.ref || forInfo.index || forInfo.lastIndex; if(needForStatus){ if(forInfo.depth){ this.append(preForAutoId ,"=",FOR_STATUS_KEY,";"); } this.append(FOR_STATUS_KEY," = array('lastIndex'=>count(",itemsAutoId,")-1);"); } this.append(indexAutoId,"=-1;") this.append(isKeyAutoId,'=false;') this.append("foreach(",itemsAutoId," as ",keyAutoId,"=>",varName,"){"); this.depth++; this.append("if(++",indexAutoId," === 0){"); this.depth++; this.append(isKeyAutoId,"=",keyAutoId," !== 0;"); this.depth--; this.append("}"); this.append("if(",isKeyAutoId,"){",varName,'=',keyAutoId,";}"); if(needForStatus){ this.append(FOR_STATUS_KEY,"['index']=",indexAutoId,";"); } this.appendCode(childCode); this.depth--; this.append("}");//end for if(needForStatus && forInfo.depth){ this.append(FOR_STATUS_KEY,"=",preForAutoId,';'); } this.freeId(isKeyAutoId); this.freeId(keyAutoId); this.freeId(itemsAutoId); if(forInfo.depth){ this.freeId(preForAutoId); } var nextElse = code[i+1]; var notEnd = true; var elseIndex = 0; while(notEnd && nextElse && nextElse[0] == ELSE_TYPE){ i++; elseIndex++; var childCode = nextElse[1]; var testEL = nextElse[2]; var test = this.stringifyEL(testEL); var ifstart = elseIndex >1 ?'else if' :'if'; if(test){ this.append(ifstart,"(",indexAutoId,"<0&&",php2jsBoolean(testEL,test),"){"); }else{ notEnd = false; this.append(ifstart,"(",indexAutoId,"<0){"); } this.depth++; this.appendCode(childCode) this.depth--; this.append("}"); nextElse = code[i+1]; } this.freeId(indexAutoId); return i; }, toSource:function(){ return this.out.join(''); } }); if(typeof require == 'function'){ exports.PHPTranslator=PHPTranslator; var php2jsBoolean=require('./php-el-translator').php2jsBoolean; var isSimplePHPEL=require('./php-el-translator').isSimplePHPEL; var stringifyPHP=require('./php-el-translator').stringifyPHP; var stringifyPHPEL=require('./php-el-translator').stringifyPHPEL; var i18nHash=require('../js/parse/syntax-i18n').i18nHash; } }; require.cached["lite/src/main/js/parse/template-token.js"]=function (require,exports,module,__filename,__dirname){/* * List Template * License LGPL(您可以在任何地方免费使用,但请不要吝啬您对框架本身的改进) * http://www.xidea.org/lite/ * @author jindw * @version $Id: template.js,v 1.4 2008/02/28 14:39:06 jindw Exp $ */ var EL_TYPE = 0;// [0,'el'] var IF_TYPE = 1;// [1,[...],'test'] var BREAK_TYPE = 2;// [2,depth] var XA_TYPE = 3;// [3,'value','name'] var XT_TYPE = 4;// [4,'el'] var FOR_TYPE = 5;// [5,[...],'items','var'] var ELSE_TYPE = 6;// [6,[...],'test']//test opt? var PLUGIN_TYPE =7;// [7,[...],'el','clazz'] var VAR_TYPE = 8;// [8,'value','name'] var CAPTURE_TYPE = 9;// [9,[...],'var'] var IF_KEY = "if"; var FOR_KEY = "for"; var PLUGIN_DEFINE = "org.xidea.lite.DefinePlugin"; exports.PLUGIN_DEFINE=PLUGIN_DEFINE; exports.VAR_TYPE=VAR_TYPE; exports.XA_TYPE=XA_TYPE; exports.ELSE_TYPE=ELSE_TYPE; exports.PLUGIN_TYPE=PLUGIN_TYPE; exports.CAPTURE_TYPE=CAPTURE_TYPE; exports.IF_TYPE=IF_TYPE; exports.EL_TYPE=EL_TYPE; exports.BREAK_TYPE=BREAK_TYPE; exports.XT_TYPE=XT_TYPE; exports.FOR_TYPE=FOR_TYPE; }; require.cached["lite/src/main/js/parse/translate-context.js"]=function (require,exports,module,__filename,__dirname){/* * List Template * License LGPL(您可以在任何地方免费使用,但请不要吝啬您对框架本身的改进) * http://www.xidea.org/project/lite/ * @author jindw * @version $Id: template.js,v 1.4 2008/02/28 14:39:06 jindw Exp $ */ exports.TranslateContext=TranslateContext; var OptimizeScope=require('./optimize-scope').OptimizeScope; var VAR_TYPE=require('./template-token').VAR_TYPE; var XA_TYPE=require('./template-token').XA_TYPE; var ELSE_TYPE=require('./template-token').ELSE_TYPE; var PLUGIN_TYPE=require('./template-token').PLUGIN_TYPE; var CAPTURE_TYPE=require('./template-token').CAPTURE_TYPE; var IF_TYPE=require('./template-token').IF_TYPE; var EL_TYPE=require('./template-token').EL_TYPE; var XT_TYPE=require('./template-token').XT_TYPE; var FOR_TYPE=require('./template-token').FOR_TYPE; var ID_PREFIX = "$_"; var XML_ENCODE_XA = 1; var XML_ENCODE_XT = 2; /** * @extends LiteContext */ function TranslateContext(code,params){ /** * 当前域下的参数表[可以为null,null和空数组表示的意思不同] */ this.params = params; /** * 当前scope的信息(包括变量,引用,函数调用信息,for状态,函数集...) */ this.scope = new OptimizeScope(code,params); this.allocateIdMap = {}; this.outputIndent = 0; } TranslateContext.prototype = { findForStatus:function(code){ var fis = this.scope.fors; var i = fis.length; while(i--){ var fi = fis[i]; if(fi.code == code){ return fi; } } //return this.vs.getForStatus(forCode); }, allocateId:function(id){ if(id && /^([\w\$_]+|[\d\.]+)$/.test(id)){ return id; } var i = 0; while(true){ if(!this.allocateIdMap[i]){ this.allocateIdMap[i] = true; return ID_PREFIX+i.toString(36); } i++; } }, freeId:function(id){ var len = ID_PREFIX.length; if(id.substring(0,len) == ID_PREFIX){ delete this.allocateIdMap[id.substring(len)]; } }, /** */ appendCode:function(code){ for(var i=0;i<code.length;i++){ var item = code[i]; if(typeof item == 'string'){ this.appendStatic(item) }else{ var type = item && item[0]; switch(type){ case EL_TYPE: this.visitEL(item[1],type) this.appendEL(item); break; case XT_TYPE: this.visitEL(item[1],type) this.appendXT(item); break; case XA_TYPE: this.visitEL(item[1],type) this.appendXA(item); break; case VAR_TYPE: this.visitEL(item[1],type) this.appendVar(item); break; case CAPTURE_TYPE: this.visitEL(null,type) this.processCapture(item); break; case PLUGIN_TYPE://not support this.visitEL(item[2],type) this.processPlugin(item[1],item[2]); break; case IF_TYPE: this.visitEL(item[2],type) i = this.processIf(code,i); break; case FOR_TYPE: this.visitEL(item[2],type) i = this.processFor(code,i); break; case ELSE_TYPE: this.visitEL(item[2],type) i = this.processElse(code,i); break; default: throw Error('无效指令:'+i+JSON.stringify(code)) } } } }, visitEL:function(){}, //[PLUGIN_TYPE,child,config] processPlugin:function(child,config){ var pn = config['class']; switch(pn.replace(/^org\.xidea\.lite\.(?:parse\.)?/,'')){ case 'EncodePlugin': this.appendEncodePlugin(child[0]); break; case 'DatePlugin': this.appendDatePlugin(child[0],child[1]); break; case 'NativePlugin': this.appendNativePlugin(child,config); break; case 'ModulePlugin': this.appendModulePlugin(child,config); break; case 'DefinePlugin': //全局自动处理 break; case 'ClientPlugin': //编译期消灭 default: console.error("程序bug(插件需要预处理):"+pn,config); } }, processElse:function(code,i){ throw Error('问题指令(无主else,else 指令必须紧跟if或者for):'+code,i); }, append:function(){ var outputIndent = this.outputIndent; this.out.push("\n"); while(outputIndent--){ this.out.push("\t") } for(var i=0;i<arguments.length;i++){ this.out.push(arguments[i]); } }, reset:function(){ var out = this.out.concat(); this.out.length=0; return out; } } }; require.cached["lite/src/main/js/parse/optimize-scope.js"]=function (require,exports,module,__filename,__dirname){/* * List Template * License LGPL(您可以在任何地方免费使用,但请不要吝啬您对框架本身的改进) * http://www.xidea.org/project/lite/ * @author jindw * @version $Id: template.js,v 1.4 2008/02/28 14:39:06 jindw Exp $ */ exports.OptimizeScope=OptimizeScope; var Expression=require('js-el').Expression; var VAR_TYPE=require('./template-token').VAR_TYPE; var XA_TYPE=require('./template-token').XA_TYPE; var ELSE_TYPE=require('./template-token').ELSE_TYPE; var PLUGIN_TYPE=require('./template-token').PLUGIN_TYPE; var CAPTURE_TYPE=require('./template-token').CAPTURE_TYPE; var IF_TYPE=require('./template-token').IF_TYPE; var EL_TYPE=require('./template-token').EL_TYPE; var BREAK_TYPE=require('./template-token').BREAK_TYPE; var XT_TYPE=require('./template-token').XT_TYPE; var FOR_TYPE=require('./template-token').FOR_TYPE; function OptimizeScope(code,params){ this.code = code; /** * @see org.xidea.lite.parse.OptimizeScope#getParams() */ this.params = params?params.concat():[]; /** * @see org.xidea.lite.parse.OptimizeScope#getVars() */ this.vars = []; /** * @see org.xidea.lite.parse.OptimizeScope#getCalls() */ this.calls = []; /** * @see org.xidea.lite.parse.OptimizeScope#getRefs() */ this.refs = []; /** * @see org.xidea.lite.parse.OptimizeScope#getExternalRefs() */ this.externalRefs = []; /** * 所有for信息数组,按深度优先出现顺序放置[_forStack 描述的是当前for深度] */ this.fors = []; /** * 所有函数定义数组 */ this.defs = []; this.defMap = {}; this.paramMap = listMap(this.params,{}); this.varMap = {} this._forStack = []; vistLite(this,this.code = code); delete this._forStack; this.callMap =listMap(this.calls, {}); this.refMap =listMap(this.refs, {}); this.externalRefMap =listMap(this.externalRefs, {}); } function listMap(list,map){ var i = list.length; while(i--){ var n = list[i]; if(n in map){ map[n]+=1; }else{ map[n] = 1; } } return map; } function ForStatus(code){ this.code = code; this.index; this.lastIndex; this.ref; this.depth //this.beforeStatus } function vistDef(context,item){ var config = item[2]; var params = config.params; var defaults = config.defaults; //def can not change!!. use cache var def = item[-1]||new OptimizeScope(item[1],params); def.name = config.name; def.defaults = config.defaults; context.fors = context.fors.concat(def.fors) context.defs.push(def.name); context.defMap[def.name] = def; def.defs = context.defs; def.defMap = context.defMap; } function vistLite(context,code){ if(code == null){ return null; } for(var i=0;i<code.length;i++){ var item = code[i]; if(item instanceof Array){ var type = item[0]; //el switch (type) { case VAR_TYPE: case EL_TYPE: case XA_TYPE: case XT_TYPE: walkEL(context, item[1]); break; case IF_TYPE: case ELSE_TYPE: case FOR_TYPE: walkEL(context, item[2]); break; // case Template.PLUGIN_TYPE: // case Template.BREAK_TYPE: // case Template.CAPTURE_TYPE: // break; } //child switch (type) { case PLUGIN_TYPE: var className = item[2]['class']; if(className == 'org.xidea.lite.DefinePlugin'){ vistDef(context,item); }else if(className == 'org.xidea.lite.parse.ClientPlugin'){ //doFindClient(item); }else if(className == 'org.xidea.lite.EncodePlugin' ||className =='org.xidea.lite.DatePlugin' ||className =='org.xidea.lite.ModulePlugin'){ vistLite(context,item[1]); }else{ console.info('unknow plugin',item[2]) } break; case CAPTURE_TYPE: case IF_TYPE: case ELSE_TYPE: vistLite(context,item[1]); break; case FOR_TYPE: enterFor(context,item); addVar(context,item[3]); vistLite(context,item[1]); exitFor(context); break; // case XA_TYPE: // case XT_TYPE: // case EL_TYPE: // case VAR_TYPE: } //var switch(type){ case CAPTURE_TYPE: case VAR_TYPE: addVar(context,item[2]); addVar(context,item[2]); } } } } function enterFor(context,forCode){ var fs = new ForStatus(forCode); fs.depth = context._forStack.length; context.fors.push(fs) context._forStack.push(fs) } function exitFor(context){ context._forStack.pop() } function addVar(context,n){ context.vars.push(n); var map = context.varMap; if(n in map){ map[n]+=1; }else{ map[n] = 1; } } /* ============================= */ function walkEL(thiz,el){ if(el == null){ return; } var varMap = new Expression(el).getVarMap(); //console.log(new Expression(el)) for(var varName in varMap){ var list = varMap[varName]; var len = list.length; if(varName == 'for'){ // for(var i =0;i<len;i++){ var p = list[i]; if(p == ''){ setForStatus(thiz,'*'); }else if(p == 'index' || p == 'lastIndex'){ setForStatus(thiz,p); }else{ console.error('for 不能有index,lastIndex 之外的其他属性'); setForStatus(thiz,'*'); } } }else{ if(!(varName in thiz.varMap || varName in thiz.paramMap)){ thiz.externalRefs.push(varName); } thiz.refs.push(varName); } } var callMap = new Expression(el).getCallMap(); for(var callName in callMap){ var list = callMap[callName]; var len = list.length; for(var i =0;i<len;i++){ if(varName in thiz.varMap //@see javadoc OptimizeUtil#walkEL || varName in thiz.paramMap ){ thiz.calls.push('*'); }else if(varName){// ignore ''//constants thiz.calls.push(varName); } } } } function setForStatus(thiz,attrName){ var fs = thiz._forStack[thiz._forStack.length-1]; if(fs){ if(attrName == 'index'){fs.index =true;} else if(attrName == 'lastIndex'){fs.lastIndex =true;} else if(attrName == '*'){fs.ref = true;} else{throw new Error("for不支持属性:"+attrName);} }else{ throw new Error("for 变量不能在循环外使用:for."+attrName); } } ///** // * 遍历Lite的表达式结构,收集表达式信息 // */ //function ELStatus(tokens){ // this.tree = tokens; // this.refs = []; // this.re // this.callMap = {}; // /** // * for 状态设置 // */ // this.forIndex = false; // this.forLastIndex = false; // this.tree && walkEL(this,this.tree) //} }; require.cached["js-el"]=function (require,exports,module,__filename,__dirname){module.exports = require("js-el/src/main/js/expression.js"); }; require.cached["js-el/src/main/js/expression.js"]=function (require,exports,module,__filename,__dirname){/* * List Template * License LGPL(您可以在任何地方免费使用,但请不要吝啬您对框架本身的改进) * http://www.xidea.org/project/lite/ * @author jindw * @version $Id: template.js,v 1.4 2008/02/28 14:39:06 jindw Exp $ */ /** * 表达式对象,可以单步解释表达式中间代码 */ function Expression(value){ if(typeof value == 'string'){ value = new ExpressionTokenizer(value).getResult(); }else if(value instanceof Expression){ return value; } this.token = value; } Expression.prototype.evaluate = function(context){ return evaluate(context,this.token); } /** * { * varName:["","a","a.b","a.*.b"] * } */ Expression.prototype.getVarMap = function(){ init(this); return this.varMap; } /** * { * methodName:["","a","a.b","*",'a.1.*.x','.a.1'] * } */ Expression.prototype.getCallMap = function(){ init(this); return this.callMap; } function init(thiz){ if(thiz.callMap == null){ thiz.callMap = {}; thiz.varMap = {}; walkEL(thiz.token,thiz); } } function walkEL(token,context){ var op = token[0]; if(op<=0){ if(op == VALUE_VAR){ _addKeyList(context.varMap,token[1],''); } return; }else{ var arg1 = token[1]; if(op == OP_INVOKE){ if(arg1[0] == VALUE_VAR){ _addKeyList(context.callMap,arg1[1],''); }else if(arg1[0] == OP_GET){//member var list = walkMembers(arg1,context,[]).reverse(); var ps = list.slice(1).join('.'); if(list[0] != ''){//!constants,what about constants, map,list? if(list[0] != '*' ){//vars _addKeyList(context.varMap,list[0],ps); } _addKeyList(context.callMap,list[0],ps); } }else{ walkEL(arg1,context); _addKeyList(context.callMap,"*",''); } }else{ if(op == OP_GET){ var list = walkMembers(token,context,[]).reverse(); var ps = list.slice(1).join('.'); if(list[0] != ''){//!constants,what about constants, map,list? if(list[0] != '*' ){//vars _addKeyList(context.varMap,list[0],ps); } } }else{ arg1 && walkEL(arg1,context); } } var pos = getTokenParamIndex(token[0]); if(pos>2){//invoke args... walkEL(token[2],context); } } } function walkMembers(token,context,buf){//[get,owner,key] var owner = token[1]; var key = token[2]; if(key[0] == VALUE_CONSTANTS){ buf.push(key[1]); }else{ walkEL(key,context); buf.push('*'); } if(owner[0] == VALUE_VAR){ buf.push(owner[1]);//跳过 设置 varMap }else if(owner[0] == VALUE_CONSTANTS){ buf.push(''); }else if(owner[0] == OP_GET){ walkMembers(owner,context,buf); }else{ walkEL(owner,context); buf.push('*'); } return buf; } function _addKeyList(map,key,value){ var list = key in map? map[key]: (map[key] = []); if(list.indexOf(value) <0){ list.push(value); } return list; } Expression.prototype.toString = function(context){ return stringifyJSEL(this.token,context||defaultContext); //return JSON.stringify(this.token); } Expression.evaluate = evaluate; /** * 表达式单步解析函数实现 */ function evaluate(context,el){ var result = _evaluate(el,context) return realValue(result); } function innerEval(){ return eval(arguments[0]); } function _evaluate(item,context){ var type = item[0]; switch(type){ case VALUE_LIST: return []; case VALUE_MAP: return {}; case VALUE_VAR: arg1 = item[1] return (arg1 in context?context:this)[arg1]; case VALUE_CONSTANTS: arg1 = item[1]; return arg1&&arg1['class'] == 'RegExp'?innerEval(arg1.literal):arg1; ///* and or */ case OP_AND: return realValue(_evaluate(item[1],context)) && (_evaluate(item[2],context)); case OP_OR: return realValue(_evaluate(item[1],context)) || (_evaluate(item[2],context)); case OP_QUESTION://// a?b:c -> a?:bc -- >a?b:c if(realValue(_evaluate(item[1],context))){ return _evaluate(item[2],context); }else{ return PropertyValue;//use as flag } case OP_QUESTION_SELECT: arg1 = realValue(_evaluate(item[1],context)); if(arg1 == PropertyValue){//use as flag return _evaluate(item[2],context); }else{ return arg1; } } var arg1=_evaluate(item[1],context); if(getTokenParamIndex(type) ==3){ var arg2=realValue(_evaluate(item[2],context)); } if(type == OP_INVOKE){ if(typeof arg1 == 'function'){ return arg1.apply(context,arg2); }else if(arg1 instanceof PropertyValue){ var thiz = arg1[0]; var key = arg1[1]; var fn = thiz[key]; //bugfix replace(RegExp if(fn == String.prototype.replace || fn == String.prototype.match){ arg2 = arg2.slice(0); var exp = arg2[0]; if(exp && exp['class'] == 'RegExp'){ arg2[0] = innerEval(exp.literal) } } return fn.apply(thiz,arg2); }else{ throw new Error("not a fn!!"+arg1) } } arg1 = realValue(arg1); switch(type){ //op // case OP_GET_STATIC_PROP: // arg2 =getTokenParam(item); case OP_GET: return new PropertyValue(arg1,arg2); case OP_NOT: return !arg1; case OP_POS: return +arg1; case OP_NEG: return -arg1; ///* +-*%/ */ case OP_ADD: return arg1+arg2; case OP_SUB: return arg1-arg2; case OP_MUL: return arg1*arg2; case OP_DIV: return arg1/arg2; case OP_MOD: return arg1%arg2; ///* boolean */ case OP_GT: return arg1 > arg2; case OP_GTEQ: return arg1 >= arg2; case OP_NE: return arg1 != arg2; case OP_NE_STRICT: return arg1 !== arg2; case OP_EQ: return arg1 == arg2; case OP_EQ_STRICT: return arg1 === arg2; case OP_LT: return arg1 < arg2; case OP_LTEQ: return arg1 <= arg2; case OP_IN: return arg1 in arg2; case OP_JOIN: arg1.push(arg2) return arg1; case OP_PUT: arg1[getTokenParam(item)]= arg2; return arg1; } } function PropertyValue(base,name){ this[0] = base; this[1] = name; } function realValue(arg1){ if(arg1 instanceof PropertyValue){ return arg1[0][arg1[1]]; } return arg1; } var ID_PATTERN_QUTE = /^"[a-zA-Z_\$][_\$\w]*"$/; var defaultContext = { getForName:String, findForAttribute:function(varName,propertyName){}, getVarName:function(varName){ return varName; }, genGetCode:function(owner,property){ if(ID_PATTERN_QUTE.test(property)){ return owner+'.'+property.slice(1,-1); }else{ return owner+'['+property+']'; } } } var stringifyJSEL = require('./el-translator.js').stringifyJSEL var ExpressionTokenizer=require('./expression-tokenizer').ExpressionTokenizer; var getTokenParam=require('./expression-token').getTokenParam; var getTokenParamIndex=require('./expression-token').getTokenParamIndex; var OP_ADD=require('./expression-token').OP_ADD; var OP_AND=require('./expression-token').OP_AND; var OP_DIV=require('./expression-token').OP_DIV; var OP_EQ=require('./expression-token').OP_EQ; var OP_EQ_STRICT=require('./expression-token').OP_EQ_STRICT; var OP_GET=require('./expression-token').OP_GET; var OP_GT=require('./expression-token').OP_GT; var OP_GTEQ=require('./expression-token').OP_GTEQ; var OP_IN=require('./expression-token').OP_IN; var OP_INVOKE=require('./expression-token').OP_INVOKE; var OP_JOIN=require('./expression-token').OP_JOIN; var OP_LT=require('./expression-token').OP_LT; var OP_LTEQ=require('./expression-token').OP_LTEQ; var OP_MOD=require('./expression-token').OP_MOD; var OP_MUL=require('./expression-token').OP_MUL; var OP_NE=require('./expression-token').OP_NE; var OP_NEG=require('./expression-token').OP_NEG; var OP_NE_STRICT=require('./expression-token').OP_NE_STRICT; var OP_NOT=require('./expression-token').OP_NOT; var OP_OR=require('./expression-token').OP_OR; var OP_POS=require('./expression-token').OP_POS; var OP_PUT=require('./expression-token').OP_PUT; var OP_QUESTION=require('./expression-token').OP_QUESTION; var OP_QUESTION_SELECT=require('./expression-token').OP_QUESTION_SELECT; var OP_SUB=require('./expression-token').OP_SUB; var VALUE_CONSTANTS=require('./expression-token').VALUE_CONSTANTS; var VALUE_LIST=require('./expression-token').VALUE_LIST; var VALUE_MAP=require('./expression-token').VALUE_MAP; var VALUE_VAR=require('./expression-token').VALUE_VAR; module.exports =Expression; Expression.Expression=Expression; }; require.cached["js-el/src/main/js/el-translator.js"]=function (require,exports,module,__filename,__dirname){/* * List Template * License LGPL(您可以在任何地方免费使用,但请不要吝啬您对框架本身的改进) * http://www.xidea.org/project/lite/ * @author jindw * @version $Id: template.js,v 1.4 2008/02/28 14:39:06 jindw Exp $ */ var NUMBER_CALL = /^(\d+)(\.\w+)$/;//10.0.toString(2), 10.toString(2) //var PRESERVED = /^(break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|var|void|while|with|class|const|debugger|enum|export|extends|import|super)$/ /** * 将某一个token转化为表达式 */ function stringifyJSEL(el,context){ var type = el[0]; if(type<=0){//value return stringifyValue(el,context) }else if(getTokenParamIndex(type) ==3){//两个操作数 return stringifyInfix(el,context); }else{ return stringifyPrefix(el,context); } } /** * 翻译常量字面量 */ function stringifyValue(el,context){ var param = el[1]; switch(el[0]){ case VALUE_CONSTANTS: return (param && param['class']=='RegExp' && param.literal) || JSON.stringify(param); case VALUE_VAR: //console.log(PRESERVED.test(param),param) if(param == 'for'){ var f = context.getForName(); if(f){ param = f; } //}else if(PRESERVED.test(param)){ // return param+'__'; }else{ } return context.getVarName(param) ; case VALUE_LIST: return "[]"; case VALUE_MAP: return "{}"; } } function stringifyGetter(context,el){ var el1 = el[1]; var el2 = el[2]; if(el2[0] == VALUE_CONSTANTS && el1[0] == VALUE_VAR){ var varName = getTokenParam(el1) var propertyName = getTokenParam(el2) if(typeof propertyName == 'string'){ var forAttr = context.findForAttribute(varName,propertyName); if(forAttr){ return forAttr; } } } var value1 = stringifyJSEL(el1,context); var value2 = stringifyJSEL(el2,context); //safe check //return __get__(value1,value2) //default impl(without safy check) value1 = addELQute(el,el1,value1) return context.genGetCode(value1,value2); } function stringifyPropertyCall(context,propertyEL,callArguments){ var value1 = stringifyGetter(context,propertyEL); var value2 = stringifyJSEL(callArguments,context); if(value1.match(/\)$/)){ //safe property call return value1.slice(0,-1)+','+value2+')' }else{ value1 = value1.replace(NUMBER_CALL,'($1)$2')//void 10.toString(2) error!! return value1+"("+value2.slice(1,-1)+')'; } } /** * 翻译中缀运算符 */ function stringifyInfix(el,context){ var type = el[0]; var el1 = el[1]; var el2 = el[2]; if(type == OP_GET){ return stringifyGetter(context,el); }else if(type == OP_INVOKE && el1[0] == OP_GET){ return stringifyPropertyCall(context,el1,el2); } var opc = findTokenText(el[0]); var value1 = stringifyJSEL(el1,context); var value2 = stringifyJSEL(el2,context); //value1 = addELQute(el,el[1],value1); switch(type){ case OP_INVOKE: value2 = value2.slice(1,-1); value1 = value1.replace(NUMBER_CALL,'($1)$2') return value1+"("+value2+')'; //case OP_GET: case OP_JOIN: if("[]"==value1){ return "["+value2+"]" }else{ return value1.slice(0,-1)+','+value2+"]" } case OP_PUT: value2 = JSON.stringify(getTokenParam(el))+":"+value2+"}"; if("{}"==value1){ return "{"+value2 }else{ return value1.slice(0,-1)+','+value2 } case OP_QUESTION: //1?2:3 => [QUESTION_SELECT, // [QUESTION,[CONSTANTS,1],[CONSTANTS,2]], // [CONSTANTS,3] // ] //throw new Error("表达式异常:QUESTION 指令翻译中应该被QUESTION_SELECT跳过"); return null;//前面有一个尝试,此处应返回null,而不是抛出异常。 case OP_QUESTION_SELECT: /** ${a?b:c} ${a?b1?b2:b3:c} ${222+2|a?b1?b2:b3:c} */ //?:已经是最低优先级了,无需qute,而且javascript 递归?: 也无需优先级控制 var test = stringifyJSEL(el1[1],context); var value1 = stringifyJSEL(el1[2],context); return test+'?'+value1+":"+value2; } value1 = addELQute(el,el1,value1) value2 = addELQute(el,el2,null,value2) if(opc == '-' || opc == '+'){//-1--2=> -1- -2 if(value2.indexOf(opc) == 0){ opc += ' '; } } return value1 + opc + value2; } /** * 翻译前缀运算符 */ function stringifyPrefix(el,context){ var type = el[0]; var el1 = el[1]; var value = stringifyJSEL(el1,context); var param = getTokenParam(el); value = addELQute(el,el1,null,value) var opc = findTokenText(type); return opc+value; } if(typeof require == 'function'){ exports.stringifyJSEL=stringifyJSEL; var getTokenParam=require('./expression-token').getTokenParam; var getTokenParamIndex=require('./expression-token').getTokenParamIndex; var findTokenText=require('./expression-token').findTokenText; var addELQute=require('./expression-token').addELQute; var OP_GET=require('./expression-token').OP_GET; var OP_IN=require('./expression-token').OP_IN; var OP_INVOKE=require('./expression-token').OP_INVOKE; var OP_JOIN=require('./expression-token').OP_JOIN; var OP_PUT=require('./expression-token').OP_PUT; var OP_QUESTION=require('./expression-token').OP_QUESTION; var OP_QUESTION_SELECT=require('./expression-token').OP_QUESTION_SELECT; var VALUE_CONSTANTS=require('./expression-token').VALUE_CONSTANTS; var VALUE_LIST=require('./expression-token').VALUE_LIST; var VALUE_MAP=require('./expression-token').VALUE_MAP; var VALUE_VAR=require('./expression-token').VALUE_VAR; } }; require.cached["js-el/src/main/js/expression-token.js"]=function (require,exports,module,__filename,__dirname){/* * List Template * License LGPL(您可以在任何地方免费使用,但请不要吝啬您对框架本身的改进) * http://www.xidea.org/project/lite/ * @author jindw * @version $Id: template.js,v 1.4 2008/02/28 14:39:06 jindw Exp $ */ var BIT_PRIORITY= 60; var BIT_PRIORITY_SUB= 3840; var BIT_ARGS= 192; var POS_INC= 12; var VALUE_CONSTANTS= -1; var VALUE_VAR= -2; var VALUE_LIST= -3; var VALUE_MAP= -4; var OP_GET= 96; var OP_INVOKE= 97; var OP_NOT= 28; var OP_BIT_NOT= 29; var OP_POS= 30; var OP_NEG= 31; var OP_MUL= 88; var OP_DIV= 89; var OP_MOD= 90; var OP_ADD= 84; var OP_SUB= 85; var OP_LSH= 80; var OP_RSH= 81; var OP_URSH= 82; var OP_LT= 332; var OP_GT= 333; var OP_LTEQ= 334; var OP_GTEQ= 335; var OP_IN= 4428; var OP_EQ= 76; var OP_NE= 77; var OP_EQ_STRICT= 78; var OP_NE_STRICT= 79; var OP_BI