Untitled
unknown
golang
2 months ago
1.4 kB
3
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