{-# LANGUAGE CPP             #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-|
Module:      Text.Show.Text.Text.XHtml
Copyright:   (C) 2014-2015 Ryan Scott
License:     BSD-style (see the file LICENSE)
Maintainer:  Ryan Scott
Stability:   Provisional
Portability: GHC

Monomorphic 'Show' functions for data types in the @xhtml@ library.

/Since: 0.1/
-}
module Text.Show.Text.Text.XHtml (
      showbHtml
    , showbHtmlList
    , showbHtmlAttr
    , showbHotLinkPrec
    , showbHtmlTable
    ) where

import Data.Monoid.Compat

import Prelude hiding (Show)

import Text.Show.Text (Show(..), Builder, FromStringShow(..), fromString, singleton)
import Text.Show.Text.Data.Char (showbString)
import Text.Show.Text.TH (deriveShow)
import Text.XHtml.Frameset (Html, HtmlAttr, HotLink,
                            htmlAttrPair, renderHtmlFragment)
import Text.XHtml.Table (HtmlTable)

#include "inline.h"

-- | Convert an 'Html' value to a 'Builder'.
--
-- /Since: 0.1/
showbHtml :: Html -> Builder
showbHtml = fromString . renderHtmlFragment
{-# INLINE showbHtml #-}

-- | Convert a list of 'Html' values to a 'Builder'.
--
-- /Since: 0.1/
showbHtmlList :: [Html] -> Builder
showbHtmlList = mconcat . map showb
{-# INLINE showbHtmlList #-}

-- | Convert an 'HtmlAttr' to a 'Builder'.
--
-- /Since: 0.1/
showbHtmlAttr :: HtmlAttr -> Builder
showbHtmlAttr ha = case htmlAttrPair ha of
    (str, val) -> fromString str <> singleton '=' <> showbString val
{-# INLINE showbHtmlAttr #-}

-- | Convert a 'HotLink' to a 'Builder' with the given precedence.
--
-- /Since: 0.1/
showbHotLinkPrec :: Int -> HotLink -> Builder
showbHotLinkPrec = showbPrec
{-# INLINE showbHotLinkPrec #-}

-- | Convert an 'HtmlTable' to a 'Builder'.
--
-- /Since: 0.1/
showbHtmlTable :: HtmlTable -> Builder
showbHtmlTable = showb . FromStringShow
{-# INLINE showbHtmlTable #-}

instance Show Html where
    showb = showbHtml
    INLINE_INST_FUN(showb)

    showbList = showbHtmlList
    INLINE_INST_FUN(showbList)

instance Show HtmlAttr where
    showb = showbHtmlAttr
    INLINE_INST_FUN(showb)

$(deriveShow ''HotLink)

instance Show HtmlTable where
    showb = showbHtmlTable
    INLINE_INST_FUN(showb)