Merge pull request #35 from lafriks-fork/feat/manpage_strategy

Add support for Roff man pages filenames
This commit is contained in:
Alexander 2020-10-22 00:10:39 +02:00 committed by GitHub
commit 0fb4b8a768
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 0 deletions

View File

@ -22,6 +22,7 @@ var DefaultStrategies = []Strategy{
GetLanguagesByFilename, GetLanguagesByFilename,
GetLanguagesByShebang, GetLanguagesByShebang,
GetLanguagesByExtension, GetLanguagesByExtension,
GetLanguagesByManpage,
GetLanguagesByContent, GetLanguagesByContent,
GetLanguagesByClassifier, GetLanguagesByClassifier,
} }
@ -383,6 +384,26 @@ func GetLanguagesByExtension(filename string, _ []byte, _ []string) []string {
return nil 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 { func getDotIndexes(filename string) []int {
dots := make([]int, 0, 2) dots := make([]int, 0, 2)
for i, letter := range filename { for i, letter := range filename {

View File

@ -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() { func (s *EnryTestSuite) TestGetLanguagesByClassifier() {
test := []struct { test := []struct {
name string name string