a68e461eb4
Now that the decision not to support colors on Linux has been made, we can replace the custom `Color` struct with simple typealiases for `NSColor` and `UIColor`. The same can’t be done for font, since we want to enable loading of a font from a path, for SPM packages.
68 lines
1.8 KiB
Swift
68 lines
1.8 KiB
Swift
/**
|
|
* Splash
|
|
* Copyright (c) John Sundell 2018
|
|
* MIT license - see LICENSE.md
|
|
*/
|
|
|
|
#if !os(Linux)
|
|
|
|
import Foundation
|
|
|
|
/// Output format to use to generate an NSAttributedString from the
|
|
/// highlighted code. A `Theme` is used to determine what fonts and
|
|
/// colors to use for the various tokens.
|
|
public struct AttributedStringOutputFormat: OutputFormat {
|
|
public var theme: Theme
|
|
|
|
public init(theme: Theme) {
|
|
self.theme = theme
|
|
}
|
|
|
|
public func makeBuilder() -> Builder {
|
|
return Builder(theme: theme)
|
|
}
|
|
}
|
|
|
|
public extension AttributedStringOutputFormat {
|
|
struct Builder: OutputBuilder {
|
|
private let theme: Theme
|
|
private lazy var font = theme.font.load()
|
|
private var string = NSMutableAttributedString()
|
|
|
|
fileprivate init(theme: Theme) {
|
|
self.theme = theme
|
|
}
|
|
|
|
public mutating func addToken(_ token: String, ofType type: TokenType) {
|
|
let color = theme.tokenColors[type] ?? Color(red: 1, green: 1, blue: 1)
|
|
string.append(token, font: font, color: color)
|
|
}
|
|
|
|
public mutating func addPlainText(_ text: String) {
|
|
string.append(text, font: font, color: theme.plainTextColor)
|
|
}
|
|
|
|
public mutating func addWhitespace(_ whitespace: String) {
|
|
let color = Color(red: 1, green: 1, blue: 1)
|
|
string.append(whitespace, font: font, color: color)
|
|
}
|
|
|
|
public func build() -> NSAttributedString {
|
|
return NSAttributedString(attributedString: string)
|
|
}
|
|
}
|
|
}
|
|
|
|
private extension NSMutableAttributedString {
|
|
func append(_ string: String, font: Font.Loaded, color: Color) {
|
|
let attributedString = NSAttributedString(string: string, attributes: [
|
|
.foregroundColor: color,
|
|
.font: font
|
|
])
|
|
|
|
append(attributedString)
|
|
}
|
|
}
|
|
|
|
#endif
|