packages feed

highlighting-kate-0.2.7: Text/Highlighting/Kate/Syntax.hs.in

module Text.Highlighting.Kate.Syntax ( highlightAs, languages, languagesByExtension,
                                       languagesByFilename ) where
import Data.Char (toLower)
import Text.Highlighting.Kate.Definitions
import Text.Highlighting.Kate.Common (matchGlobs)
@imports@

-- | List of supported languages.
languages :: [String]
languages = @languages@

-- | List of language extensions.
languageExtensions :: [(String, String)]
languageExtensions = @languageExtensions@

-- | Returns a list of languages appropriate for the given file extension.
languagesByExtension :: String -> [String]
languagesByExtension ('.':ext) = languagesByFilename ("*." ++ ext)
languagesByExtension ext       = languagesByFilename ("*." ++ ext)

-- | Returns a list of languages appropriate for the given filename.
languagesByFilename :: FilePath -> [String]
languagesByFilename fn = [lang | (lang, globs) <- languageExtensions, matchGlobs fn globs]

-- | Highlight source code using a specified syntax definition.
highlightAs :: String                        -- ^ Language syntax
            -> String                        -- ^ Source code to highlight
            -> Either String [SourceLine]    -- ^ Either error message or result
highlightAs lang =
  let lang'  = map toLower lang
      lang'' = if lang' `elem` map (map toLower) languages
                  then lang'
                  else case languagesByExtension lang' of
                            [l]  -> map toLower l  -- go by extension if unambiguous
                            _    -> lang'
  in  case lang'' of
        @cases@
        _ -> (\_ -> Left ("Unknown language: " ++ lang))