summaryrefslogtreecommitdiff
path: root/vendor/github.com/rainycape/unidecode/unidecode.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/rainycape/unidecode/unidecode.go')
-rw-r--r--vendor/github.com/rainycape/unidecode/unidecode.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/vendor/github.com/rainycape/unidecode/unidecode.go b/vendor/github.com/rainycape/unidecode/unidecode.go
new file mode 100644
index 00000000..16281da4
--- /dev/null
+++ b/vendor/github.com/rainycape/unidecode/unidecode.go
@@ -0,0 +1,58 @@
+// 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
+}