lite
Version:
A cross platform template engine base on xml/html and javascript expression.
1,658 lines (1,595 loc) • 508 kB
JavaScript
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('<'=>'<','\"'=>'"'));");
}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){//é�xDDS;
//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