131 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package template
 | |
| 
 | |
| import (
 | |
| 	"regexp"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 	"text/template"
 | |
| 
 | |
| 	"github.com/UnnoTed/fileb0x/config"
 | |
| )
 | |
| 
 | |
| var safeNameBlacklist = map[string]string{}
 | |
| var blacklist = map[string]int{}
 | |
| 
 | |
| // taken from golint @ https://github.com/golang/lint/blob/master/lint.go#L702
 | |
| var commonInitialisms = map[string]bool{
 | |
| 	"API":   true,
 | |
| 	"ASCII": true,
 | |
| 	"CPU":   true,
 | |
| 	"CSS":   true,
 | |
| 	"DNS":   true,
 | |
| 	"EOF":   true,
 | |
| 	"GUID":  true,
 | |
| 	"HTML":  true,
 | |
| 	"HTTP":  true,
 | |
| 	"HTTPS": true,
 | |
| 	"ID":    true,
 | |
| 	"IP":    true,
 | |
| 	"JSON":  true,
 | |
| 	"LHS":   true,
 | |
| 	"QPS":   true,
 | |
| 	"RAM":   true,
 | |
| 	"RHS":   true,
 | |
| 	"RPC":   true,
 | |
| 	"SLA":   true,
 | |
| 	"SMTP":  true,
 | |
| 	"SQL":   true,
 | |
| 	"SSH":   true,
 | |
| 	"TCP":   true,
 | |
| 	"TLS":   true,
 | |
| 	"TTL":   true,
 | |
| 	"UDP":   true,
 | |
| 	"UI":    true,
 | |
| 	"UID":   true,
 | |
| 	"UUID":  true,
 | |
| 	"URI":   true,
 | |
| 	"URL":   true,
 | |
| 	"UTF8":  true,
 | |
| 	"VM":    true,
 | |
| 	"XML":   true,
 | |
| 	"XSRF":  true,
 | |
| 	"XSS":   true,
 | |
| }
 | |
| 
 | |
| var r = regexp.MustCompile(`[^a-zA-Z0-9]`)
 | |
| 
 | |
| var funcsTemplate = template.FuncMap{
 | |
| 	"exported":         exported,
 | |
| 	"buildTags":        buildTags,
 | |
| 	"exportedTitle":    exportedTitle,
 | |
| 	"buildSafeVarName": buildSafeVarName,
 | |
| }
 | |
| 
 | |
| var unexported bool
 | |
| 
 | |
| // SetUnexported variables, functions and types
 | |
| func SetUnexported(e bool) {
 | |
| 	unexported = e
 | |
| }
 | |
| 
 | |
| func exported(field string) string {
 | |
| 	if !unexported {
 | |
| 		return strings.ToUpper(field)
 | |
| 	}
 | |
| 
 | |
| 	return strings.ToLower(field)
 | |
| }
 | |
| 
 | |
| func exportedTitle(field string) string {
 | |
| 	if !unexported {
 | |
| 		return strings.Title(field)
 | |
| 	}
 | |
| 
 | |
| 	return strings.ToLower(field[0:1]) + field[1:]
 | |
| }
 | |
| 
 | |
| func buildSafeVarName(path string) string {
 | |
| 	name, exists := safeNameBlacklist[path]
 | |
| 	if exists {
 | |
| 		return name
 | |
| 	}
 | |
| 
 | |
| 	n := config.SafeVarName.ReplaceAllString(path, "$")
 | |
| 	words := strings.Split(n, "$")
 | |
| 
 | |
| 	name = ""
 | |
| 	// check for uppercase words
 | |
| 	for _, word := range words {
 | |
| 		upper := strings.ToUpper(word)
 | |
| 
 | |
| 		if commonInitialisms[upper] {
 | |
| 			name += upper
 | |
| 		} else {
 | |
| 			name += strings.Title(word)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// avoid redeclaring variables
 | |
| 	//
 | |
| 	// _file.txt
 | |
| 	// file.txt
 | |
| 	_, blacklisted := blacklist[name]
 | |
| 
 | |
| 	if blacklisted {
 | |
| 		blacklist[name]++
 | |
| 		name += strconv.Itoa(blacklist[name])
 | |
| 	}
 | |
| 
 | |
| 	safeNameBlacklist[path] = name
 | |
| 	blacklist[name]++
 | |
| 	return name
 | |
| }
 | |
| 
 | |
| func buildTags(tags string) string {
 | |
| 	if tags != "" {
 | |
| 		tags = "// +build " + tags + "\n"
 | |
| 	}
 | |
| 
 | |
| 	return tags
 | |
| }
 |