github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/mix/charset.go (about) 1 package mix 2 3 import ( 4 "errors" 5 "fmt" 6 ) 7 8 var ErrInvalidChar = errors.New("mix: invalid character") 9 10 var mix2utf = []rune(` ABCDEFGHIΔJKLMNOPQRΣΠSTUVWXYZ0123456789.,()+-*/=$<>@;:'`) 11 var utf2mix = make(map[rune]int) 12 13 func init() { 14 for i, v := range mix2utf { 15 utf2mix[v] = i 16 } 17 } 18 19 func ConvertToUTF8(w []Word) string { 20 var r []rune 21 for _, v := range w { 22 for f := 1; f <= 5; f++ { 23 r = append(r, mix2utf[v.Field(Spec(f, f))]) 24 } 25 } 26 return string(r) 27 } 28 29 func ConvertToMIX(s string) ([]Word, error) { 30 var w []Word 31 f := 0 32 for _, r := range s { 33 if f = f%5 + 1; f == 1 { 34 w = append(w, 0) 35 } 36 c, ok := utf2mix[r] 37 if !ok { 38 return nil, charError(r) 39 } 40 w[len(w)-1].SetField(Spec(f, f), NewWord(c)) 41 } 42 return w, nil 43 } 44 45 func charError(r rune) error { 46 return fmt.Errorf("%w: %#U", ErrInvalidChar, r) 47 } 48 49 func IsChar(r rune) bool { 50 _, ok := utf2mix[r] 51 return ok 52 } 53 54 func IsDigit(r rune) bool { 55 return r >= '0' && r <= '9' 56 } 57 58 func IsLetter(r rune) bool { 59 return (r >= 'A' && r <= 'Z') || r == 'Δ' || r == 'Σ' || r == 'Π' 60 } 61 62 func IsSpace(r rune) bool { 63 return r == ' ' 64 }