module Text.HTML.Moe
(
module Text.HTML.Moe.Element
, module Text.HTML.Moe.Attribute
, (/)
, render
)
where
import Control.Monad.Writer (execWriter)
import Prelude hiding ((/), (), head, (>), (.), concat, concatMap, (+))
import qualified Prelude as P
import MPS.Light ((>), (.), times)
import Text.HTML.Moe.Type hiding (name, value)
import qualified Text.HTML.Moe.Type as T
import Text.HTML.Moe.Element
import Text.HTML.Moe.Attribute
import Data.ByteString.Char8 (ByteString, concat, append, intercalate)
import Text.HTML.Moe.Utils
(/) :: MoeUnit
(/) = return ()
render :: MoeUnit -> String
render = execWriter > map render_element > intercalate (pack "\n") > unpack
_indent_space :: Int
_indent_space = 2
new_line :: ByteString
new_line = pack "\n"
space :: ByteString
space = pack " "
_indent :: Int -> ByteString
_indent n = (n * _indent_space).times space.concat
render_element' :: Int -> Element -> ByteString
render_element' _ (Raw x) = x
render_element' _ (Pre x) = x
render_element' n (Prim x) = _indent n + x + new_line
render_element' n (Data x) = _indent n + x + new_line
render_element' n x =
[ _indent n
, "<".pack
, x.T.name
, x.attributes.map render_attribute. join_attribute
, ">".pack
, new_line
, x.elements.map (render_element' (n P.+ 1)) .concat
, _indent n
, "</".pack
, x.T.name
, ">".pack
, new_line
]
.concat
where
join_attribute xs = xs.map (pack " " `append`) .concat
render_element :: Element -> ByteString
render_element = render_element' 0
render_attribute :: Attribute -> ByteString
render_attribute x =
[x.key, pack "=", pack "\"", x.T.value, pack "\""].concat