Skip to content

Commit

Permalink
Try to adapt "Bulgaria"-case algorithm (WIP)
Browse files Browse the repository at this point in the history
  • Loading branch information
petarov committed May 15, 2024
1 parent e325b13 commit 4fe9ca3
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 37 deletions.
51 changes: 39 additions & 12 deletions translitbg.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,42 @@ func isUpperBGChar(r rune) bool {

// tryDoBulgaria returns true for the case where input s is the text "България".
// In this case the "ъ" needs to be trasformed into an "u" as the law dictates
func tryDoBulgaria(input string) (bool, string) {
runes := []rune(input)
func tryDoBulgaria(ch rune, source *bytes.Buffer) (string, error) {
reads := 0
dest := make([]rune, 8)

for i, r := range runes {
if BULGARIA_CYR_LOW[i] == r {
for i := 0; i < 8; i++ {
if BULGARIA_CYR_LOW[i] == ch {
dest[i] = BULGARIA_LAT_LOW[i]
} else if BULGARIA_CYR_UP[i] == r {
} else if BULGARIA_CYR_UP[i] == ch {
dest[i] = BULGARIA_LAT_UP[i]
} else {
return false, ""
break
}

ch2, _, err := source.ReadRune()
reads++

if err == io.EOF {
break
} else if err != nil {
return "", fmt.Errorf("error reading source text: %v", err)
}

ch = ch2
}

return true, string(dest)
if reads == 8 {
return string(dest), nil
}

fmt.Println("unreading reads", reads)

for c := 0; c < reads; c++ {
source.UnreadRune()
}

return "", nil
}

func New() *TranslitBG {
Expand All @@ -65,11 +86,6 @@ func (tr *TranslitBG) Encode(input string) (string, error) {
length := len(input)
if length == 0 {
return "", nil
} else if length == 16 {
ok, result := tryDoBulgaria(input)
if ok {
return result, nil
}
}

source := bytes.NewBufferString(input)
Expand All @@ -85,6 +101,17 @@ func (tr *TranslitBG) Encode(input string) (string, error) {
return "", fmt.Errorf("error reading source text: %v", err)
}

if BULGARIA_CYR_LOW[0] == ch || BULGARIA_CYR_UP[0] == ch {
str, err := tryDoBulgaria(ch, source)
if err != nil {
return "", fmt.Errorf("error parsing bg text: %v", err)
} else if len(str) > 0 {
dest.WriteString(str)
ch_1 = str[len(str)-1:]
continue
}
}

if isBGChar(ch) {
ch2, _, err := source.ReadRune()

Expand Down
55 changes: 30 additions & 25 deletions translitbg_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,31 +13,6 @@ func TestAlphabet(t *testing.T) {
}
}

func TestSentences(t *testing.T) {
testCases := []struct {
input string
expected string
}{
{"Всички хора се раждат свободни и равни по достойнство и права. Те са надарени с разум и съвест и следва да се отнасят помежду си в дух на братство.", "Vsichki hora se razhdat svobodni i ravni po dostoynstvo i prava. Te sa nadareni s razum i savest i sledva da se otnasyat pomezhdu si v duh na bratstvo."},
{"Всички хора \nсе раждат свободни\n и равни по достойнство\n и права.", "Vsichki hora \nse razhdat svobodni\n i ravni po dostoynstvo\n i prava."},
{"Ѝ може да бъде намерен и в други езици \nкато руския език и украинския език.", "I mozhe da bade nameren i v drugi ezitsi \nkato ruskia ezik i ukrainskia ezik."},
{"СанЯ е на път за ЦаревеЦ-крепост и има МАНТИЯ от Желязо и Злато, носи ЖЕзъл и корона.", "SanYA e na pat za TsareveTS-krepost i ima MANTIA ot Zhelyazo i Zlato, nosi ZHEzal i korona."},
// mixed
{"Seдем с едin udар", "Sedem s edin udar"},
{"Внезapna-smqна-на-$олаri-i-еüро", "Vnezapna-smqna-na-$olari-i-eüro"},
}

tr := New()

for _, tc := range testCases {
output, _ := tr.Encode(tc.input)

if output != tc.expected {
t.Errorf("For sentence '%s', expected '%s', got '%s'", tc.input, tc.expected, output)
}
}
}

func TestEdgeCases(t *testing.T) {
testCases := []struct {
input string
Expand Down Expand Up @@ -356,3 +331,33 @@ func Test100Words(t *testing.T) {
}
}
}

func TestSentences(t *testing.T) {
testCases := []struct {
input string
expected string
}{
{"Всички хора се раждат свободни и равни по достойнство и права. Те са надарени с разум и съвест и следва да се отнасят помежду си в дух на братство.", "Vsichki hora se razhdat svobodni i ravni po dostoynstvo i prava. Te sa nadareni s razum i savest i sledva da se otnasyat pomezhdu si v duh na bratstvo."},
{"Всички хора \nсе раждат свободни\n и равни по достойнство\n и права.", "Vsichki hora \nse razhdat svobodni\n i ravni po dostoynstvo\n i prava."},
{"Ѝ може да бъде намерен и в други езици \nкато руския език и украинския език.", "I mozhe da bade nameren i v drugi ezitsi \nkato ruskia ezik i ukrainskia ezik."},
{"СанЯ е на път за ЦаревеЦ-крепост и има МАНТИЯ от Желязо и Злато, носи ЖЕзъл и корона.", "SanYA e na pat za TsareveTS-krepost i ima MANTIA ot Zhelyazo i Zlato, nosi ZHEzal i korona."},
// mixed
{"Seдем с едin udар", "Sedem s edin udar"},
{"Внезapna-smqна-на-$олаri-i-еüро", "Vnezapna-smqna-na-$olari-i-eüro"},
// bulgaria
{"Всички в България", "Vsichki v Bulgaria"},
{"Всички в българия са българи", "Vsichki v bulgaria sa balgari"},
{"Всички в БЪЛГАРИЯ са БЪЛГАРИ", "Vsichki v BULGARIA sa BALGARI"},
{"Всички в БъЛгАриЯ са БълГаРИ", "Vsichki v BuLgAriA sa BalGaRI"},
}

tr := New()

for _, tc := range testCases {
output, _ := tr.Encode(tc.input)

if output != tc.expected {
t.Errorf("For sentence '%s', expected '%s', got '%s'", tc.input, tc.expected, output)
}
}
}

0 comments on commit 4fe9ca3

Please sign in to comment.