すべてを書き直し、3.0.0をリリースします
git-svn-id: file:///srv/svn/repo/suwako/trunk@31 0b558ee1-521d-8b46-a41b-40029c97c055
This commit is contained in:
2
COPYING
2
COPYING
@@ -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
|
||||
* ----------------------------------------------------------------------------
|
||||
|
||||
19
README.md
19
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
|
||||
|
||||
101
cmd/root.go
Normal file
101
cmd/root.go
Normal 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)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
2
doc.go
@@ -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
12
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
|
||||
)
|
||||
|
||||
21
go.sum
21
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=
|
||||
|
||||
11
main.go
Normal file
11
main.go
Normal 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()
|
||||
}
|
||||
17
suwako.1
17
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.
|
||||
|
||||
@@ -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
|
||||
|
||||
50
version.go
50
version.go
@@ -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()
|
||||
}
|
||||
Reference in New Issue
Block a user