mirror of
https://github.com/metabolist/metatext
synced 2024-12-28 10:40:32 +01:00
72 lines
2.5 KiB
Swift
72 lines
2.5 KiB
Swift
// Copyright © 2020 Metabolist. All rights reserved.
|
|
|
|
import Mastodon
|
|
import UIKit
|
|
import ViewModels
|
|
|
|
extension String {
|
|
static var separator: Self {
|
|
(Locale.autoupdatingCurrent.groupingSeparator ?? ",").appending(" ")
|
|
}
|
|
|
|
func height(width: CGFloat, font: UIFont) -> CGFloat {
|
|
(self as NSString).boundingRect(
|
|
with: CGSize(width: width, height: .greatestFiniteMagnitude),
|
|
options: .usesLineFragmentOrigin,
|
|
attributes: [.font: font],
|
|
context: nil)
|
|
.height
|
|
}
|
|
|
|
func countEmphasizedAttributedString(count: Int, highlighted: Bool = false) -> NSAttributedString {
|
|
let countRange = (self as NSString).range(of: String.localizedStringWithFormat("%ld", count))
|
|
|
|
let attributed = NSMutableAttributedString(
|
|
string: self,
|
|
attributes: [
|
|
.font: UIFont.preferredFont(forTextStyle: .body),
|
|
.foregroundColor: highlighted ? UIColor.tertiaryLabel : UIColor.secondaryLabel
|
|
])
|
|
attributed.addAttributes(
|
|
[
|
|
.font: UIFont.preferredFont(forTextStyle: .headline),
|
|
.foregroundColor: highlighted ? UIColor.secondaryLabel : UIColor.label
|
|
],
|
|
range: countRange)
|
|
|
|
return attributed
|
|
}
|
|
|
|
func localizedBolding(displayName: String,
|
|
emojis: [Emoji],
|
|
label: AnimatedAttachmentLabel,
|
|
identityContext: IdentityContext) -> NSAttributedString {
|
|
let mutableString = NSMutableAttributedString(
|
|
string: String.localizedStringWithFormat(
|
|
NSLocalizedString(self, comment: ""),
|
|
displayName))
|
|
|
|
let range = (mutableString.string as NSString).range(of: displayName)
|
|
|
|
if range.location != NSNotFound,
|
|
let boldFontDescriptor = label.font.fontDescriptor.withSymbolicTraits([.traitBold]) {
|
|
let boldFont = UIFont(descriptor: boldFontDescriptor, size: label.font.pointSize)
|
|
|
|
mutableString.setAttributes([NSAttributedString.Key.font: boldFont], range: range)
|
|
}
|
|
|
|
mutableString.insert(emojis: emojis, view: label, identityContext: identityContext)
|
|
mutableString.resizeAttachments(toLineHeight: label.font.lineHeight)
|
|
|
|
return mutableString
|
|
}
|
|
|
|
func appendingWithSeparator(_ string: Self) -> Self {
|
|
appending(Self.separator).appending(string)
|
|
}
|
|
|
|
mutating func appendWithSeparator(_ string: Self) {
|
|
append(Self.separator.appending(string))
|
|
}
|
|
}
|