(telegram|matrix)fmt: mention formatting

Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
This commit is contained in:
Sumner Evans
2024-08-05 14:40:55 -06:00
parent b539e5d63d
commit f56f520308
14 changed files with 123 additions and 59 deletions
+13 -9
View File
@@ -29,11 +29,15 @@ import (
func toTelegramEntity(br telegramfmt.BodyRange) tg.MessageEntityClass {
switch val := br.Value.(type) {
case telegramfmt.Mention:
userID, _ := ids.ParseUserID(val.UserID)
return &tg.MessageEntityMentionName{
Offset: br.Start,
Length: br.Length,
UserID: userID,
if val.Username != "" {
return &tg.MessageEntityMention{Offset: br.Start, Length: br.Length}
} else {
userID, _ := ids.ParseUserID(val.UserID)
return &tg.InputMessageEntityMentionName{
Offset: br.Start,
Length: br.Length,
UserID: &tg.InputUser{UserID: userID, AccessHash: val.AccessHash},
}
}
case telegramfmt.Style:
switch val.Type {
@@ -92,12 +96,12 @@ func Parse(ctx context.Context, parser *HTMLParser, content *event.MessageEventC
if parsed == nil {
return "", nil
}
var bodyRanges []tg.MessageEntityClass
var entities []tg.MessageEntityClass
if len(parsed.Entities) > 0 {
bodyRanges = make([]tg.MessageEntityClass, len(parsed.Entities))
entities = make([]tg.MessageEntityClass, len(parsed.Entities))
for i, ent := range parsed.Entities {
bodyRanges[i] = toTelegramEntity(ent)
entities[i] = toTelegramEntity(ent)
}
}
return parsed.String.String(), bodyRanges
return parsed.String.String(), entities
}
+6 -3
View File
@@ -243,7 +243,7 @@ func (ctx Context) WithWhitespace() Context {
// HTMLParser is a somewhat customizable Matrix HTML parser.
type HTMLParser struct {
ParseGhostMXID func(id.UserID) (networkid.UserID, bool)
GetGhostDetails func(context.Context, id.UserID) (networkid.UserID, string, int64, bool)
}
// TaggedString is a string that also contains a HTML tag.
@@ -367,11 +367,14 @@ func (parser *HTMLParser) linkToString(node *html.Node, ctx Context) *EntityStri
// Mention not allowed, use name as-is
return str
}
userID, ok := parser.ParseGhostMXID(mxid)
userID, username, accessHash, ok := parser.GetGhostDetails(ctx.Ctx, mxid)
if !ok {
return str
} else if username == "" {
return ent.Format(telegramfmt.Mention{UserID: userID, AccessHash: accessHash})
} else {
return NewEntityString("@" + username).Format(telegramfmt.Mention{UserID: userID, Username: username})
}
return ent.Format(telegramfmt.Mention{UserID: userID})
}
if str.String.String() == href {
return ent.Format(telegramfmt.Style{Type: telegramfmt.StyleURL, URL: href})