すべてを書き直し、3.0.0をリリースします

git-svn-id: file:///srv/svn/repo/suwako/trunk@31 0b558ee1-521d-8b46-a41b-40029c97c055
This commit is contained in:
yakumo.izuru
2025-05-14 15:38:01 +00:00
parent 7cece8686a
commit 7d75398332
11 changed files with 160 additions and 195 deletions

View File

@@ -1,7 +1,7 @@
/* /*
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42.1): * "THE BEER-WARE LICENSE" (Revision 42.1):
* <yakumo.izuru@chaotic.ninja> wrote this file. As long as you retain this notice you * <eternal-servant@yakumo.dev> 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 * 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 * this stuff is worth it, you can buy me a bottle of sake in return Izuru Yakumo
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------

View File

@@ -1,4 +1,4 @@
SUWAKO(1) - FreeBSD General Commands Manual SUWAKO(1) - General Commands Manual
# NAME # NAME
@@ -7,17 +7,16 @@ SUWAKO(1) - FreeBSD General Commands Manual
# SYNOPSIS # SYNOPSIS
**suwako** **suwako**
\[**-f**&nbsp;*from*] **-f**&nbsp;*from*
\[**-t**&nbsp;*to*] **-t**&nbsp;*to*
\[*input*] *input*
# DESCRIPTION # DESCRIPTION
Self-explanatory, besides, this was made as Self-explanatory, besides, this was made as
a rewrite from a shell script that had curl a rewrite from a shell script that had curl
and awk for dependencies. and awk for dependencies.
It fully serves It fully serves as a drop-in replacement.
as a drop-in replacement.
# USAGE # USAGE
@@ -40,11 +39,11 @@ suwako.conf(5)
# AUTHORS # AUTHORS
Izuru Yakumo &lt;[yakumo.izuru@chaotic.ninja](mailto:yakumo.izuru@chaotic.ninja)&gt; Izuru Yakumo &lt;[eternal-servant@yakumo.dev](mailto:eternal-servant@yakumo.dev)&gt;
# BUGS # BUGS
You cannot translate the string "version", this is Mozhi instances use translated-text as opposed to translated\_text
a direct consequence of using flaggy. coming from SimplyTranslate instances.
FreeBSD 13.2-RELEASE-p4 - December 16, 2023 NetBSD 10.1 - May 14, 2025

101
cmd/root.go Normal file
View File

@@ -0,0 +1,101 @@
/*
Copyright © 2025 Izuru Yakumo <eternal-servant@yakumo.dev>
*/
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)
}
}

View File

@@ -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)
}
}

2
doc.go
View File

@@ -1,2 +0,0 @@
// package suwako is yet another client for SimplyTranslate https://simple-web.org/projects/simplytranslate.html written in Go.
package suwako

12
go.mod
View File

@@ -1,10 +1,16 @@
module marisa.chaotic.ninja/suwako module marisa.chaotic.ninja/suwako
go 1.18 go 1.21.0
toolchain go1.23.8
require ( require (
github.com/integrii/flaggy v1.5.2 github.com/spf13/cobra v1.9.1
gopkg.in/ini.v1 v1.67.0 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
)

21
go.sum
View File

@@ -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/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/integrii/flaggy v1.5.2 h1:bWV20MQEngo4hWhno3i5Z9ISPxLPKj9NOGNwTWb/8IQ= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/integrii/flaggy v1.5.2/go.mod h1:dO13u7SYuhk910nayCJ+s1DeAAGC1THCMj1uSFmwtQ8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

11
main.go Normal file
View File

@@ -0,0 +1,11 @@
/*
Copyright © 2025 Izuru Yakumo <eternal-servant@yakumo.dev>
*/
package main
import "marisa.chaotic.ninja/suwako/cmd"
func main() {
cmd.Execute()
}

View File

@@ -1,4 +1,4 @@
.Dd $Mdocdate$ .Dd May 14, 2025
.Dt SUWAKO 1 .Dt SUWAKO 1
.Os .Os
.Sh NAME .Sh NAME
@@ -6,15 +6,14 @@
.Nd Command-line client for SimplyTranslate .Nd Command-line client for SimplyTranslate
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl f Ar from .Fl f Ar from
.Op Fl t Ar to .Fl t Ar to
.Op Ar input .Ar input
.Sh DESCRIPTION .Sh DESCRIPTION
Self-explanatory, besides, this was made as Self-explanatory, besides, this was made as
a rewrite from a shell script that had curl a rewrite from a shell script that had curl
and awk for dependencies. and awk for dependencies.
It fully serves It fully serves as a drop-in replacement.
as a drop-in replacement.
.Sh USAGE .Sh USAGE
.Bl -tag -width 11n -compact .Bl -tag -width 11n -compact
.It Fl f .It Fl f
@@ -28,7 +27,7 @@ Text to be translated
.Sh SEE ALSO .Sh SEE ALSO
.Xr suwako.conf 5 .Xr suwako.conf 5
.Sh AUTHORS .Sh AUTHORS
.An Izuru Yakumo Aq Mt yakumo.izuru@chaotic.ninja .An Izuru Yakumo Aq Mt eternal-servant@yakumo.dev
.Sh BUGS .Sh BUGS
You cannot translate the string "version", this is Mozhi instances use translated-text as opposed to translated_text
a direct consequence of using flaggy. coming from SimplyTranslate instances.

View File

@@ -1,26 +1,20 @@
.Dd $Mdocdate$ .Dd May 14, 2025
.Dt SUWAKO.CONF 5 .Dt SUWAKO.CONF 5
.Os .Os
.Sh NAME .Sh NAME
.Nm suwako.conf .Nm suwako.conf
.Nd INI-style configuration file for .Nd INI-style configuration file for suwako
.Xr suwako 1
.Sh DESCRIPTION .Sh DESCRIPTION
The The
.Nm .Nm
file specifies the instance address, file specifies the instance address,
including the API path and the including the API path and the
translation engine to be used on translation engine to be used on
the .Nm suwako
.Xr suwako 1
command.
.Sh OPTIONS .Sh OPTIONS
.Bl -tag -width 11n -compact .Bl -tag -width 11n -compact
.It instance .It endpoint
Contains the HTTPS URI to the Contains the HTTPS URI to the instance
server's up to the
.Sy /api/translate
endpoint.
.It engine .It engine
For most use cases, the For most use cases, the
.Em google .Em google
@@ -30,7 +24,7 @@ support more translation
engines. engines.
.El .El
.Sh FILES .Sh FILES
.Pa ~/.suwako/suwako.conf .Pa ~/.config/suwako.ini
path to this file path to this file
.Sh AUTHORS .Sh AUTHORS
.An Izuru Yakumo Aq Mt yakumo.izuru@chaotic.ninja .An Izuru Yakumo Aq Mt eternal-servant@yakumo.dev

View File

@@ -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 <major>.<minor>.<patch>
// 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()
}