mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-27 09:11:53 -05:00
94 lines
2.2 KiB
Go
94 lines
2.2 KiB
Go
|
// 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
|
||
|
}
|