query.gno
3.02 Kb ยท 136 lines
1package blog
2
3import (
4 "time"
5
6 "gno.land/p/lou/query"
7)
8
9type RenderOptions struct {
10 Sort string
11 TimeFormat string
12 StartTime *time.Time
13 EndTime *time.Time
14 Ascending bool
15 IsGrid bool
16 IsAlphabetical bool
17 IsLastUpdated bool
18 IsCommon bool
19 HasOrder bool
20}
21
22func ParseRenderOptions(rawPath string) RenderOptions {
23 sort := query.GetQuery("sort", rawPath)
24 order := query.GetQuery("order", rawPath)
25 mode := query.GetQuery("mode", rawPath)
26 timeFmt := query.GetQuery("time", rawPath)
27 startTime, endTime := parseTimeRange(rawPath)
28
29 return RenderOptions{
30 Sort: sort,
31 TimeFormat: timeFmt,
32 StartTime: startTime,
33 EndTime: endTime,
34 Ascending: order == "asc" || order == "",
35 IsGrid: mode == "grid" || mode == "",
36 IsAlphabetical: sort == "alpha",
37 IsLastUpdated: sort == "update",
38 IsCommon: sort == "common",
39 HasOrder: order == "asc" || order == "desc",
40 }
41}
42
43func GetGridFmtPath(rawPath string) string {
44 link, _ := query.UpdateQueryValue(rawPath, "mode", "grid")
45 return link
46}
47
48func GetListFmtPath(rawPath string) string {
49 link, _ := query.UpdateQueryValue(rawPath, "mode", "list")
50 return link
51}
52
53func GetSortByPublishedPath(rawPath, order string) string {
54 link, _ := query.UpdateQueryFirstValues(rawPath, map[string]string{
55 "sort": "recent",
56 "order": toggle(order),
57 })
58 return link
59}
60
61func GetTimeFmtPath(rawPath, timeFormat string) string {
62 link, _ := query.UpdateQueryValue(rawPath, "time", timeFormat)
63 return link
64}
65
66func GetTimeStartPath(rawPath, startTime string) string {
67 link, _ := query.UpdateQueryValue(rawPath, "start", startTime)
68 return link
69}
70
71func GetTimeEndPath(rawPath, endTime string) string {
72 link, _ := query.UpdateQueryValue(rawPath, "end", endTime)
73 return link
74}
75
76func GetSortByUpdatedPath(rawPath, order string) string {
77 link, _ := query.UpdateQueryFirstValues(rawPath, map[string]string{
78 "sort": "update",
79 "order": toggle(order),
80 })
81 return link
82}
83
84func GetSortByAlphabeticalPath(rawPath, order string) string {
85 link, _ := query.UpdateQueryFirstValues(rawPath, map[string]string{
86 "sort": "alpha",
87 "order": toggle(order),
88 })
89 return link
90}
91
92func GetSortByCommonPath(rawPath, order string) string {
93 link, _ := query.UpdateQueryFirstValues(rawPath, map[string]string{
94 "sort": "common",
95 "order": toggle(order),
96 })
97 return link
98}
99
100func toggle(current string) string {
101 if current == "desc" {
102 return "asc"
103 }
104 return "desc"
105}
106
107func toggleTimeFormat(current string) string {
108 if current == "relative" {
109 return "short"
110 }
111 if current == "short" {
112 return "full"
113 }
114 if current == "full" {
115 return "relative"
116 }
117 return "short"
118}
119
120func parseTimeRange(rawPath string) (*time.Time, *time.Time) {
121 startStr := query.GetQuery("start", rawPath)
122 endStr := query.GetQuery("end", rawPath)
123 var start, end *time.Time
124
125 if startStr != "" {
126 if t := tryParseFlexibleDate(startStr); t != nil {
127 start = t
128 }
129 }
130 if endStr != "" {
131 if t := tryParseFlexibleDate(endStr); t != nil {
132 end = t
133 }
134 }
135 return start, end
136}