/*
 UICodeHighlightingLabel.swift
 pass

 Created by Danny Moesch on 20.01.19.
 Copyright © 2019 Bob Sun. All rights reserved.
 */

import UIKit
import passKit

class UICodeHighlightingLabel: UILocalizedLabel {

    private static let CODE_ATTRIBUTES: [NSAttributedString.Key: Any] = [.font: UIFont(name: "Menlo-Regular", size: 12)!]
    private static let ATTRIBUTED_NEWLINE = NSAttributedString(string: "\n")

    override func awakeFromNib() {
        super.awakeFromNib()
        guard let text = text else {
            return
        }
        attributedText = formatCode(in: text)
    }

    /// Format code sections in a multiline string block.
    ///
    /// A line in the string is interpreted as a code section if it starts with two spaces.
    ///
    /// - Parameter text: Multiline string block
    /// - Returns: Same multiline string block with code sections formatted
    private func formatCode(in text: String) -> NSMutableAttributedString {
        let formattedText = text
            .split(omittingEmptySubsequences: false) {
                $0 == "\n" || $0 == "\r\n"
            }.map { line -> NSAttributedString in
                if line.starts(with: "  ") {
                    return NSAttributedString(string: String(line), attributes: UICodeHighlightingLabel.CODE_ATTRIBUTES)
                }
                return NSAttributedString(string: String(line))
            }.reduce(into: NSMutableAttributedString(string: "")) {
                $0.append($1)
                $0.append(UICodeHighlightingLabel.ATTRIBUTED_NEWLINE)
            }
        formattedText.deleteCharacters(in: NSRange(location: formattedText.length - 1, length: 1))
        return formattedText
    }
}

