blob: 2840020ff4eb3016617d5bc370a2bab5acc07a98 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package resource
import (
"bytes"
"strings"
"text/template"
)
const (
commentLinePrefix = "// "
)
func applyTemplate(tmpl string, i interface{}) (string, error) {
t := template.New("tmpl").Funcs(template.FuncMap{
"wordWrap": wordWrap,
"commentBlock": commentBlock,
"hasPrefix": strings.HasPrefix,
})
t2 := template.Must(t.Parse(tmpl))
var b bytes.Buffer
if err := t2.Execute(&b, i); err != nil {
return "", err
}
return b.String(), nil
}
func commentBlock(in []string, indentTabs int) string {
// Copy the input array.
in = append([]string{}, in...)
// Apply the tabs and comment prefix to each line.
for lineIndex := range in {
prefix := ""
for tabIndex := 0; lineIndex > 0 && tabIndex < indentTabs; tabIndex++ {
prefix += "\t"
}
prefix += commentLinePrefix
in[lineIndex] = prefix + in[lineIndex]
}
// Join the lines with carriage returns.
return strings.Join(in, "\n")
}
func wordWrap(in string, maxLineLength int) []string {
// First, split the input based on any user-created lines (i.e. the string contains "\n").
inputLines := strings.Split(in, "\n")
outputLines := make([]string, 0)
line := ""
for i, inputLine := range inputLines {
if i > 0 {
// Process a user-defined carriage return.
outputLines = append(outputLines, line)
line = ""
}
words := strings.Split(inputLine, " ")
for len(words) > 0 {
// Take the next word.
word := words[0]
words = words[1:]
if len(line)+len(word) > maxLineLength {
// Need to word wrap - emit the current line.
outputLines = append(outputLines, line)
line = ""
}
// Add the word to the current line.
if len(line) > 0 {
line += " "
}
line += word
}
}
// Emit the final line
outputLines = append(outputLines, line)
return outputLines
}