佐迪乌斯/轻盈的

车把(http://handlebarsjs.com/)和胡子(http://mustache.github.io/ ).

安装以下为:7072274

受抚养人以下为:54

建议者以下为:2

安全以下为:0

星星以下为:610

观察者以下为:24

叉子以下为:77

未决问题以下为:49

v1.2.6版本 2021-07-11 04:52 UTC

自述文件

⚡🍭 车把的一个非常快速的PHP实现(http://handlesjs.com/)还有胡子(http://mustache.github.io/).

CI状态:单元测试 回归测试测试PHP:7.1、7.2、7.3、7.4、8.0、8.1覆盖率状态

packagist上的包:最新稳定版本 许可证 总下载次数

特征

安装

使用作曲家(https://getcomposer.org网址/)要安装LightnCandy:

作曲家需要zordius/lightncandy:dev-master

升级通知

文件

编译选项

您可以通过运行以下命令应用更多选项LightnCandy::编译($template,$options)以下为:

LightnCandy公司::编译($模板,阵列('标志'=>LightnCandy公司::标志_错误_记录|LightnCandy公司::标志_ TANDALONEPHP));

默认情况下,将模板编译为PHP,这样可以尽快运行(标志=标志_最佳性能).

错误处理

JavaScript兼容性

胡子兼容性

  • 标记_ USTACHELOOKUP:将递归查找行为与胡子规范对齐。而且,渲染性能会更差。
  • 穆斯塔切拉姆巴达旗:支持简单的lambda逻辑作为mustache规范。而且,渲染性能会更差。
  • 标志_ OHBHELPERS:不要编译handlebars.js内置帮助程序。使用此选项,{{#with}},{{#if}},{{除非}},{{#each}}指正常截面,以及{{#带foo}},{{#if-foo}},{{#除非foo}},{{每个foo}}将导致编译错误。
  • 标志_防撞部分:将节上下文行为与mustache.js对齐。
  • FLAG_MUSTACHE标志:支持所有胡子规格,但性能下降,与标志_错误_终止+标记_ USTACHELOOKUP+穆斯塔切拉姆巴达旗+标志_ OHBHELPERS+标记_运行时间部分+标记_JSTRUE+标志_JSOBJECT.

把手兼容性

  • 标志_本
  • 标志_租金
  • 标志_最佳状态
  • FLAG_ADVARNAME标志
  • 标志_修改器
  • FLAG_SLASH(闪烁)
  • 标记_左侧
  • AWBLOCK标志:支持{{{raw_block}}}}任意字符或{{foo}}_as_raw_string{{{/raw_block}}}}.
  • 旗标_扶手杆SLAMBDA:支持lambda逻辑作为把手.js规范。而且,渲染性能会更差。
  • 旗标_ PVARS:支持特殊变量包括@root、@index、@key、@first、@last。否则,使用默认解析逻辑编译这些变量名。
  • 旗杆:支持大多数车把扩展,并保持性能良好,与标志_本+标志_警告+标志_最佳状态+FLAG_ADVARNAME标志+标志_修改器+旗标_ PVARS+FLAG_SLASH(闪烁)+标记_左侧+AWBLOCK标志.
  • 旗标_扶手:支持大多数handlers.js+javascript行为,同时保持良好的性能,与标志_JS+旗杆.
  • 标志_操纵杆SJS_FULL:启用所有支持的handlebars.js行为,但性能下降,与相同旗标_扶手+标志_安装+标记_运行时间部分+标记_ USTACHELOOKUP+旗标_扶手杆SLAMBDA.

把手选项

  • 标志_背景
  • 标记_部件上下文
  • 标志_ GNORESTANDALONE:防止在上进行独立检测{{#foo}},{{/foo}}{{^}},行为与handlebars.js ignoreStandalone编译时选项相同。
  • 标记_触发参数:将变量名作为字符串传递给助手,行为与handlebars.js stringParams编译时选项相同。
  • 标志_已知:仅将当前上下文传递给lambda,行为与handlers.js knownHelpersOnly编译时选项相同。
  • 标志_预防:将部分缩进行为与胡子规格对齐。这与handlebars.js preventIndent copmile时间选项相同。

菲律宾比索

部分支持

自定义助手

自定义助手示例

#mywith(上下文更改)

  • LightnCandy公司
//LightnCandy示例,#mywith与#with工作方式相同
$php(电话)=LightnCandy公司::编译($模板,阵列('标志'=>LightnCandy公司::旗标_扶手,“助手”=>阵列(“我的”=>功能($上下文,$选项) {返回 $选项[“fn”]($上下文);})));
  • 手柄.js
//Handlebars.js示例,#mywith与#with工作方式相同
把手.注册表帮助程序(“我的”, 功能(上下文, 选项) {
    返回 选项.fn公司(上下文);
});

#myeach(上下文更改)

  • LightnCandy公司
//LightnCandy示例,#myeach与#each的工作原理相同
$php(电话)=LightnCandy公司::编译($模板,阵列('标志'=>LightnCandy公司::旗标_扶手,“助手”=>阵列(“myeach”=>功能($上下文,$选项) {$转塔='';foreach公司($上下文 作为 $cx公司) {$转塔.=$选项[“fn”]($cx公司);}返回 $转塔;})));
  • 手柄.js
//Handlebars.js示例,#myeach与#each的工作方式相同
把手.注册表帮助程序(“myeach”, 功能(上下文, 选项) {
    无功功率,无功功率 转塔 = '', , j个 = 上下文.长度;
    对于 ( = 0;  < j个; ++) {
        转塔 = 转塔 + 选项.fn公司(上下文[]);
    }
    返回 转塔;
});

#myif(无上下文更改)

  • LightnCandy公司
//LightnCandy示例,#myif与#if的工作原理相同
$php(电话)=LightnCandy公司::编译($模板,阵列('标志'=>LightnCandy公司::旗标_扶手,“助手”=>阵列(“我的”=>功能($有条件的,$选项) {如果($有条件的) {返回 $选项[“fn”]();}其他的{返回 $选项[“反向”]();}})));
  • 手柄.js
//Handlebars.js示例,#myif与#if工作方式相同
把手.注册表帮助程序(“我的”, 功能(有条件的, 选项) {
    如果 (有条件的) {
        返回 选项.fn公司();
    } 其他的 {
        返回 选项.反向();
    }
});

你可以使用isset($options['fn'])检测您的自定义助手是否为块;您还可以使用isset($options['inverse'])检测是否存在{{else}}.

数据变量和上下文

您可以从中获取特殊数据变量$options[“数据”].使用$选项['_this']以接收当前上下文。

$php(电话)=LightnCandy公司::编译($模板,阵列('标志'=>LightnCandy公司::旗标_扶手,“助手”=>阵列(“获取根”=>功能($选项) {打印(r)($选项[“_这”]);//转储当前上下文
            返回 $选项['数据'][“root”];//与{{@root}}相同})));
  • 手柄.js
把手.注册表帮助程序(“获取根”, 功能(选项) {
    控制台.日志(); //转储当前上下文
    返回 选项.数据.; //与…相同{{@根}}
});

私有变量

当使用第二个参数执行子块时,可以将私有变量注入内部块。示例代码显示了类似的行为{{#each}}它设置子块的索引,可以用访问{{@索引}}.

  • LightnCandy公司
$php(电话)=LightnCandy公司::编译($模板,阵列('标志'=>LightnCandy公司::旗标_扶手,“助手”=>阵列('列表'=>功能($上下文,$选项) {$外面的='';$数据=$选项['数据'];foreach公司($上下文 作为 $国际数据交换=>$cx公司) {$数据['索引'] =$国际数据交换;$外面的.=$选项[“fn”]($cx公司,阵列('数据'=>$数据));}返回 $外面的;})));
  • 手柄.js
把手.注册表帮助程序('列表', 功能(上下文, 选项) {
  无功功率,无功功率 外面的 = '';
  无功功率,无功功率 数据 = 选项.数据?把手.创建帧(选项.数据)以下为:未定义;

  对于 (无功功率,无功功率 =0; <上下文.长度; ++) {
    如果 (数据) {
      数据.指数 = ;
    }
    外面的 += 选项.fn公司(上下文[], {数据以下为:数据});
  }
  返回 外面的;
});

更改分隔符

您可以更改分隔符{{}}到其他字符串。在模板中,可以使用{{=<% %>=}}将分隔符更改为<%%>,但更改不会影响包含的部分。

如果要更改模板和所有包含的部分的默认分隔符,可以编译()它与分隔符选项:

LightnCandy公司::编译(“我想使用<%foo%>作为分隔符!”,阵列('分隔符'=>阵列('<%','%>')));

模板调试

发生模板错误时,LightnCandy::compile()将返回false。您可以使用编译标志错误日志查看更多错误消息,或使用编译错误警告标志捕捉异常。

您可以使用生成调试版本的模板FLAG_RENDER_DEBUG标志编译()时。调试模板包含更多调试信息且速度较慢(待定:性能结果),您可以将额外的LightnCandy\Runtime选项传递到渲染函数中,以了解更多渲染错误(缺少数据)。例如:

$模板= "你好!{{name}}是{{gender}}。
测试1:{{@root.name}}
测试2:{{@root.segender}}}
测试3:{{../Test3}}
测试4:{{../../Test4}}
测试5:{{../../.}}
测试6:{{../../[test'6]}}
{{每个}}
每个值:{{}}
{{/each}}
{{#.}}
节值:{{}}
{{/.}}
{{#if.}}如果可以!{{/if}}
{{#excels.}}除非不正常!{{/除非}}
”;//编译为调试版本
$phpStr公司=LightnCandy公司::编译($模板,阵列('标志'=>LightnCandy公司::FLAG_RENDER_DEBUG标志|LightnCandy公司::旗标_扶手));//将编译后的PHP代码保存到PHP文件中文件输出内容('呈现.php','<?php'.$phpStr公司.'?>');//从php文件获取render函数
$渲染器=包括('呈现.php');//缺少数据时出现error_log():
//LightnCandy\运行时:[gender]不存在
//LightnCandy\运行时:/[test]不存在
$渲染器(阵列(“名称”=>“约翰”),阵列(“调试”=>LightnCandy公司\运行时::调试错误日志));//输出ANSI颜色的可视化调试模板:
回声 $渲染器(阵列(“名称”=>“约翰”),阵列(“调试”=>LightnCandy公司\运行时::调试_TAGS_ANSI));//输出带有HTML注释的调试模板:
回声 $渲染器(阵列(“名称”=>“约翰”),阵列(“调试”=>LightnCandy公司\运行时::调试_TAGS_HTML));

ANSI输出为:

示例debug.png

以下是渲染函数的LightnCandy\Runtime调试选项列表:

  • 调试错误日志:error_log(),当缺少所需数据时
  • 调试出错:缺少所需数据时引发异常
  • 调试标签:将render函数的返回值转换为规范化的mustache标记
  • 调试_TAGS_ANSI:将render函数的返回值转换为ANSI颜色的规范化胡子标记
  • 调试_TAGS_HTML:将render函数的返回值转换为带有HTML注释的规范化mustache标记

预处理部分

如果要在编译分部之前执行额外的进程,可以使用准备的什么时候compile()例如,此示例添加HTML注释以通过名称标识分部:

$php(电话)=LightnCandy公司::编译($模板,阵列('标志'=>LightnCandy公司::旗标_扶手,'准备'=>功能($上下文,$模板,$名称) {返回"<!-- 部分启动:$名称-->$模板<!-- 部分结束:$名称-->”;}));

您也可以延长LightnCandy\部分通过覆盖党派前()静态方法将预处理转换为内置功能。

自定义渲染函数

如果要在render函数中执行额外任务或添加更多注释,可以使用伦德雷克斯什么时候compile()。例如,此示例将编译时注释嵌入到模板中:

$php(电话)=LightnCandy公司::编译($模板,阵列('标志'=>LightnCandy公司::旗标_扶手,“renderex”=>“//编译于”.日期(“Y-m-d h:i:s”)));

渲染函数为:

功能($在里面) {$cx公司=阵列(...);//编译于1999-12-31 00:00:00
    返回 .....}

请确保传入伦德雷克斯是有效的PHP,LightnCandy不会检查它。

自定义渲染运行时类

如果你想延长LightnCandy\运行时类并替换默认的运行时库,可以使用运行时什么时候compile()。例如,此示例将基于您的扩展我的运行时间以下为:

//用于调试{{{foo}}}的自定义运行库
 我的运行时间 延伸 LightnCandy公司\运行时{公众的 静止的 功能 未经加工的($cx公司,$v(v)) {返回 '[[调试:raw()=>'.var_导出($v(v),真的)。']]';}}//将MyRunTime用作运行库
$php(电话)=LightnCandy公司::编译($模板,阵列('标志'=>LightnCandy公司::旗标_扶手,“运行时”=>“我的运行时间”));

请确保我的运行时间当compile()或基于标志_ TANDALONEPHP.

不支持的功能

  • {{foo/bar}}样式变量名,在官方handlebars.js文档中已弃用,请使用此样式:{{foo.bar}}.

建议的把手模板实践

  • 防止使用{{#with}}.我想{{path.to.val}}那么可读性更强{{#withpath.to}}{val}}{/without}}}; 使用时{{#with}}你会对范围变更感到困惑。{{#with}}当您在同一路径下访问多个变量时,只会节省很少的时间,但当您需要理解然后维护模板时,会花费大量时间。
  • 使用{{val}}}当您不需要对值进行HTML转义输出时。这也是更好的表现。
  • 如果要以不同语言重用模板,请防止使用自定义帮助程序。或者,您可能需要用不同的语言实现不同版本的helper。
  • 为了获得最佳性能,您应该只在开发阶段使用“按需编译”模式。在投入生产之前,您可以LightnCandy::compile()在所有模板上,保存所有生成的PHP代码,并部署这些生成的文件(您可能需要为此维护一个构建过程)。请勿在生产时编译,这也是安全的最佳实践。为“按需编译”添加缓存并不是最佳解决方案。如果您想基于LightnCandy构建一些库或框架,请考虑这个场景。
  • 每次升级LightnCandy时都要重新编译模板。
  • 坚持逃生实践{}对于把手和lightncandy:
    • 如果要显示原子}},你可以不用任何技巧就直接使用它。前任:{{foo}}}
    • 如果要显示}在任何车把标记之后,您都可以使用:{{带“}”}}{{.}}{带}}例如:{{foo}}{{#带“}”}}{.}}{/带}}
    • 如果要显示原子{,你可以不用任何技巧就使用它。前任:{和{{foo}}.
    • 如果要显示{{,您可以使用{{#带“{{”}}{{.}}{/带}}例如:{{#带“{{”}}{{.}}{/带}}{}foo}}

详细功能列表

去吧http://handlebarsjs.com/查看有关handlers.js的更多功能描述。所有特征都与之对齐。

  • 与把手.js完全相同的CR/LF行为
  • 与胡子规格完全相同的CR/LF行为
  • 与handlebars.js的“true”或“false”输出完全相同(需要标记_JSTRUE)
  • 与handlebars.js(require)的“[object object]”输出或join(','array)输出完全相同标志_JSOBJECT)
  • 可以在内部放置标题/尾随空格、制表符、CR/LF{{var}}{{var}}}
  • 与胡子规格相同的部分的缩进行为
  • 父上下文行为的递归变量查找与胡子规范相同(需要标记_ USTACHELOOKUP)
  • {{{value}}}{{值}}:原始变量
    • true作为“true”(需要标记_JSTRUE)
    • false作为“false”(需要标志_方向)
  • {{值}}:HTML转义变量
    • true作为“true”(需要标记_JSTRUE)
    • false作为“false”(需要标记_JSTRUE)
  • {{{path.to.value}}:点表示法,原始
  • {{path.to.value}}:点表示法,HTML转义
  • {{.}}:当前上下文,HTML转义
  • {{{.}}}:当前上下文,原始
  • {{this}}:当前上下文,HTML转义(需要标志_本)
  • {{此}}}:当前上下文,原始(需要标志_本)
  • {{值}}:节
    • false、undefined和null将跳过该节
    • true将运行具有原始范围的节
    • 所有其他人将使用新范围运行节(包括0、1、-1、“”、“1”、“0”、“-1”、“false”、Array…)
  • {{/value}}:端部
  • {{^值}}:倒置截面
    • false、undefined和null将运行具有原始范围的节
    • 其他所有人都将跳过该节(包括0、1、-1、“”、“1”、“0”、“-1”、“false”、Array…)
  • {{!注释}}:注释
  • {{!--注释或{{或}}--}}:可以包含}}或{{的扩展注释。
  • {{=<% %>=}}:将分隔符设置为自定义字符串,则自定义字符串不能包含=.检查http://mustache.github.io/mustache.5.html例如。
  • {{每个变量}}:每个回路
  • {{#each}}:{{.}}上的每个循环
  • {{/each}}:结束循环
  • {{#每个条作为|foo|}}:echo循环并将值设置为foo。(需要FLAG_ADVARNAME标志)
  • {{#每个栏为|foomoo|}}:条上的echo循环,将值设置为foo,将索引设置为moo。(需要FLAG_ADVARNAME标志)
  • {{#if-var}}:如果逻辑具有原始范围,则运行(null、false、空数组和“”将跳过此块)
  • {{#iffoo-includeZero=true}}:当foo===0时,result为true(需要标志_修改器)
  • {{/if}}:结束条件
  • {{else}}{{^}}:运行else逻辑,应介于{{#if-var}}{{/if}}; 或介于{{#除非var}}{{/除非}}; 或介于{{#foo}}{{/foo}}; 或介于{{每个变量}}{{/each}}; 或介于{{#带var}}{{/带}}.(要求标记_左侧)
  • {{#if-foo}}。。。{{else-if-bar}}。。。{{/if}}:如果else阻止则被链接
  • {{#除非var}}:run,除非具有原始范围的逻辑(null、false、空数组和“”将呈现此块)
  • {{#除非foo}}。。。{{else-if-bar}}。。。{{/除非}}:链接除非其他块
  • {{#除非foo}}。。。{{else除非bar}}。。。{{/除非}}:链接除非其他块
  • {{#foo}}。。。{{else栏}}。。。{{/foo}}:自定义helper链接的else块
  • {{#带var}}:更改上下文范围。如果var为false或空数组,请跳过included部分。
  • {{#条为|foo|}}:将上下文更改为bar并将值设置为foo。(需要FLAG_ADVARNAME标志)
  • {{查找foo栏}}:通过作为键的bar值查找foo。
  • {{../var}}:父模板范围。(需要标志_租金)
  • {{>文件}}:部分;在模板中包含另一个模板。
  • {{>文件foo}}:带有新上下文的部分(需要标记_运行时间部分)
  • {{>文件foo-bar=另一个}}:partial包含与以下键值混合的新上下文(需要标记_运行时间部分)
  • {{>(助手)foo}}:包含助手提供的动态分部(按名称)(需要标记_运行时间部分)
  • {{@索引}}:对中当前索引的引用{{#each}}数组上的循环。(需要旗标_ PVARS)
  • {{@key}}:对中当前键的引用{{#each}}对象上的循环。(需要旗标_ PVARS)
  • {{@root}}:对根上下文的引用。(要求旗标_ PVARS)
  • {{@第一}}:在第一项处循环时为true。(需要旗标_ PVARS)
  • {{@last}}:在最后一项处循环时为true。(需要旗标_ PVARS)
  • {{@root.path.to.value}}:引用根上下文,然后遵循路径。(需要旗标_ PVARS)
  • {{@../index}}:访问父循环索引。(需要旗标_ PVARS标志_警告)
  • {{@../key}}:访问父循环键。(需要标志_虚拟机标志_警告)
  • {{foo.[ba.r].[#spec].0.ok}}:对$CurrentConext['foo']['ba.r'][#spec'][0]['ok']的引用。(需要FLAG_ADVARNAME标志)
  • {{~any_valid_tag}}:空格控制,删除所有以前的空格(包括CR/LF、制表符、空格;停止在任何非空格字符上)
  • {{any_valid_tag~}}:空格控制,删除所有下一个空格(包括CR/LF、制表符、空格;停止在任何非空格字符上)
  • {{{helper变量}}}:执行自定义助手,然后呈现结果
  • {{helper变量}}:执行自定义帮助程序,然后呈现HTML转义结果
  • {{助手“str”}}{{helper“str”}}:使用字符串参数执行自定义帮助程序(需要FLAG_ADVARNAME标志)
  • {{helper 123 null true false undefined}}:将number、true、false、null或未定义的值传递给helper
  • {{助手名称1=var名称2=var2}}:使用命名参数执行自定义助手(需要标志_修改器)
  • {{#helper…}}。。。{{/helper}}:执行块自定义助手
  • {{助手(helper2foo)栏}}:将自定义帮助程序作为子表达式执行(需要FLAG_ADVARNAME标志)
  • {{{{raw_block}}}{{will_not_parsed}}{}{{{/raw_lock}}}}:原始块(需要AWBLOCK标志)
  • {{#>foo}}块{{/foo}}:部分闭塞,提供foo公司部分默认内容(需要标记_运行时间部分)
  • {{#>@partial-block}}:访问分部中的分部块内容
  • {{#*inline“partial_name”}}。。。{{/inline}}:内联部分,提供部分并覆盖原始部分。
  • {{log-foo}}:将值输出到stderr进行调试。

开发人员备注

请阅读贡献.md用于开发环境设置。

框架集成

工具