splash/Sources/Splash/Output/AttributedStringOutputFormat.swift
John Sundell 8bc46cbeb0
Add SwiftLint (#49)
This change adds SwiftLint to the project. For now, the rules are tweaked
to match the current state of the code base — but will over time be changed
back to their defaults in several cases.

Some smaller changes (mostly related to code style) were applied to the
project to remove all warnings.
2019-03-11 14:52:46 +01:00

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