mirror of
https://github.com/crazy-max/diun.git
synced 2024-12-22 19:38:28 +00:00
68 lines
1.9 KiB
Go
68 lines
1.9 KiB
Go
package text
|
|
|
|
import "strings"
|
|
|
|
// VAlign denotes how text is to be aligned vertically.
|
|
type VAlign int
|
|
|
|
// VAlign enumerations
|
|
const (
|
|
VAlignDefault VAlign = iota // same as VAlignTop
|
|
VAlignTop // "top\n\n"
|
|
VAlignMiddle // "\nmiddle\n"
|
|
VAlignBottom // "\n\nbottom"
|
|
)
|
|
|
|
// Apply aligns the lines vertically. For ex.:
|
|
// - VAlignTop.Apply({"Game", "Of", "Thrones"}, 5)
|
|
// returns {"Game", "Of", "Thrones", "", ""}
|
|
// - VAlignMiddle.Apply({"Game", "Of", "Thrones"}, 5)
|
|
// returns {"", "Game", "Of", "Thrones", ""}
|
|
// - VAlignBottom.Apply({"Game", "Of", "Thrones"}, 5)
|
|
// returns {"", "", "Game", "Of", "Thrones"}
|
|
func (va VAlign) Apply(lines []string, maxLines int) []string {
|
|
if len(lines) == maxLines {
|
|
return lines
|
|
} else if len(lines) > maxLines {
|
|
maxLines = len(lines)
|
|
}
|
|
|
|
insertIdx := 0
|
|
if va == VAlignMiddle {
|
|
insertIdx = int(maxLines-len(lines)) / 2
|
|
} else if va == VAlignBottom {
|
|
insertIdx = maxLines - len(lines)
|
|
}
|
|
|
|
linesOut := strings.Split(strings.Repeat("\n", maxLines-1), "\n")
|
|
for idx, line := range lines {
|
|
linesOut[idx+insertIdx] = line
|
|
}
|
|
return linesOut
|
|
}
|
|
|
|
// ApplyStr aligns the string (of 1 or more lines) vertically. For ex.:
|
|
// - VAlignTop.ApplyStr("Game\nOf\nThrones", 5)
|
|
// returns {"Game", "Of", "Thrones", "", ""}
|
|
// - VAlignMiddle.ApplyStr("Game\nOf\nThrones", 5)
|
|
// returns {"", "Game", "Of", "Thrones", ""}
|
|
// - VAlignBottom.ApplyStr("Game\nOf\nThrones", 5)
|
|
// returns {"", "", "Game", "Of", "Thrones"}
|
|
func (va VAlign) ApplyStr(text string, maxLines int) []string {
|
|
return va.Apply(strings.Split(text, "\n"), maxLines)
|
|
}
|
|
|
|
// HTMLProperty returns the equivalent HTML vertical-align tag property.
|
|
func (va VAlign) HTMLProperty() string {
|
|
switch va {
|
|
case VAlignTop:
|
|
return "valign=\"top\""
|
|
case VAlignMiddle:
|
|
return "valign=\"middle\""
|
|
case VAlignBottom:
|
|
return "valign=\"bottom\""
|
|
default:
|
|
return ""
|
|
}
|
|
}
|