From cb353b4b051c2f5169989e982c55831414dc5371 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Thu, 17 Sep 2020 11:27:28 +0300 Subject: [PATCH] Add support for Roff man pages filenames --- common.go | 21 +++++++++++++++++++++ common_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+) 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