101 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"log"
 | |
| 	"os"
 | |
| 	"strings"
 | |
| 	"./trans"
 | |
| 	"github.com/deanishe/awgo"
 | |
| 	"regexp"
 | |
| 	"fmt"
 | |
| )
 | |
| 
 | |
| 
 | |
| func main() {
 | |
| 	translations := translateProgramArgs()
 | |
| 
 | |
| 	if !runningInAlfred() {
 | |
| 		runAsCliTool(translations)
 | |
| 	} else {
 | |
| 		runAsAlfredWorkflow(translations)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func translateProgramArgs() []string {
 | |
| 	word, fromLang, toLang := parseProgramArgs(os.Args)
 | |
| 	if fromLang == "" && toLang == "" {
 | |
| 		fromLang, toLang = decideWhatLanguagesToUse(word)
 | |
| 	}
 | |
| 
 | |
| 	t := trans.New(word)
 | |
| 	t.Language = fromLang
 | |
| 	translations := t.Translate(toLang)
 | |
| 	return translations
 | |
| }
 | |
| 
 | |
| 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
 | |
| }
 | |
| 
 | |
| func decideWhatLanguagesToUse(word string) (string, string) {
 | |
| 	fromLang := trans.New(word).Identify()
 | |
| 	toLang := map[string]string{
 | |
| 		"en": "hu",
 | |
| 		"hu": "en",
 | |
| 	}[fromLang]
 | |
| 	if toLang == "" {
 | |
| 		toLang = "en"
 | |
| 	}
 | |
| 	return fromLang, toLang
 | |
| }
 | |
| 
 | |
| 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()
 | |
| 	})
 | |
| }
 |