diff --git a/go.mod b/go.mod index c43611e..26adf79 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,8 @@ require ( github.com/minio/selfupdate v0.6.0 github.com/mitchellh/cli v1.1.5 github.com/pelletier/go-toml/v2 v2.1.0 + github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c + github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef github.com/yuin/goldmark v1.5.6 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) @@ -40,6 +42,8 @@ require ( github.com/spf13/cast v1.5.1 // indirect golang.org/x/crypto v0.17.0 // indirect golang.org/x/image v0.15.0 // indirect + golang.org/x/net v0.10.0 // indirect golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index e9e87a5..054c422 100644 --- a/go.sum +++ b/go.sum @@ -105,6 +105,10 @@ github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= +github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= +github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= +github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -141,6 +145,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -166,6 +172,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/internal/build/frontmatter.go b/internal/build/frontmatter.go index 0382757..e22c945 100644 --- a/internal/build/frontmatter.go +++ b/internal/build/frontmatter.go @@ -8,10 +8,11 @@ import ( "net/http" "unicode/utf8" - "golang.org/x/image/draw" + "github.com/srwiley/oksvg" + "github.com/srwiley/rasterx" ) -const emojiPngSize = 72 +const emojiPngSize = 400 type YamlFrontMatter struct { Author string `yaml:"author"` @@ -41,14 +42,8 @@ func (y *YamlFrontMatter) saveTwemojiImage(w io.Writer, ext string) error { if ext != ".svg" && ext != "png" { return fmt.Errorf("unsupported file extension: %s", ext) } - var url string - if ext == "svg" { - url = fmt.Sprintf("https://jdecked.github.io/twemoji/v/latest/svg/%s.svg", codepoint) - } else if ext == "png" { - url = fmt.Sprintf("https://jdecked.github.io/twemoji/v/latest/72x72/%s.png", codepoint) - } - res, err := http.Get(url) + res, err := http.Get(fmt.Sprintf("https://jdecked.github.io/twemoji/v/latest/svg/%s.svg", codepoint)) if err != nil { return err } @@ -56,15 +51,13 @@ func (y *YamlFrontMatter) saveTwemojiImage(w io.Writer, ext string) error { return fmt.Errorf("failed to download emoji: %s", res.Status) } - // png の場合はリサイズする + // png の場合 svg から変換する if ext == "png" { - img, err := png.Decode(res.Body) - if err != nil { - return err - } - newImage := image.NewRGBA(image.Rect(0, 0, emojiPngSize*2, emojiPngSize*2)) - draw.BiLinear.Scale(newImage, newImage.Bounds(), img, img.Bounds(), draw.Over, nil) - return png.Encode(w, newImage) + icon, _ := oksvg.ReadIconStream(res.Body) + icon.SetTarget(0, 0, float64(emojiPngSize), float64(emojiPngSize)) + rgba := image.NewRGBA(image.Rect(0, 0, emojiPngSize, emojiPngSize)) + icon.Draw(rasterx.NewDasher(emojiPngSize, emojiPngSize, rasterx.NewScannerGV(emojiPngSize, emojiPngSize, rgba, rgba.Bounds())), 1) + return png.Encode(w, rgba) } else { _, err = io.Copy(w, res.Body) return err