dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit 880e112350b3da46f6dc255a9ee362b300b6f1fa
parent 03022ab02f13ca4c183f8fb2149e7f1b5710d832
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Wed, 16 Nov 2022 02:08:35 -0500

gpg ascii art generator

Diffstat:
Acmd/art/main.go | 140+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acmd/art/main_test.go | 19+++++++++++++++++++
Acmd/art/mask.png | 0
3 files changed, 159 insertions(+), 0 deletions(-)

diff --git a/cmd/art/main.go b/cmd/art/main.go @@ -0,0 +1,140 @@ +package main + +import ( + "fmt" + "image/color" + "image/png" + "os" + "sort" + "strings" +) + +func main() { + + in := `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` + maskFile := "mask.png" + outFile := "out.html" + + f, _ := os.Open(maskFile) + im, _ := png.Decode(f) + + lines := strings.Split(in, "\n") + w := len(lines[0]) + h := len(lines) + + classPrefix := "gpg_" + classIdx := 0 + colorsMap := make(map[string]string) + colorsArr := [][]string{} + for j := 0; j < h; j++ { + for i := 0; i < w; i++ { + c := im.At(i, j) + hex := HexFromRgbColor(c.(color.NRGBA)) + if _, ok := colorsMap[hex]; ok { + continue + } + className := classPrefix + getClassName(classIdx) + colorsMap[hex] = className + colorsArr = append(colorsArr, []string{className, hex}) + classIdx++ + } + } + sort.Slice(colorsArr, func(i, j int) bool { + return colorsArr[i][0] < colorsArr[j][0] + }) + + out := "" + out += "<style>\n" + for _, v := range colorsArr { + out += fmt.Sprintf(".%s{color:%s}\n", v[0], v[1]) + } + out += "</style>\n" + out += "<div style=\"font-family: monospace; background-color: #222;\">\n" + out += "<pre>\n" + for j := 0; j < h; j++ { + for i := 0; i < w; i++ { + c := im.At(i, j) + if len(lines[j]) <= i { + break + } + char := lines[j][i] + hex := HexFromRgbColor(c.(color.NRGBA)) + class := colorsMap[hex] + out += fmt.Sprintf(`<span class="%s">%s</span>`, class, string(char)) + } + out += "\n" + } + out += "</pre>\n" + out += "</div>" + + _ = os.WriteFile(outFile, []byte(out), 0644) +} + +func HexFromRgbColor(color color.NRGBA) string { + return fmt.Sprintf("#%X%X%X", color.R, color.G, color.B) +} + +func getClassName(idx int) string { + out := []rune{} + r := 'a' - 1 + for idx >= 0 { + if r == 'z' { + if len(out) == 0 { + out = append(out, 'a') + } else { + out[0]++ + } + r = 'a' - 1 + } + r++ + idx-- + } + out = append(out, r) + return string(out) +} diff --git a/cmd/art/main_test.go b/cmd/art/main_test.go @@ -0,0 +1,19 @@ +package main + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestGetClassName(t *testing.T) { + assert.Equal(t, "a", getClassName(0)) + assert.Equal(t, "b", getClassName(1)) + assert.Equal(t, "z", getClassName(25)) + assert.Equal(t, "aa", getClassName(26)) + assert.Equal(t, "ab", getClassName(27)) + assert.Equal(t, "az", getClassName(51)) + assert.Equal(t, "ba", getClassName(52)) + assert.Equal(t, "bb", getClassName(53)) + assert.Equal(t, "bz", getClassName(77)) + assert.Equal(t, "ca", getClassName(78)) +} diff --git a/cmd/art/mask.png b/cmd/art/mask.png Binary files differ.