mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.9 KiB
Swift
62 lines
1.9 KiB
Swift
//
|
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
public extension String {
|
|
|
|
var stripped: String {
|
|
return self.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
}
|
|
|
|
func rtlSafeAppend(_ string: String) -> String {
|
|
return (self as NSString).rtlSafeAppend(string)
|
|
}
|
|
|
|
var filterForDisplay: String? {
|
|
return (self as NSString).filterStringForDisplay()
|
|
}
|
|
|
|
// Truncates string to be less than or equal to byteCount, while ensuring we never truncate partial characters for multibyte characters.
|
|
func truncated(toByteCount byteCount: UInt) -> String? {
|
|
var lowerBoundCharCount = 0
|
|
var upperBoundCharCount = self.count
|
|
|
|
while (lowerBoundCharCount < upperBoundCharCount) {
|
|
guard let upperBoundData = self.prefix(upperBoundCharCount).data(using: .utf8) else {
|
|
owsFailDebug("upperBoundData was unexpectedly nil")
|
|
return nil
|
|
}
|
|
|
|
if upperBoundData.count <= byteCount {
|
|
break
|
|
}
|
|
|
|
// converge
|
|
if upperBoundCharCount - lowerBoundCharCount == 1 {
|
|
upperBoundCharCount = lowerBoundCharCount
|
|
break
|
|
}
|
|
|
|
let midpointCharCount = (lowerBoundCharCount + upperBoundCharCount) / 2
|
|
let midpointString = self.prefix(midpointCharCount)
|
|
|
|
guard let midpointData = midpointString.data(using: .utf8) else {
|
|
owsFailDebug("midpointData was unexpectedly nil")
|
|
return nil
|
|
}
|
|
let midpointByteCount = midpointData.count
|
|
|
|
if midpointByteCount < byteCount {
|
|
lowerBoundCharCount = midpointCharCount
|
|
} else {
|
|
upperBoundCharCount = midpointCharCount
|
|
}
|
|
}
|
|
|
|
return String(self.prefix(upperBoundCharCount))
|
|
}
|
|
|
|
}
|