Use interface to allow for more complex transliteration implementations
This commit is contained in:
parent
471de06158
commit
91f2f28076
@ -73,11 +73,10 @@ func initNotifRelay(dev *infinitime.Device) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
maps := viper.GetStringSlice("notifs.translit.maps.use")
|
maps := viper.GetStringSlice("notifs.translit.maps.use")
|
||||||
translit.Maps["custom"] = viper.GetStringSlice("notifs.translit.maps.custom")
|
translit.Maps["custom"] = translit.Map(viper.GetStringSlice("notifs.translit.maps.custom"))
|
||||||
replacer := translit.NewReplacer(maps...)
|
sender = translit.Transliterate(sender, maps...)
|
||||||
sender = replacer.Replace(sender)
|
summary = translit.Transliterate(summary, maps...)
|
||||||
summary = replacer.Replace(summary)
|
body = translit.Transliterate(body, maps...)
|
||||||
body = replacer.Replace(body)
|
|
||||||
|
|
||||||
var msg string
|
var msg string
|
||||||
// If summary does not exist, set message to body.
|
// If summary does not exist, set message to body.
|
||||||
|
@ -171,10 +171,11 @@ func handleConnection(conn net.Conn, dev *infinitime.Device) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
maps := viper.GetStringSlice("notifs.translit.maps.use")
|
maps := viper.GetStringSlice("notifs.translit.maps.use")
|
||||||
translit.Maps["custom"] = viper.GetStringSlice("notifs.translit.maps.custom")
|
translit.Maps["custom"] = translit.Map(viper.GetStringSlice("notifs.translit.maps.custom"))
|
||||||
replacer := translit.NewReplacer(maps...)
|
title := translit.Transliterate(reqData.Title, maps...)
|
||||||
|
body := translit.Transliterate(reqData.Body, maps...)
|
||||||
// Send notification to watch
|
// Send notification to watch
|
||||||
err = dev.Notify(replacer.Replace(reqData.Title), replacer.Replace(reqData.Body))
|
err = dev.Notify(title, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
connErr(conn, err, "Error sending notification")
|
connErr(conn, err, "Error sending notification")
|
||||||
break
|
break
|
||||||
|
@ -4,17 +4,60 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Transliterate runs the given maps on s and returns the result
|
||||||
|
func Transliterate(s string, useMaps ...string) string {
|
||||||
|
// Create variable to store modified string
|
||||||
|
out := s
|
||||||
|
// If custom map exists
|
||||||
|
if customMap, ok := Maps["custom"]; ok {
|
||||||
|
// Perform transliteration with it
|
||||||
|
out = customMap.Transliterate(out)
|
||||||
|
}
|
||||||
|
// For every map to use
|
||||||
|
for _, useMap := range useMaps {
|
||||||
|
// If custom, skip
|
||||||
|
if useMap == "custom" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Get requested map
|
||||||
|
translitMap, ok := Maps[useMap]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Perform transliteration
|
||||||
|
out = translitMap.Transliterate(out)
|
||||||
|
}
|
||||||
|
// Return result
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transliterator is implemented by anything with a
|
||||||
|
// Transliterate method, which performs transliteration
|
||||||
|
// and returns the resulting string.
|
||||||
|
type Transliterator interface {
|
||||||
|
Transliterate(string) string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map implements Transliterator using a slice where
|
||||||
|
// every odd element is a key and every even one is a value
|
||||||
|
// which replaces the key.
|
||||||
|
type Map []string
|
||||||
|
|
||||||
|
func (mt Map) Transliterate(s string) string {
|
||||||
|
return strings.NewReplacer(mt...).Replace(s)
|
||||||
|
}
|
||||||
|
|
||||||
// Maps stores transliteration maps as slices to preserve order.
|
// Maps stores transliteration maps as slices to preserve order.
|
||||||
// Some of these maps were sourced from https://codeberg.org/Freeyourgadget/Gadgetbridge
|
// Some of these maps were sourced from https://codeberg.org/Freeyourgadget/Gadgetbridge
|
||||||
var Maps = map[string][]string{
|
var Maps = map[string]Transliterator{
|
||||||
"eASCII": {
|
"eASCII": Map{
|
||||||
"œ", "oe",
|
"œ", "oe",
|
||||||
"ª", "a",
|
"ª", "a",
|
||||||
"°", "o",
|
"°", "o",
|
||||||
"«", `"`,
|
"«", `"`,
|
||||||
"»", `"`,
|
"»", `"`,
|
||||||
},
|
},
|
||||||
"Scandinavian": {
|
"Scandinavian": Map{
|
||||||
"Æ", "Ae",
|
"Æ", "Ae",
|
||||||
"æ", "ae",
|
"æ", "ae",
|
||||||
"Ø", "Oe",
|
"Ø", "Oe",
|
||||||
@ -22,7 +65,7 @@ var Maps = map[string][]string{
|
|||||||
"Å", "Aa",
|
"Å", "Aa",
|
||||||
"å", "aa",
|
"å", "aa",
|
||||||
},
|
},
|
||||||
"German": {
|
"German": Map{
|
||||||
"ä", "ae",
|
"ä", "ae",
|
||||||
"ö", "oe",
|
"ö", "oe",
|
||||||
"ü", "ue",
|
"ü", "ue",
|
||||||
@ -32,7 +75,7 @@ var Maps = map[string][]string{
|
|||||||
"ß", "ss",
|
"ß", "ss",
|
||||||
"ẞ", "SS",
|
"ẞ", "SS",
|
||||||
},
|
},
|
||||||
"Hebrew": {
|
"Hebrew": Map{
|
||||||
"א", "a",
|
"א", "a",
|
||||||
"ב", "b",
|
"ב", "b",
|
||||||
"ג", "g",
|
"ג", "g",
|
||||||
@ -61,7 +104,7 @@ var Maps = map[string][]string{
|
|||||||
"ם", "m",
|
"ם", "m",
|
||||||
"ן", "n",
|
"ן", "n",
|
||||||
},
|
},
|
||||||
"Greek": {
|
"Greek": Map{
|
||||||
"α", "a",
|
"α", "a",
|
||||||
"ά", "a",
|
"ά", "a",
|
||||||
"β", "v",
|
"β", "v",
|
||||||
@ -132,11 +175,11 @@ var Maps = map[string][]string{
|
|||||||
"Ω", "O",
|
"Ω", "O",
|
||||||
"Ώ", "O",
|
"Ώ", "O",
|
||||||
},
|
},
|
||||||
"Russian": {
|
"Russian": Map{
|
||||||
"Ё", "Йo",
|
"Ё", "Йo",
|
||||||
"ё", "йo",
|
"ё", "йo",
|
||||||
},
|
},
|
||||||
"Ukranian": {
|
"Ukranian": Map{
|
||||||
"ґ", "gh",
|
"ґ", "gh",
|
||||||
"є", "je",
|
"є", "je",
|
||||||
"і", "i",
|
"і", "i",
|
||||||
@ -146,7 +189,7 @@ var Maps = map[string][]string{
|
|||||||
"І", "I",
|
"І", "I",
|
||||||
"Ї", "JI",
|
"Ї", "JI",
|
||||||
},
|
},
|
||||||
"Arabic": {
|
"Arabic": Map{
|
||||||
"ا", "a",
|
"ا", "a",
|
||||||
"ب", "b",
|
"ب", "b",
|
||||||
"ت", "t",
|
"ت", "t",
|
||||||
@ -194,7 +237,7 @@ var Maps = map[string][]string{
|
|||||||
"٨", "8",
|
"٨", "8",
|
||||||
"٩", "9",
|
"٩", "9",
|
||||||
},
|
},
|
||||||
"Farsi": {
|
"Farsi": Map{
|
||||||
"پ", "p",
|
"پ", "p",
|
||||||
"چ", "ch",
|
"چ", "ch",
|
||||||
"ژ", "zh",
|
"ژ", "zh",
|
||||||
@ -223,11 +266,11 @@ var Maps = map[string][]string{
|
|||||||
"ُ", "o",
|
"ُ", "o",
|
||||||
"ّ", "",
|
"ّ", "",
|
||||||
},
|
},
|
||||||
"Polish": {
|
"Polish": Map{
|
||||||
"Ł", "L",
|
"Ł", "L",
|
||||||
"ł", "l",
|
"ł", "l",
|
||||||
},
|
},
|
||||||
"Lithuanian": {
|
"Lithuanian": Map{
|
||||||
"ą", "a",
|
"ą", "a",
|
||||||
"č", "c",
|
"č", "c",
|
||||||
"ę", "e",
|
"ę", "e",
|
||||||
@ -238,7 +281,7 @@ var Maps = map[string][]string{
|
|||||||
"ū", "u",
|
"ū", "u",
|
||||||
"ž", "z",
|
"ž", "z",
|
||||||
},
|
},
|
||||||
"Estonian": {
|
"Estonian": Map{
|
||||||
"ä", "a",
|
"ä", "a",
|
||||||
"Ä", "A",
|
"Ä", "A",
|
||||||
"ö", "o",
|
"ö", "o",
|
||||||
@ -248,13 +291,13 @@ var Maps = map[string][]string{
|
|||||||
"ü", "u",
|
"ü", "u",
|
||||||
"Ü", "U",
|
"Ü", "U",
|
||||||
},
|
},
|
||||||
"Icelandic": {
|
"Icelandic": Map{
|
||||||
"Þ", "Th",
|
"Þ", "Th",
|
||||||
"þ", "th",
|
"þ", "th",
|
||||||
"Ð", "D",
|
"Ð", "D",
|
||||||
"ð", "d",
|
"ð", "d",
|
||||||
},
|
},
|
||||||
"Czeck": {
|
"Czeck": Map{
|
||||||
"ř", "r",
|
"ř", "r",
|
||||||
"ě", "e",
|
"ě", "e",
|
||||||
"ý", "y",
|
"ý", "y",
|
||||||
@ -268,7 +311,7 @@ var Maps = map[string][]string{
|
|||||||
"ť", "t",
|
"ť", "t",
|
||||||
"ň", "n",
|
"ň", "n",
|
||||||
},
|
},
|
||||||
"French": {
|
"French": Map{
|
||||||
"à", "a",
|
"à", "a",
|
||||||
"â", "a",
|
"â", "a",
|
||||||
"é", "e",
|
"é", "e",
|
||||||
@ -280,7 +323,7 @@ var Maps = map[string][]string{
|
|||||||
"ÿ", "y",
|
"ÿ", "y",
|
||||||
"ç", "c",
|
"ç", "c",
|
||||||
},
|
},
|
||||||
"Armenian": {
|
"Armenian": Map{
|
||||||
"աու", "au",
|
"աու", "au",
|
||||||
"բու", "bu",
|
"բու", "bu",
|
||||||
"գու", "gu",
|
"գու", "gu",
|
||||||
@ -393,7 +436,7 @@ var Maps = map[string][]string{
|
|||||||
"ֆ", "f",
|
"ֆ", "f",
|
||||||
"ւ", "",
|
"ւ", "",
|
||||||
},
|
},
|
||||||
"Emoji": {
|
"Emoji": Map{
|
||||||
"😂", ":')",
|
"😂", ":')",
|
||||||
"😊", ":)",
|
"😊", ":)",
|
||||||
"😃", ":)",
|
"😃", ":)",
|
||||||
@ -422,21 +465,3 @@ var Maps = map[string][]string{
|
|||||||
"💤", ":zzz:",
|
"💤", ":zzz:",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewReplacer(useMaps ...string) *strings.Replacer {
|
|
||||||
var replace []string
|
|
||||||
if customMap, ok := Maps["custom"]; ok {
|
|
||||||
replace = append(replace, customMap...)
|
|
||||||
}
|
|
||||||
for _, useMap := range useMaps {
|
|
||||||
if useMap == "custom" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
translitMap, ok := Maps[useMap]
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
replace = append(replace, translitMap...)
|
|
||||||
}
|
|
||||||
return strings.NewReplacer(replace...)
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user