trans-alfred/main.go

101 lines
2.0 KiB
Go
Raw Normal View History

2019-04-05 23:02:12 +00:00
package main
import (
2019-04-06 16:09:02 +00:00
"log"
2019-04-05 23:02:12 +00:00
"os"
"strings"
2019-04-06 16:09:02 +00:00
"./trans"
"github.com/deanishe/awgo"
"regexp"
2019-12-24 21:40:10 +00:00
"fmt"
2019-04-05 23:02:12 +00:00
)
func main() {
translations := translateProgramArgs()
2019-12-24 21:40:10 +00:00
if !runningInAlfred() {
runAsCliTool(translations)
} else {
runAsAlfredWorkflow(translations)
}
2019-04-06 16:09:02 +00:00
}
func translateProgramArgs() []string {
2019-04-06 16:09:02 +00:00
word, fromLang, toLang := parseProgramArgs(os.Args)
if fromLang == "" && toLang == "" {
fromLang, toLang = decideWhatLanguagesToUse(word)
}
2019-04-06 16:09:02 +00:00
2019-10-13 16:11:29 +00:00
t := trans.New(word)
t.Language = fromLang
translations := t.Translate(toLang)
return translations
2019-04-06 16:09:02 +00:00
}
func parseProgramArgs(args []string) (string, string, string) {
if len(args) < 2 {
log.Fatal("Not enough arguments!")
}
word := strings.Join(args[1:], " ")
fromLang, toLang := "", ""
if len(args) > 2 {
if isTransLanguageSpecifier(args[1]) {
languages := strings.Split(os.Args[1], ":")
fromLang, toLang = languages[0], languages[1]
word = strings.Join(os.Args[2:], " ")
}
}
return word, fromLang, toLang
}
func isTransLanguageSpecifier(arg string) bool {
ok, _ := regexp.MatchString("(\\w{2})?:(\\w{2})?", os.Args[1])
return ok
2019-04-05 23:02:12 +00:00
}
func decideWhatLanguagesToUse(word string) (string, string) {
2019-10-13 16:11:29 +00:00
fromLang := trans.New(word).Identify()
toLang := map[string]string{
"en": "hu",
"hu": "en",
}[fromLang]
if toLang == "" {
toLang = "en"
}
return fromLang, toLang
}
2019-12-24 21:40:10 +00:00
func runningInAlfred() bool {
envVarsSetByAlfred := []string {
"alfred_version",
"alfred_workflow_uid",
"alfred_workflow_data",
}
for _, envVar := range envVarsSetByAlfred {
if _, ok := os.LookupEnv(envVar); !ok {
return false
}
}
return true
}
func runAsCliTool(translations []string) {
for _, translation := range translations {
fmt.Println(translation)
}
}
func runAsAlfredWorkflow(translations []string) {
wf := aw.New()
wf.Run(func() {
for _, translation := range translations {
wf.NewItem(translation).Arg(translation).Valid(true)
}
wf.WarnEmpty("No results", "Try a different query?")
wf.SendFeedback()
})
}