Skip to content

Instantly share code, notes, and snippets.

@rsp9u
Created December 27, 2019 16:26
Show Gist options
  • Save rsp9u/1a895d35b175a981676761febb9f31da to your computer and use it in GitHub Desktop.
Save rsp9u/1a895d35b175a981676761febb9f31da to your computer and use it in GitHub Desktop.
The PlantUML encoder written by Go
package pumlencode
import (
"bytes"
"compress/zlib"
"encoding/base64"
)
func makeTable() map[rune]rune {
src := []rune{}
for r := 'A'; r <= 'Z'; r++ {
src = append(src, r)
}
for r := 'a'; r <= 'z'; r++ {
src = append(src, r)
}
for r := '0'; r <= '9'; r++ {
src = append(src, r)
}
src = append(src, '+')
src = append(src, '/')
dst := []rune{}
for r := '0'; r <= '9'; r++ {
dst = append(dst, r)
}
for r := 'A'; r <= 'Z'; r++ {
dst = append(dst, r)
}
for r := 'a'; r <= 'z'; r++ {
dst = append(dst, r)
}
dst = append(dst, '-')
dst = append(dst, '_')
ret := map[rune]rune{}
for i := 0; i < len(src); i++ {
ret[src[i]] = dst[i]
}
return ret
}
var transTable = makeTable()
func translate(table map[rune]rune, str string) string {
ret := []rune{}
for _, char := range []rune(str) {
ret = append(ret, table[char])
}
return string(ret)
}
// Encode generates and returns PlantUML text encode string from the given PlantUML code.
func Encode(plantUMLCode string) string {
b := new(bytes.Buffer)
w := zlib.NewWriter(b)
w.Write([]byte(plantUMLCode))
w.Close()
compressedStr := b.Bytes()[2 : b.Len()-4]
b = new(bytes.Buffer)
encoder := base64.NewEncoder(base64.StdEncoding, b)
encoder.Write(compressedStr)
encoder.Close()
return translate(transTable, b.String())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment