-- | Primary interface for looking up the programming language of a file or -- interacting with languages known to linguist -- (https://github.com/github/linguist). module Data.Languages ( languageForPath , languages , languagesByExtension , languagesByFileName , LanguageKey , Language(..) ) where import Control.Applicative import qualified Data.Map.Strict as Map import Data.Maybe import Data.Text (Text) import qualified Data.Text as Text import Gen_Languages import System.FilePath.Posix -- | Find the Language (if any) for a FilePath. languageForPath :: FilePath -> Maybe Language languageForPath path = languageForFileName <|> languageForExtension where languageForFileName = languageFor (takeFileName path) languagesByFileName languageForExtension = languageFor (takeExtension path) languagesByExtension languageFor k f = maybe Nothing lookupPrimary $ Map.lookup (Text.pack k) f -- Some extensions and filenames associate with multiple languages, this is -- a dumb way to specify which is the primary language. lookupPrimary xs | null xs = Nothing | "Markdown" `elem` xs = lookup "Markdown" | otherwise = lookup (head xs) where lookup k = Map.lookup k languages