Merge pull request #388 from n-peugnet/newlines-nohtml

Preserve newlines in plain text messages
This commit is contained in:
Tulir Asokan 2022-10-19 14:33:22 +03:00 committed by GitHub
commit 71f16b797f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -388,16 +388,39 @@ func (parser *htmlParser) tagNodeToEntity(node *html.Node) Entity {
var spaces = regexp.MustCompile("\\s+") var spaces = regexp.MustCompile("\\s+")
// textToHTMLEntity converts a plain text string into an HTML Entity while preserving newlines.
func textToHTMLEntity(text string) Entity {
lines := strings.SplitAfter(text, "\n")
if len(lines) == 1 {
return NewTextEntity(text)
}
ent := &ContainerEntity{
BaseEntity: &BaseEntity{Tag: "span"},
}
for _, line := range lines {
line_len := len(line)
if line_len == 0 {
continue
}
if line[line_len-1:] == "\n" {
ent.Children = append(ent.Children, NewTextEntity(line[:line_len-1]), NewBreakEntity())
} else {
ent.Children = append(ent.Children, NewTextEntity(line))
}
}
return ent
}
func TextToEntity(text string, eventID id.EventID, linkify bool) Entity { func TextToEntity(text string, eventID id.EventID, linkify bool) Entity {
if len(text) == 0 { if len(text) == 0 {
return nil return nil
} }
if !linkify { if !linkify {
return NewTextEntity(text) return textToHTMLEntity(text)
} }
indices := xurls.Strict().FindAllStringIndex(text, -1) indices := xurls.Strict().FindAllStringIndex(text, -1)
if len(indices) == 0 { if len(indices) == 0 {
return NewTextEntity(text) return textToHTMLEntity(text)
} }
ent := &ContainerEntity{ ent := &ContainerEntity{
BaseEntity: &BaseEntity{Tag: "span"}, BaseEntity: &BaseEntity{Tag: "span"},
@ -406,7 +429,7 @@ func TextToEntity(text string, eventID id.EventID, linkify bool) Entity {
for i, item := range indices { for i, item := range indices {
start, end := item[0], item[1] start, end := item[0], item[1]
if start > lastEnd { if start > lastEnd {
ent.Children = append(ent.Children, NewTextEntity(text[lastEnd:start])) ent.Children = append(ent.Children, textToHTMLEntity(text[lastEnd:start]))
} }
link := text[start:end] link := text[start:end]
linkID := fmt.Sprintf("%s-%d", eventID, i) linkID := fmt.Sprintf("%s-%d", eventID, i)
@ -414,7 +437,7 @@ func TextToEntity(text string, eventID id.EventID, linkify bool) Entity {
lastEnd = end lastEnd = end
} }
if lastEnd < len(text) { if lastEnd < len(text) {
ent.Children = append(ent.Children, NewTextEntity(text[lastEnd:])) ent.Children = append(ent.Children, textToHTMLEntity(text[lastEnd:]))
} }
return ent return ent
} }