aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/vektah/gqlparser/lexer/blockstring.go
blob: 4065a610a87826195edb748dfba1d999df3ddda1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package lexer

import (
	"math"
	"strings"
)

// blockStringValue produces the value of a block string from its parsed raw value, similar to
// Coffeescript's block string, Python's docstring trim or Ruby's strip_heredoc.
//
// This implements the GraphQL spec's BlockStringValue() static algorithm.
func blockStringValue(raw string) string {
	lines := strings.Split(raw, "\n")

	commonIndent := math.MaxInt32
	for _, line := range lines {
		indent := leadingWhitespace(line)
		if indent < len(line) && indent < commonIndent {
			commonIndent = indent
			if commonIndent == 0 {
				break
			}
		}
	}

	if commonIndent != math.MaxInt32 && len(lines) > 0 {
		for i := 1; i < len(lines); i++ {
			if len(lines[i]) < commonIndent {
				lines[i] = ""
			} else {
				lines[i] = lines[i][commonIndent:]
			}
		}
	}

	start := 0
	end := len(lines)

	for start < end && leadingWhitespace(lines[start]) == math.MaxInt32 {
		start++
	}

	for start < end && leadingWhitespace(lines[end-1]) == math.MaxInt32 {
		end--
	}

	return strings.Join(lines[start:end], "\n")
}

func leadingWhitespace(str string) int {
	for i, r := range str {
		if r != ' ' && r != '\t' {
			return i
		}
	}
	// this line is made up entirely of whitespace, its leading whitespace doesnt count.
	return math.MaxInt32
}