123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // Copyright 2014 Oleku Konko All rights reserved.
- // Use of this source code is governed by a MIT
- // license that can be found in the LICENSE file.
- // This module is a Table Writer API for the Go Programming Language.
- // The protocols were written in pure Go and works on windows and unix systems
- package tablewriter
- import (
- "math"
- "regexp"
- "strings"
- "github.com/mattn/go-runewidth"
- )
- var ansi = regexp.MustCompile("\033\\[(?:[0-9]{1,3}(?:;[0-9]{1,3})*)?[m|K]")
- func DisplayWidth(str string) int {
- return runewidth.StringWidth(ansi.ReplaceAllLiteralString(str, ""))
- }
- // Simple Condition for string
- // Returns value based on condition
- func ConditionString(cond bool, valid, inValid string) string {
- if cond {
- return valid
- }
- return inValid
- }
- func isNumOrSpace(r rune) bool {
- return ('0' <= r && r <= '9') || r == ' '
- }
- // Format Table Header
- // Replace _ , . and spaces
- func Title(name string) string {
- origLen := len(name)
- rs := []rune(name)
- for i, r := range rs {
- switch r {
- case '_':
- rs[i] = ' '
- case '.':
- // ignore floating number 0.0
- if (i != 0 && !isNumOrSpace(rs[i-1])) || (i != len(rs)-1 && !isNumOrSpace(rs[i+1])) {
- rs[i] = ' '
- }
- }
- }
- name = string(rs)
- name = strings.TrimSpace(name)
- if len(name) == 0 && origLen > 0 {
- // Keep at least one character. This is important to preserve
- // empty lines in multi-line headers/footers.
- name = " "
- }
- return strings.ToUpper(name)
- }
- // Pad String
- // Attempts to place string in the center
- func Pad(s, pad string, width int) string {
- gap := width - DisplayWidth(s)
- if gap > 0 {
- gapLeft := int(math.Ceil(float64(gap / 2)))
- gapRight := gap - gapLeft
- return strings.Repeat(string(pad), gapLeft) + s + strings.Repeat(string(pad), gapRight)
- }
- return s
- }
- // Pad String Right position
- // This would place string at the left side of the screen
- func PadRight(s, pad string, width int) string {
- gap := width - DisplayWidth(s)
- if gap > 0 {
- return s + strings.Repeat(string(pad), gap)
- }
- return s
- }
- // Pad String Left position
- // This would place string at the right side of the screen
- func PadLeft(s, pad string, width int) string {
- gap := width - DisplayWidth(s)
- if gap > 0 {
- return strings.Repeat(string(pad), gap) + s
- }
- return s
- }
|