From 2196468b0bb5218b4a231554ea7baaac9d048a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=BC=9F=E8=B0=83=E8=B0=83?= <398188662@qq.com> Date: Sun, 16 Nov 2025 21:38:34 +0800 Subject: [PATCH] feat: add Leaf --- README.md | 3 +- appicon/keyzer.png | Bin 0 -> 48903 bytes assets/leaf.svg | 1 + docs/leaf.md | 474 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 477 insertions(+), 1 deletion(-) create mode 100755 appicon/keyzer.png create mode 100644 assets/leaf.svg create mode 100644 docs/leaf.md diff --git a/README.md b/README.md index ec866206..74288e0e 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Quick Reference 非常感谢一直以来支持我开源项目的朋友们!如果您认可我的工作,欢迎通过 [赞助](https://wangchujiang.com/#/sponsor) 我或下载并使用我开发的 [macOS 应用](https://wangchujiang.com/#/app) 来支持我。以下是我个人独立开发的 macOS 应用列表:

- Keyzer + Keyzer Vidwall Hub VidCrop Vidwall @@ -147,6 +147,7 @@ Quick Reference [Kubernetes](./docs/kubernetes.md) [LaTeX](./docs/latex.md) [Laravel 8](./docs/laravel.md) +[Leaf](./docs/leaf.md) [Lua](./docs/lua.md) [Markdown](./docs/markdown.md) [MATLAB](./docs/matlab.md) diff --git a/appicon/keyzer.png b/appicon/keyzer.png new file mode 100755 index 0000000000000000000000000000000000000000..5f3fbfa74b79ac80bcc63fc332c0ea1e4f180489 GIT binary patch literal 48903 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 \ No newline at end of file diff --git a/docs/leaf.md b/docs/leaf.md new file mode 100644 index 00000000..9e675ec9 --- /dev/null +++ b/docs/leaf.md @@ -0,0 +1,474 @@ +Leaf 备忘清单 +==== + +[Leaf](https://github.com/vapor/leaf) 是 [Vapor](https://github.com/vapor/vapor) 的轻量级模板引擎,用于在服务端生成动态 HTML 页面。 + +入门 +---- + +### Leaf + +`Leaf` 是一种强大的模板语言,其语法受 `Swift` 启发。 + +- [Leaf 模板语言官方文档](https://docs.vapor.codes/zh/leaf/getting-started/) _(vapor.codes)_ +- [**LeafKit**:Swift 模板引擎库](https://github.com/vapor/leaf-kit) _(github.com)_ +- [**Leaf**:LeafKit 的 Vapor 集成模板系统](https://github.com/vapor/leaf) _(github.com)_ + +### Package + + +```swift +// swift-tools-version:5.2 +import PackageDescription + +let package = Package( + name: "MyApp", + platforms: [ .macOS(.v10_15) ], + dependencies: [ /// 添加其它依赖 + .package(url: "https://github.com/vapor/leaf.git", from: "4.0.0"), + ], + targets: [ + .target(name: "App", dependencies: [ .product(name: "Leaf", package: "leaf") ]), + ] +) +``` + +### 配置 + +```swift +import Vapor +import Leaf +``` + +设置工作目录 + +```swift +app.directory.workingDirectory = "...." +``` + +设置模板目录 + +```swift +app.directory.viewsDirectory = "...." +``` + +设置模板引擎 + +```swift +app.views.use(.leaf) +``` + +### 目录结构 + +``` +VaporApp +├── Package.swift +├── Resources +│ ├── Views +│ │ └── hello.leaf +├── Public +│ ├── images (images 资源) +│ ├── styles (css 资源) +└── Sources + └── ... +``` + +- Views 文件夹来存储 `.leaf` 文件 +- 配置 [`FileMiddleware`](https://api.vapor.codes/vapor/documentation/vapor/filemiddleware/) 提供静态文件 + +```swift +app.middleware.use(FileMiddleware( + publicDirectory: + app.directory.publicDirectory +)) +``` + +### 渲染视图 + +```swift +app.get("hello") { + req -> EventLoopFuture in + return req.view.render("hello", [ + "name": "Leaf" + ]) +} +// 或 +app.get("hello") { + req async throws -> View in + return try await req.view.render( + "hello", ["name": "Leaf"] + ) +} +``` + +在 `hello.leaf` 模板中使用 `name` + +``` +Hello, #(name)! +``` + +打开浏览器访问 `/hello` 显示 `Hello, Leaf!`。 + +## Leaf 概述 + +### 模板语法 + +一个基本的 `Leaf` 标签使用示例 + +```swift +There are #count(users) users. +``` + +可以使用冒号和结束标签为某些标签提供可选的正文。 + +- 标记 `#`:这表示 leaf 解析器开始寻找的标记。 +- 名称 `count`:标签的标识符。 +- 参数列表 (`users`):可以接受零个或多个参数。 + +### 内置标签示例 + +```html +#(variable) +#extend("template"): 添加到模板中!#endextend +#export("title"): 欢迎使用 Vapor #endexport +#import("body") +#count(friends) +#for(friend in friends): +

  • #(friend.name)
  • +#endfor +``` + +### 表达式 + +- `+` +- `%` +- `>` +- `==` +- `||` + + +```leaf +#if(1 + 1 == 2): + Hello! +#endif + +#if(index % 2 == 0): + This is even index. +#else: + This is odd index. +#endif +``` + +### 上下文 + + +Leaf 推荐用 `Encodable` 结构体传数据,数组需包装,`[String: Any]` 不支持。 + +```swift +struct WelcomeContext: Encodable { + var title: String + var numbers: [Int] +} +return req.view.render("home", + WelcomeContext( + title: "Hello!", + numbers: [42, 9001] + ) +) +``` + +`title` 和 `numbers` 将暴露给 `Leaf` 模板,就可以在标签中使用这些变量。 + +```html +

    #(title)

    +#for(number in numbers): +

    #(number)

    +#endfor +``` + +### 条件 + + +变量是否存在 + +```html +#if(title): + The title is #(title) +#endif +``` + +比较 + +```html +#if(title == "Welcome"): + This is a friendly web page. +#endif +``` + +使用另一个标签作为判断条件的一部分,内部标签应该省略 `#` + +```html +#if(count(users) > 0): + You have users! +#else: + There are no users yet :( +#endif +``` + +### #elseif + +```html +#if(title == "Welcome"): + Hello new user! +#elseif(title == "Welcome back!"): + Hello old user +#else: + Unexpected page! +#endif +``` + +### 循环 + +```swift +struct SolarSystem: Codable { + let planets = ["Venus", "Earth", "Mars"] +} +return req.view.render( + "solarSystem", SolarSystem() +) +``` + +在 `Leaf` 中循环它们: + +```html + +``` + +### 模板示例 + + +入口页面,通过 `#extend("main")` 将 `mainleaf` 模板的内容复制到当前模板中使用 + +```html +#extend("main"): + #export("body"): +

    Welcome to Vapor!

    + #endexport +#endextend +``` + +在公共模板 `main.leaf` 中 + +```html + + + #(name) + + #import("body") + +``` + +呈现如下内容: + +```html + + + Leaf + + +

    Welcome to Vapor!

    + + +``` + +### 扩展模板 + + +在模板中使用 `#export` 存储名为 `body` 的一些 HTML + +```html +#export("body"): +

    Welcome to Vapor!

    +#endexport +``` + +使用 `#import` 获取传递给 `#extend` 标签的内容 + +```html + + #import("body") + +``` + +### #count + +```html +Your search matched #count(matches) pages. +``` + +`#count` 标签返回数组中的项目数量 + +### #lowercased + +```html +#lowercased(name) +``` + +`#lowercased` 标签将字符串转成小写字母。 + +### #capitalized + +```html +#capitalized(name) +``` + +`#capitalized` 标签将字符串中每个单词的首字母大写,其他字母小写。 + +### #contains + +```html +#if(contains(planets, "Earth")): + Earth is here! +#else: + Earth is not in this array. +#endif +``` + +`#contains` 标签接受一个数组和一个值作为其两个参数,如果参数一中的数组包含参数二中的值,则返回 true。 + +### #date + + +`#date` 标签将日期格式化为可读的字符串。默认情况下,它使用 ISO8601 格式。 + +```swift +render(..., ["now": Date()]) +``` + +模板中使用 + +``` +The time is #date(now) +``` + +你可以传自定义日期格式作为第二参数,详见 [Swift DateFormatter](https://developer.apple.com/documentation/foundation/dateformatter)。 + +``` +The date is #date(now, "yyyy-MM-dd") +``` + +### #unsafeHTML + +标签就像一个变量标签 - 例如 `#(variable)`。 + +``` +The time is #unsafeHTML(styledTitle) +``` + +它不会转义任何 `variable` 可能包含的 HTML 标签 + +### #dumpContext + +`#dumpContext` 标签将整个上下文渲染为可读的字符串。使用此标记来调试作为上下文提供给当前渲染的内容。 + +``` +Hello, world! +#dumpContext +``` + +自定义标签 +--- + +### LeafTag + + +创建一个名为 `NowTag` 的类并遵循 `LeafTag` 协议 + +```swift +struct NowTag: LeafTag { + func render(_ ctx: LeafContext) throws -> LeafData { + ... + } +} +``` + +实现 `render(_:)` 方法。传递给该方法的 `LeafContext` 参数包含了我们需要的所有内容。 + +```swift +enum NowTagError: Error { + case invalidFormatParameter + case tooManyParameters +} + +struct NowTag: LeafTag { + func render(_ ctx: LeafContext) throws -> LeafData { + let formatter = DateFormatter() + switch ctx.parameters.count { + case 0: formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" + case 1: + guard let string = ctx.parameters[0].string else { + throw NowTagError.invalidFormatParameter + } + + formatter.dateFormat = string + default: + throw NowTagError.tooManyParameters + } + + let dateAsString = formatter.string(from: Date()) + return LeafData.string(dateAsString) + } +} +``` + +### 配置标签 + +实现了 `NowTag`,告诉 `Leaf` 并设置标签名称为 `#now` + +```swift +app.leaf.tags["now"] = NowTag() +``` + +现在可以在 Leaf 中使用我们的自定义标签 `#now` 了 + +```html +The time is #now() +``` + +### 上下文属性 + +#### `parameters`: 包含标签参数的数组 + +```swift +struct NowTag: LeafTag { + func render( + _ ctx: LeafContext + ) throws -> LeafData { + /// ctx.parameters + } +} +``` + +#### 使用 Data,`render(_:_:)` 方法作为上下文视图的数据 + +```swift +return try await req.view.render( + "home", ["name": "John"] +) +``` + +```swift +struct NowTag: LeafTag { + func render( + _ ctx: LeafContext + ) throws -> LeafData { + let name = ctx.data["name"]?.string + } +} +``` + +`LeafContext` 包含两个重要的属性