60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package misspell
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
// WordCase is an enum of various word casing styles
|
|
type WordCase int
|
|
|
|
// Various WordCase types.. likely to be not correct
|
|
const (
|
|
CaseUnknown WordCase = iota
|
|
CaseLower
|
|
CaseUpper
|
|
CaseTitle
|
|
)
|
|
|
|
// CaseStyle returns what case style a word is in
|
|
func CaseStyle(word string) WordCase {
|
|
upperCount := 0
|
|
lowerCount := 0
|
|
|
|
// this iterates over RUNES not BYTES
|
|
for i := 0; i < len(word); i++ {
|
|
ch := word[i]
|
|
switch {
|
|
case ch >= 'a' && ch <= 'z':
|
|
lowerCount++
|
|
case ch >= 'A' && ch <= 'Z':
|
|
upperCount++
|
|
}
|
|
}
|
|
|
|
switch {
|
|
case upperCount != 0 && lowerCount == 0:
|
|
return CaseUpper
|
|
case upperCount == 0 && lowerCount != 0:
|
|
return CaseLower
|
|
case upperCount == 1 && lowerCount > 0 && word[0] >= 'A' && word[0] <= 'Z':
|
|
return CaseTitle
|
|
}
|
|
return CaseUnknown
|
|
}
|
|
|
|
// CaseVariations returns
|
|
// If AllUpper or First-Letter-Only is upcased: add the all upper case version
|
|
// If AllLower, add the original, the title and upcase forms
|
|
// If Mixed, return the original, and the all upcase form
|
|
//
|
|
func CaseVariations(word string, style WordCase) []string {
|
|
switch style {
|
|
case CaseLower:
|
|
return []string{word, strings.ToUpper(word[0:1]) + word[1:], strings.ToUpper(word)}
|
|
case CaseUpper:
|
|
return []string{strings.ToUpper(word)}
|
|
default:
|
|
return []string{word, strings.ToUpper(word)}
|
|
}
|
|
}
|