agent/util/stringutil/stringutil.go (37 lines of code) (raw):

package stringutil import ( "errors" "strings" ) // ReplaceMarkedFields finds substrings delimited by the start and end markers, // removes the markers, and replaces the text between the markers with the result // of calling the fieldReplacer function on that text substring. For example, if // the input string is: "a string with <a>text</a> marked" // the startMarker is: "<a>" // the end marker is: "</a>" // and fieldReplacer is: strings.ToUpper // then the output will be: "a string with TEXT marked" func ReplaceMarkedFields(str, startMarker, endMarker string, fieldReplacer func(string) string) (newStr string, err error) { startIndex := strings.Index(str, startMarker) newStr = "" for startIndex >= 0 { newStr += str[:startIndex] fieldStart := str[startIndex+len(startMarker):] endIndex := strings.Index(fieldStart, endMarker) if endIndex < 0 { err = errors.New("Found startMarker without endMarker!") return } field := fieldStart[:endIndex] transformedField := fieldReplacer(field) newStr += transformedField str = fieldStart[endIndex+len(endMarker):] startIndex = strings.Index(str, startMarker) } newStr += str return newStr, nil } func CleanupNewLines(s string) string { return strings.Replace(strings.Replace(s, "\n", "", -1), "\r", "", -1) } // CleanupJSONField converts a text to a json friendly text as follows: // - converts multi-line fields to single line by removing all but the first line // - escapes special characters // - truncates remaining line to length no more than maxSummaryLength func CleanupJSONField(field string) string { res := field endOfLinePos := strings.Index(res, "\n") if endOfLinePos >= 0 { res = res[0:endOfLinePos] } res = strings.Replace(res, `\`, `\\`, -1) res = strings.Replace(res, `"`, `\"`, -1) res = strings.Replace(res, "\t", `\t`, -1) return res }