76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
package common
|
|
|
|
import "strings"
|
|
|
|
var replacer *strings.Replacer
|
|
|
|
func init() {
|
|
trimChars := "0123456789-()/½⅓¼⅕⅙⅐⅛⅑⅔⅖¾⅗⅘"
|
|
tcs := make([]string, len(trimChars)*2)
|
|
for i, c := range trimChars {
|
|
tcs[i*2] = string(c)
|
|
tcs[i*2+1] = ""
|
|
}
|
|
replacer = strings.NewReplacer(tcs...)
|
|
}
|
|
|
|
type List struct {
|
|
Name string `json:"name"`
|
|
Group string `json:"group"`
|
|
Items []Item `json:"items"`
|
|
// ID is the Mealie API reference for the list.
|
|
ID int `json:"id"`
|
|
}
|
|
|
|
var sortableText map[string]string = map[string]string{}
|
|
|
|
func (l List) Len() int { return len(l.Items) }
|
|
func (l List) Swap(i, j int) { l.Items[i], l.Items[j] = l.Items[j], l.Items[i] }
|
|
|
|
func (l List) Less(i, j int) bool {
|
|
var ok bool
|
|
var it, jt string
|
|
li := l.Items[i]
|
|
lit := li.Text
|
|
if it, ok = sortableText[lit]; !ok {
|
|
it = replacer.Replace(strings.ToUpper(lit))
|
|
it = strings.TrimLeft(it, " ")
|
|
sortableText[lit] = it
|
|
}
|
|
lj := l.Items[j]
|
|
ljt := lj.Text
|
|
if jt, ok = sortableText[ljt]; !ok {
|
|
jt = replacer.Replace(strings.ToUpper(ljt))
|
|
jt = strings.TrimLeft(jt, " ")
|
|
sortableText[ljt] = jt
|
|
}
|
|
if !li.Checked {
|
|
if lj.Checked {
|
|
return true
|
|
}
|
|
return it < jt
|
|
}
|
|
if !lj.Checked {
|
|
return false
|
|
}
|
|
return it < jt
|
|
}
|
|
|
|
type Item struct {
|
|
Id string `json:"id"`
|
|
Title string `json:"title"`
|
|
Text string `json:"text"`
|
|
Quantity int `json:"quantity"`
|
|
Checked bool `json:"checked"`
|
|
Size int64 `json:"size"`
|
|
Data interface{} `json:"data"`
|
|
}
|
|
|
|
func NewList(name string) List {
|
|
return List{
|
|
ID: -1,
|
|
Name: name,
|
|
Items: []Item{},
|
|
}
|
|
}
|