From 139179ff13772fd8723e6b8a23c33704ead39cd0 Mon Sep 17 00:00:00 2001 From: marltake Date: Tue, 10 Sep 2019 00:22:34 +0900 Subject: [PATCH 1/4] add request --- kadai1/marltake/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 kadai1/marltake/README.md diff --git a/kadai1/marltake/README.md b/kadai1/marltake/README.md new file mode 100644 index 0000000..e72fb2f --- /dev/null +++ b/kadai1/marltake/README.md @@ -0,0 +1,14 @@ +# 課題1回答 +## 画像変換コマンド仕様 +* 指定されたディレクトリ以下の画像ファイルを再帰的に検索して処理する +* デフォルトはJPGファイルをPNGファイルに変換 +* オプションで変更前後の形式を指定可能 + * 前後のフォーマットが同じオプションは指定不可 + * 返還後のファイル名が存在する場合は、処理をskip + * -i 問い合わせる、-f 強制上書きとかできるかな +## 実装条件 +* mainパッケージと分離する +* 自作パッケージと標準パッケージと準標準パッケージのみ使う + * 準標準パッケージ:golang.org/x以下のパッケージ +* ユーザ定義型を作ってみる +* GoDocを生成してみる From 4a40fda67433d35bbbfc493c763dad5c212ed82a Mon Sep 17 00:00:00 2001 From: marltake Date: Tue, 10 Sep 2019 00:23:42 +0900 Subject: [PATCH 2/4] 1st work code --- kadai1/marltake/convert/convert.go | 73 ++++++++++++++++++++++++++++++ kadai1/marltake/main.go | 23 ++++++++++ 2 files changed, 96 insertions(+) create mode 100644 kadai1/marltake/convert/convert.go create mode 100644 kadai1/marltake/main.go diff --git a/kadai1/marltake/convert/convert.go b/kadai1/marltake/convert/convert.go new file mode 100644 index 0000000..b766c8b --- /dev/null +++ b/kadai1/marltake/convert/convert.go @@ -0,0 +1,73 @@ +package convert + +import ( + "image" + "image/gif" + "image/jpeg" + "image/png" + "os" + "path/filepath" + "strings" +) + +func ConfigConvert(src string, dest string) func(string, os.FileInfo, error) error { + srcExt := "." + src + lenSrcExt := len(srcExt) + destExt := "." + dest + // TODO declare decode for src and encode for dest here + return func(path string, info os.FileInfo, err error) error { + println(path) + if strings.ToLower(filepath.Ext(path)) == srcExt { + destPath := path[:len(path)-lenSrcExt] + destExt + // TODO error handling + if _, err := os.Stat(destPath); os.IsNotExist(err) { + file, _ := os.Open(path) + defer file.Close() + var img image.Image + switch src { + case "jpg": + img, _ = jpeg.Decode(file) + case "png": + img, _ = png.Decode(file) + case "gif": + img, _ = gif.Decode(file) + } + destfile, _ := os.Create(destPath) + defer destfile.Close() + switch dest { + case "jpg": + jpeg.Encode(destfile, img, nil) + case "png": + png.Encode(destfile, img) + case "gif": + gif.Encode(destfile, img, nil) + } + } else { + println("skip not to over write.", path) + } + } + return nil + } +} + +func ParseTarget(target string) (src string, dest string, ok bool) { + targets := strings.Split(target, ",") + allowedExt := map[string]bool{ + "jpg": true, + "png": true, + "gif": true, + } + if len(targets) != 2 { + return "", "", false + } + if targets[0] == "" { + targets[0] = "Jpg" + } + if targets[1] == "" { + targets[1] = "png" + } + if targets[0] != targets[1] && allowedExt[targets[0]] && allowedExt[targets[1]] { + return targets[0], targets[1], true + } + return "", "", false +} diff --git a/kadai1/marltake/main.go b/kadai1/marltake/main.go new file mode 100644 index 0000000..0888556 --- /dev/null +++ b/kadai1/marltake/main.go @@ -0,0 +1,23 @@ +package main + +import ( + "flag" + "fmt" + "log" + "path/filepath" + + "./convert" +) + +func main() { + var target = flag.String("t", "jpg,png", "source and destination picture type") + flag.Parse() + src, dest, ok := convert.ParseTarget(*target) + if !ok { + log.Fatal(fmt.Errorf("Invalid target option %s", *target)) + } + err := filepath.Walk(flag.Arg(0), convert.ConfigConvert(src, dest)) + if err != nil { + log.Fatal(err) + } +} From d5694b55397857e9e3c4ac5a8e010d6582d67407 Mon Sep 17 00:00:00 2001 From: marltake Date: Tue, 10 Sep 2019 00:24:37 +0900 Subject: [PATCH 3/4] just return when using named return --- kadai1/marltake/convert/convert.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/kadai1/marltake/convert/convert.go b/kadai1/marltake/convert/convert.go index b766c8b..b1e34ec 100644 --- a/kadai1/marltake/convert/convert.go +++ b/kadai1/marltake/convert/convert.go @@ -57,17 +57,23 @@ func ParseTarget(target string) (src string, dest string, ok bool) { "png": true, "gif": true, } + src, dest, ok = "", "", false if len(targets) != 2 { - return "", "", false + return } if targets[0] == "" { - targets[0] = "Jpg" + src = "jpg" + } else { + src = targets[0] } if targets[1] == "" { - targets[1] = "png" + dest = "png" + } else { + dest = targets[1] } - if targets[0] != targets[1] && allowedExt[targets[0]] && allowedExt[targets[1]] { - return targets[0], targets[1], true + if src != dest && allowedExt[src] && allowedExt[dest] { + ok = true + return } - return "", "", false + return } From c9a400a06036c60a6125d279156f7f4bea81dda6 Mon Sep 17 00:00:00 2001 From: marltake Date: Tue, 10 Sep 2019 00:25:36 +0900 Subject: [PATCH 4/4] use go module to remove relative import --- kadai1/marltake/go.mod | 3 +++ kadai1/marltake/main.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 kadai1/marltake/go.mod diff --git a/kadai1/marltake/go.mod b/kadai1/marltake/go.mod new file mode 100644 index 0000000..f3e50eb --- /dev/null +++ b/kadai1/marltake/go.mod @@ -0,0 +1,3 @@ +module marltake + +go 1.12 diff --git a/kadai1/marltake/main.go b/kadai1/marltake/main.go index 0888556..2447169 100644 --- a/kadai1/marltake/main.go +++ b/kadai1/marltake/main.go @@ -6,7 +6,7 @@ import ( "log" "path/filepath" - "./convert" + "marltake/convert" ) func main() {