mirror of
https://github.com/ralsina/tartrazine.git
synced 2024-11-13 23:12:24 +00:00
7db593cb32
test plan: * ENRY_TEST_REPO=".linguist" \ go test -run '^TestIsConfiguration$' github.com/go-enry/go-enry/v2
149 lines
3.3 KiB
Go
149 lines
3.3 KiB
Go
package enry
|
|
|
|
import (
|
|
"bytes"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/go-enry/go-enry/v2/data"
|
|
"github.com/go-enry/go-enry/v2/regex"
|
|
)
|
|
|
|
const binSniffLen = 8000
|
|
|
|
var configurationLanguages = map[string]struct{}{
|
|
"XML": {},
|
|
"JSON": {},
|
|
"TOML": {},
|
|
"YAML": {},
|
|
"MiniYAML": {},
|
|
"INI": {},
|
|
"SQL": {},
|
|
}
|
|
|
|
// IsConfiguration tells if a give file is in one of the configuration languages.
|
|
func IsConfiguration(path string) bool {
|
|
language, _ := GetLanguageByExtension(path)
|
|
_, is := configurationLanguages[language]
|
|
return is
|
|
}
|
|
|
|
// IsImage tells if a given file is an image (PNG, JPEG or GIF format).
|
|
func IsImage(path string) bool {
|
|
extension := filepath.Ext(path)
|
|
if extension == ".png" || extension == ".jpg" || extension == ".jpeg" || extension == ".gif" {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// GetMIMEType returns a MIME type of a given file based on its languages.
|
|
func GetMIMEType(path string, language string) string {
|
|
if mime, ok := data.LanguagesMime[language]; ok {
|
|
return mime
|
|
}
|
|
|
|
if IsImage(path) {
|
|
return "image/" + filepath.Ext(path)[1:]
|
|
}
|
|
|
|
return "text/plain"
|
|
}
|
|
|
|
// IsDocumentation returns whether or not path is a documentation path.
|
|
func IsDocumentation(path string) bool {
|
|
return matchRegexSlice(data.DocumentationMatchers, path)
|
|
}
|
|
|
|
// IsDotFile returns whether or not path has dot as a prefix.
|
|
func IsDotFile(path string) bool {
|
|
base := filepath.Base(filepath.Clean(path))
|
|
return strings.HasPrefix(base, ".") && base != "."
|
|
}
|
|
|
|
// IsVendor returns whether or not path is a vendor path.
|
|
func IsVendor(path string) bool {
|
|
// fast path: single collatated regex, if the engine supports its syntax
|
|
if data.FastVendorMatcher != nil {
|
|
return data.FastVendorMatcher.MatchString(path)
|
|
}
|
|
|
|
// slow path: skip individual rules with unsupported syntax
|
|
for _, matcher := range data.VendorMatchers {
|
|
if matcher == nil {
|
|
continue
|
|
}
|
|
if matcher.MatchString(path) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// IsTest returns whether or not path is a test path.
|
|
func IsTest(path string) bool {
|
|
return matchRegexSlice(data.TestMatchers, path)
|
|
}
|
|
|
|
func matchRegexSlice(exprs []regex.EnryRegexp, str string) bool {
|
|
for _, expr := range exprs {
|
|
if expr.MatchString(str) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// IsBinary detects if data is a binary value based on:
|
|
// http://git.kernel.org/cgit/git/git.git/tree/xdiff-interface.c?id=HEAD#n198
|
|
func IsBinary(data []byte) bool {
|
|
if len(data) > binSniffLen {
|
|
data = data[:binSniffLen]
|
|
}
|
|
|
|
if bytes.IndexByte(data, byte(0)) == -1 {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// GetColor returns a HTML color code of a given language.
|
|
func GetColor(language string) string {
|
|
if color, ok := data.LanguagesColor[language]; ok {
|
|
return color
|
|
}
|
|
|
|
if color, ok := data.LanguagesColor[GetLanguageGroup(language)]; ok {
|
|
return color
|
|
}
|
|
|
|
return "#cccccc"
|
|
}
|
|
|
|
// IsGenerated returns whether the file with the given path and content is a
|
|
// generated file.
|
|
func IsGenerated(path string, content []byte) bool {
|
|
ext := strings.ToLower(filepath.Ext(path))
|
|
if _, ok := data.GeneratedCodeExtensions[ext]; ok {
|
|
return true
|
|
}
|
|
|
|
for _, m := range data.GeneratedCodeNameMatchers {
|
|
if m(path) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
path = strings.ToLower(path)
|
|
for _, m := range data.GeneratedCodeMatchers {
|
|
if m(path, ext, content) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|