damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

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:
Mdamus/Views/PostView.swift | 8++------
Mdamus/Views/Posting/UserSearch.swift | 21+++++++++++----------
MdamusTests/ReplyTests.swift | 18++++++++++++------
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)