Firefly logo

Twitter: @LinemanZachary

Firefly

Firefly 是一个纯 Swift 编写的 iOS & macOS 语法高亮器,基于 SourcefulSavannaKitSyntaxKit,以及之前的 Highlightr。为了实现纯 Swift 解决方案,Highlighter 已经被从项目中移除。

联系方式

如果您想联系 Firefly,Jellycuts Discord 是最好的交流场所。

问题反馈

问题反馈同时托管在本仓库和 Jellycuts Issue Repo 上。 这是因为许多与 Firefly 相关的问题都是通过 Jellycuts 报告的,没有必要将它们镜像到此仓库。

Firefly 如何工作?

Firefly 使用纯 Swift 编写,并使用 NSRegularExpressions 检测要高亮的标记。 一旦检测到标记,它们会根据当前主题着色。

在您的项目中使用 Firefly

如果您打算在您的项目中使用 Firefly,我希望您能在此 GitHub 页面上添加一个链接。 如果您愿意,也可以 给我发邮件,我会将您添加到此页面上使用 Firefly 的应用列表中。

关于本项目

本项目受到了 Paul Hudson(@twostraws)的 Sourceful 语法高亮器和 J.P Illanes(@raspu)的 Highlightr 的启发。 Sourceful 是一个结合了 Louis D’hauwe 的 SavannaKit 和 Source Editor 的项目。 Highlightr 将 Highlight.js 与 Swift 合并。

功能特性

支持

如何使用

要开始使用,您可以在 Storyboard 中创建一个 UIView 并将其类指定为 SyntaxTextView,或者以编程方式创建一个 SyntaxTextView。 然后,您可以在您的 View Controller 中分配编辑器的语言。 Firefly 还支持使用 Swift UI 进行设置。

示例代码

UI Kit

Firefly View 的基本设置

import UIKit
import Firefly

class ViewController: UIViewController {

    @IBOutlet weak var fireflyView: FireflySyntaxView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Use the setup function
        fireflyView.setup(theme: themeName, language: "jelly", font: "system", offsetKeyboard: true, keyboardOffset: 10, dynamicGutter: true, gutterWidth: 20, placeholdersAllowed: true, linkPlaceholders: false)
    }
}

在 macOS 上使用 .setup 函数与在 iOS 上相同。

一次性设置所有内容

这允许您一次性设置视图的几乎所有方面,这样您就不会意外地导致额外的突出显示调用。

fireflyView.setup(theme: themeName, language: "jelly", font: "system", offsetKeyboard: true, keyboardOffset: 10, dynamicGutter: true, gutterWidth: 20, placeholdersAllowed: true, linkPlaceholders: false)

设置视图的各个部分

设置 Firefly View 中的文本

fireflyView.text = “My code string”

设置 Firefly View 的主题

fireflyView.setTheme(name: "Basic")

设置 Firefly View 的语言

fireflyView.setLanguage(nLanguage: "default")

设置 Firefly View 的 Gutter 宽度

fireView.setGutterWidth(width: 20)

设置 Firefly View 的键盘偏移量

键盘偏移量是 Firefly View 底部和键盘框架之间的空间。 您应该使用它为任何键盘输入视图留出空间。

fireflyView.setKeyboardOffset(offset: 85)

告诉视图是否应该动态调整键盘

fireView.setShouldOffsetKeyboard(bool: true)

设置 Firefly View 的字体

fireflyView.setFont(font: "Source Code Pro")

告诉视图是否应动态更新 Gutter 宽度

fireflyView.setDynamicGutter(bool: true)

告诉视图是否应显示占位符

占位符可用于深度链接到您的应用程序的不同部分或打开链接。 用于 Jellycuts 中的文档。

fireView.setPlaceholdersAllowed(bool: true)

告诉视图占位符是否也应该是链接

fireView.setLinkPlaceholders(bool: true)

获取为 Firefly View 设置的当前主题

这将返回当前主题的值。 您可以使用它来获取有关 View 的外观以及相应地为应用程序的其他部分着色的详细信息。

let theme = fireflyView.getCurrentTheme()

列出所有支持的语言

fireflyView().availableLanguages()

列出所有支持的主题

fireflyView().availableThemes()

Swift UI

Swift UI 尚未完全支持,但仍支持。 下面是一个 Swift UI Fiefly 视图的示例视图。 这将为您设置一个基本的 Swift UI Fiefly 视图。

struct ContentView: View {
    @State var text = """
    if(x == 3) {
        quickLook()
    }
    import Shortcuts 1090.2
    #Color: red, #Icon: shortcuts
    Function()
    functionWithParams(test: test)
    // This is a comment
    /*
    This is a multi line comment
    */
    "String"
    \"""
    Multi Line Text
    More Text
    \"""
    """

    @State var theme: String = "Xcode Dark"
    @State var fontName: String = "system"
    
    @State var update: Bool = false
    
    @State var dynamicGutter: Bool = false
    @State var gutterWidth: CGFloat = 40
    @State var placeholdersAllowed: Bool = true
    @State var linkPlaceholders: Bool = false
    @State var lineNumbers: Bool = true
    @State var fontSize: CGFloat = 14

    var body: some View {
        FireflySyntaxEditor(text: $text, language: .constant("Jelly"), theme: $theme, fontName: $fontName, fontSize: $fontSize, dynamicGutter: $dynamicGutter, gutterWidth: $gutterWidth, placeholdersAllowed: $placeholdersAllowed, linkPlaceholders: $linkPlaceholders, lineNumbers: $lineNumbers, cursorPosition: $cursorPosition) { editor in
            print("Did change text")
        } didChangeSelectedRange: { editor, range in
            print("Did change selected range")
        } textViewDidBeginEditing: { editor in
            print("Did begin editing")
        }
    }
}

添加您自己的内容

添加您自己的语言

语言是定义词典,它告诉语法高亮器如何检测标记。

语言定义的示例

let defaultLanguage: [String: Any] = [
    "comment": [
        "regex": "//.*?(\\n|$)", // The regex used for highlighting
        "group": 0, // The regex group that should be highlighted
        "relevance": 5, // The releavance over other tokens
        "options": [], // Regular expression options
        "multiline": false // If the token is multiline
    ],
    "multi_comment": [
        "regex": "/\\*.*?\\*/", // The regex used for highlighting
        "group": 0, // The regex group that should be highlighted
        "relevance": 5, // The releavance over other tokens
        "options": [NSRegularExpression.Options.dotMatchesLineSeparators],  // Regular expression options
        "multiline": true // If the token is multiline
    ],
]

添加您的语言

要将您自己的语言添加到语言词典中的语言数组中。

let languages: [String: [String: Any]] = [
    "default": defaultLanguage,
    "jelly": jellyLanguage,
    "swift": swiftLanguage
]

添加主题

主题是一个带有颜色值的字典,告诉高亮器突出显示不同标记的颜色。

主题定义的示例

"Basic": [
    "default": "#000000", // The default font color
    "background": "#FFFFFF", // The background color
    "currentLine": "#F3F3F4", // Color of the current line
    "selection": "#A4CDFF", // The selection color of the text view
    "cursor": "#000000", // The cursor color of the text view
    "definitions": [ // These are the definitions that tell the highlighter what color to highlight different types of definitions.
        "function": "#2B839F",
        "keyword": "#0000FF",
        "identifier": "#2B839F",
        "string": "#A31515",
        "mult_string": "#A31515",
        "comment": "#008000",
        "multi_comment": "#008000",
        "numbers": "#000000",
        "url": "#0000FF"
    ]
]

使用 Firefly 的应用

  1. Jellycuts
  2. App Maker

待办事项

鸣谢

Sourceful 是一个将 SavannaKit 和 SourceEditor 合并在一起的项目,然后更新为现代版本的 Swift。 它由 Paul Hudson 维护。 本项目曾被用作 Firefly 的起点,但已在很大程度上从工作副本中删除。 Sourceful 采用 MIT 许可证;有关更多信息,请参阅 Sourceful LICENSE

Highlightr 是一个将 Highlight.js 与 Swift 交互的项目。 为了采用完全 Swift 方法,Highlighter 已从工作副本中删除。 Highlightr 采用 MIT 许可证;有关更多信息,请参阅 Highlightr LICENSE

SyntaxKit 是 Palle Klewitz 创建的用于 iOS 语法高亮的项目。 本项目被用作代码中问题的参考。 SyntaxKit 采用 MIT 许可证;有关更多信息,请参阅 SyntaxKit LICENSE

SavannaKit 是 Louis D'hauwe 创建的项目。 Firefly 使用 LineNumberLayoutManager 的修改版本。 SavannaKit 采用 MIT 许可证;有关更多信息,请参阅 SavannaKit LICENSE