1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- 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
- }
|