diff --git a/common.go b/common.go index 723bc48..d6c8b7e 100644 --- a/common.go +++ b/common.go @@ -22,6 +22,7 @@ var DefaultStrategies = []Strategy{ GetLanguagesByFilename, GetLanguagesByShebang, GetLanguagesByExtension, + GetLanguagesByManpage, GetLanguagesByContent, GetLanguagesByClassifier, } @@ -383,6 +384,26 @@ func GetLanguagesByExtension(filename string, _ []byte, _ []string) []string { return nil } +var ( + manpageExtension = regex.MustCompile(`\.(?:[1-9](?:[a-z_]+[a-z_0-9]*)?|0p|n|man|mdoc)(?:\.in)?$`) +) + +// GetLanguagesByManpage returns a slice of possible manpage languages for the given filename. +// It complies with the signature to be a Strategy type. +func GetLanguagesByManpage(filename string, _ []byte, _ []string) []string { + filename = strings.ToLower(filename) + + // Check if matches Roff man page filenames + if manpageExtension.Match([]byte(filename)) { + return []string{ + "Roff Manpage", + "Roff", + } + } + + return nil +} + func getDotIndexes(filename string) []int { dots := make([]int, 0, 2) for i, letter := range filename { diff --git a/common_test.go b/common_test.go index 40d78d9..15ae503 100644 --- a/common_test.go +++ b/common_test.go @@ -290,6 +290,30 @@ func (s *EnryTestSuite) TestGetLanguagesByExtension() { } } +func (s *EnryTestSuite) TestGetLanguagesByManpage() { + tests := []struct { + name string + filename string + content []byte + candidates []string + expected []string + }{ + {name: "TestGetLanguagesByManpage_1", filename: "bsdmalloc.3malloc", expected: []string{"Roff Manpage", "Roff"}}, + {name: "TestGetLanguagesByManpage_2", filename: "dirent.h.0p", expected: []string{"Roff Manpage", "Roff"}}, + {name: "TestGetLanguagesByManpage_3", filename: "linguist.1gh", expected: []string{"Roff Manpage", "Roff"}}, + {name: "TestGetLanguagesByManpage_4", filename: "test.1.in", expected: []string{"Roff Manpage", "Roff"}}, + {name: "TestGetLanguagesByManpage_5", filename: "test.man.in", expected: []string{"Roff Manpage", "Roff"}}, + {name: "TestGetLanguagesByManpage_6", filename: "test.mdoc.in", expected: []string{"Roff Manpage", "Roff"}}, + {name: "TestGetLanguagesByManpage_7", filename: "foo.h", expected: nil}, + {name: "TestGetLanguagesByManpage_8", filename: "", expected: nil}, + } + + for _, test := range tests { + languages := GetLanguagesByManpage(test.filename, test.content, test.candidates) + assert.Equal(s.T(), test.expected, languages, fmt.Sprintf("%v: languages = %v, expected: %v", test.name, languages, test.expected)) + } +} + func (s *EnryTestSuite) TestGetLanguagesByClassifier() { test := []struct { name string