mirror of
https://github.com/pocketbase/pocketbase.git
synced 2024-12-01 11:01:04 +02:00
86 lines
1.9 KiB
Go
86 lines
1.9 KiB
Go
package inflector
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
var columnifyRemoveRegex = regexp.MustCompile(`[^\w\.\*\-\_\@\#]+`)
|
|
var snakecaseSplitRegex = regexp.MustCompile(`[\W_]+`)
|
|
|
|
// UcFirst converts the first character of a string into uppercase.
|
|
func UcFirst(str string) string {
|
|
if str == "" {
|
|
return ""
|
|
}
|
|
|
|
s := []rune(str)
|
|
|
|
return string(unicode.ToUpper(s[0])) + string(s[1:])
|
|
}
|
|
|
|
// Columnify strips invalid db identifier characters.
|
|
func Columnify(str string) string {
|
|
return columnifyRemoveRegex.ReplaceAllString(str, "")
|
|
}
|
|
|
|
// Sentenize converts and normalizes string into a sentence.
|
|
func Sentenize(str string) string {
|
|
str = strings.TrimSpace(str)
|
|
if str == "" {
|
|
return ""
|
|
}
|
|
|
|
str = UcFirst(str)
|
|
|
|
lastChar := str[len(str)-1:]
|
|
if lastChar != "." && lastChar != "?" && lastChar != "!" {
|
|
return str + "."
|
|
}
|
|
|
|
return str
|
|
}
|
|
|
|
// Sanitize sanitizes `str` by removing all characters satisfying `removePattern`.
|
|
// Returns an error if the pattern is not valid regex string.
|
|
func Sanitize(str string, removePattern string) (string, error) {
|
|
exp, err := regexp.Compile(removePattern)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return exp.ReplaceAllString(str, ""), nil
|
|
}
|
|
|
|
// Snakecase removes all non word characters and converts any english text into a snakecase.
|
|
// "ABBREVIATIONS" are preserved, eg. "myTestDB" will become "my_test_db".
|
|
func Snakecase(str string) string {
|
|
var result strings.Builder
|
|
|
|
// split at any non word character and underscore
|
|
words := snakecaseSplitRegex.Split(str, -1)
|
|
|
|
for _, word := range words {
|
|
if word == "" {
|
|
continue
|
|
}
|
|
|
|
if result.Len() > 0 {
|
|
result.WriteString("_")
|
|
}
|
|
|
|
for i, c := range word {
|
|
if unicode.IsUpper(c) && i > 0 &&
|
|
// is not a following uppercase character
|
|
!unicode.IsUpper(rune(word[i-1])) {
|
|
result.WriteString("_")
|
|
}
|
|
|
|
result.WriteRune(c)
|
|
}
|
|
}
|
|
|
|
return strings.ToLower(result.String())
|
|
}
|