{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}
module Render.HTML(htmlFromColSpans) where
import Prelude hiding(span)
import Data.Text(Text)
import Data.Char(isSpace)
import qualified Data.Text as T
import qualified Data.Text.Lazy as LT
import Text.Blaze.Html5 hiding(style)
import Text.Blaze.Html5.Attributes(colspan, style)
import Text.Blaze.Html.Renderer.Text(renderHtml)
import Alignment
import Render.Common(TokensWithColSpan)
import Token(MyTok(..))
import Debug.Trace(trace)
import Util
--latexFromColSpans :: Int -> [[TokensWithColSpan]] -> Text
htmlFromColSpans cols =
LT.toStrict
. renderHtml
. table
. tbody
. mapM_ renderTr
renderTr colspans = tr (mapM_ renderColSpan colspans)
--renderColSpan :: TokensWithColSpan -> Text
renderColSpan ([(TBlank, txt)], colSpan, AIndent) = -- indentation
(td $ toHtml txt)
! colspan (toValue colSpan)
! style widthStyle
where
widthStyle = toValue $ "min-width: " <> show (T.length txt) <> "ex"
renderColSpan (toks, colSpan, alignment) =
(td $ formatTokens toks)
! colspan (toValue colSpan)
! style alignStyle
where
alignStyle = "text-align: " <> alignMark alignment
alignMark ACenter = "center"
alignMark ALeft = "left"
-- Decrease column spacing: \\setlength{\\tabcolsep}{1ex}
-- TODO: braced operators
formatTokens :: [(MyTok, Text)] -> Html
formatTokens = mapM_ formatToken
. preformatTokens
formatToken :: (MyTok, Text) -> Html
formatToken (TOperator,unbrace -> Just op) = do "("
formatToken (TOperator, op)
")"
formatToken (TOperator,"|>" ) = "⊳"
formatToken (TOperator,"<>" ) = "⋄"
formatToken (TOperator,"=>" ) = "⇒"
formatToken (TOperator,"->" ) = "→"
formatToken (TOperator,"|->" ) = "↦"
formatToken (TVar ,"undefined") = "⊥"
formatToken (TVar ,"bot" ) = "⊥"
formatToken (TVar ,"not" ) = "¬"
formatToken (TVar ,"a" ) = "α"
formatToken (TVar ,"b" ) = "β"
formatToken (TVar ,"c" ) = "γ"
formatToken (TVar ,"d" ) = "δ"
formatToken (TVar ,"pi" ) = "π"
formatToken (TVar ,"eps" ) = "ε"
formatToken (TKeyword ,"\\" ) = "λ"
formatToken (TKeyword, "forall" ) = "∀"
formatToken (TOperator,"elem" ) = "∈"
formatToken (TOperator,"<=" ) = "≤"
formatToken (TOperator,">=" ) = "≥"
formatToken (TOperator,"mempty" ) = "∅"
formatToken (TOperator,">>>" ) = "⋙"
formatToken (TOperator,"<<<" ) = "⋘"
formatToken (TOperator,"||" ) = "∥"
formatToken (TOperator,"<->" ) = "↔︎"
formatToken (TOperator,"<-" ) = "←"
formatToken (TOperator,"-<" ) = "≺"
formatToken (TOperator,">-" ) = "≻"
formatToken (TOperator,"!=" ) = "≠"
formatToken (TOperator,"\\/" ) = "⋁"
formatToken (TOperator,"/\\" ) = "⋀"
formatToken (TOperator,"~" ) = "∼"
formatToken (TOperator,"~=" ) = "≈"
formatToken (TVar,"top" ) = "⊤"
formatToken (TKeyword, kwd ) = b $ toHtml kwd
formatToken (TVar, v ) = i $ toHtml v
formatToken (TCons, v ) = span (toHtml v)
! style ("font-variant: small-caps;")
formatToken (_, txt) = toHtml txt