I was looking for a way to transliterate(translate) English numbers to Persian numbers in Go.
Such functionality is usually found in programming languages, but I wasn't expecting too much from Go.
It's very easy to do in Raku:
say 567.trans: '0'..'9' => '۰'..'۹'
=output ۵۶۷
say TR/0..9/۰..۹/ given 567
=output ۵۶۷
For Go I found xstrings module which has a
Translate
function. But the solution I came up with was using
NewReplacer
function from Go's internal strings
module:
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.NewReplacer(`0`, `۰`, `1`, `۱`, `2`, `۲`, `3`, `۳`, `4`, `۴`, `5`, `۵`, `6`, `۶`, `7`, `۷`, `8`, `۸`, `9`, `۹`).Replace(`567`))
}
Go playground link
When I created my Raku programming language website with
Hugo static site generator, I had to manually create the syntax highlighted
html files for code examples shown in the front page, because Hugo used
Chroma(written in Go and uses a
mostly similar API to Pygments) for syntax highlighting which didn't
support Raku. So I opened an issue on Chroma, the discussion showed that you cannot just convert
the Raku lexer from Pygments to Chroma; You would need to create some functions manually, and
Chroma needed a new Emitter
interface which would take the LexerState
as an argument, because
Raku has some complex syntax; the Raku lexer in Pygments had functions for finding closing
brackets matching the opening brackets, and for regex nesting in tokens
, regexes
and
rules
. In the end I realized functions for token nesting were unnecessary.