Untitled
unknown
golang
8 months ago
1.4 kB
4
Indexable
func CompositeANSITransparent(fg, bg string, xPos, yPos lipgloss.Position, xOff, yOff int) string {
fgLines := strings.Split(fg, "\n")
bgLines := strings.Split(bg, "\n")
fgHeight := len(fgLines)
fgWidth := 0
for _, line := range fgLines {
if w := ansi.StringWidth(line); w > fgWidth {
fgWidth = w
}
}
bgHeight := len(bgLines)
bgWidth := 0
for _, line := range bgLines {
if w := ansi.StringWidth(line); w > bgWidth {
bgWidth = w
}
}
x, y := offsets(fg, bg, xPos, yPos, xOff, yOff)
x = clamp(x, 0, bgWidth-fgWidth)
y = clamp(y, 0, bgHeight-fgHeight)
bgCells := make([][]string, len(bgLines))
for i, line := range bgLines {
bgCells[i] = parseANSIIntoCells(line)
}
fgCells := make([][]string, len(fgLines))
for i, line := range fgLines {
fgCells[i] = parseANSIIntoCells(line)
}
for i := 0; i < len(fgCells); i++ {
bgRowIdx := i + y
if bgRowIdx >= len(bgCells) {
break
}
fgRow := fgCells[i]
bgRow := bgCells[bgRowIdx]
for j := 0; j < len(fgRow); j++ {
bgColIdx := j + x
if bgColIdx >= len(bgRow) {
break
}
fgCell := fgRow[j]
if strings.TrimSpace(stripANSI(fgCell)) != "" {
bgRow[bgColIdx] = fgCell
}
}
}
var sb strings.Builder
for i, row := range bgCells {
for _, cell := range row {
sb.WriteString(cell)
}
if i < len(bgCells)-1 {
sb.WriteRune('\n')
}
}
return sb.String()
}
Editor is loading...
Leave a Comment