diff --git a/CHANGELOG.md b/CHANGELOG.md index 5015f66..ddb2419 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ # Changelog +## 1.0.1 - 2024-04-19 +* Enhanced for Yoruba, Igbo and Hausa names + ## 1.0.0 - 2024-04-19 * Initial Release diff --git a/README.md b/README.md index c8bec27..8e8d152 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,9 @@ func main() { "Watkins", "Robert Johnson", "Samantha Williams", + "Olanrewaju Akinyele", // Yoruba + "Obinwanne Obiora", // Igbo + "Abdussalamu Abubakar", // Hausa } // Encode each name using NYSIIS diff --git a/nysiis.go b/nysiis.go index 8161522..326137b 100644 --- a/nysiis.go +++ b/nysiis.go @@ -41,6 +41,16 @@ func (n *Nysiis) translateFirstCharacters(name string) string { name = "FF" + name[2:] case strings.HasPrefix(name, "SCH"): name = "SSS" + name[3:] + case strings.HasPrefix(name, "GB"): + name = "J" + name[2:] // Igbo: 'Gb' -> 'J' + case strings.HasPrefix(name, "KP"): + name = "P" + name[2:] // Igbo: 'Kp' -> 'P' + case strings.HasPrefix(name, "NW"): + name = "W" + name[2:] // Igbo: 'Nw' -> 'W' + case strings.HasPrefix(name, "TS"): + name = "S" + name[2:] // Yoruba: 'Ts' -> 'S' + case strings.HasPrefix(name, "SH"): + name = "S" + name[2:] // Hausa: 'Sh' -> 'S' } return name } @@ -89,6 +99,34 @@ func (n *Nysiis) generateKey(name string) string { char = prevChar } else if char == 'W' && (prevChar == 'A' || prevChar == 'E' || prevChar == 'I' || prevChar == 'O' || prevChar == 'U') { char = prevChar + } else if char == 'G' && i+1 < len(name) && name[i+1] == 'B' { + char = 'J' // Igbo: 'Gb' -> 'J' + } else if char == 'K' && i+1 < len(name) && name[i+1] == 'P' { + char = 'P' // Igbo: 'Kp' -> 'P' + } else if char == 'N' && i+1 < len(name) && name[i+1] == 'W' { + char = 'W' // Igbo: 'Nw' -> 'W' + } else if char == 'T' && i+1 < len(name) && name[i+1] == 'S' { + char = 'S' // Yoruba: 'Ts' -> 'S' + } else if char == 'S' && i+1 < len(name) && name[i+1] == 'H' { + char = 'S' // Hausa: 'Sh' -> 'S' + } + + // Handle vowel harmony and tonal differences + if n.vowels[char] && i > 0 && n.vowels[prevChar] { + if prevChar == 'A' || prevChar == 'O' || prevChar == 'U' { + if char == 'E' || char == 'I' { + char = 'A' + } + } else if prevChar == 'E' || prevChar == 'I' { + if char == 'A' || char == 'O' || char == 'U' { + char = 'E' + } + } + } + + // Ignore tonal differences + if char >= 'A' && char <= 'Z' { + char = rune(strings.ToUpper(string(char))[0]) } if char != prevChar { diff --git a/nysiis_test.go b/nysiis_test.go index 1d9d36c..9fe5da1 100644 --- a/nysiis_test.go +++ b/nysiis_test.go @@ -20,8 +20,23 @@ func TestNysiis_Encode(t *testing.T) { encodedName3 := nysiis.NewNysiis().Encode(name3) fmt.Printf("Encoded name for %q: %s\n", name3, encodedName3) + name4 := "Olanrewaju Akinyele" + encodedName4 := nysiis.NewNysiis().Encode(name4) + fmt.Printf("Encoded name for %q: %s\n", name4, encodedName4) + + name5 := "Obinwanne Obiora" + encodedName5 := nysiis.NewNysiis().Encode(name5) + fmt.Printf("Encoded name for %q: %s\n", name5, encodedName5) + + name6 := "Abdussalamu Abubakar" + encodedName6 := nysiis.NewNysiis().Encode(name6) + fmt.Printf("Encoded name for %q: %s\n", name6, encodedName6) + // Output: // Encoded name for "Watkins": WATCAN // Encoded name for "Robert Johnson": RABART // Encoded name for "Samantha Williams": SANANT + // Encoded name for "Olanrewaju Akinyele": OLANRA + // Encoded name for "Obinwanne Obiora": OBAWAN + // Encoded name for "Abdussalamu Abubakar": ABDASA }