render.gno
2.59 Kb · 83 lines
1package gnotif
2
3import (
4 "chain/runtime/unsafe"
5 "strconv"
6 "strings"
7
8 "gno.land/p/nt/markdown/sanitize/v0"
9)
10
11const pageSize = 50
12
13// Render serves "" (the first page), "page/N" and "trigger/<id>".
14func Render(path string) string {
15 switch {
16 case path == "":
17 return renderPage(1)
18 case strings.HasPrefix(path, "page/"):
19 n, err := strconv.Atoi(strings.TrimPrefix(path, "page/"))
20 if err != nil || n < 1 {
21 return "Not found."
22 }
23 return renderPage(n)
24 case strings.HasPrefix(path, "trigger/"):
25 v := triggers.Get(strings.TrimPrefix(path, "trigger/"))
26 if v == nil {
27 return "Not found."
28 }
29 return renderTrigger(v.(*Trigger))
30 }
31 return "Not found."
32}
33
34// renderPage lists the triggers newest first, pageSize to a page.
35func renderPage(n int) string {
36 var b strings.Builder
37 b.WriteString("# gnotif triggers\n\n")
38 pages := (triggers.Size() + pageSize - 1) / pageSize
39 if n > pages {
40 b.WriteString("No triggers on this page.\n")
41 return b.String()
42 }
43 triggers.ReverseIterateByOffset((n-1)*pageSize, pageSize, func(_ string, v any) bool {
44 tr := v.(*Trigger)
45 b.WriteString("- [**" + tr.ID + "**](" + selfPath + ":trigger/" + tr.ID + ") " +
46 sanitize.InlineText(tr.Target) + " · " + sanitize.InlineText(tr.Event))
47 if tr.Param != "" {
48 b.WriteString(" · param " + sanitize.InlineText(tr.Param))
49 }
50 if tr.Verified {
51 b.WriteString(" · ✓ verified")
52 }
53 b.WriteString(" · by " + tr.Declarer.String() + "\n")
54 return false
55 })
56 if n < pages {
57 b.WriteString("\n[Next page](" + selfPath + ":page/" + strconv.Itoa(n+1) + ")\n")
58 }
59 return b.String()
60}
61
62func renderTrigger(tr *Trigger) string {
63 var b strings.Builder
64 b.WriteString("# Trigger " + tr.ID + "\n\n")
65 b.WriteString("- Target: " + sanitize.InlineText(tr.Target) + "\n")
66 b.WriteString("- Event: " + sanitize.InlineText(tr.Event) + "\n")
67 b.WriteString("- Filter: " + sanitize.InlineText(tr.Filter) + "\n")
68 b.WriteString("- Param: " + sanitize.InlineText(tr.Param) + "\n")
69 b.WriteString("- Title: " + sanitize.InlineText(tr.Title) + "\n")
70 b.WriteString("- Body: " + sanitize.InlineText(tr.Body) + "\n")
71 b.WriteString("- Link: " + sanitize.InlineText(tr.Link) + "\n")
72 b.WriteString("- Declarer: " + tr.Declarer.String() + "\n")
73 if tr.Verified {
74 b.WriteString("- ✓ verified\n")
75 }
76 b.WriteString("\n[All triggers](" + selfPath + ")\n")
77 return b.String()
78}
79
80// selfPath is this realm's path on gnoweb. It is read at package init, where
81// the realm itself is current; Render is not crossing, so reading it there
82// would give the caller's path. It only builds links.
83var selfPath = strings.TrimPrefix(unsafe.CurrentRealm().PkgPath(), "gno.land")