package braille import ( "os" "path/filepath" "sort" "strings" ) const tableDirectory = "/usr/share/liblouis/tables" type TableOption struct { Label string File string } // AvailableTables lists installed literary and computer tables for the // current message locale. English US also offers UEB tables. func AvailableTables() []TableOption { locale := "" for _, key := range []string{"LC_ALL", "LC_MESSAGES", "LANG"} { if value := os.Getenv(key); value != "" { locale = value break } } return tablesForLocale(tableDirectory, locale) } func tablesForLocale(dir, locale string) []TableOption { locale = strings.ToLower(strings.ReplaceAll(strings.Split(strings.Split(locale, ".")[0], "@")[0], "_", "-")) if locale == "" || locale == "c" || locale == "posix" { locale = "en-us" } entries, err := os.ReadDir(dir) if err != nil { return nil } var result []TableOption for _, entry := range entries { name := entry.Name() lower := strings.ToLower(name) if entry.IsDir() || !(strings.HasSuffix(lower, ".ctb") || strings.HasSuffix(lower, ".utb")) || strings.Contains(lower, "interline") || strings.Contains(lower, "mathtext") || !(strings.HasPrefix(lower, locale+"-") || locale == "en-us" && strings.HasPrefix(lower, "en-ueb-")) { continue } label := strings.TrimSuffix(strings.TrimSuffix(name, ".ctb"), ".utb") label = strings.ReplaceAll(label, "-g1", " Grade 1") label = strings.ReplaceAll(label, "-g2", " Grade 2") label = strings.ReplaceAll(label, "-g3", " Grade 3") result = append(result, TableOption{Label: label, File: filepath.Join(dir, name)}) } sort.Slice(result, func(i, j int) bool { return result[i].Label < result[j].Label }) return result }