-
Notifications
You must be signed in to change notification settings - Fork 7
/
render.go
52 lines (46 loc) · 1.24 KB
/
render.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package birds
import (
"fmt"
"strings"
)
// RenderHTML renders the tweet text into HTML.
func (t *Tweet) RenderHTML(photos Photos) string {
// First, replace all urls and mentions
entities := t.Entities.sort()
runes := []rune(t.Text)
var lastStart int
for _, e := range entities {
// When more than 1 images are attached,
// twitter might give us duplicated url entities.
if e.getStart() == lastStart {
continue
}
lastStart = e.getStart()
rendered := []rune(e.render())
replaced := make([]rune, e.getStart()+len(rendered)+len(runes)-e.getEnd())
copy(replaced, runes[:e.getStart()])
copy(replaced[e.getStart():], rendered)
copy(replaced[e.getStart()+len(rendered):], runes[e.getEnd():])
runes = replaced
}
text := string(runes)
// Then, add line breakers and get a whole p tag for the text
text = strings.ReplaceAll(text, "\n", "<br />\n")
var sb strings.Builder
sb.WriteString("<p>")
sb.WriteString(text)
sb.WriteString("</p>\n")
// Finally, add any photos
for _, key := range t.Attachments.MediaKeys {
if m, ok := photos[key]; ok {
sb.WriteString(fmt.Sprintf(
`<p><img src="%s" height="%d" width="%d" /></p>`,
m.URL,
m.Height,
m.Width,
))
sb.WriteString("\n")
}
}
return sb.String()
}