packages feed

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

{-# 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 `<tr/>` element
renderTr :: [TokensWithColSpan] -> Html
renderTr colspans = tr (mapM_ renderColSpan colspans)

-- | Render single colspan as a single `<td/>` 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