Build Status Platforms Documentation Matrix

ThemePark

一个用于处理语法高亮/IDE主题的 Swift 库

此软件包旨在解决两个问题:读取主题定义和使这些定义在语义上可寻址。

支持

安装

dependencies: [
    .package(url: "https://github.com/ChimeHQ/ThemePark", branch: "main")
],

使用

使用主题

TextMate 主题

import ThemePark

let url = URL(...)
let data = try Data(contentsOf: url, options: [])
let theme = try TextMateTheme(with: data)

let urls = TextMateTheme.all

Xcode 主题

import ThemePark

let url = URL(...)
let data = try Data(contentsOf: url, options: [])
let theme = try XcodeTheme(with: data)

let urls = XcodeTheme.all

BBEdit 主题

import ThemePark

let url = URL(...)
let data = try Data(contentsOf: url, options: [])
let theme = try BBEditTheme(with: data)

let urls = BBEditTheme.all

解析样式

ThemePark 的 Styling 协议可以利用 SwiftUI 环境来调整颜色方案、对比度和悬停状态。您可以使用修饰符将其暴露给您的视图层次结构

import SwiftUI
import ThemePark

struct ThemedView: View {
    var body: some View {
        Text("themed")
            .themeSensitive()
    }
}

对主题执行查询

let styler: any Styling = TextMateTheme.all.randomElement()!
let query = Query(key: .editorBackground, context: .init(colorScheme: .dark))

let style = styler.style(for: query)
print(style.color)
print(style.font)

颜色方案

Variant 类型捕获有关颜色方案和对比度的信息。但是,您是希望主题完全自定义 UI,还是希望用户的偏好自定义主题?这取决于客户端和底层 Styling 一致性的能力。许多主题也不支持多个变体,因此可能需要查询它

let variants = theme.supportedVariants

语法元素标识

大多数主题系统使用字符串来为语法元素提供语义标签。最终,这个字符串 -> 语义含义需要被解析。ThemePark 没有将此留给客户端/主题设计者,而是使用基于枚举的系统进行语法元素标识。这消除了所有歧义,但可能会暴露不匹配。

这是 tree-sitter 高亮查询中非常常见的问题,这些查询没有规范,并且通常完全是临时的。

let specifier = SyntaxSpecifier(highlightsQueryCapture: captureName)

贡献和协作

我很乐意收到您的来信! Issues 或 pull requests 效果很好。 Matrix spaceDiscord 都可用于实时帮助,但我强烈倾向于以文档的形式回答。您也可以在 mastodon 上找到我。

我更喜欢协作,如果您有类似的项目,我很乐意找到合作的方式。

我更喜欢使用制表符进行缩进以提高可访问性。 但是,我宁愿您使用您想要的系统并提出 PR,也不愿因为空格而犹豫。

通过参与本项目,您同意遵守 贡献者行为准则