hpaste-1.2.0: src/Hpaste/View/Highlight.hs
{-# OPTIONS -Wall -fno-warn-name-shadowing #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE NamedFieldPuns #-}
-- | Code highlighting.
module Hpaste.View.Highlight
(highlightPaste
,highlightHaskell)
where
import Hpaste.Types
import Hpaste.View.Html
import Control.Monad
import Data.List (find)
import Data.Monoid.Operator
import Data.Text (Text,unpack,pack)
import qualified Data.Text as T
import Language.Haskell.HsColour.CSS (hscolour)
import Prelude hiding ((++))
import Text.Blaze.Html5 as H hiding (map)
import qualified Text.Blaze.Html5.Attributes as A
-- | Syntax highlight the paste.
highlightPaste :: [Language] -> Paste -> Html
highlightPaste langs Paste{..} =
H.table ! aClass "code" $ do
td ! aClass "line-nums" $ do
pre $
forM_ [1..length (T.lines pastePaste)] $ \i -> do
let name = "line" ++ pack (show i)
href ("#" ++ name) (toHtml i) ! A.id (toValue name) ! A.name (toValue name)
"\n"
td $
case lang of
Just (Language{languageName})
| elem languageName ["haskell","agda","idris"] ->
preEscapedString $ hscolour False (unpack pastePaste)
Just (Language{..}) ->
pre $ code ! A.class_ (toValue $ "language-" ++ languageName) $
toHtml pastePaste
_ ->
pre $ toHtml pastePaste
where lang = find ((==pasteLanguage) . Just . languageId) langs
highlightHaskell :: Text -> Html
highlightHaskell paste =
H.table ! aClass "code" $
td $ preEscapedString $ hscolour False (unpack paste)