1
0
mirror of https://github.com/danog/gojekyll.git synced 2024-12-02 15:47:47 +01:00
gojekyll/utils/strings.go

81 lines
1.9 KiB
Go
Raw Normal View History

2017-07-09 22:17:20 +02:00
package utils
import (
2017-06-15 16:17:21 +02:00
"regexp"
2017-07-14 17:30:39 +02:00
"strings"
)
2017-06-15 13:19:49 +02:00
// LeftPad left-pads s with spaces to n wide. It's an alternative to http://left-pad.io.
2017-06-13 23:19:05 +02:00
func LeftPad(s string, n int) string {
2017-06-11 22:00:03 +02:00
if n <= len(s) {
return s
}
ws := make([]byte, n-len(s))
for i := range ws {
ws[i] = ' '
}
return string(ws) + s
}
2017-07-03 15:37:14 +02:00
type replaceStringFuncError error
// SafeReplaceAllStringFunc is like regexp.ReplaceAllStringFunc but passes an
// an error back from the replacement function.
func SafeReplaceAllStringFunc(re *regexp.Regexp, src string, repl func(m string) (string, error)) (out string, err error) {
// The ReplaceAllStringFunc callback signals errors via panic.
// Turn them into return values.
defer func() {
if r := recover(); r != nil {
if e, ok := r.(replaceStringFuncError); ok {
err = e.(error)
} else {
panic(r)
}
}
}()
return re.ReplaceAllStringFunc(src, func(m string) string {
out, err := repl(m)
if err != nil {
panic(replaceStringFuncError(err))
}
return out
}), nil
}
var nonAlphanumericSequenceMatcher = regexp.MustCompile(`[^[:alnum:]]+`)
// Slugify replaces each sequence of non-alphanumerics by a single hyphen
func Slugify(s string) string {
2017-07-14 17:30:39 +02:00
return strings.ToLower(nonAlphanumericSequenceMatcher.ReplaceAllString(s, "-"))
2017-07-03 15:37:14 +02:00
}
2017-06-17 01:17:22 +02:00
// StringArrayToMap creates a map for use as a set.
2017-07-14 17:30:39 +02:00
func StringArrayToMap(a []string) map[string]bool {
2017-08-20 18:22:58 +02:00
m := map[string]bool{}
2017-07-14 17:30:39 +02:00
for _, s := range a {
2017-08-20 18:22:58 +02:00
m[s] = true
}
2017-08-20 18:22:58 +02:00
return m
}
2017-09-01 15:10:07 +02:00
// StringArrayContains returns a bool indicating whether the array contains the string.
func StringArrayContains(a []string, s string) bool {
for _, item := range a {
if item == s {
return true
}
}
return false
}
2017-08-20 18:22:58 +02:00
// Titleize splits at ` `, capitalizes, and joins.
func Titleize(s string) string {
a := strings.Split(s, "-")
for i, s := range a {
if len(s) > 0 {
a[i] = strings.ToUpper(s[:1]) + s[1:]
}
}
return strings.Join(a, " ")
}