mirror of https://github.com/k3s-io/k3s
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.3 KiB
50 lines
1.3 KiB
6 years ago
|
package dedent
|
||
|
|
||
|
import (
|
||
|
"regexp"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
whitespaceOnly = regexp.MustCompile("(?m)^[ \t]+$")
|
||
|
leadingWhitespace = regexp.MustCompile("(?m)(^[ \t]*)(?:[^ \t\n])")
|
||
|
)
|
||
|
|
||
|
// Dedent removes any common leading whitespace from every line in text.
|
||
|
//
|
||
|
// This can be used to make multiline strings to line up with the left edge of
|
||
|
// the display, while still presenting them in the source code in indented
|
||
|
// form.
|
||
|
func Dedent(text string) string {
|
||
|
var margin string
|
||
|
|
||
|
text = whitespaceOnly.ReplaceAllString(text, "")
|
||
|
indents := leadingWhitespace.FindAllStringSubmatch(text, -1)
|
||
|
|
||
|
// Look for the longest leading string of spaces and tabs common to all
|
||
|
// lines.
|
||
|
for i, indent := range indents {
|
||
|
if i == 0 {
|
||
|
margin = indent[1]
|
||
|
} else if strings.HasPrefix(indent[1], margin) {
|
||
|
// Current line more deeply indented than previous winner:
|
||
|
// no change (previous winner is still on top).
|
||
|
continue
|
||
|
} else if strings.HasPrefix(margin, indent[1]) {
|
||
|
// Current line consistent with and no deeper than previous winner:
|
||
|
// it's the new winner.
|
||
|
margin = indent[1]
|
||
|
} else {
|
||
|
// Current line and previous winner have no common whitespace:
|
||
|
// there is no margin.
|
||
|
margin = ""
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if margin != "" {
|
||
|
text = regexp.MustCompile("(?m)^"+margin).ReplaceAllString(text, "")
|
||
|
}
|
||
|
return text
|
||
|
}
|