forked from shadowfacts/Tusker
98 lines
2.6 KiB
Swift
98 lines
2.6 KiB
Swift
//
|
|
// StatusFormat.swift
|
|
// Tusker
|
|
//
|
|
// Created by Shadowfacts on 1/12/19.
|
|
// Copyright © 2019 Shadowfacts. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import Pachyderm
|
|
|
|
enum StatusFormat: CaseIterable {
|
|
case bold, italics, strikethrough, code
|
|
|
|
var insertionResult: FormatInsertionResult? {
|
|
switch Preferences.shared.statusContentType {
|
|
case .plain:
|
|
return nil
|
|
case .markdown:
|
|
return Markdown.format(self)
|
|
case .html:
|
|
return HTML.format(self)
|
|
}
|
|
}
|
|
|
|
var image: UIImage? {
|
|
let name: String
|
|
switch self {
|
|
case .italics:
|
|
name = "italic"
|
|
case .bold:
|
|
name = "bold"
|
|
case .strikethrough:
|
|
name = "strikethrough"
|
|
default:
|
|
return nil
|
|
}
|
|
return UIImage(systemName: name)
|
|
}
|
|
|
|
var title: (String, [NSAttributedString.Key: Any])? {
|
|
if self == .code {
|
|
return ("</>", [.font: UIFont(name: "Menlo", size: 17)!])
|
|
} else {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
var accessibilityLabel: String {
|
|
switch self {
|
|
case .italics:
|
|
return NSLocalizedString("Italics", comment: "italics text format accessibility label")
|
|
case .bold:
|
|
return NSLocalizedString("Bold", comment: "bold text format accessibility label")
|
|
case .strikethrough:
|
|
return NSLocalizedString("Strikethrough", comment: "strikethrough text format accessibility label")
|
|
case .code:
|
|
return NSLocalizedString("Code", comment: "code text format accessibility label")
|
|
}
|
|
}
|
|
}
|
|
|
|
typealias FormatInsertionResult = (prefix: String, suffix: String, insertionPoint: Int)
|
|
|
|
protocol FormatType {
|
|
static func format(_ format: StatusFormat) -> FormatInsertionResult
|
|
}
|
|
|
|
extension StatusFormat {
|
|
struct Markdown: FormatType {
|
|
static var formats: [StatusFormat: String] = [
|
|
.italics: "_",
|
|
.bold: "**",
|
|
.strikethrough: "~~",
|
|
.code: "`"
|
|
]
|
|
|
|
static func format(_ format: StatusFormat) -> FormatInsertionResult {
|
|
let str = formats[format]!
|
|
return (str, str, str.count)
|
|
}
|
|
}
|
|
|
|
struct HTML: FormatType {
|
|
static var tags: [StatusFormat: String] = [
|
|
.italics: "em",
|
|
.bold: "strong",
|
|
.strikethrough: "del",
|
|
.code: "code"
|
|
]
|
|
|
|
static func format(_ format: StatusFormat) -> FormatInsertionResult {
|
|
let tag = tags[format]!
|
|
return ("<\(tag)>", "</\(tag)>", tag.count + 2)
|
|
}
|
|
}
|
|
}
|