Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}