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. jquery中解决设置图片不显示

    jquery中解决设置背景图片无法显示 let src='clock/img/afternoon.png'; them_icons.css('background','url('+src+')') 主 ...

  2. 微信小程序——如何解决本地图片不显示的问题

    解决微信小程序本地图片不显示的问题 这篇记录的是小涂踩的小程序的一个坑:本地图片真机显示不出来! 问题发现 开发小程序过程中,模拟器上显示一些本地的图标照片(.jpg \ .png -)模拟器上可以清 ...

  3. 解决wiki图片无法显示问题

    英文wiki图片无法显示,解决办法是修改hosts ip地址: 1. 打开C:/Windows/System32/drivers/etc, 寻找hosts文件,加入: 91.198.174.234 u ...

  4. 解决github图片不显示问题【完美解决】

    在昨天的博客中写到  <解决github连接中断失败的问题[绝对有效]> 虽然解决了链接问题,但是发现照片都是出不来,比如我的头像,还有合作者的头像,都获得不了照片! 解决办法: 依旧是在 ...

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

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

  6. 解决github图片不显示问题_2020/06/25更新

     最近在课设,想这参考参考网上开源的项目,结果发现 GitHub上的大部分项目的示例图片一个个都图裂,无法显示.网上搜索有人说原因是域名污染,咱也不知道是什么情况,反正照着下面的解决方法搞定就行. 解 ...

  7. html解决邮件图片不显示图片,邮件营销中图片无法显示的处理方式

    我们设计的HTML电子邮件中如果含有图片,在一些客户端中默认无法显示图片,这种情况是ISP(邮件服务商)为保护邮箱安全设置的一种策略.下面列出几个收到的电子邮件显示的示例: 示例1图 示例2图 示例3 ...

  8. VUE项目打包(解决背景图片不显示问题)

    vue项目打包 vue项目打包 改变路径配置 配置背景图片路径 在命令行中用npm run build 进行打包. 查看 改变路径配置 将绝对路径改为相对路径 目标文件:项目目录 > confi ...

  9. 解决Github图片加载失败

    问题描述 浏览自己Github某仓库的README.md内时,发现文档的图片始终加载不出,打开浏览器后台,冒出一片红,Failed to load resource: net::ERR_CONNECT ...

最新文章

  1. (转)FFMPEG解码H264拼帧简解
  2. 蒙版遮住全屏(包括导航栏)
  3. 如何在CSMAR中找到不同公司,不同时间的数据呢?
  4. Nginx 源码分析:ngx_hash_t(上)
  5. C/C++学习之路: 继承
  6. java代码中加log_Java LogManager addLogger()用法及代码示例
  7. 【转】让EntityManager的Query返回Map对象
  8. React-Native 在 mac 下 build 问题
  9. 管理win7开机启动项
  10. jks转换 p12、keystore、pk8、x509.pem 命令
  11. adb server version not match client
  12. conda和pip卸载包的注意事项
  13. java计算机毕业设计济南旅游网站源码+mysql数据库+系统+lw文档+部署
  14. xshell 快捷键
  15. 腾讯云运维干货沙龙-海量运维实践大曝光 (一)
  16. 第一次毕业设计任务书
  17. 如何高效访问OneDrive个人存储空间?三种方法
  18. 程序员的“良知”是道
  19. Arduino提高篇02—OLED屏汉字显示
  20. OpenXml 操作Excel,Word,PPT

热门文章

  1. NM-CIDS测试经历
  2. 业界 | 每天1.4亿小时观看时长,Netflix怎样存储这些时间序列数据?
  3. 《JavaScript高效图形编程(修订版)》——6.2 位图、矢量图,或两者兼而有之?...
  4. mof提权原理及其过程
  5. delphi中try的用法1
  6. ecshop的Mysql操作类
  7. 介绍一款比Android原生模拟器还要快的模拟器Genymotion(转)
  8. .NET重构—单元测试的代码重构
  9. 【JNI】JNI中java类型的简写
  10. Openfiler之一:Openfiler的安装(转载)