{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ViewPatterns #-} -- | Render analyzed tokens into HTML table. module Render.HTML(htmlFromColSpans, htmlInline) where import Prelude hiding(span, id) import Data.Text(Text) import qualified Data.Text as T import qualified Data.Text.Lazy as LT import Text.Blaze.Html5 ( toHtml, Html, ToValue(toValue), (!), b, html, i, span, table, tbody, td, tr ) import Text.Blaze.Html5.Attributes(colspan, style, id) import Text.Blaze.Html.Renderer.Text(renderHtml) import Alignment ( Align(..) ) import Render.Common(TokensWithColSpan) import Token (MyTok(..)) import Util ( preformatTokens, unbrace ) -- | Given a list of lists of colspans in each table row, return an HTML text. htmlFromColSpans :: [[TokensWithColSpan]] -> Text htmlFromColSpans = LT.toStrict . renderHtml . table . tbody . mapM_ renderTr -- | Given a list of colspans within a single table row, render it to HTML tree -- of `` element renderTr :: [TokensWithColSpan] -> Html renderTr colspans = tr (mapM_ renderColSpan colspans) -- | Render single colspan as a single `` cell. renderColSpan :: TokensWithColSpan -> Html 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" alignMark AIndent = "left" -- TODO: braced operators -- | Given a list of tokens in a colspan, render HTML fragment. htmlInline :: [(MyTok, Text)] -> Text htmlInline = LT.toStrict . renderHtml . formatTokens formatTokens :: [(MyTok, Text)] -> Html formatTokens = mapM_ formatToken . preformatTokens -- | Format a single token as HTML fragment. 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 (TTikz mark,_ ) = span "" ! id (toValue mark) formatToken (_, txt ) = toHtml txt