36 lines
901 B
Go
36 lines
901 B
Go
package linknorm
|
|
|
|
import (
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
// SanitizeShareText strips BOM, bidi isolates and zero-width chars that break
|
|
// scheme detection (common when pasting from messengers / Amnezia share).
|
|
func SanitizeShareText(raw string) string {
|
|
raw = strings.TrimPrefix(raw, "\ufeff")
|
|
raw = strings.TrimSpace(raw)
|
|
if raw == "" {
|
|
return ""
|
|
}
|
|
var b strings.Builder
|
|
b.Grow(len(raw))
|
|
for _, r := range raw {
|
|
switch r {
|
|
case '\u200b', '\u200c', '\u200d', '\u2060', '\ufeff', // zero-width / BOM
|
|
'\u2066', '\u2067', '\u2068', '\u2069', // LRI/RLI/FSI/PDI
|
|
'\u200e', '\u200f', // LRM/RLM
|
|
'\u202a', '\u202b', '\u202c', '\u202d', '\u202e': // embedding overrides
|
|
continue
|
|
}
|
|
if r < 0x20 && r != '\n' && r != '\r' && r != '\t' {
|
|
continue
|
|
}
|
|
if unicode.Is(unicode.Cf, r) { // other format controls
|
|
continue
|
|
}
|
|
b.WriteRune(r)
|
|
}
|
|
return strings.TrimSpace(b.String())
|
|
}
|