Skip to content

Instantly share code, notes, and snippets.

@ghostsquad
Created August 11, 2020 20:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ghostsquad/de3db99e304a5e5854d2fa767a76cdae to your computer and use it in GitHub Desktop.
Save ghostsquad/de3db99e304a5e5854d2fa767a76cdae to your computer and use it in GitHub Desktop.
emoji and character alignment
package main
import (
"fmt"
"strings"
"unicode/utf8"
"github.com/mattn/go-runewidth"
"github.com/rivo/uniseg"
)
func valueDiagnostics(val string, leftpad, rightpad int) {
fmt.Printf("%15s: %d\n", "rune width", runewidth.StringWidth(val))
fmt.Printf("%15s: %d\n", "rune count", utf8.RuneCountInString(val))
fmt.Printf("%15s: %d\n", "len", len(val))
fmt.Printf("%15s: %d\n", "grapheme ct", uniseg.GraphemeClusterCount(val))
fmt.Printf("%15s: %d\n", "req left pad", leftpad)
fmt.Printf("%15s: %d\n", "req right pad", rightpad)
fmt.Printf("[%*s%sAAA]\n", leftpad, val, strings.Repeat(" ", rightpad))
fmt.Println(valuePaddingPredictor(val))
}
// aligns to 5 characters
func valuePaddingPredictor(val string) string {
runeWidth := runewidth.StringWidth(val)
// runeCount := utf8.RuneCountInString(val)
stringLen := len(val)
leftPad := 3
rightPad := 1
if runeWidth == 1 {
leftPad++
}
if stringLen > 4 {
leftPad++
rightPad++
}
return fmt.Sprintf("[%*s%sAAA]", leftPad, val, strings.Repeat(" ", rightPad))
}
func main() {
characters := []string{
"πŸ”„",
"πŸ‡§πŸ‡Ύ",
"ℹ️",
"πŸ’©",
"x",
"πŸ˜€",
"πŸ’š",
"☁️",
"β€’",
"β¨―",
"βœ”οΈ",
"βœ“",
"؏",
"β”œ",
"か",
"ζΌ’",
"ν•œ",
"ζΌ’",
"汉",
"⻨",
"ζΌ’",
"←", "β†–", "↑", "β†—", "β†’", "β†˜", "↓", "↙",
}
for _, c := range characters {
fmt.Println(valuePaddingPredictor(c))
}
// valueDiagnostics("πŸ”„", 3, 1)
// valueDiagnostics("πŸ‡§πŸ‡Ύ", 4, 2)
// valueDiagnostics("ℹ️", 4, 2)
// valueDiagnostics("β€’", 4, 1)
// valueDiagnostics("πŸ’©", 3, 1)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment