diff --git a/data/colors.go b/data/colors.go new file mode 100644 index 0000000..157946b --- /dev/null +++ b/data/colors.go @@ -0,0 +1,244 @@ +// Code generated by github.com/src-d/enry/v2/internal/code-generator DO NOT EDIT. +// Extracted from github/linguist commit: e4560984058b4726010ca4b8f03ed9d0f8f464db + +package data + +var LanguagesColor = map[string]string{ + "1C Enterprise": "#814CCC", + "ABAP": "#E8274B", + "AGS Script": "#B9D9FF", + "AMPL": "#E6EFBB", + "ANTLR": "#9DC3FF", + "API Blueprint": "#2ACCA8", + "APL": "#5A8164", + "ASP": "#6a40fd", + "ATS": "#1ac620", + "ActionScript": "#882B0F", + "Ada": "#02f88c", + "Agda": "#315665", + "Alloy": "#64C800", + "AngelScript": "#C7D7DC", + "AppleScript": "#101F1F", + "Arc": "#aa2afe", + "AspectJ": "#a957b0", + "Assembly": "#6E4C13", + "Asymptote": "#4a0c0c", + "AutoHotkey": "#6594b9", + "AutoIt": "#1C3552", + "Ballerina": "#FF5000", + "Batchfile": "#C1F12E", + "BlitzMax": "#cd6400", + "Boo": "#d4bec1", + "Brainfuck": "#2F2530", + "C": "#555555", + "C#": "#178600", + "C++": "#f34b7d", + "CSS": "#563d7c", + "Ceylon": "#dfa535", + "Chapel": "#8dc63f", + "Cirru": "#ccccff", + "Clarion": "#db901e", + "Clean": "#3F85AF", + "Click": "#E4E6F3", + "Clojure": "#db5855", + "CoffeeScript": "#244776", + "ColdFusion": "#ed2cd6", + "Common Lisp": "#3fb68b", + "Common Workflow Language": "#B5314C", + "Component Pascal": "#B0CE4E", + "Crystal": "#000100", + "Cuda": "#3A4E3A", + "D": "#ba595e", + "DM": "#447265", + "Dart": "#00B4AB", + "DataWeave": "#003a52", + "Dockerfile": "#384d54", + "Dogescript": "#cca760", + "Dylan": "#6c616e", + "E": "#ccce35", + "ECL": "#8a1267", + "EQ": "#a78649", + "Eiffel": "#946d57", + "Elixir": "#6e4a7e", + "Elm": "#60B5CC", + "Emacs Lisp": "#c065db", + "EmberScript": "#FFF4F3", + "Erlang": "#B83998", + "F#": "#b845fc", + "F*": "#572e30", + "FLUX": "#88ccff", + "Factor": "#636746", + "Fancy": "#7b9db4", + "Fantom": "#14253c", + "Forth": "#341708", + "Fortran": "#4d41b1", + "FreeMarker": "#0050b2", + "Frege": "#00cafe", + "GDScript": "#355570", + "Game Maker Language": "#71b417", + "Genie": "#fb855d", + "Gherkin": "#5B2063", + "Glyph": "#c1ac7f", + "Gnuplot": "#f0a9f0", + "Go": "#00ADD8", + "Golo": "#88562A", + "Gosu": "#82937f", + "Grammatical Framework": "#79aa7a", + "Groovy": "#e69f56", + "HTML": "#e34c26", + "Hack": "#878787", + "Harbour": "#0e60e3", + "Haskell": "#5e5086", + "Haxe": "#df7900", + "HiveQL": "#dce200", + "Hy": "#7790B2", + "IDL": "#a3522f", + "Idris": "#b30000", + "Io": "#a9188d", + "Ioke": "#078193", + "Isabelle": "#FEFE00", + "J": "#9EEDFF", + "JSONiq": "#40d47e", + "Java": "#b07219", + "JavaScript": "#f1e05a", + "Jolie": "#843179", + "Julia": "#a270ba", + "Jupyter Notebook": "#DA5B0B", + "KRL": "#28430A", + "Kotlin": "#F18E33", + "LFE": "#4C3023", + "LLVM": "#185619", + "LOLCODE": "#cc9900", + "LSL": "#3d9970", + "Lasso": "#999999", + "Lex": "#DBCA00", + "LiveScript": "#499886", + "LookML": "#652B81", + "Lua": "#000080", + "MATLAB": "#e16737", + "MAXScript": "#00a6a6", + "MQL4": "#62A8D6", + "MQL5": "#4A76B8", + "MTML": "#b7e1f4", + "Makefile": "#427819", + "Mask": "#f97732", + "Max": "#c4a79c", + "Mercury": "#ff2b2b", + "Meson": "#007800", + "Metal": "#8f14e9", + "Mirah": "#c7a938", + "Modula-3": "#223388", + "NCL": "#28431f", + "Nearley": "#990000", + "Nemerle": "#3d3c6e", + "NetLinx": "#0aa0ff", + "NetLinx+ERB": "#747faa", + "NetLogo": "#ff6375", + "NewLisp": "#87AED7", + "Nextflow": "#3ac486", + "Nim": "#37775b", + "Nit": "#009917", + "Nix": "#7e7eff", + "Nu": "#c9df40", + "OCaml": "#3be133", + "Objective-C": "#438eff", + "Objective-C++": "#6866fb", + "Objective-J": "#ff0c5a", + "Omgrofl": "#cabbff", + "Opal": "#f7ede0", + "Oxygene": "#cdd0e3", + "Oz": "#fab738", + "P4": "#7055b5", + "PHP": "#4F5D95", + "PLSQL": "#dad8d8", + "Pan": "#cc0000", + "Papyrus": "#6600cc", + "Parrot": "#f3ca0a", + "Pascal": "#E3F171", + "Pawn": "#dbb284", + "Pep8": "#C76F5B", + "Perl": "#0298c3", + "Perl 6": "#0000fb", + "PigLatin": "#fcd7de", + "Pike": "#005390", + "PogoScript": "#d80074", + "PostScript": "#da291c", + "PowerBuilder": "#8f0f8d", + "PowerShell": "#012456", + "Processing": "#0096D8", + "Prolog": "#74283c", + "Propeller Spin": "#7fa2a7", + "Puppet": "#302B6D", + "PureBasic": "#5a6986", + "PureScript": "#1D222D", + "Python": "#3572A5", + "QML": "#44a51c", + "Quake": "#882233", + "R": "#198CE7", + "RAML": "#77d9fb", + "RUNOFF": "#665a4e", + "Racket": "#22228f", + "Ragel": "#9d5200", + "Rascal": "#fffaa0", + "Rebol": "#358a5b", + "Red": "#f50000", + "Ren'Py": "#ff7f7f", + "Ring": "#2D54CB", + "Roff": "#ecdebe", + "Rouge": "#cc0088", + "Ruby": "#701516", + "Rust": "#dea584", + "SAS": "#B34936", + "SQF": "#3F3F3F", + "SRecode Template": "#348a34", + "SaltStack": "#646464", + "Scala": "#c22d40", + "Scheme": "#1e4aec", + "Self": "#0579aa", + "Shell": "#89e051", + "Shen": "#120F14", + "Slash": "#007eff", + "Slice": "#003fa2", + "Smalltalk": "#596706", + "Solidity": "#AA6746", + "SourcePawn": "#5c7611", + "Squirrel": "#800000", + "Stan": "#b2011d", + "Standard ML": "#dc566d", + "SuperCollider": "#46390b", + "Swift": "#ffac45", + "SystemVerilog": "#DAE1C2", + "TI Program": "#A0AA87", + "Tcl": "#e4cc98", + "TeX": "#3D6117", + "Terra": "#00004c", + "Turing": "#cf142b", + "TypeScript": "#2b7489", + "UnrealScript": "#a54c4d", + "VCL": "#148AA8", + "VHDL": "#adb2cb", + "Vala": "#fbe5cd", + "Verilog": "#b2b7f8", + "Vim script": "#199f4b", + "Visual Basic": "#945db7", + "Volt": "#1F1F1F", + "Vue": "#2c3e50", + "WebAssembly": "#04133b", + "X10": "#4B6BEF", + "XC": "#99DA07", + "XQuery": "#5232e7", + "XSLT": "#EB8CEB", + "YARA": "#220000", + "YASnippet": "#32AB90", + "Yacc": "#4B6C4B", + "Zephir": "#118f9e", + "Zig": "#ec915c", + "eC": "#913960", + "nesC": "#94B0C7", + "ooc": "#b0b77e", + "q": "#0040cd", + "sed": "#64b970", + "wdl": "#42f1f4", + "wisp": "#7582D1", + "xBase": "#403a40", +} diff --git a/internal/code-generator/assets/colors.go.tmpl b/internal/code-generator/assets/colors.go.tmpl new file mode 100644 index 0000000..0bb1c20 --- /dev/null +++ b/internal/code-generator/assets/colors.go.tmpl @@ -0,0 +1,7 @@ +package data + +var LanguagesColor = map[string]string{ + {{range $language, $color := . -}} + "{{$language}}": "{{$color -}}", + {{end -}} +} diff --git a/internal/code-generator/generator/colors.go b/internal/code-generator/generator/colors.go new file mode 100644 index 0000000..4dc2934 --- /dev/null +++ b/internal/code-generator/generator/colors.go @@ -0,0 +1,47 @@ +package generator + +import ( + "bytes" + "io" + "io/ioutil" + + "gopkg.in/yaml.v2" +) + +// Colors generates a map in Go with language name -> color string. +// It is of generator.File type. +func Colors(fileToParse, samplesDir, outPath, tmplPath, tmplName, commit string) error { + data, err := ioutil.ReadFile(fileToParse) + if err != nil { + return err + } + + languages := make(map[string]*languageInfo) + if err := yaml.Unmarshal(data, &languages); err != nil { + return err + } + + langColorMap := buildLanguageColorMap(languages) + + buf := &bytes.Buffer{} + if err := executeMimeTemplate(buf, langColorMap, tmplPath, tmplName, commit); err != nil { + return err + } + + return formatedWrite(outPath, buf.Bytes()) +} + +func buildLanguageColorMap(languages map[string]*languageInfo) map[string]string { + langColorMap := make(map[string]string) + for lang, info := range languages { + if len(info.Color) != 0 { + langColorMap[lang] = info.Color + } + } + + return langColorMap +} + +func executeColorTemplate(out io.Writer, langColorMap map[string]string, tmplPath, tmplName, commit string) error { + return executeTemplate(out, tmplName, tmplPath, commit, nil, langColorMap) +} diff --git a/internal/code-generator/generator/generator_test.go b/internal/code-generator/generator/generator_test.go index 18e581e..e014bb0 100644 --- a/internal/code-generator/generator/generator_test.go +++ b/internal/code-generator/generator/generator_test.go @@ -80,6 +80,11 @@ const ( mimeTypeGold = testDir + "/mimeType.gold" mimeTypeTestTmplPath = assetsDir + "/mimeType.go.tmpl" mimeTypeTestTmplName = "mimeType.go.tmpl" + + // colors test + colorsGold = testDir + "/colors.gold" + colorsTestTmplPath = assetsDir + "/colors.go.tmpl" + colorsTestTmplName = "colors.go.tmpl" ) type GeneratorTestSuite struct { @@ -243,6 +248,16 @@ func (s *GeneratorTestSuite) SetupSuite() { generate: MimeType, wantOut: mimeTypeGold, }, + { + name: "Colors()", + fileToParse: filepath.Join(s.tmpLinguist, languagesFile), + samplesDir: "", + tmplPath: colorsTestTmplPath, + tmplName: colorsTestTmplName, + commit: commit, + generate: Colors, + wantOut: colorsGold, + }, } } diff --git a/internal/code-generator/generator/langinfo.go b/internal/code-generator/generator/langinfo.go index 7644a27..e0a8a8b 100644 --- a/internal/code-generator/generator/langinfo.go +++ b/internal/code-generator/generator/langinfo.go @@ -4,6 +4,7 @@ import "sort" type languageInfo struct { Type string `yaml:"type,omitempty"` + Color string `yaml:"color,omitempty"` Aliases []string `yaml:"aliases,omitempty"` Extensions []string `yaml:"extensions,omitempty,flow"` Interpreters []string `yaml:"interpreters,omitempty,flow"` diff --git a/internal/code-generator/generator/test_files/colors.gold b/internal/code-generator/generator/test_files/colors.gold new file mode 100644 index 0000000..157946b --- /dev/null +++ b/internal/code-generator/generator/test_files/colors.gold @@ -0,0 +1,244 @@ +// Code generated by github.com/src-d/enry/v2/internal/code-generator DO NOT EDIT. +// Extracted from github/linguist commit: e4560984058b4726010ca4b8f03ed9d0f8f464db + +package data + +var LanguagesColor = map[string]string{ + "1C Enterprise": "#814CCC", + "ABAP": "#E8274B", + "AGS Script": "#B9D9FF", + "AMPL": "#E6EFBB", + "ANTLR": "#9DC3FF", + "API Blueprint": "#2ACCA8", + "APL": "#5A8164", + "ASP": "#6a40fd", + "ATS": "#1ac620", + "ActionScript": "#882B0F", + "Ada": "#02f88c", + "Agda": "#315665", + "Alloy": "#64C800", + "AngelScript": "#C7D7DC", + "AppleScript": "#101F1F", + "Arc": "#aa2afe", + "AspectJ": "#a957b0", + "Assembly": "#6E4C13", + "Asymptote": "#4a0c0c", + "AutoHotkey": "#6594b9", + "AutoIt": "#1C3552", + "Ballerina": "#FF5000", + "Batchfile": "#C1F12E", + "BlitzMax": "#cd6400", + "Boo": "#d4bec1", + "Brainfuck": "#2F2530", + "C": "#555555", + "C#": "#178600", + "C++": "#f34b7d", + "CSS": "#563d7c", + "Ceylon": "#dfa535", + "Chapel": "#8dc63f", + "Cirru": "#ccccff", + "Clarion": "#db901e", + "Clean": "#3F85AF", + "Click": "#E4E6F3", + "Clojure": "#db5855", + "CoffeeScript": "#244776", + "ColdFusion": "#ed2cd6", + "Common Lisp": "#3fb68b", + "Common Workflow Language": "#B5314C", + "Component Pascal": "#B0CE4E", + "Crystal": "#000100", + "Cuda": "#3A4E3A", + "D": "#ba595e", + "DM": "#447265", + "Dart": "#00B4AB", + "DataWeave": "#003a52", + "Dockerfile": "#384d54", + "Dogescript": "#cca760", + "Dylan": "#6c616e", + "E": "#ccce35", + "ECL": "#8a1267", + "EQ": "#a78649", + "Eiffel": "#946d57", + "Elixir": "#6e4a7e", + "Elm": "#60B5CC", + "Emacs Lisp": "#c065db", + "EmberScript": "#FFF4F3", + "Erlang": "#B83998", + "F#": "#b845fc", + "F*": "#572e30", + "FLUX": "#88ccff", + "Factor": "#636746", + "Fancy": "#7b9db4", + "Fantom": "#14253c", + "Forth": "#341708", + "Fortran": "#4d41b1", + "FreeMarker": "#0050b2", + "Frege": "#00cafe", + "GDScript": "#355570", + "Game Maker Language": "#71b417", + "Genie": "#fb855d", + "Gherkin": "#5B2063", + "Glyph": "#c1ac7f", + "Gnuplot": "#f0a9f0", + "Go": "#00ADD8", + "Golo": "#88562A", + "Gosu": "#82937f", + "Grammatical Framework": "#79aa7a", + "Groovy": "#e69f56", + "HTML": "#e34c26", + "Hack": "#878787", + "Harbour": "#0e60e3", + "Haskell": "#5e5086", + "Haxe": "#df7900", + "HiveQL": "#dce200", + "Hy": "#7790B2", + "IDL": "#a3522f", + "Idris": "#b30000", + "Io": "#a9188d", + "Ioke": "#078193", + "Isabelle": "#FEFE00", + "J": "#9EEDFF", + "JSONiq": "#40d47e", + "Java": "#b07219", + "JavaScript": "#f1e05a", + "Jolie": "#843179", + "Julia": "#a270ba", + "Jupyter Notebook": "#DA5B0B", + "KRL": "#28430A", + "Kotlin": "#F18E33", + "LFE": "#4C3023", + "LLVM": "#185619", + "LOLCODE": "#cc9900", + "LSL": "#3d9970", + "Lasso": "#999999", + "Lex": "#DBCA00", + "LiveScript": "#499886", + "LookML": "#652B81", + "Lua": "#000080", + "MATLAB": "#e16737", + "MAXScript": "#00a6a6", + "MQL4": "#62A8D6", + "MQL5": "#4A76B8", + "MTML": "#b7e1f4", + "Makefile": "#427819", + "Mask": "#f97732", + "Max": "#c4a79c", + "Mercury": "#ff2b2b", + "Meson": "#007800", + "Metal": "#8f14e9", + "Mirah": "#c7a938", + "Modula-3": "#223388", + "NCL": "#28431f", + "Nearley": "#990000", + "Nemerle": "#3d3c6e", + "NetLinx": "#0aa0ff", + "NetLinx+ERB": "#747faa", + "NetLogo": "#ff6375", + "NewLisp": "#87AED7", + "Nextflow": "#3ac486", + "Nim": "#37775b", + "Nit": "#009917", + "Nix": "#7e7eff", + "Nu": "#c9df40", + "OCaml": "#3be133", + "Objective-C": "#438eff", + "Objective-C++": "#6866fb", + "Objective-J": "#ff0c5a", + "Omgrofl": "#cabbff", + "Opal": "#f7ede0", + "Oxygene": "#cdd0e3", + "Oz": "#fab738", + "P4": "#7055b5", + "PHP": "#4F5D95", + "PLSQL": "#dad8d8", + "Pan": "#cc0000", + "Papyrus": "#6600cc", + "Parrot": "#f3ca0a", + "Pascal": "#E3F171", + "Pawn": "#dbb284", + "Pep8": "#C76F5B", + "Perl": "#0298c3", + "Perl 6": "#0000fb", + "PigLatin": "#fcd7de", + "Pike": "#005390", + "PogoScript": "#d80074", + "PostScript": "#da291c", + "PowerBuilder": "#8f0f8d", + "PowerShell": "#012456", + "Processing": "#0096D8", + "Prolog": "#74283c", + "Propeller Spin": "#7fa2a7", + "Puppet": "#302B6D", + "PureBasic": "#5a6986", + "PureScript": "#1D222D", + "Python": "#3572A5", + "QML": "#44a51c", + "Quake": "#882233", + "R": "#198CE7", + "RAML": "#77d9fb", + "RUNOFF": "#665a4e", + "Racket": "#22228f", + "Ragel": "#9d5200", + "Rascal": "#fffaa0", + "Rebol": "#358a5b", + "Red": "#f50000", + "Ren'Py": "#ff7f7f", + "Ring": "#2D54CB", + "Roff": "#ecdebe", + "Rouge": "#cc0088", + "Ruby": "#701516", + "Rust": "#dea584", + "SAS": "#B34936", + "SQF": "#3F3F3F", + "SRecode Template": "#348a34", + "SaltStack": "#646464", + "Scala": "#c22d40", + "Scheme": "#1e4aec", + "Self": "#0579aa", + "Shell": "#89e051", + "Shen": "#120F14", + "Slash": "#007eff", + "Slice": "#003fa2", + "Smalltalk": "#596706", + "Solidity": "#AA6746", + "SourcePawn": "#5c7611", + "Squirrel": "#800000", + "Stan": "#b2011d", + "Standard ML": "#dc566d", + "SuperCollider": "#46390b", + "Swift": "#ffac45", + "SystemVerilog": "#DAE1C2", + "TI Program": "#A0AA87", + "Tcl": "#e4cc98", + "TeX": "#3D6117", + "Terra": "#00004c", + "Turing": "#cf142b", + "TypeScript": "#2b7489", + "UnrealScript": "#a54c4d", + "VCL": "#148AA8", + "VHDL": "#adb2cb", + "Vala": "#fbe5cd", + "Verilog": "#b2b7f8", + "Vim script": "#199f4b", + "Visual Basic": "#945db7", + "Volt": "#1F1F1F", + "Vue": "#2c3e50", + "WebAssembly": "#04133b", + "X10": "#4B6BEF", + "XC": "#99DA07", + "XQuery": "#5232e7", + "XSLT": "#EB8CEB", + "YARA": "#220000", + "YASnippet": "#32AB90", + "Yacc": "#4B6C4B", + "Zephir": "#118f9e", + "Zig": "#ec915c", + "eC": "#913960", + "nesC": "#94B0C7", + "ooc": "#b0b77e", + "q": "#0040cd", + "sed": "#64b970", + "wdl": "#42f1f4", + "wisp": "#7582D1", + "xBase": "#403a40", +} diff --git a/internal/code-generator/main.go b/internal/code-generator/main.go index c76a31b..3df7027 100644 --- a/internal/code-generator/main.go +++ b/internal/code-generator/main.go @@ -72,6 +72,11 @@ const ( mimeTypeTmplPath = "internal/code-generator/assets/mimeType.go.tmpl" mimeTypeTmpl = "mimeType.go.tmpl" + // colors.go generation + colorsFile = "data/colors.go" + colorsTmplPath = "internal/code-generator/assets/colors.go.tmpl" + colorsTmpl = "colors.go.tmpl" + commitPath = ".linguist/.git/HEAD" ) @@ -103,6 +108,7 @@ func main() { {generator.Frequencies, "", samplesDir, frequenciesFile, frequenciesTmplPath, frequenciesTmpl, commit}, {generator.Commit, "", "", commitFile, commitTmplPath, commitTmpl, commit}, {generator.MimeType, languagesYAML, "", mimeTypeFile, mimeTypeTmplPath, mimeTypeTmpl, commit}, + {generator.Colors, languagesYAML, "", colorsFile, colorsTmplPath, colorsTmpl, commit}, } for _, file := range fileList { diff --git a/java/src/main/java/tech/sourced/enry/Enry.java b/java/src/main/java/tech/sourced/enry/Enry.java index 5a0522c..0618f86 100644 --- a/java/src/main/java/tech/sourced/enry/Enry.java +++ b/java/src/main/java/tech/sourced/enry/Enry.java @@ -217,4 +217,13 @@ public class Enry { return toJavaBool(nativeLib.IsVendor(toGoString(path))); } + /** + * Returns a color code for given language. + * + * @param language of the file + * @return color code + */ + public static synchronized String getColor(String language) { + return toJavaString(nativeLib.GetColor(toGoString(language))); + } } diff --git a/java/src/test/java/tech/sourced/enry/EnryTest.java b/java/src/test/java/tech/sourced/enry/EnryTest.java index 29c45e3..99241c4 100644 --- a/java/src/test/java/tech/sourced/enry/EnryTest.java +++ b/java/src/test/java/tech/sourced/enry/EnryTest.java @@ -161,6 +161,14 @@ public class EnryTest { assertFalse(Enry.isImage("nope.go")); } + @Test + public void getColor() { + assertEquals( + "#00ADD8", + Enry.getColor("Go") + ); + } + void assertGuess(String language, boolean safe, Guess guess) { assertEquals(language, guess.language); assertEquals(safe, guess.safe); diff --git a/shared/enry.go b/shared/enry.go index 35aa58e..d1fde6e 100644 --- a/shared/enry.go +++ b/shared/enry.go @@ -126,6 +126,11 @@ func IsVendor(path string) bool { return enry.IsVendor(path) } +//export GetColor +func GetColor(language string) string { + return enry.GetColor(language) +} + func strSliceCopy(result *[]*C.char, slice []string) { for _, str := range slice { *result = append(*result, C.CString(str)) diff --git a/utils.go b/utils.go index 168cc3b..fb807db 100644 --- a/utils.go +++ b/utils.go @@ -73,3 +73,12 @@ func IsBinary(data []byte) bool { 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 + } + + return "#cccccc" +} diff --git a/utils_test.go b/utils_test.go index 2ec3193..a7cb644 100644 --- a/utils_test.go +++ b/utils_test.go @@ -133,3 +133,19 @@ func TestIsDotFile(t *testing.T) { assert.Equal(t, test.expected, is, fmt.Sprintf("%v: is = %v, expected: %v", test.name, is, test.expected)) } } + +func TestGetColor(t *testing.T) { + tests := []struct { + name string + language string + expected string + }{ + {name: "TestGetColor_1", language: "Go", expected: "#00ADD8"}, + {name: "TestGetColor_2", language: "SomeRandom", expected: "#cccccc"}, + } + + for _, test := range tests { + color := GetColor(test.language) + assert.Equal(t, test.expected, color, fmt.Sprintf("%v: is = %v, expected: %v", test.name, color, test.expected)) + } +}