go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/utils/stringx/overlay.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package stringx
     5  
     6  import (
     7  	"strings"
     8  	"unicode"
     9  )
    10  
    11  func Overlay(base string, layers ...string) string {
    12  	// split layer in rows
    13  	baseLayer := strings.Split(base, "\n")
    14  
    15  	layeredRows := make([][]string, len(layers))
    16  	for i := range layers {
    17  		layeredRows[i] = strings.Split(layers[i], "\n")
    18  	}
    19  
    20  	output := []string{}
    21  
    22  	// iterate over base layer rows and merge all other layers
    23  	for i := range baseLayer {
    24  		row := []rune(baseLayer[i])
    25  
    26  		// iterate over each character
    27  		for pos := 0; pos < len(row); pos++ {
    28  			winning := row[pos]
    29  
    30  			// iterate over all layers that we want to merge in
    31  			mergeRow := make([]rune, 0)
    32  			for j := range layeredRows {
    33  				layer := layeredRows[j]
    34  				if len(layer) > i {
    35  					mergeRow = []rune(layer[i])
    36  				}
    37  				if len(mergeRow) > pos {
    38  					layerChar := mergeRow[pos]
    39  					if !unicode.IsSpace(layerChar) || layerChar == 0x0 {
    40  						winning = layerChar
    41  					}
    42  				}
    43  			}
    44  
    45  			row[pos] = winning
    46  		}
    47  		output = append(output, string(row))
    48  	}
    49  
    50  	return strings.Join(output, "\n")
    51  }