-- | -- Module : Simulation.Aivika.Experiment.HtmlWriter -- Copyright : Copyright (c) 2012, David Sorokin -- License : BSD3 -- Maintainer : David Sorokin -- Stability : experimental -- Tested with: GHC 7.4.1 -- -- This is an utility module that provides an HTML writer. -- module Simulation.Aivika.Experiment.HtmlWriter (HtmlWriter, runHtmlWriter, composeHtml, writeHtml, writeHtmlLn, writeHtmlText, writeHtmlParagraph, writeHtmlParagraphWithId, writeHtmlHeader1, writeHtmlHeader1WithId, writeHtmlHeader2, writeHtmlHeader2WithId, writeHtmlHeader3, writeHtmlHeader3WithId, writeHtmlHeader4, writeHtmlHeader4WithId, writeHtmlHeader5, writeHtmlHeader5WithId, writeHtmlHeader6, writeHtmlHeader6WithId, writeHtmlBreak, writeHtmlLink, writeHtmlImage, writeHtmlList, writeHtmlListItem, writeHtmlDocumentWithTitle, encodeHtmlText) where import Control.Monad import Control.Monad.Trans import Network.URI -- | It writes fast an HTML code. newtype HtmlWriter a = HtmlWriter { runHtmlWriter :: ShowS -> IO (a, ShowS) -- ^ Run the HTML writer monad. } instance Monad HtmlWriter where return a = HtmlWriter $ \f -> return (a, f) (HtmlWriter m) >>= k = HtmlWriter $ \f -> do (a, f') <- m f let HtmlWriter m' = k a m' f' instance MonadIO HtmlWriter where liftIO m = HtmlWriter $ \f -> do x <- m return (x, f) -- | Write the HTML code. writeHtml :: String -> HtmlWriter () writeHtml code = HtmlWriter $ \f -> return ((), f . (code ++)) -- | Write the HTML code. writeHtmlLn :: String -> HtmlWriter () writeHtmlLn code = do writeHtml code writeHtml "\n" -- | Write the text in HTML. writeHtmlText :: String -> HtmlWriter () writeHtmlText text = HtmlWriter $ \f -> return ((), f . (encodeHtmlText text ++)) -- | Compose the HTML applying the corresponded transformation. composeHtml :: ShowS -> HtmlWriter () composeHtml g = HtmlWriter $ \f -> return ((), f . g) -- | Write the HTML link with the specified URI and contents. writeHtmlLink :: String -> HtmlWriter () -> HtmlWriter () writeHtmlLink uri inner = do writeHtml "" inner writeHtml "" -- | Write the HTML image with the specified URI. writeHtmlImage :: String -> HtmlWriter () writeHtmlImage uri = do writeHtml "" -- | Write the @\@ element with the specified contents. writeHtmlParagraph :: HtmlWriter () -> HtmlWriter () writeHtmlParagraph inner = do writeHtml "

" inner writeHtml "

" -- | Write the @\@ element with the specified contents. writeHtmlHeader1 :: HtmlWriter () -> HtmlWriter () writeHtmlHeader1 inner = do writeHtml "

" inner writeHtml "

" -- | Write the @\@ element with the specified contents. writeHtmlHeader2 :: HtmlWriter () -> HtmlWriter () writeHtmlHeader2 inner = do writeHtml "

" inner writeHtml "

" -- | Write the @\@ element with the specified contents. writeHtmlHeader3 :: HtmlWriter () -> HtmlWriter () writeHtmlHeader3 inner = do writeHtml "

" inner writeHtml "

" -- | Write the @\@ element with the specified contents. writeHtmlHeader4 :: HtmlWriter () -> HtmlWriter () writeHtmlHeader4 inner = do writeHtml "

" inner writeHtml "

" -- | Write the @\@ element with the specified contents. writeHtmlHeader5 :: HtmlWriter () -> HtmlWriter () writeHtmlHeader5 inner = do writeHtml "
" inner writeHtml "
" -- | Write the @\@ element with the specified contents. writeHtmlHeader6 :: HtmlWriter () -> HtmlWriter () writeHtmlHeader6 inner = do writeHtml "
" inner writeHtml "
" -- | Write the @\@ element with the specified id and contents. writeHtmlParagraphWithId :: String -> HtmlWriter () -> HtmlWriter () writeHtmlParagraphWithId id inner = do writeHtml "

" inner writeHtml "

" -- | Write the @\@ element with the specified id and contents. writeHtmlHeader1WithId :: String -> HtmlWriter () -> HtmlWriter () writeHtmlHeader1WithId id inner = do writeHtml "

" inner writeHtml "

" -- | Write the @\@ element with the specified id and contents. writeHtmlHeader2WithId :: String -> HtmlWriter () -> HtmlWriter () writeHtmlHeader2WithId id inner = do writeHtml "

" inner writeHtml "

" -- | Write the @\@ element with the specified id and contents. writeHtmlHeader3WithId :: String -> HtmlWriter () -> HtmlWriter () writeHtmlHeader3WithId id inner = do writeHtml "

" inner writeHtml "

" -- | Write the @\@ element with the specified id and contents. writeHtmlHeader4WithId :: String -> HtmlWriter () -> HtmlWriter () writeHtmlHeader4WithId id inner = do writeHtml "

" inner writeHtml "

" -- | Write the @\@ element with the specified id and contents. writeHtmlHeader5WithId :: String -> HtmlWriter () -> HtmlWriter () writeHtmlHeader5WithId id inner = do writeHtml "
" inner writeHtml "
" -- | Write the @\@ element with the specified id and contents. writeHtmlHeader6WithId :: String -> HtmlWriter () -> HtmlWriter () writeHtmlHeader6WithId id inner = do writeHtml "
" inner writeHtml "
" -- | Write the @\@ element. writeHtmlBreak :: HtmlWriter () writeHtmlBreak = writeHtml "
" -- | Write the list of items wrapped in @\@. writeHtmlList :: HtmlWriter () -> HtmlWriter () writeHtmlList inner = do writeHtml "
    " inner writeHtml "
" -- | Write the item list wrapped in @\@. writeHtmlListItem :: HtmlWriter () -> HtmlWriter () writeHtmlListItem inner = do writeHtml "
  • " inner writeHtml "
  • " -- | Write the HTML document with the specified title and contents writeHtmlDocumentWithTitle :: String -> HtmlWriter () -> HtmlWriter () writeHtmlDocumentWithTitle title inner = do writeHtml "" writeHtml "" writeHtml "" writeHtml "" writeHtmlText title writeHtml "" writeHtmlCss writeHtml "" writeHtml "" writeHtmlHeader1 $ writeHtmlText title writeHtml "" inner writeHtml "

    Automatically generated by " writeHtml "" writeHtml "Aivika Experiment" writeHtml "

    " writeHtml "" writeHtml "" -- | Escape special HTML characters in the 'String'. -- It is based on one function from package Web-Encodings, -- which is licensed under BSD3 but obsolete now. encodeHtmlText :: String -> String encodeHtmlText x = join $ map encodeHtmlChar x -- | Escape a character. encodeHtmlChar :: Char -> String encodeHtmlChar '<' = "<" encodeHtmlChar '>' = ">" encodeHtmlChar '&' = "&" encodeHtmlChar '"' = """ encodeHtmlChar '\'' = "'" encodeHtmlChar c = [c] -- | Write the CSS styles writeHtmlCss :: HtmlWriter () writeHtmlCss = do writeHtmlLn ""