这个 SPM 插件允许你自动生成一个枚举,其中包含你的 CSS 文件中声明的所有 CSS 类。
例如,如果你正在使用 Vapor 框架和 Elementary 构建 Web 前端,那么你可以不用写成这样:
span(.class("slider round startsChecked")) {}
你可以写成这样:
span(.class(.slider, .round, .startsChecked)) {}
为了让它与 Elementary 协同工作,你需要这个扩展
extension HTMLAttribute where Tag: HTMLTrait.Attributes.Global {
static func `class`(_ values: HTMLTagClass...) -> Self {
HTMLAttribute(name: "class", value: values.map(\.rawValue).joined(separator: " "), mergedBy: .appending(seperatedBy: " "))
}
}
将此软件包作为依赖项添加到你的项目中。
let package = Package(
dependencies: [
.package(url: "https://github.com/maciejtrybilo/htmltagclass-plugin.git", from: "0.1.0")
],
)
注意:你只需要将其添加为软件包依赖项,而不是 targets
下的任何位置。
启动命令以生成代码
❯ swift package plugin generateHTMLTagClass --allow-writing-to-package-directory
你也可以使用 entr 来在每次 CSS 文件保存时自动重新生成代码,例如:
❯ find ./Public/css | grep '\.css$' | entr -r swift package plugin generateHTMLTagClass --allow-writing-to-package-directory
该插件会查找 Public/css
目录及其所有子目录,并尝试解析出 CSS 文件中引用的所有类。然后,它会在 Sources/App 目录中创建 HTMLTagClass.swift
文件,其中包含 HTMLTagClass
枚举,例如:
enum HTMLTagClass: String {
case slider
case round
case startsChecked
}
该插件尝试处理一些边缘情况,例如当类名不是有效的 Swift 标识符时,所以一个包含以下内容的 CSS 文件:
.left-panel {}
.switch {}
将会生成:
enum HTMLTagClass: String {
case left_panel = "left-panel"
case `switch`
}
如果你在使用过程中发现插件有任何问题,欢迎贡献其他修复!