mirror of
https://github.com/charmbracelet/lipgloss.git
synced 2024-09-11 22:17:12 +03:00
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package lipgloss
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/muesli/reflow/ansi"
|
|
"github.com/muesli/termenv"
|
|
)
|
|
|
|
// Perform text alignment. If the string is multi-lined, we also make all lines
|
|
// the same width by padding them with spaces. If a termenv style is passed,
|
|
// use that to style the spaces added.
|
|
func alignText(str string, pos Position, width int, style *termenv.Style) string {
|
|
lines, widestLine := getLines(str)
|
|
var b strings.Builder
|
|
|
|
for i, l := range lines {
|
|
lineWidth := ansi.PrintableRuneWidth(l)
|
|
|
|
shortAmount := widestLine - lineWidth // difference from the widest line
|
|
shortAmount += max(0, width-(shortAmount+lineWidth)) // difference from the total width, if set
|
|
|
|
if shortAmount > 0 {
|
|
switch pos {
|
|
case Right:
|
|
s := strings.Repeat(" ", shortAmount)
|
|
if style != nil {
|
|
s = style.Styled(s)
|
|
}
|
|
l = s + l
|
|
case Center:
|
|
left := shortAmount / 2
|
|
right := left + shortAmount%2 // note that we put the remainder on the right
|
|
|
|
leftSpaces := strings.Repeat(" ", left)
|
|
rightSpaces := strings.Repeat(" ", right)
|
|
|
|
if style != nil {
|
|
leftSpaces = style.Styled(leftSpaces)
|
|
rightSpaces = style.Styled(rightSpaces)
|
|
}
|
|
l = leftSpaces + l + rightSpaces
|
|
default: // Left
|
|
s := strings.Repeat(" ", shortAmount)
|
|
if style != nil {
|
|
s = style.Styled(s)
|
|
}
|
|
l += s
|
|
}
|
|
}
|
|
|
|
b.WriteString(l)
|
|
if i < len(lines)-1 {
|
|
b.WriteRune('\n')
|
|
}
|
|
}
|
|
|
|
return b.String()
|
|
}
|