splash/Sources/Splash/Output/HTMLOutputFormat.swift
John Sundell c73767a0bc HTMLOutputFormat: Escape < and > characters
This patch makes `HTMLOutputFormat` correctly escape all < and > characters
that occur in source code. Otherwise, a web browser rendering the resulting
HTML will interpret those characters as tags.
2018-08-27 00:14:48 +02:00

59 lines
1.6 KiB
Swift

/**
* Splash
* Copyright (c) John Sundell 2018
* MIT license - see LICENSE.md
*/
import Foundation
/// Output format to use to generate an HTML string with a semantic
/// representation of the highlighted code. Each token will be wrapped
/// in a `span` element with a CSS class matching the token's type.
/// Optionally, a `classPrefix` can be set to prefix each CSS class with
/// a given string.
public struct HTMLOutputFormat: OutputFormat {
public var classPrefix: String
public init(classPrefix: String = "") {
self.classPrefix = classPrefix
}
public func makeBuilder() -> Builder {
return Builder(classPrefix: classPrefix)
}
}
public extension HTMLOutputFormat {
struct Builder: OutputBuilder {
private let classPrefix: String
private var html = ""
fileprivate init(classPrefix: String) {
self.classPrefix = classPrefix
}
public mutating func addToken(_ token: String, ofType type: TokenType) {
html.append("<span class=\"\(classPrefix)\(type.rawValue)\">\(token.escaped)</span>")
}
public mutating func addPlainText(_ text: String) {
html.append(text.escaped)
}
public mutating func addWhitespace(_ whitespace: String) {
html.append(whitespace)
}
public func build() -> String {
return html
}
}
}
private extension String {
var escaped: String {
return replacingOccurrences(of: "<", with: "&lt;")
.replacingOccurrences(of: ">", with: "&gt;")
}
}