You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

unicode.go 922B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Copyright (c) 2021 Shivaram Lingamneni
  2. // Released under the MIT License
  3. package ircutils
  4. import (
  5. "strings"
  6. "unicode"
  7. "unicode/utf8"
  8. "github.com/ergochat/irc-go/ircmsg"
  9. )
  10. var TruncateUTF8Safe = ircmsg.TruncateUTF8Safe
  11. // Sanitizes human-readable text to make it safe for IRC;
  12. // assumes UTF-8 and uses the replacement character where
  13. // applicable.
  14. func SanitizeText(message string, byteLimit int) (result string) {
  15. var buf strings.Builder
  16. for _, r := range message {
  17. if r == '\x00' || r == '\r' {
  18. continue
  19. } else if r == '\n' {
  20. if buf.Len()+2 <= byteLimit {
  21. buf.WriteString(" ")
  22. continue
  23. } else {
  24. break
  25. }
  26. } else if unicode.IsSpace(r) {
  27. if buf.Len()+1 <= byteLimit {
  28. buf.WriteString(" ")
  29. } else {
  30. break
  31. }
  32. } else {
  33. rLen := utf8.RuneLen(r)
  34. if buf.Len()+rLen <= byteLimit {
  35. buf.WriteRune(r)
  36. } else {
  37. break
  38. }
  39. }
  40. }
  41. return buf.String()
  42. }