-
Notifications
You must be signed in to change notification settings - Fork 2
/
normalizeforcomparison.go
51 lines (39 loc) · 1.89 KB
/
normalizeforcomparison.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package lib
import (
"strings"
"unicode"
"golang.org/x/text/unicode/norm"
)
func createTransliterationMap() map[rune]string {
transliterationMapString := "ÀA,ÁA,ÂA,ÃA,ÄA,ÅA,ÆAE,ÇC,ÈE,ÉE,ÊE,ËE,ÌI,ÍI,ÎI,ÏI,ÐD,ÑN,ÒO,ÓO,ÔO,ÕO,ÖO,ØO,ÙU,ÚU,ÛU,ÜU,ÝY,ßss,àa,áa,âa,ãa,äa,åa,æae,çc,èe,ée,êe,ëe,ìi,íi,îi,ïi,ðd,ñn,òo,óo,ôo,õo,öo,øo,ùu,úu,ûu,üu,ýy,ÿy,ĀA,āa,ĂA,ăa,ĄA,ąa,ĆC,ćc,ĈC,ĉc,ĊC,ċc,ČC,čc,ĎD,ďd,ĐD,đd,ĒE,ēe,ĔE,ĕe,ĖE,ėe,ĘE,ęe,ĚE,ěe,ĜG,ĝg,ĞG,ğg,ĠG,ġg,ĢG,ģg,ĤH,ĥh,ĦH,ħh,ĨI,ĩi,ĪI,īi,ĬI,ĭi,ĮI,įi,İI,IJIJ,ijij,ĴJ,ĵj,ĶK,ķk,ĹL,ĺl,ĻL,ļl,ĽL,ľl,ŁL,łl,ŃN,ńn,ŅN,ņn,ŇN,ňn,ʼn'n,ŌO,ōo,ŎO,ŏo,ŐO,őo,ŒOE,œoe,ŔR,ŕr,ŖR,ŗr,ŘR,řr,ŚS,śs,ŜS,ŝs,ŞS,şs,ŠS,šs,ŢT,ţt,ŤT,ťt,ŨU,ũu,ŪU,ūu,ŬU,ŭu,ŮU,ůu,ŰU,űu,ŲU,ųu,ŴW,ŵw,ŶY,ŷy,ŸY,ŹZ,źz,ŻZ,żz,ŽZ,žz"
mapping := make(map[rune]string)
pairs := strings.Split(transliterationMapString, ",")
for _, pair := range pairs {
runes := []rune(pair)
mapping[runes[0]] = string(runes[1:])
}
return mapping
}
func transliterate(r rune, transliterationMap map[rune]string) string {
if result, ok := transliterationMap[r]; ok {
return result
}
return string(r)
}
func NormalizeForComparison(path string) string {
transliterationMap := createTransliterationMap()
// Normalize Algorithm
path = strings.ReplaceAll(path, "\x00", "")
path = strings.ReplaceAll(path, "\\", "/")
path = strings.Trim(path, "/")
path = strings.Join(strings.FieldsFunc(path, func(r rune) bool { return r == '/' }), "/")
// Normalize For Comparison Algorithm
path = norm.NFKC.String(path)
var transliteratedPath strings.Builder
for _, r := range path {
transliteratedPath.WriteString(transliterate(r, transliterationMap))
}
path = strings.Map(unicode.ToLower, transliteratedPath.String())
path = strings.TrimRightFunc(path, unicode.IsSpace)
return path
}