12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- // Package unidecode implements a unicode transliterator
- // which replaces non-ASCII characters with their ASCII
- // approximations.
- package unidecode
-
- //go:generate go run make_table.go
-
- import (
- "sync"
- "unicode"
- )
-
- const pooledCapacity = 64
-
- var (
- slicePool sync.Pool
- decodingOnce sync.Once
- )
-
- // Unidecode implements a unicode transliterator, which
- // replaces non-ASCII characters with their ASCII
- // counterparts.
- // Given an unicode encoded string, returns
- // another string with non-ASCII characters replaced
- // with their closest ASCII counterparts.
- // e.g. Unicode("áéíóú") => "aeiou"
- func Unidecode(s string) string {
- decodingOnce.Do(decodeTransliterations)
- l := len(s)
- var r []rune
- if l > pooledCapacity {
- r = make([]rune, 0, len(s))
- } else {
- if x := slicePool.Get(); x != nil {
- r = x.([]rune)[:0]
- } else {
- r = make([]rune, 0, pooledCapacity)
- }
- }
- for _, c := range s {
- if c <= unicode.MaxASCII {
- r = append(r, c)
- continue
- }
- if c > unicode.MaxRune || c > transCount {
- /* Ignore reserved chars */
- continue
- }
- if d := transliterations[c]; d != nil {
- r = append(r, d...)
- }
- }
- res := string(r)
- if l <= pooledCapacity {
- slicePool.Put(r)
- }
- return res
- }
|