на главную

figlet_visualizer

20e0e6d

commit 20e0e6d45d248328ea636084c3d65eb8ad2ed0a7
Author: root <root@librejokes.ru>
Date:   Sat Feb 1 10:11:07 2025 +0300

    1.0

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..62c9d27
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+figlet-fonts/
diff --git a/FreeSans.otf b/FreeSans.otf
new file mode 100644
index 0000000..062c939
Binary files /dev/null and b/FreeSans.otf differ
diff --git a/MonospaceBold.ttf b/MonospaceBold.ttf
new file mode 100755
index 0000000..c4f4a87
Binary files /dev/null and b/MonospaceBold.ttf differ
diff --git a/MonospaceOblique.ttf b/MonospaceOblique.ttf
new file mode 100755
index 0000000..dbf8f89
Binary files /dev/null and b/MonospaceOblique.ttf differ
diff --git a/MonospaceRegular.ttf b/MonospaceRegular.ttf
new file mode 100755
index 0000000..2d3289f
Binary files /dev/null and b/MonospaceRegular.ttf differ
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..2e8a3b6
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,12 @@
+module librejokes.ru/gitreps/figlet_visualizer
+
+go 1.23
+
+require (
+	github.com/fogleman/gg v1.3.0 // indirect
+	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
+	github.com/lukesampson/figlet v0.0.0-20190211215653-8a3ef4a6ac42 // indirect
+	github.com/tdewolff/parse/v2 v2.7.19 // indirect
+	golang.org/x/image v0.23.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..8c15304
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,13 @@
+github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
+github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
+github.com/lukesampson/figlet v0.0.0-20190211215653-8a3ef4a6ac42 h1:UtyD+eBVdLYSj5/pjfSR6mtnzMgIiOVcFT024G2l4CY=
+github.com/lukesampson/figlet v0.0.0-20190211215653-8a3ef4a6ac42/go.mod h1:/peI0OaxVYh7fzA72CD7rUsyGVdF7sCiFw7GcYqOcCw=
+github.com/tdewolff/parse/v2 v2.7.19 h1:7Ljh26yj+gdLFEq/7q9LT4SYyKtwQX4ocNrj45UCePg=
+github.com/tdewolff/parse/v2 v2.7.19/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA=
+github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
+golang.org/x/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68=
+golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
diff --git a/hui.go b/hui.go
new file mode 100644
index 0000000..05c7d2a
--- /dev/null
+++ b/hui.go
@@ -0,0 +1,140 @@
+package main
+
+import (
+	"bufio"
+	"bytes"
+	"fmt"
+	"image"
+	"image/color"
+	"image/jpeg"
+	"net/http"
+	"os"
+	"strconv"
+	"strings"
+
+	"github.com/fogleman/gg"
+	"github.com/lukesampson/figlet/figletlib"
+
+	"golang.org/x/image/font"
+	"golang.org/x/image/font/opentype"
+)
+
+func generate_image(w int, h int, chrs []string, fnt string, figfnt string, clr color.RGBA, cltx color.RGBA) *image.RGBA {
+
+	//draw.Draw(img, img.Bounds(), &image.Uniform{clr}, image.ZP, draw.Src)
+
+	ftf, err := os.Open(fnt)
+	fmt.Println(fnt)
+	if err != nil {
+
+		fmt.Println("opening", fnt, err)
+		return nil
+	}
+	ftfSts, _ := ftf.Stat()
+	ftfb := make([]byte, ftfSts.Size())
+	_, _ = ftf.Read(ftfb)
+	font_, err := opentype.Parse(ftfb)
+	if err != nil {
+		fmt.Println("making", err)
+		return nil
+	}
+
+	face, err := opentype.NewFace(font_, &opentype.FaceOptions{
+		Size:    50,
+		DPI:     72,
+		Hinting: font.HintingNone,
+	})
+
+	if err != nil {
+		fmt.Println(err)
+		return nil
+	}
+
+	img := image.NewRGBA(image.Rect(0, 0, face.Metrics().Ascent.Ceil()*w, face.Metrics().Height.Floor()*h))
+	dc := gg.NewContextForRGBA(img)
+	dc.SetColor(clr)
+	dc.Clear()
+	dc.SetColor(cltx)
+	fmt.Println("hh", face.Metrics().Ascent.Floor(), face.Metrics().Height.Floor())
+	//dc.SetRGBA(float64(cltx.R), float64(cltx.G), float64(cltx.B), float64(cltx.A))
+	fmt.Println("db", cltx.R, cltx.G, cltx.B, cltx.A)
+	dc.SetFontFace(face)
+	for i := 0; i < len(chrs); i++ {
+		fmt.Println(i, chrs[i], float64(50.0*(i+1)))
+
+		dc.DrawStringAnchored(chrs[i], float64(face.Metrics().Ascent.Ceil()*w)/2, float64(50.0*(i+1)), 0.5, 0.5)
+	}
+	dc.Fill()
+
+	return img
+
+}
+
+func main() {
+
+	hui := 0
+	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+		//fmt.Fprintf(w, r.FormValue("text"))
+
+		font := r.FormValue("font")
+		fontsdir := "figlet-fonts/"
+		conf, err := figletlib.GetFontByName(fontsdir, font)
+		if err != nil {
+			fmt.Println("ERR", err)
+			w.Header().Set("Content-Type", "text-plain")
+
+		}
+		fmt.Println(r.Form)
+
+		bg := strings.Split(r.FormValue("bg"), ",")
+
+		var bg_ color.RGBA
+		if len(bg) < 2 {
+
+			bg_ = color.RGBA{0, 0, 0, 255}
+		} else {
+			bgr, _ := strconv.Atoi(bg[0])
+			bgg, _ := strconv.Atoi(bg[1])
+			bgb, _ := strconv.Atoi(bg[2])
+			bg_ = color.RGBA{uint8(bgr), uint8(bgg), uint8(bgb), 255}
+		}
+
+		fg := strings.Split(r.FormValue("fg"), ",")
+		var fg_ color.RGBA
+		if len(fg) < 2 {
+
+			fg_ = color.RGBA{255, 255, 255, 255}
+		} else {
+			fgr, _ := strconv.Atoi(fg[0])
+			fgg, _ := strconv.Atoi(bg[1])
+			fgb, _ := strconv.Atoi(bg[2])
+			fg_ = color.RGBA{uint8(fgr), uint8(fgg), uint8(fgb), 255}
+		}
+
+		text_ := r.FormValue("text")
+
+		if len(text_) > 0 {
+			figfont := "figlet-fonts/" + r.FormValue("font") + "."
+
+			chr := figletlib.SprintMsg(text_, conf, 1024, conf.Settings(), "left")
+
+			chrs := strings.Split(chr, "\n")
+			img := generate_image(len(chrs[0])-strings.Count(text_, " ")-1, len(chrs), chrs, "MonospaceBold.ttf", figfont, bg_, fg_)
+			if img == nil {
+				fmt.Fprintf(w, "error")
+			} else {
+				var imgjpbuf bytes.Buffer
+				imgwrt := bufio.NewWriter(&imgjpbuf)
+
+				if err := jpeg.Encode(imgwrt, img, nil); err != nil {
+					fmt.Println("Ошибка кодирования изображения в jpeg:", err)
+
+				}
+				w.Header().Set("Content-Type", "image/jpeg")
+				w.Write(imgjpbuf.Bytes())
+			}
+		}
+	})
+
+	http.ListenAndServeTLS("librejokes.ru:8050", "/root/ultra_trash_storage/certificate.crt", "/root/ultra_trash_storage/certificate.key", nil)}
+//go func(){http.ListenAndServe("librejokes.ru:8050", nil)}
diff --git a/hui.png b/hui.png
new file mode 100644
index 0000000..e69de29
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..6ee9d30
--- /dev/null
+++ b/main.go
@@ -0,0 +1,139 @@
+package main
+
+import (
+	"bufio"
+	"bytes"
+	"fmt"
+	"image"
+	"image/color"
+	"image/jpeg"
+	"net/http"
+	"os"
+	"strconv"
+	"strings"
+
+	"github.com/fogleman/gg"
+	"github.com/lukesampson/figlet/figletlib"
+
+	"golang.org/x/image/font"
+	"golang.org/x/image/font/opentype"
+)
+
+func generate_image(w int, h int, chrs []string, fnt string, figfnt string, clr color.RGBA, cltx color.RGBA) *image.RGBA {
+
+	//draw.Draw(img, img.Bounds(), &image.Uniform{clr}, image.ZP, draw.Src)
+
+	ftf, err := os.Open(fnt)
+	fmt.Println(fnt)
+	if err != nil {
+
+		fmt.Println("opening", fnt, err)
+		return nil
+	}
+	ftfSts, _ := ftf.Stat()
+	ftfb := make([]byte, ftfSts.Size())
+	_, _ = ftf.Read(ftfb)
+	font_, err := opentype.Parse(ftfb)
+	if err != nil {
+		fmt.Println("making", err)
+		return nil
+	}
+
+	face, err := opentype.NewFace(font_, &opentype.FaceOptions{
+		Size:    50,
+		DPI:     72,
+		Hinting: font.HintingNone,
+	})
+
+	if err != nil {
+		fmt.Println(err)
+		return nil
+	}
+
+	img := image.NewRGBA(image.Rect(0, 0, face.Metrics().Ascent.Ceil()*w, face.Metrics().Height.Floor()*h))
+	dc := gg.NewContextForRGBA(img)
+	dc.SetColor(clr)
+	dc.Clear()
+	dc.SetColor(cltx)
+	fmt.Println("hh", face.Metrics().Ascent.Floor(), face.Metrics().Height.Floor())
+	//dc.SetRGBA(float64(cltx.R), float64(cltx.G), float64(cltx.B), float64(cltx.A))
+	fmt.Println("db", cltx.R, cltx.G, cltx.B, cltx.A)
+	dc.SetFontFace(face)
+	for i := 0; i < len(chrs); i++ {
+		fmt.Println(i, chrs[i], float64(50.0*(i+1)))
+
+		dc.DrawStringAnchored(chrs[i], float64(face.Metrics().Ascent.Ceil()*w)/2, float64(50.0*(i+1)), 0.5, 0.5)
+	}
+	dc.Fill()
+
+	return img
+
+}
+
+func main() {
+
+	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+		//fmt.Fprintf(w, r.FormValue("text"))
+
+		font := r.FormValue("font")
+		fontsdir := "figlet-fonts/"
+		conf, err := figletlib.GetFontByName(fontsdir, font)
+		if err != nil {
+			fmt.Println("ERR", err)
+			w.Header().Set("Content-Type", "text-plain")
+
+		}
+		fmt.Println(r.Form)
+
+		bg := strings.Split(r.FormValue("bg"), ",")
+
+		var bg_ color.RGBA
+		if len(bg) < 2 {
+
+			bg_ = color.RGBA{0, 0, 0, 255}
+		} else {
+			bgr, _ := strconv.Atoi(bg[0])
+			bgg, _ := strconv.Atoi(bg[1])
+			bgb, _ := strconv.Atoi(bg[2])
+			bg_ = color.RGBA{uint8(bgr), uint8(bgg), uint8(bgb), 255}
+		}
+
+		fg := strings.Split(r.FormValue("fg"), ",")
+		var fg_ color.RGBA
+		if len(fg) < 2 {
+
+			fg_ = color.RGBA{255, 255, 255, 255}
+		} else {
+			fgr, _ := strconv.Atoi(fg[0])
+			fgg, _ := strconv.Atoi(bg[1])
+			fgb, _ := strconv.Atoi(bg[2])
+			fg_ = color.RGBA{uint8(fgr), uint8(fgg), uint8(fgb), 255}
+		}
+
+		text_ := r.FormValue("text")
+
+		if len(text_) > 0 {
+			figfont := "figlet-fonts/" + r.FormValue("font") + "."
+
+			chr := figletlib.SprintMsg(text_, conf, 1024, conf.Settings(), "left")
+
+			chrs := strings.Split(chr, "\n")
+			img := generate_image(len(chrs[0])-strings.Count(text_, " ")-1, len(chrs), chrs, "MonospaceBold.ttf", figfont, bg_, fg_)
+			if img == nil {
+				fmt.Fprintf(w, "error")
+			} else {
+				var imgjpbuf bytes.Buffer
+				imgwrt := bufio.NewWriter(&imgjpbuf)
+
+				if err := jpeg.Encode(imgwrt, img, nil); err != nil {
+					fmt.Println("Ошибка кодирования изображения в jpeg:", err)
+
+				}
+				w.Header().Set("Content-Type", "image/jpeg")
+				w.Write(imgjpbuf.Bytes())
+			}
+		}
+	})
+
+	http.ListenAndServeTLS("librejokes.ru:8050", "/root/ultra_trash_storage/certificate.crt", "/root/ultra_trash_storage/certificate.key", nil)}
+//go func(){http.ListenAndServe("librejokes.ru:8050", nil)}
diff --git a/moscow.flf b/moscow.flf
new file mode 100644
index 0000000..2fdd130
Binary files /dev/null and b/moscow.flf differ