mentions: fix bech32 mentions at end
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
@@ -70,14 +70,12 @@ func parse_post_bech32_mention(_ p: Parser) -> ReferencedId? {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var end = p.pos
|
guard consume_until(p, match: { c in !is_bech32_char(c) }, end_ok: true) else {
|
||||||
if consume_until(p, match: { c in !is_bech32_char(c) }) {
|
|
||||||
end = p.pos
|
|
||||||
} else {
|
|
||||||
p.pos = start
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let end = p.pos
|
||||||
|
|
||||||
let sliced = String(substring(p.str, start: start, end: end))
|
let sliced = String(substring(p.str, start: start, end: end))
|
||||||
guard let decoded = try? bech32_decode(sliced) else {
|
guard let decoded = try? bech32_decode(sliced) else {
|
||||||
p.pos = start
|
p.pos = start
|
||||||
|
|||||||
@@ -17,17 +17,22 @@ class Parser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func consume_until(_ p: Parser, match: (Character) -> Bool) -> Bool {
|
func consume_until(_ p: Parser, match: (Character) -> Bool, end_ok: Bool = false) -> Bool {
|
||||||
var i: Int = 0
|
|
||||||
let sub = substring(p.str, start: p.pos, end: p.str.count)
|
let sub = substring(p.str, start: p.pos, end: p.str.count)
|
||||||
|
let start = p.pos
|
||||||
|
|
||||||
for c in sub {
|
for c in sub {
|
||||||
if match(c) {
|
if match(c) {
|
||||||
p.pos += i
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
i += 1
|
p.pos += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if end_ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
p.pos = start
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -189,6 +189,32 @@ class ReplyTests: XCTestCase {
|
|||||||
XCTAssertEqual(parsed.count, 0)
|
XCTAssertEqual(parsed.count, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testBech32MentionAtStart() throws {
|
||||||
|
let pk = "npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s"
|
||||||
|
let hex_pk = "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"
|
||||||
|
let content = "@\(pk) hello there"
|
||||||
|
let blocks = parse_post_blocks(content: content)
|
||||||
|
|
||||||
|
XCTAssertEqual(blocks.count, 3)
|
||||||
|
XCTAssertEqual(blocks[0].is_text, "")
|
||||||
|
XCTAssertEqual(blocks[1].is_ref, ReferencedId(ref_id: hex_pk, relay_id: nil, key: "p"))
|
||||||
|
XCTAssertEqual(blocks[2].is_text, " hello there")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func testBech32MentionAtEnd() throws {
|
||||||
|
let pk = "npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s"
|
||||||
|
let hex_pk = "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"
|
||||||
|
let content = "this is a @\(pk)"
|
||||||
|
let blocks = parse_post_blocks(content: content)
|
||||||
|
|
||||||
|
XCTAssertEqual(blocks.count, 3)
|
||||||
|
XCTAssertEqual(blocks[1].is_ref, ReferencedId(ref_id: hex_pk, relay_id: nil, key: "p"))
|
||||||
|
XCTAssertEqual(blocks[0].is_text, "this is a ")
|
||||||
|
XCTAssertEqual(blocks[2].is_text, "")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func testNpubMention() throws {
|
func testNpubMention() throws {
|
||||||
let evid = "0000000000000000000000000000000000000000000000000000000000000005"
|
let evid = "0000000000000000000000000000000000000000000000000000000000000005"
|
||||||
let pk = "npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s"
|
let pk = "npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s"
|
||||||
|
|||||||
Reference in New Issue
Block a user