Compare commits
3 Commits
93c859a3c4
...
cd01d2f8c3
Author | SHA1 | Date |
---|---|---|
Shadowfacts | cd01d2f8c3 | |
Shadowfacts | 65c3c8026d | |
Shadowfacts | 534f83e716 |
|
@ -2451,6 +2451,7 @@
|
|||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
INFOPLIST_FILE = TuskerUITests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
|
@ -2804,6 +2805,7 @@
|
|||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
INFOPLIST_FILE = TuskerUITests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
|
@ -2823,6 +2825,7 @@
|
|||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
INFOPLIST_FILE = TuskerUITests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
|
@ -2956,8 +2959,8 @@
|
|||
isa = XCRemoteSwiftPackageReference;
|
||||
repositoryURL = "https://git.shadowfacts.net/shadowfacts/HTMLStreamer.git";
|
||||
requirement = {
|
||||
branch = main;
|
||||
kind = branch;
|
||||
kind = upToNextMinorVersion;
|
||||
minimumVersion = 0.1.0;
|
||||
};
|
||||
};
|
||||
D63CC700290EC0B8000E19DE /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = {
|
||||
|
|
|
@ -30,20 +30,31 @@ extension NSAttributedString {
|
|||
extension NSMutableAttributedString {
|
||||
|
||||
func trimLeadingCharactersInSet(_ charSet: CharacterSet) {
|
||||
var range = (string as NSString).rangeOfCharacter(from: charSet)
|
||||
|
||||
while range.length != 0 && range.location == 0 {
|
||||
replaceCharacters(in: range, with: "")
|
||||
range = (string as NSString).rangeOfCharacter(from: charSet)
|
||||
var end = string.startIndex
|
||||
while end < string.endIndex && charSet.contains(string.unicodeScalars[end]) {
|
||||
end = string.unicodeScalars.index(after: end)
|
||||
}
|
||||
if end > string.startIndex {
|
||||
let length = string.utf16.distance(from: string.startIndex, to: end)
|
||||
replaceCharacters(in: NSRange(location: 0, length: length), with: "")
|
||||
}
|
||||
}
|
||||
|
||||
func trimTrailingCharactersInSet(_ charSet: CharacterSet) {
|
||||
var range = (string as NSString).rangeOfCharacter(from: charSet, options: .backwards)
|
||||
|
||||
while range.length != 0 && range.length + range.location == length {
|
||||
replaceCharacters(in: range, with: "")
|
||||
range = (string as NSString).rangeOfCharacter(from: charSet, options: .backwards)
|
||||
if string.isEmpty {
|
||||
return
|
||||
}
|
||||
var start = string.index(before: string.endIndex)
|
||||
while start > string.startIndex && charSet.contains(string.unicodeScalars[start]) {
|
||||
start = string.unicodeScalars.index(before: start)
|
||||
}
|
||||
if start < string.endIndex {
|
||||
if start != string.startIndex || !charSet.contains(string.unicodeScalars[start]) {
|
||||
start = string.unicodeScalars.index(after: start)
|
||||
}
|
||||
let location = string.utf16.distance(from: string.startIndex, to: start)
|
||||
let length = string.utf16.distance(from: start, to: string.endIndex)
|
||||
replaceCharacters(in: NSRange(location: location, length: length), with: "")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ extension HTMLConverter {
|
|||
if clazz == "invisible" {
|
||||
return .skip
|
||||
} else if clazz == "ellipsis" {
|
||||
return .replace("…")
|
||||
return .append("…")
|
||||
} else {
|
||||
return .default
|
||||
}
|
||||
|
|
|
@ -388,7 +388,11 @@ class ConversationMainStatusCollectionViewCell: UICollectionViewListCell, Status
|
|||
|
||||
let html = translation?.content ?? status.content
|
||||
let attributedContent = ConversationMainStatusCollectionViewCell.htmlConverter.convert(html)
|
||||
doUpdateUI(status: status, content: attributedContent)
|
||||
let collapsedContent = NSMutableAttributedString(attributedString: attributedContent)
|
||||
collapsedContent.collapseWhitespace()
|
||||
collapsedContent.trimLeadingCharactersInSet(.whitespacesAndNewlines)
|
||||
collapsedContent.trimTrailingCharactersInSet(.whitespacesAndNewlines)
|
||||
doUpdateUI(status: status, content: collapsedContent)
|
||||
|
||||
if !status.spoilerText.isEmpty,
|
||||
let translated = translation?.spoilerText {
|
||||
|
|
|
@ -616,7 +616,11 @@ class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollecti
|
|||
}
|
||||
|
||||
let content = precomputedContent ?? TimelineStatusCollectionViewCell.htmlConverter.convert(status.content)
|
||||
doUpdateUI(status: status, content: content)
|
||||
let collapsedContent = NSMutableAttributedString(attributedString: content)
|
||||
collapsedContent.collapseWhitespace()
|
||||
collapsedContent.trimLeadingCharactersInSet(.whitespacesAndNewlines)
|
||||
collapsedContent.trimTrailingCharactersInSet(.whitespacesAndNewlines)
|
||||
doUpdateUI(status: status, content: collapsedContent)
|
||||
|
||||
doUpdateTimestamp(status: status)
|
||||
timestampLabel.isHidden = showPinned
|
||||
|
|
|
@ -16,6 +16,36 @@ class AttributedStringHelperTests: XCTestCase {
|
|||
|
||||
override func tearDown() {
|
||||
}
|
||||
|
||||
func testTrimLeading() {
|
||||
let a = NSMutableAttributedString(string: " a ")
|
||||
a.trimLeadingCharactersInSet(.whitespaces)
|
||||
XCTAssertEqual(a, NSAttributedString(string: "a "))
|
||||
let b = NSMutableAttributedString(string: " ")
|
||||
b.trimLeadingCharactersInSet(.whitespaces)
|
||||
XCTAssertEqual(b, NSAttributedString(string: ""))
|
||||
let c = NSMutableAttributedString(string: "")
|
||||
c.trimLeadingCharactersInSet(.whitespaces)
|
||||
XCTAssertEqual(c, NSAttributedString(string: ""))
|
||||
let d = NSMutableAttributedString(string: "abc")
|
||||
d.trimLeadingCharactersInSet(.whitespaces)
|
||||
XCTAssertEqual(d, NSAttributedString(string: "abc"))
|
||||
}
|
||||
|
||||
func testTrimTrailing() {
|
||||
let a = NSMutableAttributedString(string: " a ")
|
||||
a.trimTrailingCharactersInSet(.whitespaces)
|
||||
XCTAssertEqual(a, NSAttributedString(string: " a"))
|
||||
let b = NSMutableAttributedString(string: " ")
|
||||
b.trimTrailingCharactersInSet(.whitespaces)
|
||||
XCTAssertEqual(b, NSAttributedString(string: ""))
|
||||
let c = NSMutableAttributedString(string: "")
|
||||
c.trimTrailingCharactersInSet(.whitespaces)
|
||||
XCTAssertEqual(c, NSAttributedString(string: ""))
|
||||
let d = NSMutableAttributedString(string: "abc")
|
||||
d.trimTrailingCharactersInSet(.whitespaces)
|
||||
XCTAssertEqual(d, NSAttributedString(string: "abc"))
|
||||
}
|
||||
|
||||
func testCollapsingWhitespace() {
|
||||
var str = NSAttributedString(string: "test 1\n")
|
||||
|
|
Loading…
Reference in New Issue