packages feed

pandoc-filter-indent-0.1.0.0: src/Render/HTML.hs

{-# 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