Tuxedo 是一个用于 Swift 的模板语言。它允许你将应用程序的 UI 和渲染层与业务逻辑分离。智能模板与原始数据协同工作,使得前端可以独立于应用程序的其他部分进行处理和开发。因此,输出的处理、布局和格式化可以在非常简单的模板格式中定义。
为什么叫这个名字?因为它使用控制语句和高级运算符,用优雅的动态模板来修饰你的静态输出。
这个项目是基于我的轻量级解释器框架 Eval 构建的,并作为使用此求值器的示例应用。
很快,这个模板语言示例就变成了一个非常有用的独立项目,所以我将其提取出来作为一个独立的库,供尽可能多的项目使用。我看到其应用前景尤其在 服务器端 Swift 项目 中最有价值,但在许多其他领域,模板解析也非常适用。
这个项目——尽管其大部分功能集已经可用——仍处于早期阶段,围绕开源活动还有很多工作要做,例如 CI、贡献指南和详尽的文档。在这个阶段,如果你对 Tuxedo 目前的功能感兴趣,我鼓励你查看单元测试,并在文档准备就绪之前查看那里的用例,或者查看下面的一些示例。请继续关注更新!
灵感来自于优秀的 PHP 模板引擎 Twig,以及 Swift 语言和平台缺乏现有且足够全面的模板库这一事实。
你可以求值基本表达式...
let result = Tuxedo().evaluate("Hello {{ name }}!", variables: ["name": "Tuxedo"]) // Hello Tuxedo!
...甚至复杂的表达式...
let result = Tuxedo().evaluate("""
The results are:
{% for item in results.sort.reverse %}
{% if item is not first %}, {% endif %}
{% if item is last %} and {% endif %}
{{ item * 2 }}
{% endfor %}
""", variables: ["results": [3, 1, 2]]) // The results are: 6, 4 and 2
...定义宏...
let templateEngine = Tuxedo()
let _ = templateEngine.evaluate("{% macro concat(a, b) %}a + b{% endmacro %}")
let result = templateEngine.evaluate("{{ concat('Hello ', 'World!') }}") // Hello World!
...或代码块...
let templateEngine = Tuxedo()
let result = templateEngine.evaluate("""
<html>
<head>
<title>
{% block title %}Website{% endblock %}
</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
""")
...并在之后覆盖它们...
{% block title %} {{ parent() }} - Subpage {% endblock %}
{% block body %} Content {% endblock %}
Tuxedo 处理你能想到的各种表达式。它适用于数字类型、字符串、布尔值、日期、数组和字典。
你可以使用函数和运算符执行各种操作,例如数值和逻辑运算、字符串操作、日期格式化、更高级别的数组和字典操作等等。
它可以处理硬编码的字符串输入,以及从磁盘写入的模板文件。
欢迎任何人为这个伟大的项目做出贡献!只需发起一个 issue 或 pull request 即可开始对话!
我是 Laszlo Teveli,软件工程师,iOS 布道者。在空闲时间,我喜欢研究我的爱好项目并将它们开源 😉
欢迎随时通过 tevelee [at] gmail [dot] com
或 Twitter 上的 @tevelee
联系我。
Tuxedo 在 Apache 2.0 许可规则下可用。有关更多信息,请参阅 LICENSE 文件。