mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
49 lines
728 B
Go
49 lines
728 B
Go
package tools
|
|
|
|
import "strings"
|
|
|
|
func sanitizeIdentifierComponent(s string) string {
|
|
const maxLen = 64
|
|
|
|
s = strings.ToLower(s)
|
|
var b strings.Builder
|
|
b.Grow(len(s))
|
|
|
|
prevUnderscore := false
|
|
for _, r := range s {
|
|
isAllowed := (r >= 'a' && r <= 'z') ||
|
|
(r >= '0' && r <= '9') ||
|
|
r == '_' || r == '-'
|
|
|
|
if !isAllowed {
|
|
if !prevUnderscore {
|
|
b.WriteRune('_')
|
|
prevUnderscore = true
|
|
}
|
|
continue
|
|
}
|
|
|
|
if r == '_' {
|
|
if prevUnderscore {
|
|
continue
|
|
}
|
|
prevUnderscore = true
|
|
} else {
|
|
prevUnderscore = false
|
|
}
|
|
|
|
b.WriteRune(r)
|
|
}
|
|
|
|
result := strings.Trim(b.String(), "_")
|
|
if result == "" {
|
|
result = "unnamed"
|
|
}
|
|
|
|
if len(result) > maxLen {
|
|
result = result[:maxLen]
|
|
}
|
|
|
|
return result
|
|
}
|