module Text.Highlighter.Formatters.Html (format) where
import Data.Text.Encoding (decodeUtf8)
import Prelude hiding (div, span)
import Text.Blaze.Html5
import Text.Blaze.Html5.Attributes hiding (span)
import qualified Data.ByteString as BS
import Text.Highlighter.Types
format :: Bool -> [Token] -> Html
format ls ts
| ls =
table ! class_ "highlighttable" $ tr $ do
td ! class_ "linenos" $
div ! class_ "linenodiv" $
pre (lineNos (countLines ts))
td ! class_ "code" $
div ! class_ "highlight" $
pre $ highlight ts
| otherwise =
div ! class_ "highlight" $
pre $ highlight ts
highlight :: [Token] -> Html
highlight [] = return ()
highlight (Token t s:ts) = do
span ! class_ (stringValue $ shortName t) $ text (decodeUtf8 s)
highlight ts
countLines :: [Token] -> Int
countLines [] = 0
countLines (Token _ s:ts) =
length (BS.elemIndices (toEnum . fromEnum $ '\n') s) + countLines ts
lineNos :: Int -> Html
lineNos n = lineNos' 1
where
lineNos' c
| c <= n = do
a ! href (stringValue $ "#L-" ++ show c)
! name (stringValue $ "L-" ++ show c) $
string (show c)
string "\n"
lineNos' (c + 1)
| otherwise = return ()