すべてを書き直し、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):
* <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
* 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
@@ -7,17 +7,16 @@ SUWAKO(1) - FreeBSD General Commands Manual
# SYNOPSIS
**suwako**
\[**-f**&nbsp;*from*]
\[**-t**&nbsp;*to*]
\[*input*]
**-f**&nbsp;*from*
**-t**&nbsp;*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 &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
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

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

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/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=

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
.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.

View File

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

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