Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.2 KiB
93 lines
2.2 KiB
// 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 |
|
}
|
|
|