112 lines
2.2 KiB
Go
Executable File
112 lines
2.2 KiB
Go
Executable File
package form
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"html"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type readCloser struct {
|
|
io.Reader
|
|
}
|
|
|
|
func (rc readCloser) Close() error {
|
|
return nil
|
|
}
|
|
|
|
func GetAll(r *http.Request, k string) []string {
|
|
r.ParseForm()
|
|
v, _ := r.Form[k]
|
|
return v
|
|
}
|
|
|
|
func Get(r *http.Request, k string) string {
|
|
s := r.FormValue(k)
|
|
if s == "" {
|
|
b, _ := ioutil.ReadAll(r.Body)
|
|
var m map[string]json.RawMessage
|
|
if err := json.Unmarshal(b, &m); err != nil {
|
|
return ""
|
|
}
|
|
v, _ := m[k]
|
|
s = strings.TrimPrefix(strings.TrimSuffix(string(v), `"`), `"`)
|
|
r.Body = readCloser{bytes.NewReader(b)}
|
|
}
|
|
s = html.UnescapeString(s)
|
|
s = strings.ReplaceAll(s, "\r", "")
|
|
return s
|
|
}
|
|
|
|
func ToInt(s string) int {
|
|
v, _ := strconv.Atoi(s)
|
|
return v
|
|
}
|
|
|
|
func ToStrArr(k string) []string {
|
|
arr := strings.Split(k, ",")
|
|
outArr := []string{}
|
|
for i := range arr {
|
|
s := strings.TrimSpace(arr[i])
|
|
if len(s) > 0 {
|
|
outArr = append(outArr, s)
|
|
}
|
|
}
|
|
return outArr
|
|
}
|
|
|
|
func ToDuration(s string) time.Duration {
|
|
var d time.Duration
|
|
for _, c := range []struct {
|
|
key string
|
|
d time.Duration
|
|
}{
|
|
{"d", time.Hour * 24},
|
|
{"w", time.Hour * 24 * 7},
|
|
} {
|
|
daysPattern := regexp.MustCompile(`(^|[a-z])[0-9]+` + c.key + `($|[0-9])`)
|
|
idxes := daysPattern.FindAllStringIndex(s, -1)
|
|
if len(idxes) > 1 {
|
|
return 0
|
|
}
|
|
for _, idx := range idxes {
|
|
substr := s[idx[0]:idx[1]]
|
|
for len(substr) > 0 && (substr[0] < '0' || substr[0] > '9') {
|
|
substr = substr[1:]
|
|
}
|
|
for len(substr) > 0 && (substr[len(substr)-1] >= '0' && substr[len(substr)-1] <= '9') {
|
|
substr = substr[:len(substr)-1]
|
|
}
|
|
s = strings.ReplaceAll(s, substr, "")
|
|
substr = strings.TrimSuffix(substr, c.key)
|
|
n, _ := strconv.Atoi(substr)
|
|
d += c.d * time.Duration(n)
|
|
}
|
|
}
|
|
d2, _ := time.ParseDuration(s)
|
|
return d2 + d
|
|
}
|
|
|
|
func ToTime(s string) time.Time {
|
|
v, err := time.Parse("2006-01-02 15:04:05", s)
|
|
if err != nil || v.IsZero() {
|
|
v, err = time.Parse("2006-01-02", s)
|
|
}
|
|
if err != nil || v.IsZero() {
|
|
v, err = time.Parse("1/2/06", s)
|
|
}
|
|
if err != nil || v.IsZero() {
|
|
v, err = time.Parse("02 Jan 2006 3:04 PM", s)
|
|
}
|
|
if err != nil || v.IsZero() {
|
|
v, err = time.Parse("02 Jan 2006 3:04 PM", strings.ReplaceAll(s, "+", " "))
|
|
}
|
|
return v
|
|
}
|