Firefly 是一个纯 Swift 编写的 iOS & macOS 语法高亮器,基于 Sourceful、SavannaKit、SyntaxKit,以及之前的 Highlightr。为了实现纯 Swift 解决方案,Highlighter 已经被从项目中移除。
如果您想联系 Firefly,Jellycuts Discord 是最好的交流场所。
问题反馈同时托管在本仓库和 Jellycuts Issue Repo 上。 这是因为许多与 Firefly 相关的问题都是通过 Jellycuts 报告的,没有必要将它们镜像到此仓库。
Firefly 使用纯 Swift 编写,并使用 NSRegularExpressions 检测要高亮的标记。 一旦检测到标记,它们会根据当前主题着色。
如果您打算在您的项目中使用 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 进行设置。
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)
fireflyView.text = “My code string”
fireflyView.setTheme(name: "Basic")
fireflyView.setLanguage(nLanguage: "default")
fireView.setGutterWidth(width: 20)
键盘偏移量是 Firefly View 底部和键盘框架之间的空间。 您应该使用它为任何键盘输入视图留出空间。
fireflyView.setKeyboardOffset(offset: 85)
fireView.setShouldOffsetKeyboard(bool: true)
fireflyView.setFont(font: "Source Code Pro")
fireflyView.setDynamicGutter(bool: true)
占位符可用于深度链接到您的应用程序的不同部分或打开链接。 用于 Jellycuts 中的文档。
fireView.setPlaceholdersAllowed(bool: true)
fireView.setLinkPlaceholders(bool: true)
这将返回当前主题的值。 您可以使用它来获取有关 View 的外观以及相应地为应用程序的其他部分着色的详细信息。
let theme = fireflyView.getCurrentTheme()
fireflyView().availableLanguages()
fireflyView().availableThemes()
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"
]
]
支持主题更换
支持语言更换
动态创建 Gutter 和线条样式
修复主题在标记具有字体粗细修饰符时未显示正确颜色的问题 - 实际上并未修复,目前只是一个解决方法。
修改、更新并实施 SavannaKit / SyntaxKit LineNumberLayoutManager,以获得更好更快的行号显示
提高加载较大文件的速度
多行字符串支持
Swift UI 支持
占位符
可折叠的行
更多语言
在 obj-c 中重写 NSTextStorage 子类。 这将带来速度提升。
支持 VSCode 主题或 VSCode -> Firefly 主题的转换器
使用行号和行片段的着色来突出显示当前行
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。