{- | Module : Text.Highlighting.Kate.Syntax Copyright : Copyright (C) 2008-2011 John MacFarlane License : GNU GPL, version 2 or above Maintainer : John MacFarlane Stability : alpha Portability : portable Token lexer for various languages. -} module Text.Highlighting.Kate.Syntax ( highlightAs, languages, languageByFullName, languagesByExtension, languagesByFilename ) where import Data.Char (toLower) import Text.Highlighting.Kate.Types import Text.Highlighting.Kate.Common (matchGlobs) @imports@ -- | List of supported languages. languages :: [String] languages = @languages@ -- | List of language extensions. languageExtensions :: [(String, String)] languageExtensions = @languageExtensions@ -- | List of full names of languages. languageFullNames :: [(String, String)] languageFullNames = @languageFullNames@ languageShortNames :: [(String, String)] languageShortNames = [(map toLower y, map toLower x) | (x, y) <- languageFullNames] -- | Lookup canonical language name by full syntaxName (e.g. "C#" for "Cs"). languageByFullName :: String -> Maybe String languageByFullName s = lookup s languageShortNames -- | 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. The source language may be specified -- by its canonical name (case-insensitive) or by a canonical -- extension (if unique). -- The parsers read the input lazily and parse line by line; -- results are returned immediately. -- Supported languages: @supportedlanguages@. highlightAs :: String -- ^ Language syntax (e.g. "haskell") or extension (e.g. "hs"). -> String -- ^ Source code to highlight -> [SourceLine] -- ^ List of highlighted source lines highlightAs lang = let lang' = map toLower lang lang'' = if lang' `elem` map (map toLower) languages then lang' else case languageByFullName lang' of Just l -> l Nothing -> case languagesByExtension lang' of -- go by extension if unambiguous [l] -> map toLower l _ -> lang' in case lang'' of @cases@ -- special cases: "csharp" -> highlightAs "cs" _ -> map (\l -> [(NormalTok, l)]) . lines