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 }