Tuxedo

Travis CI status Framework version Swift version Code Test Coverage Platforms Lincese

依赖管理器

CocoaPods compatible Swift Package Manager compatible Carthage compatible


👨🏻‍💻 关于

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 文件。