diff --git a/content.go b/content.go index 7f7560e..4590a52 100644 --- a/content.go +++ b/content.go @@ -2,7 +2,7 @@ package slinguist // CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate // THIS FILE SHOULD NOT BE EDITED BY HAND -// Extracted from github/linguist commit: 3a2a62baad5363a604828706f8df730902a542b0 +// Extracted from github/linguist commit: dae33dc2b20cddc85d1300435c3be7118a7115a9 import ( "path/filepath" diff --git a/internal/code-generator/assets/utils.go.tmpl b/internal/code-generator/assets/utils.go.tmpl new file mode 100644 index 0000000..55e1166 --- /dev/null +++ b/internal/code-generator/assets/utils.go.tmpl @@ -0,0 +1,84 @@ +package slinguist + +// CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate +// THIS FILE SHOULD NOT BE EDITED BY HAND +// Extracted from github/linguist commit: {{ getCommit }} + +import ( + "bytes" + "path/filepath" + "strings" + + "gopkg.in/toqueteos/substring.v1" +) + +func IsAuxiliaryLanguage(lang string) bool { + _, ok := auxiliaryLanguages[lang] + return ok +} + +func IsConfiguration(path string) bool { + lang, _ := GetLanguageByExtension(path) + _, is := configurationLanguages[lang] + + return is +} + +func IsDotFile(path string) bool { + return strings.HasPrefix(filepath.Base(path), ".") +} + +func IsVendor(path string) bool { + return findIndex(path, vendorMatchers) >= 0 +} + +func IsDocumentation(path string) bool { + return findIndex(path, documentationMatchers) >= 0 +} + +func findIndex(path string, matchers substring.StringsMatcher) int { + return matchers.MatchIndex(path) +} + +const sniffLen = 8000 + +//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) > sniffLen { + data = data[:sniffLen] + } + + if bytes.IndexByte(data, byte(0)) == -1 { + return false + } + + return true +} + +var vendorMatchers = substring.Or( + {{range $regexp := . -}} + substring.Regexp(`{{ $regexp }}`), + {{end -}} +) + +var documentationMatchers = substring.Or( + substring.Regexp(`^docs?/`), + substring.Regexp(`(^|/)[Dd]ocumentation/`), + substring.Regexp(`(^|/)javadoc/`), + substring.Regexp(`^man/`), + substring.Regexp(`^[Ee]xamples/`), + substring.Regexp(`(^|/)CHANGE(S|LOG)?(\.|$)`), + substring.Regexp(`(^|/)CONTRIBUTING(\.|$)`), + substring.Regexp(`(^|/)COPYING(\.|$)`), + substring.Regexp(`(^|/)INSTALL(\.|$)`), + substring.Regexp(`(^|/)LICEN[CS]E(\.|$)`), + substring.Regexp(`(^|/)[Ll]icen[cs]e(\.|$)`), + substring.Regexp(`(^|/)README(\.|$)`), + substring.Regexp(`(^|/)[Rr]eadme(\.|$)`), + substring.Regexp(`^[Ss]amples/`), +) + +var configurationLanguages = map[string]bool{ + "XML": true, "JSON": true, "TOML": true, "YAML": true, "INI": true, "SQL": true, +} diff --git a/internal/code-generator/generator/generator_test.go b/internal/code-generator/generator/generator_test.go index 180ddd2..36f174e 100644 --- a/internal/code-generator/generator/generator_test.go +++ b/internal/code-generator/generator/generator_test.go @@ -13,6 +13,7 @@ const ( // FromFile test formatedLangGold = "test_files/formated_languages.gold" formatedContentGold = "test_files/formated_content.gold" + formatedUtilsGold = "test_files/formated_utils.gold" // Languages test ymlTestFile = "test_files/languages.test.yml" @@ -27,6 +28,13 @@ const ( contentTestTmplPath = "test_files/content.test.go.tmpl" contentTestTmplName = "content.test.go.tmpl" commitHeuristicsTest = "fe8b44ab8a225b1ffa75b983b916ea22fee5b6f7" + + // Vendor test + vendorTestFile = "test_files/vendor.test.yml" + utilsGold = "test_files/utils.gold" + utilsTestTmplPath = "test_files/utils.test.go.tmpl" + utilsTestTmplName = "utils.test.go.tmpl" + commitVendorTest = "fe8b44ab8a225b1ffa75b983b916ea22fee5b6f7" ) func TestFromFile(t *testing.T) { @@ -36,6 +44,9 @@ func TestFromFile(t *testing.T) { goldContent, err := ioutil.ReadFile(formatedContentGold) assert.NoError(t, err) + goldUtils, err := ioutil.ReadFile(formatedUtilsGold) + assert.NoError(t, err) + outPathLang, err := ioutil.TempFile("/tmp", "generator-test-") assert.NoError(t, err) defer os.Remove(outPathLang.Name()) @@ -44,6 +55,10 @@ func TestFromFile(t *testing.T) { assert.NoError(t, err) defer os.Remove(outPathContent.Name()) + outPathUtils, err := ioutil.TempFile("/tmp", "generator-test-") + assert.NoError(t, err) + defer os.Remove(outPathContent.Name()) + tests := []struct { name string fileToParse string @@ -74,6 +89,16 @@ func TestFromFile(t *testing.T) { generate: Heuristics, wantOut: goldContent, }, + { + name: "TestFromFile_Vendor", + fileToParse: vendorTestFile, + outPath: outPathUtils.Name(), + tmplPath: utilsTestTmplPath, + tmplName: utilsTestTmplName, + commit: commitVendorTest, + generate: Vendor, + wantOut: goldUtils, + }, } for _, tt := range tests { @@ -154,3 +179,37 @@ func TestHeuristics(t *testing.T) { }) } } + +func TestVendor(t *testing.T) { + gold, err := ioutil.ReadFile(utilsGold) + assert.NoError(t, err) + + input, err := ioutil.ReadFile(vendorTestFile) + assert.NoError(t, err) + + tests := []struct { + name string + input []byte + tmplPath string + tmplName string + commit string + wantOut []byte + }{ + { + name: "TestVendor", + input: input, + tmplPath: utilsTestTmplPath, + tmplName: utilsTestTmplName, + commit: commitVendorTest, + wantOut: gold, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + out, err := Vendor(tt.input, tt.tmplPath, tt.tmplName, tt.commit) + assert.NoError(t, err) + assert.EqualValues(t, tt.wantOut, out, fmt.Sprintf("Vendor() = %v, want %v", string(out), string(tt.wantOut))) + }) + } +} diff --git a/internal/code-generator/generator/test_files/formated_utils.gold b/internal/code-generator/generator/test_files/formated_utils.gold new file mode 100644 index 0000000..1f3d89d --- /dev/null +++ b/internal/code-generator/generator/test_files/formated_utils.gold @@ -0,0 +1,95 @@ +package slinguist + +// CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate +// THIS FILE SHOULD NOT BE EDITED BY HAND +// Extracted from github/linguist commit: fe8b44ab8a225b1ffa75b983b916ea22fee5b6f7 + +import ( + "bytes" + "path/filepath" + "strings" + + "gopkg.in/toqueteos/substring.v1" +) + +func IsAuxiliaryLanguage(lang string) bool { + _, ok := auxiliaryLanguages[lang] + return ok +} + +func IsConfiguration(path string) bool { + lang, _ := GetLanguageByExtension(path) + _, is := configurationLanguages[lang] + + return is +} + +func IsDotFile(path string) bool { + return strings.HasPrefix(filepath.Base(path), ".") +} + +func IsVendor(path string) bool { + return findIndex(path, vendorMatchers) >= 0 +} + +func IsDocumentation(path string) bool { + return findIndex(path, documentationMatchers) >= 0 +} + +func findIndex(path string, matchers substring.StringsMatcher) int { + return matchers.MatchIndex(path) +} + +const sniffLen = 8000 + +//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) > sniffLen { + data = data[:sniffLen] + } + + if bytes.IndexByte(data, byte(0)) == -1 { + return false + } + + return true +} + +var vendorMatchers = substring.Or( + substring.Regexp(`(^|/)cache/`), + substring.Regexp(`^[Dd]ependencies/`), + substring.Regexp(`(^|/)dist/`), + substring.Regexp(`^deps/`), + substring.Regexp(`^tools/`), + substring.Regexp(`(^|/)configure$`), + substring.Regexp(`(^|/)config.guess$`), + substring.Regexp(`(^|/)config.sub$`), + substring.Regexp(`(^|/)aclocal.m4`), + substring.Regexp(`(^|/)libtool.m4`), + substring.Regexp(`(^|/)ltoptions.m4`), + substring.Regexp(`(^|/)ltsugar.m4`), + substring.Regexp(`(^|/)ltversion.m4`), + substring.Regexp(`(^|/)lt~obsolete.m4`), +) + +var documentationMatchers = substring.Or( + substring.Regexp(`^docs?/`), + substring.Regexp(`(^|/)[Dd]ocumentation/`), + substring.Regexp(`(^|/)javadoc/`), + substring.Regexp(`^man/`), + substring.Regexp(`^[Ee]xamples/`), + substring.Regexp(`(^|/)CHANGE(S|LOG)?(\.|$)`), + substring.Regexp(`(^|/)CONTRIBUTING(\.|$)`), + substring.Regexp(`(^|/)COPYING(\.|$)`), + substring.Regexp(`(^|/)INSTALL(\.|$)`), + substring.Regexp(`(^|/)LICEN[CS]E(\.|$)`), + substring.Regexp(`(^|/)[Ll]icen[cs]e(\.|$)`), + substring.Regexp(`(^|/)README(\.|$)`), + substring.Regexp(`(^|/)[Rr]eadme(\.|$)`), + substring.Regexp(`^[Ss]amples/`), +) + +var configurationLanguages = map[string]bool{ + "XML": true, "JSON": true, "TOML": true, "YAML": true, "INI": true, "SQL": true, +} diff --git a/internal/code-generator/generator/test_files/utils.gold b/internal/code-generator/generator/test_files/utils.gold new file mode 100644 index 0000000..ccc8460 --- /dev/null +++ b/internal/code-generator/generator/test_files/utils.gold @@ -0,0 +1,95 @@ +package slinguist + +// CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate +// THIS FILE SHOULD NOT BE EDITED BY HAND +// Extracted from github/linguist commit: fe8b44ab8a225b1ffa75b983b916ea22fee5b6f7 + +import ( + "bytes" + "path/filepath" + "strings" + + "gopkg.in/toqueteos/substring.v1" +) + +func IsAuxiliaryLanguage(lang string) bool { + _, ok := auxiliaryLanguages[lang] + return ok +} + +func IsConfiguration(path string) bool { + lang, _ := GetLanguageByExtension(path) + _, is := configurationLanguages[lang] + + return is +} + +func IsDotFile(path string) bool { + return strings.HasPrefix(filepath.Base(path), ".") +} + +func IsVendor(path string) bool { + return findIndex(path, vendorMatchers) >= 0 +} + +func IsDocumentation(path string) bool { + return findIndex(path, documentationMatchers) >= 0 +} + +func findIndex(path string, matchers substring.StringsMatcher) int { + return matchers.MatchIndex(path) +} + +const sniffLen = 8000 + +//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) > sniffLen { + data = data[:sniffLen] + } + + if bytes.IndexByte(data, byte(0)) == -1 { + return false + } + + return true +} + +var vendorMatchers = substring.Or( + substring.Regexp(`(^|/)cache/`), + substring.Regexp(`^[Dd]ependencies/`), + substring.Regexp(`(^|/)dist/`), + substring.Regexp(`^deps/`), + substring.Regexp(`^tools/`), + substring.Regexp(`(^|/)configure$`), + substring.Regexp(`(^|/)config.guess$`), + substring.Regexp(`(^|/)config.sub$`), + substring.Regexp(`(^|/)aclocal.m4`), + substring.Regexp(`(^|/)libtool.m4`), + substring.Regexp(`(^|/)ltoptions.m4`), + substring.Regexp(`(^|/)ltsugar.m4`), + substring.Regexp(`(^|/)ltversion.m4`), + substring.Regexp(`(^|/)lt~obsolete.m4`), + ) + +var documentationMatchers = substring.Or( + substring.Regexp(`^docs?/`), + substring.Regexp(`(^|/)[Dd]ocumentation/`), + substring.Regexp(`(^|/)javadoc/`), + substring.Regexp(`^man/`), + substring.Regexp(`^[Ee]xamples/`), + substring.Regexp(`(^|/)CHANGE(S|LOG)?(\.|$)`), + substring.Regexp(`(^|/)CONTRIBUTING(\.|$)`), + substring.Regexp(`(^|/)COPYING(\.|$)`), + substring.Regexp(`(^|/)INSTALL(\.|$)`), + substring.Regexp(`(^|/)LICEN[CS]E(\.|$)`), + substring.Regexp(`(^|/)[Ll]icen[cs]e(\.|$)`), + substring.Regexp(`(^|/)README(\.|$)`), + substring.Regexp(`(^|/)[Rr]eadme(\.|$)`), + substring.Regexp(`^[Ss]amples/`), +) + +var configurationLanguages = map[string]bool{ + "XML": true, "JSON": true, "TOML": true, "YAML": true, "INI": true, "SQL": true, +} diff --git a/internal/code-generator/generator/test_files/utils.test.go.tmpl b/internal/code-generator/generator/test_files/utils.test.go.tmpl new file mode 100644 index 0000000..55e1166 --- /dev/null +++ b/internal/code-generator/generator/test_files/utils.test.go.tmpl @@ -0,0 +1,84 @@ +package slinguist + +// CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate +// THIS FILE SHOULD NOT BE EDITED BY HAND +// Extracted from github/linguist commit: {{ getCommit }} + +import ( + "bytes" + "path/filepath" + "strings" + + "gopkg.in/toqueteos/substring.v1" +) + +func IsAuxiliaryLanguage(lang string) bool { + _, ok := auxiliaryLanguages[lang] + return ok +} + +func IsConfiguration(path string) bool { + lang, _ := GetLanguageByExtension(path) + _, is := configurationLanguages[lang] + + return is +} + +func IsDotFile(path string) bool { + return strings.HasPrefix(filepath.Base(path), ".") +} + +func IsVendor(path string) bool { + return findIndex(path, vendorMatchers) >= 0 +} + +func IsDocumentation(path string) bool { + return findIndex(path, documentationMatchers) >= 0 +} + +func findIndex(path string, matchers substring.StringsMatcher) int { + return matchers.MatchIndex(path) +} + +const sniffLen = 8000 + +//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) > sniffLen { + data = data[:sniffLen] + } + + if bytes.IndexByte(data, byte(0)) == -1 { + return false + } + + return true +} + +var vendorMatchers = substring.Or( + {{range $regexp := . -}} + substring.Regexp(`{{ $regexp }}`), + {{end -}} +) + +var documentationMatchers = substring.Or( + substring.Regexp(`^docs?/`), + substring.Regexp(`(^|/)[Dd]ocumentation/`), + substring.Regexp(`(^|/)javadoc/`), + substring.Regexp(`^man/`), + substring.Regexp(`^[Ee]xamples/`), + substring.Regexp(`(^|/)CHANGE(S|LOG)?(\.|$)`), + substring.Regexp(`(^|/)CONTRIBUTING(\.|$)`), + substring.Regexp(`(^|/)COPYING(\.|$)`), + substring.Regexp(`(^|/)INSTALL(\.|$)`), + substring.Regexp(`(^|/)LICEN[CS]E(\.|$)`), + substring.Regexp(`(^|/)[Ll]icen[cs]e(\.|$)`), + substring.Regexp(`(^|/)README(\.|$)`), + substring.Regexp(`(^|/)[Rr]eadme(\.|$)`), + substring.Regexp(`^[Ss]amples/`), +) + +var configurationLanguages = map[string]bool{ + "XML": true, "JSON": true, "TOML": true, "YAML": true, "INI": true, "SQL": true, +} diff --git a/internal/code-generator/generator/test_files/vendor.test.yml b/internal/code-generator/generator/test_files/vendor.test.yml new file mode 100644 index 0000000..6accb42 --- /dev/null +++ b/internal/code-generator/generator/test_files/vendor.test.yml @@ -0,0 +1,24 @@ +# Caches +- (^|/)cache/ + +# Dependencies +- ^[Dd]ependencies/ + +# Distributions +- (^|/)dist/ + +# C deps +# https://github.com/joyent/node +- ^deps/ +- ^tools/ +- (^|/)configure$ +- (^|/)config.guess$ +- (^|/)config.sub$ + +# stuff autogenerated by autoconf - still C deps +- (^|/)aclocal.m4 +- (^|/)libtool.m4 +- (^|/)ltoptions.m4 +- (^|/)ltsugar.m4 +- (^|/)ltversion.m4 +- (^|/)lt~obsolete.m4 diff --git a/internal/code-generator/generator/vendor.go b/internal/code-generator/generator/vendor.go new file mode 100644 index 0000000..f156f74 --- /dev/null +++ b/internal/code-generator/generator/vendor.go @@ -0,0 +1,37 @@ +package generator + +import ( + "bytes" + "html/template" + "io" + + yaml "gopkg.in/yaml.v2" +) + +// Vendor reads from buf and builds utils.go file from utilsTmplPath. +func Vendor(data []byte, uitlsTmplPath, utilsTmplName, commit string) ([]byte, error) { + var regexpList []string + if err := yaml.Unmarshal(data, ®expList); err != nil { + return nil, err + } + + buf := &bytes.Buffer{} + if err := executeUtilsTemplate(buf, regexpList, uitlsTmplPath, utilsTmplName, commit); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func executeUtilsTemplate(out io.Writer, regexpList []string, languagesTmplPath, languagesTmpl, commit string) error { + fmap := template.FuncMap{ + "getCommit": func() string { return commit }, + } + + t := template.Must(template.New(languagesTmpl).Funcs(fmap).ParseFiles(languagesTmplPath)) + if err := t.Execute(out, regexpList); err != nil { + return err + } + + return nil +} diff --git a/internal/code-generator/main.go b/internal/code-generator/main.go index 58c4c72..3f531f3 100644 --- a/internal/code-generator/main.go +++ b/internal/code-generator/main.go @@ -18,6 +18,11 @@ const ( contentTmplPath = "internal/code-generator/assets/content.go.tmpl" contentTmpl = "content.go.tmpl" + vendorYAML = ".linguist/lib/linguist/vendor.yml" + utilsFile = "utils.go" + utilsTmplPath = "internal/code-generator/assets/utils.go.tmpl" + utilsTmpl = "utils.go.tmpl" + commitPath = ".git/refs/heads/master" ) @@ -34,6 +39,14 @@ func main() { if err := generator.FromFile(heuristicsRuby, contentFile, contentTmplPath, contentTmpl, commit, generator.Heuristics); err != nil { log.Println(err) } + + if err := generator.FromFile(vendorYAML, utilsFile, utilsTmplPath, utilsTmpl, commit, generator.Vendor); err != nil { + log.Println(err) + } + + if err := generator.FromFile(vendorYAML, utilsFile, utilsTmplPath, utilsTmpl, commit, generator.Vendor); err != nil { + log.Println(err) + } } func getCommit(path string) (string, error) { diff --git a/languages.go b/languages.go index 8f534a7..d7d9050 100644 --- a/languages.go +++ b/languages.go @@ -2,7 +2,7 @@ package slinguist // CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate // THIS FILE SHOULD NOT BE EDITED BY HAND -// Extracted from github/linguist commit: 3a2a62baad5363a604828706f8df730902a542b0 +// Extracted from github/linguist commit: dae33dc2b20cddc85d1300435c3be7118a7115a9 var languagesByExtension = map[string][]string{ ".1": {"Roff"}, diff --git a/utils.go b/utils.go index 17d7755..3ddf803 100644 --- a/utils.go +++ b/utils.go @@ -1,5 +1,9 @@ package slinguist +// CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate +// THIS FILE SHOULD NOT BE EDITED BY HAND +// Extracted from github/linguist commit: dae33dc2b20cddc85d1300435c3be7118a7115a9 + import ( "bytes" "path/filepath" @@ -52,220 +56,153 @@ func IsBinary(data []byte) bool { return true } -// From github/linguist. -// curl https://raw.githubusercontent.com/github/linguist/master/lib/linguist/vendor.yml | python -c 'import sys, yaml; l = yaml.load(sys.stdin.read()); print "var skipped = []*regexp.Regexp{\n" + "\n".join(["\tregexp.MustCompile(`" + i + "`)," for i in l]) + "\n}"' - var vendorMatchers = substring.Or( - substring.Suffix(`.framer`), - substring.SuffixGroup(`.js`, - substring.After(`cordova-`, substring.Regexp(`\d\.\d(\.\d)?`)), - substring.After(`d3`, substring.Regexp(`(\.v\d+)?([^.]*)`)), - substring.After(`jquery-`, substring.Regexp(`\d\.\d+(\.\d+)?`)), - substring.After(`jquery-ui`, substring.Regexp(`(\-\d\.\d+(\.\d+)?)?(\.\w+)?`)), - substring.After(`knockout-`, substring.Regexp(`(\d+\.){3}(debug\.)?$`)), - substring.After(`microsoft`, substring.Regexp(`([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?`)), - substring.After(`Microsoft`, substring.Regexp(`([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?`)), - substring.After(`modernizr-`, substring.Regexp(`\d\.\d+(\.\d+)?`)), - substring.After(`mootools`, substring.Regexp(`([^.]*)\d+\.\d+.\d+([^.]*)`)), - substring.Has(`angular`), - substring.Has(`bootstrap`), - substring.Has(`cordova`), - substring.Has(`less`), - substring.Has(`custom.bootstrap`), - substring.Has(`extjs/`), - substring.Has(`foundation`), - substring.Has(`jquery.effects.`), - substring.Has(`jquery.ui.`), - substring.Has(`jquery`), - substring.Has(`modernizr.custom.`), - substring.Has(`prototype`), - substring.Has(`backbone`), - substring.Has(`three`), - substring.Has(`ember`), - substring.Has(`babylon`), - substring.Has(`react`), - substring.Has(`shBrush`), - substring.Has(`tiny_mce`), - substring.Has(`yahoo-`), - substring.Has(`html5-`), - substring.Has(`yui`), - substring.Has(`underscore`), - substring.Has(`lodash`), - substring.Has(`lodash.core`), - substring.Has(`coffee-script`), - substring.Suffixes( - `-vsdoc.js`, - `.intellisense.js`, - `Chart.js`, - `ckeditor.js`, - `controls.js`, - `dojo.js`, - `dragdrop.js`, - `effects.js`, - `html5shiv.js`, - `MochiKit.js`, - `shCore.js`, - `shLegacy.js`, - `.min.js`, - `-min.js`, - ), - ), - substring.SuffixGroup(`.css`, - substring.Has(`bootstrap`), - substring.Has(`custom.bootstrap`), - substring.Has(`jquery.effects.`), - substring.Has(`jquery.ui.`), - substring.Has(`octicons.css`), - substring.After(`jquery-ui`, substring.Regexp(`(\-\d\.\d+(\.\d+)?)?(\.\w+)?`)), - substring.Suffixes( - `animate.css`, - `bourbon.css`, - `Bourbon.css`, - `font-awesome.css`, - `foundation.css`, - `import.css`, - `normalize.css`, - `.min.css`, - `-min.css`, - ), - ), - substring.SuffixGroup(`.scss`, - substring.Has(`bootstrap`), - substring.Has(`custom.bootstrap`), - substring.Has(`sprockets-octicons.scss`), - substring.Suffixes( - `animate.scss`, - `bourbon.scss`, - `Bourbon.scss`, - `font-awesome.scss`, - `foundation.scss`, - `import.scss`, - `normalize.scss`, - ), - ), - substring.SuffixGroup(`.less`, - substring.Has(`bootstrap`), - substring.Has(`custom.bootstrap`), - substring.Suffixes( - `animate.less`, - `bourbon.less`, - `Bourbon.less`, - `font-awesome.less`, - `foundation.less`, - `import.less`, - `normalize.less`, - ), - ), - substring.SuffixGroup(`.styl`, - substring.Has(`bootstrap`), - substring.Has(`custom.bootstrap`), - substring.Suffixes( - `animate.styl`, - `bourbon.styl`, - `Bourbon.styl`, - `font-awesome.styl`, - `foundation.styl`, - `import.styl`, - `normalize.styl`, - ), - ), - substring.After(`codemirror/`, substring.Or( - substring.Exact(`lib`), - substring.Exact(`mode`), - substring.Exact(`theme`), - substring.Exact(`addon`), - substring.Exact(`keymap`), - )), - substring.After(`extjs/`, substring.Or( - substring.Suffixes(`.html`, `.properties`, `.txt`, `.xml`), - substring.Exact(`.sencha/`), - substring.Exact(`builds/`), - substring.Exact(`cmd/`), - substring.Exact(`docs/`), - substring.Exact(`examples/`), - substring.Exact(`locale/`), - substring.Exact(`packages/`), - substring.Exact(`plugins/`), - substring.Exact(`resources/`), - substring.Exact(`src/`), - substring.Exact(`welcome/`), - )), - substring.After(`tiny_mce/`, substring.Or( - substring.Exact(`langs`), - substring.Exact(`plugins`), - substring.Exact(`themes`), - substring.Exact(`utils`), - )), - substring.Has(`3rd-party/`), - substring.Has(`3rd_party/`), - substring.Has(`3rdparty/`), - substring.Has(`admin_media/`), - substring.Has(`bower_components/`), - substring.Has(`cache/`), - substring.Has(`Dependencies/`), - substring.Has(`dependencies/`), - substring.Has(`erlang.mk`), - substring.Has(`extern/`), - substring.Has(`external/`), - substring.Has(`Godeps/_workspace/`), - substring.Has(`gradle/wrapper/`), - substring.Has(`MathJax/`), - substring.Has(`node_modules/`), - substring.Has(`proguard-rules.pro`), - substring.Has(`proguard.pro`), - substring.Has(`Sparkle/`), - substring.Has(`third-party/`), - substring.Has(`third_party/`), - substring.Has(`thirdparty/`), - substring.Has(`vendor/`), - substring.Has(`vendors/`), - substring.Exact(`.osx`), - substring.Exact(`rebar`), - substring.Exact(`Vagrantfile`), - substring.Exact(`waf`), - substring.Prefixes( - `.google_apis/`, - `debian/`, - `deps/`, - `inst/extdata/`, - `packages/`, - `Packages/`, - `Pods/`, - `Samples/`, - `samples/`, - `Test/fixture/`, - `test/fixture/`, - `Test/fixtures/`, - `test/fixtures/`, - `tools/`, - `vignettes/`, - ), - substring.Suffixes( - `.d.ts`, - `.travis.yml`, - `activator.bat`, - `activator`, - `circle.yml`, - `config.guess`, - `config.sub`, - `configure.ac`, - `configure`, - `fabfile.py`, - `gitattributes`, - `gitignore`, - `gitmodules`, - `gradlew.bat`, - `gradlew`, - `run.n`, - `.DS_Store`, - `.DS_store`, - `.dS_Store`, - `.dS_store`, - `.Ds_Store`, - `.Ds_store`, - `.ds_Store`, - `.ds_store`, - ), + substring.Regexp(`(^|/)cache/`), + substring.Regexp(`^[Dd]ependencies/`), + substring.Regexp(`(^|/)dist/`), + substring.Regexp(`^deps/`), + substring.Regexp(`^tools/`), + substring.Regexp(`(^|/)configure$`), + substring.Regexp(`(^|/)config.guess$`), + substring.Regexp(`(^|/)config.sub$`), + substring.Regexp(`(^|/)aclocal.m4`), + substring.Regexp(`(^|/)libtool.m4`), + substring.Regexp(`(^|/)ltoptions.m4`), + substring.Regexp(`(^|/)ltsugar.m4`), + substring.Regexp(`(^|/)ltversion.m4`), + substring.Regexp(`(^|/)lt~obsolete.m4`), + substring.Regexp(`cpplint.py`), + substring.Regexp(`node_modules/`), + substring.Regexp(`bower_components/`), + substring.Regexp(`^rebar$`), + substring.Regexp(`erlang.mk`), + substring.Regexp(`Godeps/_workspace/`), + substring.Regexp(`.indent.pro`), + substring.Regexp(`(\.|-)min\.(js|css)$`), + substring.Regexp(`([^\s]*)import\.(css|less|scss|styl)$`), + substring.Regexp(`(^|/)bootstrap([^.]*)\.(js|css|less|scss|styl)$`), + substring.Regexp(`(^|/)custom\.bootstrap([^\s]*)(js|css|less|scss|styl)$`), + substring.Regexp(`(^|/)font-awesome\.(css|less|scss|styl)$`), + substring.Regexp(`(^|/)foundation\.(css|less|scss|styl)$`), + substring.Regexp(`(^|/)normalize\.(css|less|scss|styl)$`), + substring.Regexp(`(^|/)[Bb]ourbon/.*\.(css|less|scss|styl)$`), + substring.Regexp(`(^|/)animate\.(css|less|scss|styl)$`), + substring.Regexp(`third[-_]?party/`), + substring.Regexp(`3rd[-_]?party/`), + substring.Regexp(`vendors?/`), + substring.Regexp(`extern(al)?/`), + substring.Regexp(`(^|/)[Vv]+endor/`), + substring.Regexp(`^debian/`), + substring.Regexp(`run.n$`), + substring.Regexp(`bootstrap-datepicker/`), + substring.Regexp(`(^|/)jquery([^.]*)\.js$`), + substring.Regexp(`(^|/)jquery\-\d\.\d+(\.\d+)?\.js$`), + substring.Regexp(`(^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(js|css)$`), + substring.Regexp(`(^|/)jquery\.(ui|effects)\.([^.]*)\.(js|css)$`), + substring.Regexp(`jquery.fn.gantt.js`), + substring.Regexp(`jquery.fancybox.(js|css)`), + substring.Regexp(`fuelux.js`), + substring.Regexp(`(^|/)jquery\.fileupload(-\w+)?\.js$`), + substring.Regexp(`(^|/)slick\.\w+.js$`), + substring.Regexp(`(^|/)Leaflet\.Coordinates-\d+\.\d+\.\d+\.src\.js$`), + substring.Regexp(`leaflet.draw-src.js`), + substring.Regexp(`leaflet.draw.css`), + substring.Regexp(`Control.FullScreen.css`), + substring.Regexp(`Control.FullScreen.js`), + substring.Regexp(`leaflet.spin.js`), + substring.Regexp(`wicket-leaflet.js`), + substring.Regexp(`.sublime-project`), + substring.Regexp(`.sublime-workspace`), + substring.Regexp(`(^|/)prototype(.*)\.js$`), + substring.Regexp(`(^|/)effects\.js$`), + substring.Regexp(`(^|/)controls\.js$`), + substring.Regexp(`(^|/)dragdrop\.js$`), + substring.Regexp(`(.*?)\.d\.ts$`), + substring.Regexp(`(^|/)mootools([^.]*)\d+\.\d+.\d+([^.]*)\.js$`), + substring.Regexp(`(^|/)dojo\.js$`), + substring.Regexp(`(^|/)MochiKit\.js$`), + substring.Regexp(`(^|/)yahoo-([^.]*)\.js$`), + substring.Regexp(`(^|/)yui([^.]*)\.js$`), + substring.Regexp(`(^|/)ckeditor\.js$`), + substring.Regexp(`(^|/)tiny_mce([^.]*)\.js$`), + substring.Regexp(`(^|/)tiny_mce/(langs|plugins|themes|utils)`), + substring.Regexp(`(^|/)ace-builds/`), + substring.Regexp(`(^|/)fontello(.*?)\.css$`), + substring.Regexp(`(^|/)MathJax/`), + substring.Regexp(`(^|/)Chart\.js$`), + substring.Regexp(`(^|/)[Cc]ode[Mm]irror/(\d+\.\d+/)?(lib|mode|theme|addon|keymap|demo)`), + substring.Regexp(`(^|/)shBrush([^.]*)\.js$`), + substring.Regexp(`(^|/)shCore\.js$`), + substring.Regexp(`(^|/)shLegacy\.js$`), + substring.Regexp(`(^|/)angular([^.]*)\.js$`), + substring.Regexp(`(^|\/)d3(\.v\d+)?([^.]*)\.js$`), + substring.Regexp(`(^|/)react(-[^.]*)?\.js$`), + substring.Regexp(`(^|/)modernizr\-\d\.\d+(\.\d+)?\.js$`), + substring.Regexp(`(^|/)modernizr\.custom\.\d+\.js$`), + substring.Regexp(`(^|/)knockout-(\d+\.){3}(debug\.)?js$`), + substring.Regexp(`(^|/)docs?/_?(build|themes?|templates?|static)/`), + substring.Regexp(`(^|/)admin_media/`), + substring.Regexp(`(^|/)env/`), + substring.Regexp(`^fabfile\.py$`), + substring.Regexp(`^waf$`), + substring.Regexp(`^.osx$`), + substring.Regexp(`\.xctemplate/`), + substring.Regexp(`\.imageset/`), + substring.Regexp(`^Carthage/`), + substring.Regexp(`^Pods/`), + substring.Regexp(`(^|/)Sparkle/`), + substring.Regexp(`Crashlytics.framework/`), + substring.Regexp(`Fabric.framework/`), + substring.Regexp(`BuddyBuildSDK.framework/`), + substring.Regexp(`Realm.framework`), + substring.Regexp(`RealmSwift.framework`), + substring.Regexp(`gitattributes$`), + substring.Regexp(`gitignore$`), + substring.Regexp(`gitmodules$`), + substring.Regexp(`(^|/)gradlew$`), + substring.Regexp(`(^|/)gradlew\.bat$`), + substring.Regexp(`(^|/)gradle/wrapper/`), + substring.Regexp(`-vsdoc\.js$`), + substring.Regexp(`\.intellisense\.js$`), + substring.Regexp(`(^|/)jquery([^.]*)\.validate(\.unobtrusive)?\.js$`), + substring.Regexp(`(^|/)jquery([^.]*)\.unobtrusive\-ajax\.js$`), + substring.Regexp(`(^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$`), + substring.Regexp(`^[Pp]ackages\/.+\.\d+\/`), + substring.Regexp(`(^|/)extjs/.*?\.js$`), + substring.Regexp(`(^|/)extjs/.*?\.xml$`), + substring.Regexp(`(^|/)extjs/.*?\.txt$`), + substring.Regexp(`(^|/)extjs/.*?\.html$`), + substring.Regexp(`(^|/)extjs/.*?\.properties$`), + substring.Regexp(`(^|/)extjs/.sencha/`), + substring.Regexp(`(^|/)extjs/docs/`), + substring.Regexp(`(^|/)extjs/builds/`), + substring.Regexp(`(^|/)extjs/cmd/`), + substring.Regexp(`(^|/)extjs/examples/`), + substring.Regexp(`(^|/)extjs/locale/`), + substring.Regexp(`(^|/)extjs/packages/`), + substring.Regexp(`(^|/)extjs/plugins/`), + substring.Regexp(`(^|/)extjs/resources/`), + substring.Regexp(`(^|/)extjs/src/`), + substring.Regexp(`(^|/)extjs/welcome/`), + substring.Regexp(`(^|/)html5shiv\.js$`), + substring.Regexp(`^[Tt]ests?/fixtures/`), + substring.Regexp(`^[Ss]pecs?/fixtures/`), + substring.Regexp(`(^|/)cordova([^.]*)\.js$`), + substring.Regexp(`(^|/)cordova\-\d\.\d(\.\d)?\.js$`), + substring.Regexp(`foundation(\..*)?\.js$`), + substring.Regexp(`^Vagrantfile$`), + substring.Regexp(`.[Dd][Ss]_[Ss]tore$`), + substring.Regexp(`^vignettes/`), + substring.Regexp(`^inst/extdata/`), + substring.Regexp(`octicons.css`), + substring.Regexp(`sprockets-octicons.scss`), + substring.Regexp(`(^|/)activator$`), + substring.Regexp(`(^|/)activator\.bat$`), + substring.Regexp(`proguard.pro`), + substring.Regexp(`proguard-rules.pro`), + substring.Regexp(`^puphpet/`), + substring.Regexp(`(^|/)\.google_apis/`), + substring.Regexp(`^Jenkinsfile$`), ) var documentationMatchers = substring.Or(