commit 139be9eef260010c4a418762df941276492fb4ff
parent 72a060c7b31bc5e97d7ad498ff6d4a88f3e5021f
Author: William Casarin <jb55@jb55.com>
Date: Fri, 14 Jul 2023 17:26:19 -0700
Fix nostr: mention prefix bugs
The zero-width space was causing parsing issues. Not sure why we need
this so I just removed it.
Changelog-Fixed: Fix nostr:nostr:... bugs
Diffstat:
3 files changed, 25 insertions(+), 22 deletions(-)
diff --git a/damus/Views/PostView.swift b/damus/Views/PostView.swift
@@ -570,16 +570,12 @@ func build_post(post: NSMutableAttributedString, action: PostAction, uploadedMed
// Add zero-width space in case text preceding the mention is not a whitespace.
// In the case where the character preceding the mention is a whitespace, the added zero-width space will be stripped out.
- post.replaceCharacters(in: range, with: "\u{200B}\(normalized_link)\u{200B}")
+ post.replaceCharacters(in: range, with: "\(normalized_link)")
}
}
+
var content = post.string
- // If two zero-width spaces are next to each other, normalize it to just one zero-width space.
- .replacingOccurrences(of: "\u{200B}\u{200B}", with: "\u{200B}")
- // If zero-width space is next to an actual whitespace, remove the zero-width space.
- .replacingOccurrences(of: " \u{200B}", with: " ")
- .replacingOccurrences(of: "\u{200B} ", with: " ")
.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
let imagesString = uploadedMedias.map { $0.uploadedURL.absoluteString }.joined(separator: " ")
diff --git a/damus/Views/Posting/UserSearch.swift b/damus/Views/Posting/UserSearch.swift
@@ -34,8 +34,11 @@ struct UserSearch: View {
guard let pk = bech32_pubkey(user.pubkey) else {
return
}
- let tagAttributedString = user_tag_attr_string(profile: user.profile, pubkey: pk)
- appendUserTag(withTag: tagAttributedString)
+
+ let user_tag = user_tag_attr_string(profile: user.profile, pubkey: pk)
+ user_tag.append(.init(string: " "))
+
+ appendUserTag(withTag: user_tag)
}
private func appendUserTag(withTag tagAttributedString: NSMutableAttributedString) {
@@ -97,14 +100,12 @@ struct UserSearch_Previews: PreviewProvider {
func user_tag_attr_string(profile: Profile?, pubkey: String) -> NSMutableAttributedString {
let display_name = Profile.displayName(profile: profile, pubkey: pubkey)
let name = display_name.username.truncate(maxLength: 50)
- let tagString = "@\(name)\u{200B} "
+ let tagString = "@\(name)"
- let tagAttributedString = NSMutableAttributedString(string: tagString,
- attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18.0),
- NSAttributedString.Key.link: "nostr:\(pubkey)"])
- tagAttributedString.removeAttribute(.link, range: NSRange(location: tagAttributedString.length - 2, length: 2))
- tagAttributedString.addAttributes([NSAttributedString.Key.foregroundColor: UIColor.label], range: NSRange(location: tagAttributedString.length - 2, length: 2))
-
- return tagAttributedString
+ return NSMutableAttributedString(string: tagString, attributes: [
+ NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18.0),
+ NSAttributedString.Key.foregroundColor: UIColor.label,
+ NSAttributedString.Key.link: "damus:nostr:\(pubkey)"
+ ])
}
diff --git a/damusTests/ReplyTests.swift b/damusTests/ReplyTests.swift
@@ -136,15 +136,21 @@ class ReplyTests: XCTestCase {
guard let hex_pk = bech32_pubkey_decode(pk) else {
return
}
- let content = """
- @\(pk)
- @\(pk)
- """
- let blocks = parse_mentions(content: content, tags: []).blocks
+ let profile = Profile(name: "jb55", display_name: "Will", about: nil, picture: nil, banner: nil, website: nil, lud06: nil, lud16: nil, nip05: nil, damus_donation: nil)
+
+ let post = user_tag_attr_string(profile: profile, pubkey: pk)
+ post.append(.init(string: "\n"))
+ post.append(user_tag_attr_string(profile: profile, pubkey: pk))
+ post.append(.init(string: "\n"))
+
+ let post_note = build_post(post: post, action: .posting(.none), uploadedMedias: [], references: [.p(hex_pk)])
- let rendered = render_blocks(blocks: blocks)
let expected_render = "nostr:\(pk)\nnostr:\(pk)"
+ XCTAssertEqual(post_note.content, expected_render)
+
+ let blocks = parse_mentions(content: post_note.content, tags: []).blocks
+ let rendered = render_blocks(blocks: blocks)
XCTAssertEqual(rendered, expected_render)