summaryrefslogtreecommitdiff
path: root/vendor/github.com/renstrom/dedent/dedent.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/renstrom/dedent/dedent.go')
-rw-r--r--vendor/github.com/renstrom/dedent/dedent.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/vendor/github.com/renstrom/dedent/dedent.go b/vendor/github.com/renstrom/dedent/dedent.go
new file mode 100644
index 000000000..f58dc47d5
--- /dev/null
+++ b/vendor/github.com/renstrom/dedent/dedent.go
@@ -0,0 +1,56 @@
+package dedent
+
+import (
+ "regexp"
+ "strings"
+)
+
+var whitespaceOnly = regexp.MustCompile("(?m)^[ \t]+$")
+var leadingWhitespace = regexp.MustCompile("(?m)(^[ \t]*)")
+
+// Dedent removes any common leading whitespace from every line in s.
+//
+// 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(s string) string {
+ s = whitespaceOnly.ReplaceAllString(s, "")
+ margin := findMargin(s)
+ if len(margin) == 0 {
+ return s
+ }
+ return regexp.MustCompile("(?m)^"+margin).ReplaceAllString(s, "")
+}
+
+// Look for the longest leading string of spaces and tabs common to all lines.
+func findMargin(s string) string {
+ var margin string
+
+ indents := leadingWhitespace.FindAllString(s, -1)
+ numIndents := len(indents)
+ for i, indent := range indents {
+ // Don't use last row if it is empty
+ if i == numIndents-1 && indent == "" {
+ break
+ }
+
+ if margin == "" {
+ margin = indent
+ } else if strings.HasPrefix(indent, margin) {
+ // Current line more deeply indented than previous winner:
+ // no change (previous winner is still on top).
+ continue
+ } else if strings.HasPrefix(margin, indent) {
+ // Current line consistent with and no deeper than previous winner:
+ // it's the new winner.
+ margin = indent
+ } else {
+ // Current line and previous winner have no common whitespace:
+ // there is no margin.
+ margin = ""
+ break
+ }
+ }
+
+ return margin
+}