Files
geo/server/internal/shared/contentstats/word_count.go
T

37 lines
689 B
Go
Raw Normal View History

package contentstats
import (
"regexp"
"strings"
"unicode"
)
var latinTokenPattern = regexp.MustCompile(`[A-Za-z0-9]+(?:['-][A-Za-z0-9]+)?`)
func CountWords(input string) int {
input = strings.TrimSpace(input)
if input == "" {
return 0
}
var builder strings.Builder
hanCount := 0
for _, r := range input {
switch {
case unicode.Is(unicode.Han, r):
hanCount++
builder.WriteRune(' ')
case unicode.IsLetter(r) || unicode.IsDigit(r):
builder.WriteRune(r)
case unicode.IsSpace(r):
builder.WriteRune(' ')
default:
builder.WriteRune(' ')
}
}
latinCount := len(latinTokenPattern.FindAllString(builder.String(), -1))
return hanCount + latinCount
}