欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  资讯频道

Lite2 体验程序发布,模板系统中的小无相功?

程序员文章站 2022-03-19 14:53:45
...
一个Lite最新版本的测试环境。

最大的特点是提供了一种非常*方便的跨平台扩展机制。
您可以在这个平台的基础上轻松实现各种完全不同的模板语法。就像逍遥派的小无相功^_^。

Google Closure Template 语法运用实例
为了测试方便,用法稍有改变,前后端模板集成,不再要求手动编译。
closure.soy
#!encoding=utf-8;extension=/WEB-INF/closure.js
<pre>
{foreach $name in $names}
{if not $greetingWord}
    Hello {$name}!
{else}
    {$greetingWord} {$name}!
{/if}
{ifempty}
.....
{/foreach}
</pre>
<!-- 前端模板(不同GCT,GCT需要编译,也不能直接插入) -->
{template testSoy}
{foreach $name in $names}
{if not $greetingWord}
    Hello {$name}!
{else}
    {$greetingWord} {$name}!
{/if}
{ifempty}
.....
{/foreach}
{/template}

<script>
var data = new Object();
data.$greetingWord='hehe';
data.$names=['kexin','dawei','niuyao'];
alert(testSoy(data));
</script>

closure.s.js
var $greetingWord = "haha"
var $names = ["kexin",'dawei','quguangyu','niuyao']
lite.render("closure.soy");

感觉如何?“小无相功精微渊深,以此为根基,本寺的七十二绝技,倒也皆可运使,只不过细微曲折之处,不免有点似是而非罢了。”


语法模拟
Google Closure哪洋洋洒洒3兆多的源代码,实在是写的太冤了,这不就是120行代码的事情嘛^_^
/WEB-INF/closure.js

$if = {
  parse : function(text,start,context){
    var end = text.indexOf("}",start);
    var el = text.substring(start+4,end);
    el = el.replace(/^\s*not\b/,'!');
    context.appendIf(el);
    return end+2;
  },
  findStart : function(text,start,otherStart){
    return text.indexOf("{if",start);
  }
}
$else = {
  parse : function(text,start,context){
    context.appendEnd();
    context.appendElse(null);
    return start+7;
  },
  findStart : function(text,start,otherStart){
    return text.indexOf("{else}",start);
  }
}
$elseif = {
  parse : function(text,start,context){
    context.appendEnd();
    var end = text.indexOf("}",start);
    var el = text.substring(start+8,end);
    el = el.replace(/^\s*not\b/,'!');
    context.appendElse(el);
    return end+2;
  },
  findStart : function(text,start,otherStart){
    return text.indexOf("{elseif",start);
  }
}

$end = {
  parse : function(text,start,context){
    var end = text.indexOf("}",start);
    var word = text.substring(start+2,end);
    switch(word){
        case 'if':
        case 'foreach':
        context.appendEnd();
        //java.lang.System.out.println([context.toCode()].join('\n====\n'))
    
        break;
        default:
        return start;
    }
    return end+1;
  },
  findStart : function(text,start,otherStart){
    return text.indexOf("{/",start);
  }
}
//  {foreach $additionalName in $additionalNames}
var $for = {
  parse : function(text,start,context){
    var end = text.indexOf("}",start);
    var el = text.substring(start+9,end);
    el = el.replace(/^\s+/,'');
    var split = el.indexOf('in')
    var varName = el.substring(0,split).replace(/\s+$/,'');
    var items = el.substring(split+3);
    context.appendFor(varName,items,null);
    //java.lang.System.out.println([varName,items].join('\n====\n'))
    return end+2;
  },
  findStart : function(text,start,otherStart){
    return text.indexOf("{foreach",start);
  }
};
//{ifempty}
var $ifempty = {
  priority:100,//默认优先级是1,这个最低,所以设置为0
  parse : function(text,start,context){
    context.appendEnd();
    context.appendElse(null);
    return start+10;
  },
  findStart : function(text,start,otherStart){
    return text.indexOf("{ifempty}",start);
  }
};
$el = {
  priority:-1,//默认优先级是1,这个最低,所以设置为0
  parse : function(text,start,context){
    var end = text.indexOf("}",start);
    var el = text.substring(start+1,end);
    context.appendEL(el);
    return end+1;
  },
  findStart : function(text,start,otherStart){
    return text.indexOf("{",start);
  }
}
//{template fn}{/template}
var clientParser = new Packages.org.xidea.lite.parser.impl.ClientParser();
var $template = {
  parse : function(text,start,context){
    var text2 = text.substring(start);
    var match = text.match(/{template\s*([^\s}]+)}([\s\S]+){\/template}/);
    var id = match[1];
    var client = match[2];
    clientParser.parse(id,client,context);
    return start +match[0].length;
  },
  findStart : function(text,start,otherStart){
    return text.indexOf("{template",start);
  }
}
context.addTextParser($el);
context.addTextParser($if);
context.addTextParser($else);
context.addTextParser($elseif);
context.addTextParser($end);
context.addTextParser($for);
context.addTextParser($ifempty);
context.addTextParser($template);



实例中还有一个基于文本语法的模板实现。命名为LiVI,适合在VI上编辑的Lite 模板语言。
也有几个常用的语法扩展,比如百科词条扩展,语法高亮扩展。


如何测试:

1. 双击如下webstart地址启动测试服务器。
   http://www.xidea.org/webstart/JSide.jnlp
   测试服务器启动之后,您的桌面右侧将出现一个彩筐。这是一个操作终端。

2. 下载测试代码并解压,设置为测试服务器的网站目录。
   http://lite.googlecode.com/files/Example-20091213.zip
   将解压的目录拖放到测试服务器上(彩筐)即可。

3. 打开首页
   看那里顺眼点那里吧:)