Atitit.模板引擎原理以及常见模板技术

1.
Asp Php jsp smarty模板1

1.1.
模板引擎基本原理1

1.2.
调试模式原理2

2.
Attilax总结的模板引擎原理2

3.
支持两种类型的错误捕获,一是渲染错误(Render Error)与编译错误(Syntax Error)。2

3.1.
1、渲染错误2

3.2.
2、编译错误3

4.
常见的模板技术
t4   Razor4

1. Asp Php jsp smarty模板

1.1. 模板引擎基本原理

虽然每个引擎从模板语法、语法解析、变量赋值、字符串拼接的实现方式各有所不同,但关键的渲染原理仍然是动态执行 javascript 字符串。

, Discuz的模板解析是用正则表达式替换一些模板中的规定的语言标记,然后呢,写到forumdata/templates中,再用include引用到index, forumdisplay等等中,和smarty的原理基本上相同

那么,这个联合页面listnews.php的代码就很简单了


<? 

Include(‘getnews.php');//获取数据 


Include(‘shownesw.php');//显示数据 


?> 

作者::  ★(attilax)>>>   绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

总结

使用PHP标签的模板系统,能够很好的实现美工和程序的分离,同时方便程序员和美工人员的分工合作,比如在上面的例子中shownews.php由美工人员来维护,getnews.php由程序人员来维护。而listnews.php就可以由系统设计人员来维护了。当然这中间需要增加一些约定的文档。

最简单的方式就是通过replace函数了:

1.2. 调试模式原理

前端模板引擎不像后端模板引擎,它是动态解析,所以调试器无法定位到错误行号,而 artTemplate 通过巧妙的方式让模板调试器可以精确定位到引发渲染错误的模板语句,例如:

2. Attilax总结的模板引擎原理

通过splitor  《%%》区分代码和模板,然后把木板str
out,在不个代码eval给挂。。

3. 支持两种类型的错误捕获,一是渲染错误(Render Error)与编译错误(Syntax
Error)。

3.1. 1、渲染错误

渲染错误一般是因为模板数据错误或者变量错误产生的,渲染的时候只有遇到错误才会进入调试模式重新编译模板,而不会影响正常的模板执行效率。模板编译器根据模板换行符记录行号,编译后的函数类似:

当执行过程遇到错误,立马抛出异常模板对应的行号,模板调试器再根据行号反查模板对应的语句并打印到控制台。

3.2. 2、编译错误

编译错误一般是模板语法错误,如不合格的套嵌、未知语法等。由于 artTemplate 没有进行完整的词法分析,故无法确定错误源所在的位置,只能对错误信息与源码进行原文输出,供开发者判断。

for($i =
0; $i < $nest; $i++)
{<br>

070

071

$template =
preg_replace("/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\}[\n\r]*(.+?)[\n\r]*\{\/loop\}[\n\r\t]*/ies","stripvtags('\n<?
if(is_array(\\1)) { foreach(\\1 as \\2) { ?>','\n\\3\n<? } } ?>\n')", $template);<br>

072

073

$template =
preg_replace("/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}[\n\r\t]*(.+?)[\n\r\t]*\{\/loop\}[\n\r\t]*/ies","stripvtags('\n<?
if(is_array(\\1)) { foreach(\\1 as \\2 => \\3) { ?>','\n\\4\n<? } } ?>\n')", $template);<br>

074

075

$template =
preg_replace("/[\n\r\t]*\{if\s+(.+?)\}[\n\r]*(.+?)[\n\r]*\{\/if\}[\n\r\t]*/ies", "stripvtags('\n<?
if(\\1) { ?>','\n\\2\n<? } ?>\n')"

4. 常见的模板技术
t4   
Razor

微软已经有一套模板引擎T4,在设计ASP.NET MVC 3时又设计一套模板引擎Razor

2.装入数组

var r = [];

r.push('Posts: ' );

r.push(for(var i = 0; i < post.length; i++) {);

r.push('<a href="#">');

r.push(post[i].exper);

r.push('</a>');

r.push(});

有人看到上面的代码就要笑了,第三行和最后一行代码的逻辑明显是不正确的嘛,那肿么办呢?呵呵,很简单,不放进去就行了呗,

var r = [];

r.push('Posts: ' );

for(var i = 0; i < post.length; i++) {

r.push('<a href="#">');

r.push(post[i].exper);

r.push('</a>');

}

这样的逻辑就十分完善了,不存在太多的漏洞,但是这个转化的过程是如何实现的?我们必须还是要写一个解析的模板函数出来。

不过我们并需要for,if,switch等这些东西也push到r数组中去,所以呢,还得改善下上面的代码,如果在line中发现了包含js逻辑的代码,我们就不应该让他进门:

regOut = /(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g;

var add = function(line, js) {

js? code += line.match(regOut) ? line + '\n' : 'r.push(' + line + ');\n' :

code += 'r.push("' + line.replace(/"/g, '\\"') + '");\n';

};

所以我们只剩下最后一步工作了,把data扔进去!

参考

JavaScript模板引擎原理,几行代码的事儿 - Javascript教程_JS教程_技术文章 - 红黑联盟.html

Atitit.jpg png格式差别以及解决jpg图片不显示的问题的更多相关文章

  1. 通过使用CSS字体阴影效果解决hover图片时显示文字看不清的问题

    1.前言 最近需要加入一个小功能,在鼠标越过图片时,提示其大小和分辨率,而不想用增加属性title来提醒,不够好看.然而发现如果文字是一种颜色,然后总有概率碰到那张图上浮一层的文字会看不到,所以加入文 ...

  2. 解决github图片不显示的问题

    修改hosts C:\Windows\System32\drivers\etc\hosts 在文件末尾添加: # GitHub Start 192.30.253.112 Build software ...

  3. Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php

    Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php 1. Keyword/subtitle 1 2. 使用dwr3的异常convert处 ...

  4. Atitit  图像处理底色变红的解决

    Atitit  图像处理底色变红的解决 1.1. 原因  ImageIO  bug ,alpha通道应该在保存jpg的时候排除1 1.2. 解决,自己移除alpha通道即可1 2. Image sav ...

  5. string.Format出现异常"输入的字符串格式有误"的解决方法

    string.Format出现异常"输入的字符串格式有误"的解决方法 今天在做项目时,碰到一个很奇怪的问题,我使用string.Format居然报“输入的字符串格式有误”的错误,我 ...

  6. atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型运行期获得Dialect

    atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型运行期获得Dialect   #-----原理 Hibernate 运行期获得Dialect   2010-07-28 12:59 ...

  7. 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法

    -----转载:http://blog.csdn.net/sgear/article/details/7663502 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格 ...

  8. 【转】chrome 67版本后无法拖拽离线安装CRX格式插件的解决方法

    第一种:开启开发者模式即可 (推荐) chrome  的设置 -> 更多工具 -> 扩展程序,开启开发者模式即可! 第二种方法:修改参数 首先打开下面地址:chrome://flags/# ...

  9. atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型执行期获得Dialect

    atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型执行期获得Dialect   #-----原理 Hibernate 执行期获得Dialect   2010-07-28 12:59 ...

随机推荐

  1. 新浪微博宋琦:PHP在微博优化中的“大显身手”

    摘要:2013中国软件开发者大会编程语言与工具专题论坛中,新浪微博架构师宋琦介绍了PHP在新浪微博中的应用,并且分享了很多微博主站所做的性能优化的工作. [CSDN报道] 2013中国软件开发者大会( ...

  2. rust 参考的资料 转

    http://blog.csdn.net/loveisasea/article/details/46292715 rust官方学习文档: 1.http://doc.rust-lang.org/book ...

  3. Jquery 一次处理多个ajax请求的代码

    Jquery 一次处理多个ajax请求的代码,需要的朋友可以参考下.   复制代码代码如下: $(document).ready(function () { $('#getsetgo').click( ...

  4. nodejs调试利器:supervisor

    测试多了,是不是感觉每次要重新node一次app.js,很烦恼? 用supervisor,只有有改动,页面刷新就可以看到效果,不用重启node.js 安装: npm -g install superv ...

  5. 一个简单的WebService服务

    现在,网上提供的免费的webservice服务的网站: http://www.webxml.com.cn/ 从扩展名上看,是 .net构建的网站. 看看功能的实现效果: 需求:我们要远程调用手机号归属 ...

  6. Ubuntu中Git服务器搭建

    git服务器搭建过程 参考网上资料搭建git服务器过程记录 如下: 需求 硬件需求:一台Ubuntu或者debian电脑(虚拟机),能通过网络访问到. 软件需求:git-core, gitosis, ...

  7. @NotEmpty、@NotBlank、@NotNull区别

    @NotEmpty 用在集合类上面 @NotBlank 用在String上面 @NotNull    用在基本类型上

  8. Polar Code主要研究者的个人主页(持续更新中........)

    Polar Code主要研究者的个人主页(持续更新中........) 1. Polar码的编译码.以及List译码算法,都少不了Ido Tal这位大牛. http://webee.technion. ...

  9. 使用Sublime经验分享

    Sublime轻量级.可是绝对是神一样的编辑器. 1.代码清晰美观 2.能够选择文件夹作为文件结构文件夹显示在左側 3.以tab的形式打开多个页面在同一个窗体内 设置方法例如以下: Preferenc ...

  10. 前端性能优化:DocumentFragments或innerHTML取代复杂的元素注入

    来源:GBin1.com 我们的浏览器执行越来越多的特性,并且网络逐渐向移动设备转移,使我们的前端代码更加紧凑,如何优化,就变得越来越重要了.前端给力的地方是可以有 许多种简单的策略和代码习惯让我们可 ...