198 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package sprig
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/base32"
 | 
						|
	"encoding/base64"
 | 
						|
	"fmt"
 | 
						|
	"reflect"
 | 
						|
	"strconv"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	util "github.com/aokoli/goutils"
 | 
						|
)
 | 
						|
 | 
						|
func base64encode(v string) string {
 | 
						|
	return base64.StdEncoding.EncodeToString([]byte(v))
 | 
						|
}
 | 
						|
 | 
						|
func base64decode(v string) string {
 | 
						|
	data, err := base64.StdEncoding.DecodeString(v)
 | 
						|
	if err != nil {
 | 
						|
		return err.Error()
 | 
						|
	}
 | 
						|
	return string(data)
 | 
						|
}
 | 
						|
 | 
						|
func base32encode(v string) string {
 | 
						|
	return base32.StdEncoding.EncodeToString([]byte(v))
 | 
						|
}
 | 
						|
 | 
						|
func base32decode(v string) string {
 | 
						|
	data, err := base32.StdEncoding.DecodeString(v)
 | 
						|
	if err != nil {
 | 
						|
		return err.Error()
 | 
						|
	}
 | 
						|
	return string(data)
 | 
						|
}
 | 
						|
 | 
						|
func abbrev(width int, s string) string {
 | 
						|
	if width < 4 {
 | 
						|
		return s
 | 
						|
	}
 | 
						|
	r, _ := util.Abbreviate(s, width)
 | 
						|
	return r
 | 
						|
}
 | 
						|
 | 
						|
func abbrevboth(left, right int, s string) string {
 | 
						|
	if right < 4 || left > 0 && right < 7 {
 | 
						|
		return s
 | 
						|
	}
 | 
						|
	r, _ := util.AbbreviateFull(s, left, right)
 | 
						|
	return r
 | 
						|
}
 | 
						|
func initials(s string) string {
 | 
						|
	// Wrap this just to eliminate the var args, which templates don't do well.
 | 
						|
	return util.Initials(s)
 | 
						|
}
 | 
						|
 | 
						|
func randAlphaNumeric(count int) string {
 | 
						|
	// It is not possible, it appears, to actually generate an error here.
 | 
						|
	r, _ := util.RandomAlphaNumeric(count)
 | 
						|
	return r
 | 
						|
}
 | 
						|
 | 
						|
func randAlpha(count int) string {
 | 
						|
	r, _ := util.RandomAlphabetic(count)
 | 
						|
	return r
 | 
						|
}
 | 
						|
 | 
						|
func randAscii(count int) string {
 | 
						|
	r, _ := util.RandomAscii(count)
 | 
						|
	return r
 | 
						|
}
 | 
						|
 | 
						|
func randNumeric(count int) string {
 | 
						|
	r, _ := util.RandomNumeric(count)
 | 
						|
	return r
 | 
						|
}
 | 
						|
 | 
						|
func untitle(str string) string {
 | 
						|
	return util.Uncapitalize(str)
 | 
						|
}
 | 
						|
 | 
						|
func quote(str ...interface{}) string {
 | 
						|
	out := make([]string, len(str))
 | 
						|
	for i, s := range str {
 | 
						|
		out[i] = fmt.Sprintf("%q", strval(s))
 | 
						|
	}
 | 
						|
	return strings.Join(out, " ")
 | 
						|
}
 | 
						|
 | 
						|
func squote(str ...interface{}) string {
 | 
						|
	out := make([]string, len(str))
 | 
						|
	for i, s := range str {
 | 
						|
		out[i] = fmt.Sprintf("'%v'", s)
 | 
						|
	}
 | 
						|
	return strings.Join(out, " ")
 | 
						|
}
 | 
						|
 | 
						|
func cat(v ...interface{}) string {
 | 
						|
	r := strings.TrimSpace(strings.Repeat("%v ", len(v)))
 | 
						|
	return fmt.Sprintf(r, v...)
 | 
						|
}
 | 
						|
 | 
						|
func indent(spaces int, v string) string {
 | 
						|
	pad := strings.Repeat(" ", spaces)
 | 
						|
	return pad + strings.Replace(v, "\n", "\n"+pad, -1)
 | 
						|
}
 | 
						|
 | 
						|
func replace(old, new, src string) string {
 | 
						|
	return strings.Replace(src, old, new, -1)
 | 
						|
}
 | 
						|
 | 
						|
func plural(one, many string, count int) string {
 | 
						|
	if count == 1 {
 | 
						|
		return one
 | 
						|
	}
 | 
						|
	return many
 | 
						|
}
 | 
						|
 | 
						|
func strslice(v interface{}) []string {
 | 
						|
	switch v := v.(type) {
 | 
						|
	case []string:
 | 
						|
		return v
 | 
						|
	case []interface{}:
 | 
						|
		l := len(v)
 | 
						|
		b := make([]string, l)
 | 
						|
		for i := 0; i < l; i++ {
 | 
						|
			b[i] = strval(v[i])
 | 
						|
		}
 | 
						|
		return b
 | 
						|
	default:
 | 
						|
		val := reflect.ValueOf(v)
 | 
						|
		switch val.Kind() {
 | 
						|
		case reflect.Array, reflect.Slice:
 | 
						|
			l := val.Len()
 | 
						|
			b := make([]string, l)
 | 
						|
			for i := 0; i < l; i++ {
 | 
						|
				b[i] = strval(val.Index(i).Interface())
 | 
						|
			}
 | 
						|
			return b
 | 
						|
		default:
 | 
						|
			return []string{strval(v)}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func strval(v interface{}) string {
 | 
						|
	switch v := v.(type) {
 | 
						|
	case string:
 | 
						|
		return v
 | 
						|
	case []byte:
 | 
						|
		return string(v)
 | 
						|
	case error:
 | 
						|
		return v.Error()
 | 
						|
	case fmt.Stringer:
 | 
						|
		return v.String()
 | 
						|
	default:
 | 
						|
		return fmt.Sprintf("%v", v)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func trunc(c int, s string) string {
 | 
						|
	if len(s) <= c {
 | 
						|
		return s
 | 
						|
	}
 | 
						|
	return s[0:c]
 | 
						|
}
 | 
						|
 | 
						|
func join(sep string, v interface{}) string {
 | 
						|
	return strings.Join(strslice(v), sep)
 | 
						|
}
 | 
						|
 | 
						|
func split(sep, orig string) map[string]string {
 | 
						|
	parts := strings.Split(orig, sep)
 | 
						|
	res := make(map[string]string, len(parts))
 | 
						|
	for i, v := range parts {
 | 
						|
		res["_"+strconv.Itoa(i)] = v
 | 
						|
	}
 | 
						|
	return res
 | 
						|
}
 | 
						|
 | 
						|
// substring creates a substring of the given string.
 | 
						|
//
 | 
						|
// If start is < 0, this calls string[:length].
 | 
						|
//
 | 
						|
// If start is >= 0 and length < 0, this calls string[start:]
 | 
						|
//
 | 
						|
// Otherwise, this calls string[start, length].
 | 
						|
func substring(start, length int, s string) string {
 | 
						|
	if start < 0 {
 | 
						|
		return s[:length]
 | 
						|
	}
 | 
						|
	if length < 0 {
 | 
						|
		return s[start:]
 | 
						|
	}
 | 
						|
	return s[start:length]
 | 
						|
}
 |