lite
Version:
A cross platform template engine base on xml/html and javascript expression.
167 lines (160 loc) • 4.25 kB
JavaScript
/*
* 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 findELEnd=require('./el-util').findELEnd;
var PLUGIN_DEFINE=require('./template-token').PLUGIN_DEFINE;
var parseDefName = require('./syntax-util').parseDefName;
var findLiteParamMap=require('./syntax-util').findLiteParamMap;
var appendForStart = require('./syntax-util').appendForStart;
exports.seekxa = function(text){
var end = findELEnd(text,0);
if(end>0){
try{
var el = text.substring(1,end);
if(/^\s*([\w\-]+|"[^"]+"|'[^']+')\s*\:/.test(el)){
var map = findLiteParamMap(el);
for(var n in map){
this.appendXA(n,map[n]);
}
}else{
this.appendXA(null,el)
}
return end;
}catch(e){
console.error("XML属性表达式解析异常,请检查是否手误:[fileName:"+this.currentURI+",el:"+el+"],text:"+text,e)
return -1;
}
}else{
console.warn("XML属性表达式解析异常,请检查是否手误:[fileName:"+this.currentURI+",el:"+text+"]")
return -1;
}
};
exports.seekxt = function(text){
var end = findELEnd(text,0);
if(end>0){
try{
var el = text.substring(1,end);
this.appendXT(el)
return end;
}catch(e){
console.error("XML文本表达式解析异常,请检查是否手误:[fileName:"+this.currentURI+",el:"+el+"],text:"+text,e)
return -1;
}
}else{
console.warn("XML文本表达式解析异常,请检查是否手误:[fileName:"+this.currentURI+",el:"+text+"]")
return -1;
}
}
function trimSpaceLine(ctx,text){
//ctx.trimLineEnd();
var previous = ctx._result.result;
var last = previous[previous.length-1];
if(typeof last == 'string'){
previous[previous.length-1] = last.replace(/(?:\r\n?|\n|^)[^\S\r\n]*$/,'')
}
if(text.charAt() == '$'){
var m = /[\s]*?(?:\r\n?|\n)/.exec(text);
if(m ){
return m[0].length;
}
}
return 0;
}
exports.seekEnd= function(text){
var end = 0;
if(text.charAt() == '$'){
//console.log('end $')
end = trimSpaceLine(this,text)
}
this.appendEnd();
return end;
}
exports.seekElse=function (text){
//console.log('else el:',text,text.charAt(),'$$$')
if(text.charAt() == '$'){
//console.log('else $',text,'#####')
end = trimSpaceLine(this,text);
this.appendEnd();
this.appendElse(null);
return end;
}else{
var end = findELEnd(text);
if(end>0){
this.appendEnd();
this.appendElse(text.substring(1,end)||null);
return end;
}else{
this.appendEnd();
this.appendElse(null);
}
return 0;
}
}
exports.seekDef=function (text){
var end = findELEnd(text);
if(end>0){
var ns = text.substring(1,end);
var config = parseDefName(ns);
this.appendPlugin(PLUGIN_DEFINE,JSON.stringify(config));
return end;
}
}
exports.seekVar=function (text){
var end = findELEnd(text);
if(end>0){
var value = text.substring(1,end);
if(/^\s*(?:\w+|['"][^"]+['"])\s*$/.test(value)){
this.appendCapture(value.replace(/['"]/g,''));
}else{
var map = findLiteParamMap(value);
for(var n in map){
this.appendVar(n,map[n]);
}
}
return end;
}
}
exports.seekClient= function(text){
var end = findELEnd(text);
if(end>0){
var ns = text.substring(1,end);
var config = parseDefName(ns);
this.appendPlugin("org.xidea.lite.parse.ClientPlugin",JSON.stringify(config));
return end;
}
}
exports.seekIf=function (text){
var end = findELEnd(text,0);
if(end>0){
this.appendIf(text.substring(1,end));
return end;
}
}
exports.seekElif=function (text){
var end = findELEnd(text);
if(end>0){
this.appendEnd();
this.appendElse(text.substring(1,end)||null);
return end;
}
}
exports.seekFor=function (text){
var end = findELEnd(text);
if(end>0){
var value = text.substring(1,end);
appendForStart(this,value);
return end;
}
}
exports.seekOut=function (text){
var end = findELEnd(text);
if(end>0){
var value = text.substring(1,end);
this.appendEL(value);
return end;
}
}