KMGTemplateEngine
MGTemplateEngine
由 Matt Legend Gemmell 开发
http://mattgemmell.com/
是什么?
MGTemplateEngine 是一个基于模板和数据的原生 Cocoa 系统用于生成文本输出。它是 Smarty、FreeMarker、Django 的模板语言以及其他类似系统的近亲。
标记(函数或语言结构)的默认语法是
{% for 1 to 5 %} foo {% /for %}
并且变量/表达式的默认语法是
{{ foo.bar | uppercase }}
竖线字符表示应用了一个过滤器;例如,“foo.bar”的值将在显示之前通过“uppercase”过滤器。您可以将过滤器应用到标记以及变量上。
标记、变量和过滤符号是完全可自定义的,因此如果您喜欢不同的语法,不必坚持默认设置。
功能
MGTemplateEngine 提供以下功能
-
原生 Cocoa 实现。它不使用脚本桥接或任何外部运行时/框架,因此核心引擎自身除了需要的 Mac OS X Leopard 以外没有其他要求。
-
极其可定制。定义新的标记(如函数或语言结构)和新的过滤器(数据格式化功能)非常容易。您也可以自由地更改标记和表达式的语法,以满足您的个人喜好,或模仿您喜欢的其他模板化系统。
-
委托系统,让您保持信息同步。MGTemplateEngine可以在处理模板的过程中,可选地向委托对象通知重要事件,包括开始/结束块,或在遇到错误时。
-
全局和模板特定变量。您可以定义一组存在的变量,该变量在引擎的生命周期内有效,还可以指定仅适用于特定模板的变量。
-
通过熟悉的键值编码(KVC)键路径使用变量,并进行了增强。例如,如果您有一个包含具有“foo”关键字的NSArray的NSDictionary,并且该数组包含5个NSDictionaries,每个Dictionaries都有“bar”关键字的NSString,您可以按如下语法访问第五个字典的“bar”对象的价值
foo.4.bar(记住数组索引从0开始!)
要求
MGTemplateEngine需要Mac OS X 10.5(雪豹)或更高版本的操作系统。
许可协议
请参阅所包含的源代码许可文件,了解代码发布的许可协议。摘要:这是一个署名许可协议。请给我致谢,并且您可以自由地以您认为适合的方式使用、修改和以源代码或二进制形式重新分发。
可扩展性
MGTemplateEngine提供了以下3种主要类型的扩展性,详情如下。您还应该阅读包含的每个API的特定文件以获取更多详细信息。
-
标记。您可以创建新的标记,这些标记为模板中的使用提供了新的标签。标记可以是独立的,也可以是复杂的块(如if-else-/if),可以循环/迭代,启用或禁用输出,在其作用域内设置新变量,等等。
-
过滤器。过滤器将数据修改为显示目的,例如内置的“date_format”过滤器,它使用指定的格式化定义将NSDate格式化为字符串。您可以轻松编写新的过滤器,以以新的方式格式化/转换数据。
-
匹配器。匹配器是一个非常重要的对象,执行概念上简单的任务:它在模板中找到下一个标记或表达式,并将其拆分为其组件(例如标记名称或变量、额外参数、任何指定的过滤器)。MGTemplateEngine附带两个匹配器,您可以从中选择,或实现您自己的。
-
RegexKitLite。这个匹配器使用了RegexKitLite,它是对libicucore.dylib的薄包装,随Mac OS X 10.5及以后的版本一起提供。这个匹配器不需要在您的应用程序中加入任何其他框架或库,尽管您当然需要链接到libicucore。示例项目就是这样做的。
-
RegexKit。这个匹配器使用了RegexKit,它是对PCRE正则表达式库的封装。这个匹配器需要将RegexKit加入您的应用程序中。
如果您不想链接到libicucore,或者不想将RegexKit加入应用程序中,可以自由编写自己的匹配器。例如,您可以编写一个使用NSScanner的匹配器,或者使用OgreKit的匹配器。
标准语言特性
所有语言特性都作为插件标记实现的,因此您可以自由地检查和修改它们的工作方式。在本书的写作时间,MGTemplateEngine支持以下构造
-
for x to y:从x开始的标准for循环,每次循环递增循环变量,直到达到y。您也可以将"reversed"附加到命令中,从第二个值递减到第一个值。
-
for p in q:创建一个新的变量p,它依次具有集合q中的每个值。您也可以将"reversed"附加到命令中,从最后一个值递减到第一个值(仅适用于提供reverseObjectEnumerator的有序集合,即NSArray及其子类)。
注意:这两个"for"构造在循环体中都提供了几个有用的变量,包括currentLoop.currentIndex、currentLoop.startIndex等,包括适合currentLoop.parentLoop。
-
if x / if x == y - else - /if: 标准的if-/if或if-else-/if条件构造。if语句的参数以布尔值或数值比较进行处理,并且可以是
- x
- x == y
- x = y(与==相同)
- x and y
- x && y(与and相同)
- x or y
- x || y(与or相同)
- x < y, x > y, x <= y, x >= y
- x % y(如果x/y没有余数则返回false,否则返回true)
-
now:创建一个代表当前日期和时间的NSDate对象。
-
literal:开始一个文本块,其中标记/表达式不会被解释,而会直接输出到输出中。使用/literal标记结束。
-
comment:没有参数时,开始一个以遇到/comment结束的块注释。如果有1个或多个参数,这被视为一个自包含的注释。
-
section:开始一个模板的命名块。当与告知块的开始和结束的委托方法结合使用时,这有助于通知模板中某些命名块的当前位置和长度,可能用于提取和进一步处理。
-
load:接受一个以空格分隔的类名列表,并将尝试根据需要将它们作为标记/筛选器加载。只有在类存在,并且它们根据需要实现MGTemplateMarker或MGTemplateFilter协议,并且尚未被加载数据时,才会实例化这些类。
-
cycle:接受一个由空格分隔的参数列表(如果包含空格可以加引号),在每个循环中交替使用。这在循环中很有用,例如交替输出一组值,用于交替行颜色等。
-
set:接受两个参数,第一个是变量名,第二个是将该变量设置为的值。注意:请记住,变量默认情况下在当前块的作用域内,如果你想使变量在当前块之外存活,你应在开始处理模板之前在模板变量或全局变量中为其设置一个初始值。
标准数据过滤器
MGTemplateEngine当前包含一些标准过滤器,并且你可以轻松添加自己的。标准过滤器包括:
-
uppercase,lowercase,capitalized:将值转换为字符串表示形式,并适当转换大小写。
-
date_format:接受一个包含格式字符的字符串来格式化NSDate对象(例如,通过“now”标记获得)。使用的格式化系统是10.4+模式的NSDateFormatter,具体请参阅此处:http://unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns
-
color_format:接受一个表示要将给定NSColor对象转换的格式的字符串。目前仅支持“hex”值,它提供了Web兼容的6位RRGGBB十六进制颜色表示(如果可以转换为RGB,否则为黑色)。
功能请求和错误报告
请通过电子邮件向我提交任何功能请求或错误报告;您可以在我的网站“关于”页面找到我的地址,这里是:http://mattgemmell.com/about
希望您使用MGTemplateEngine感到愉快!
期待您的支持,-Matt Legend Gemmell
示例
要运行示例项目,请克隆repo,然后首先从示例目录中运行pod install
。
要求
安装
KMGTemplateEngine 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile
pod 'KMGTemplateEngine'
作者
该项目仅供方便在 Cocoapod 上导入使用
许可协议
KMGTemplateEngine 采用 MIT 许可协议。更多信息请参阅 LICENSE 文件。