From 7d75398332647605bde4c175f640f3b2dc8ca05e Mon Sep 17 00:00:00 2001 From: "yakumo.izuru" Date: Wed, 14 May 2025 15:38:01 +0000 Subject: [PATCH] =?UTF-8?q?=E3=81=99=E3=81=B9=E3=81=A6=E3=82=92=E6=9B=B8?= =?UTF-8?q?=E3=81=8D=E7=9B=B4=E3=81=97=E3=80=813.0.0=E3=82=92=E3=83=AA?= =?UTF-8?q?=E3=83=AA=E3=83=BC=E3=82=B9=E3=81=97=E3=81=BE=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///srv/svn/repo/suwako/trunk@31 0b558ee1-521d-8b46-a41b-40029c97c055 --- COPYING | 2 +- README.md | 19 ++++----- cmd/root.go | 101 +++++++++++++++++++++++++++++++++++++++++++++ cmd/suwako/main.go | 100 -------------------------------------------- doc.go | 2 - go.mod | 12 ++++-- go.sum | 21 ++++++---- main.go | 11 +++++ suwako.1 | 17 ++++---- suwako.conf.5 | 20 ++++----- version.go | 50 ---------------------- 11 files changed, 160 insertions(+), 195 deletions(-) create mode 100644 cmd/root.go delete mode 100644 cmd/suwako/main.go delete mode 100644 doc.go create mode 100644 main.go delete mode 100644 version.go diff --git a/COPYING b/COPYING index e31cea1..d573761 100644 --- a/COPYING +++ b/COPYING @@ -1,7 +1,7 @@ /* * ---------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42.1): - * wrote this file. As long as you retain this notice you + * wrote this file. As long as you retain this notice you * can do whatever you want with this stuff. If we meet some day, and you think * this stuff is worth it, you can buy me a bottle of sake in return Izuru Yakumo * ---------------------------------------------------------------------------- diff --git a/README.md b/README.md index 6e84d8b..f25e9a7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -SUWAKO(1) - FreeBSD General Commands Manual +SUWAKO(1) - General Commands Manual # NAME @@ -7,17 +7,16 @@ SUWAKO(1) - FreeBSD General Commands Manual # SYNOPSIS **suwako** -\[**-f** *from*] -\[**-t** *to*] -\[*input*] +**-f** *from* +**-t** *to* +*input* # DESCRIPTION Self-explanatory, besides, this was made as a rewrite from a shell script that had curl and awk for dependencies. -It fully serves -as a drop-in replacement. +It fully serves as a drop-in replacement. # USAGE @@ -40,11 +39,11 @@ suwako.conf(5) # AUTHORS -Izuru Yakumo <[yakumo.izuru@chaotic.ninja](mailto:yakumo.izuru@chaotic.ninja)> +Izuru Yakumo <[eternal-servant@yakumo.dev](mailto:eternal-servant@yakumo.dev)> # BUGS -You cannot translate the string "version", this is -a direct consequence of using flaggy. +Mozhi instances use translated-text as opposed to translated\_text +coming from SimplyTranslate instances. -FreeBSD 13.2-RELEASE-p4 - December 16, 2023 +NetBSD 10.1 - May 14, 2025 diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000..b87a2ca --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,101 @@ +/* +Copyright © 2025 Izuru Yakumo + +*/ +package cmd + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + "net/url" + "os" + "strings" + + "github.com/spf13/cobra" + "gopkg.in/ini.v1" +) + +var ( + cfgFile string + input string + output string +) + +var conf struct { + endpoint string + engine string +} + +type Translate struct { + Output string `json:"translated_text"` +} + +var rootCmd = &cobra.Command{ + Use: "suwako", + Short: "A client for SimplyTranslate with illusionary origins", + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + _split := fmt.Sprint(args) + text := fmt.Sprint(strings.Trim(_split, "[]")) + if len(output) == 0 { + log.Fatalf("\033[1;31m%s\033[0m\n", "No target language") + } + var translate Translate + encInput := url.PathEscape(text) + queryURL := conf.endpoint + "/api/translate" + "?engine=" + conf.engine + "&from=" + input + "&to=" + output + "&text=" + encInput + resp, err := http.Get(queryURL) + CheckErr(err) + defer resp.Body.Close() + + _ = json.NewDecoder(resp.Body).Decode(&translate) + CheckErr(err) + if len(translate.Output) == 0 { + log.Fatalf("\033[1;31m%s\033[0m\n", "There was no output, maybe the endpoint is down?") + } else { + fmt.Printf("%v\n", translate.Output) + } + }, + Version: "3.0.0", +} +func CheckErr(err error) { + if err != nil { + log.Fatal(err) + } +} +func Execute() { + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } +} + +func init() { + cobra.OnInitialize(initConfig) + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $XDG_CONFIG_HOME/suwako.ini)") + rootCmd.PersistentFlags().StringVarP(&input, "from", "f", "auto", "language to translate from (default is auto)") + rootCmd.PersistentFlags().StringVarP(&output, "to", "t", "", "target language") +} +func parseConfig(file string) error { + cfg, err := ini.Load(file) + CheckErr(err) + + conf.endpoint = cfg.Section("suwako").Key("endpoint").String() + conf.engine = cfg.Section("suwako").Key("engine").String() + + return nil +} +func initConfig() { + if cfgFile != "" { + parseConfig(cfgFile) + + } else { + // Find home directory. + xdg, err := os.UserConfigDir() + CheckErr(err) + defaultCfgPath := xdg + "/suwako.ini" + parseConfig(defaultCfgPath) + } + +} diff --git a/cmd/suwako/main.go b/cmd/suwako/main.go deleted file mode 100644 index 147baaf..0000000 --- a/cmd/suwako/main.go +++ /dev/null @@ -1,100 +0,0 @@ -// $TheSupernovaDuo: suwako,v 1.5.5 2024/01/20 21:07:30 yakumo_izuru Exp $ -// Command line client for SimplyTranslate, a privacy friendly frontend to other translation engines -package main - -import ( - "encoding/json" - "fmt" - "log" - "net/http" - "net/url" - "os" - - "github.com/integrii/flaggy" - "gopkg.in/ini.v1" - "marisa.chaotic.ninja/suwako" -) - -var conf struct { - engine string - instance string -} - -var ( - input string - source string = "auto" - target string -) - -type Translate struct { - Output string `json:"translated_text"` -} - -func errCheck(err error) { - if err != nil { - log.Println("Something happened :(") - log.Fatal(err) - } -} - -func iniLoad(file string) error { - cfg, err := ini.Load(file) - if err != nil { - return err - } - conf.engine = cfg.Section("suwako").Key("engine").String() - conf.instance = cfg.Section("suwako").Key("instance").String() - - return nil -} - -func flagParse() { - flaggy.SetName("suwako") - flaggy.SetDescription("Command line client for SimplyTranslate") - flaggy.SetVersion(suwako.FullVersion()) - - flaggy.String(&source, "f", "from", "Source language") - flaggy.String(&target, "t", "to", "Target language") - flaggy.AddPositionalValue(&input, "input", 1, true, "Text to translate") - - flaggy.Parse() -} - -func main() { - // Flag parsing - flagParse() - - // Load configuration file - config, err := os.UserConfigDir() - errCheck(err) - cfgfile := config + "/suwako/suwako.ini" - iniLoad(cfgfile) - - // Verify command-line inputs - if len(target) == 0 { - log.Fatal("No target language") - } - - // Map variable to struct - var translate Translate - - // Encode input just in case - var encInput = url.PathEscape(input) - - // Construct the final path to query - var queryURL = conf.instance + "/api/translate/" + "?engine=" + conf.engine + "&from=" + source + "&to=" + target + "&text=" + encInput - - // Shoot danmaku to path - resp, err := http.Get(queryURL) - errCheck(err) - defer resp.Body.Close() - - // Decode JSON response, discard everything else, print to standard output - _ = json.NewDecoder(resp.Body).Decode(&translate) - errCheck(err) - if len(translate.Output) == 0 { - log.Fatal("There was no output, maybe the server was down?") - } else { - fmt.Printf("%v\n", translate.Output) - } -} diff --git a/doc.go b/doc.go deleted file mode 100644 index 730eb37..0000000 --- a/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// package suwako is yet another client for SimplyTranslate https://simple-web.org/projects/simplytranslate.html written in Go. -package suwako diff --git a/go.mod b/go.mod index f7ceef2..12d2948 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,16 @@ module marisa.chaotic.ninja/suwako -go 1.18 +go 1.21.0 + +toolchain go1.23.8 require ( - github.com/integrii/flaggy v1.5.2 + github.com/spf13/cobra v1.9.1 gopkg.in/ini.v1 v1.67.0 ) -require github.com/stretchr/testify v1.8.4 // indirect +require ( + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/stretchr/testify v1.10.0 // indirect +) diff --git a/go.sum b/go.sum index 684fb31..1ecc26f 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,19 @@ +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/integrii/flaggy v1.5.2 h1:bWV20MQEngo4hWhno3i5Z9ISPxLPKj9NOGNwTWb/8IQ= -github.com/integrii/flaggy v1.5.2/go.mod h1:dO13u7SYuhk910nayCJ+s1DeAAGC1THCMj1uSFmwtQ8= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go new file mode 100644 index 0000000..3337f7a --- /dev/null +++ b/main.go @@ -0,0 +1,11 @@ +/* +Copyright © 2025 Izuru Yakumo + +*/ +package main + +import "marisa.chaotic.ninja/suwako/cmd" + +func main() { + cmd.Execute() +} diff --git a/suwako.1 b/suwako.1 index 984e9dc..487d245 100644 --- a/suwako.1 +++ b/suwako.1 @@ -1,4 +1,4 @@ -.Dd $Mdocdate$ +.Dd May 14, 2025 .Dt SUWAKO 1 .Os .Sh NAME @@ -6,15 +6,14 @@ .Nd Command-line client for SimplyTranslate .Sh SYNOPSIS .Nm -.Op Fl f Ar from -.Op Fl t Ar to -.Op Ar input +.Fl f Ar from +.Fl t Ar to +.Ar input .Sh DESCRIPTION Self-explanatory, besides, this was made as a rewrite from a shell script that had curl and awk for dependencies. -It fully serves -as a drop-in replacement. +It fully serves as a drop-in replacement. .Sh USAGE .Bl -tag -width 11n -compact .It Fl f @@ -28,7 +27,7 @@ Text to be translated .Sh SEE ALSO .Xr suwako.conf 5 .Sh AUTHORS -.An Izuru Yakumo Aq Mt yakumo.izuru@chaotic.ninja +.An Izuru Yakumo Aq Mt eternal-servant@yakumo.dev .Sh BUGS -You cannot translate the string "version", this is -a direct consequence of using flaggy. +Mozhi instances use translated-text as opposed to translated_text +coming from SimplyTranslate instances. diff --git a/suwako.conf.5 b/suwako.conf.5 index 39c0e98..9545bd8 100644 --- a/suwako.conf.5 +++ b/suwako.conf.5 @@ -1,26 +1,20 @@ -.Dd $Mdocdate$ +.Dd May 14, 2025 .Dt SUWAKO.CONF 5 .Os .Sh NAME .Nm suwako.conf -.Nd INI-style configuration file for -.Xr suwako 1 +.Nd INI-style configuration file for suwako .Sh DESCRIPTION The .Nm file specifies the instance address, including the API path and the translation engine to be used on -the -.Xr suwako 1 -command. +.Nm suwako .Sh OPTIONS .Bl -tag -width 11n -compact -.It instance -Contains the HTTPS URI to the -server's up to the -.Sy /api/translate -endpoint. +.It endpoint +Contains the HTTPS URI to the instance .It engine For most use cases, the .Em google @@ -30,7 +24,7 @@ support more translation engines. .El .Sh FILES -.Pa ~/.suwako/suwako.conf +.Pa ~/.config/suwako.ini path to this file .Sh AUTHORS -.An Izuru Yakumo Aq Mt yakumo.izuru@chaotic.ninja +.An Izuru Yakumo Aq Mt eternal-servant@yakumo.dev diff --git a/version.go b/version.go deleted file mode 100644 index 144213d..0000000 --- a/version.go +++ /dev/null @@ -1,50 +0,0 @@ -package suwako - -import ( - "fmt" - "runtime/debug" - "strings" -) - -const ( - defaultVersion = "0.0.0" - defaultCommit = "HEAD" - defaultBuild = "0000-01-01:00:00+00:00" -) - -var ( - // Version is the tagged release version in the form .. - // following semantic versioning and is overwritten by the build system. - Version = defaultVersion - - // Commit is the commit sha of the build (normally from Git) and is overwritten - // by the build system. - Commit = defaultCommit - - // Build is the date and time of the build as an RFC3339 formatted string - // and is overwritten by the build system. - Build = defaultBuild -) - -// FullVersion display the full version and build -func FullVersion() string { - var sb strings.Builder - - isDefault := Version == defaultVersion && Commit == defaultCommit && Build == defaultBuild - - if !isDefault { - sb.WriteString(fmt.Sprintf("%s@%s %s", Version, Commit, Build)) - } - - if info, ok := debug.ReadBuildInfo(); ok { - if isDefault { - sb.WriteString(fmt.Sprintf(" %s", info.Main.Version)) - } - sb.WriteString(fmt.Sprintf(" %s", info.GoVersion)) - if info.Main.Sum != "" { - sb.WriteString(fmt.Sprintf(" %s", info.Main.Sum)) - } - } - - return sb.String() -}