packages feed

lit-0.1.0.5: src/Highlight.hs

module Highlight (highlight, getLang) where

import qualified Data.Text as T 
import Data.Monoid (mconcat)

import Text.Blaze (toValue, (!))
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A
import Text.Highlighting.Kate ( defaultFormatOpts
                              , highlightAs
                              , languagesByFilename )
import Text.Highlighting.Kate.Types 

highlight :: String -> T.Text -> H.Html
highlight lang txt = 
    let
        highlighted = highlightAs lang (T.unpack txt)
        htmlList = map sourceLineToHtml highlighted
    in 
        mconcat htmlList

sourceLineToHtml :: SourceLine -> H.Html
sourceLineToHtml line = mconcat $  htmlList ++ [H.toHtml "\n"]
    where
        htmlList = map (tokenToHtml defaultFormatOpts) line

tokenToHtml :: FormatOptions -> Token -> H.Html
tokenToHtml _ (NormalTok, str)  = H.toHtml str
tokenToHtml opts (toktype, str) =
    if titleAttributes opts
    then sp ! A.title (toValue $ show toktype)
    else sp 
        where sp = H.span ! A.class_ (toValue $ short toktype) $ H.toHtml str

short :: TokenType -> String
short KeywordTok        = "kw"
short DataTypeTok       = "dt"
short DecValTok         = "dv"
short BaseNTok          = "bn"
short FloatTok          = "fl"
short CharTok           = "ch"
short StringTok         = "st"
short CommentTok        = "co"
short OtherTok          = "ot"
short AlertTok          = "al"
short FunctionTok       = "fu"
short RegionMarkerTok   = "re"
short ErrorTok          = "er"
short NormalTok         = ""

getLang path = 
    case languagesByFilename path of
    [] -> ""
    lst -> head lst