{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} ------------------------------------------------------------------------------- -- | -- -- Rewrite/simplification of yesod-markdown written by ajdunlap. -- -- Forked from . -- ------------------------------------------------------------------------------- module Yesod.Markdown ( Markdown(..) -- * Wrappers , markdownToHtml , markdownToHtmlTrusted , markdownFromFile -- * Conversions , parseMarkdown , writePandoc , writePandocTrusted -- * Option sets , yesodDefaultWriterOptions , yesodDefaultReaderOptions -- * Form helper , markdownField ) where import Data.Monoid (Monoid) import Data.String (IsString) import Data.Text (Text) import Data.Text.Encoding (decodeUtf8With) import Data.Text.Encoding.Error (lenientDecode) import Database.Persist (PersistField) import System.Directory (doesFileExist) import Text.Blaze (ToMarkup (toMarkup)) import Text.Blaze.Html (preEscapedToMarkup) import Text.HTML.SanitizeXSS (sanitizeBalance) import Text.Hamlet (hamlet, Html) import Text.Pandoc import Yesod.Core (RenderMessage) import Yesod.Form (ToField(..), areq, aopt) import Yesod.Form.Functions (parseHelper) import Yesod.Form.Types import Yesod.Widget (toWidget) import qualified Data.ByteString as B import qualified Data.Text as T newtype Markdown = Markdown { unMarkdown :: Text } deriving (Eq, Ord, Show, Read, PersistField, IsString, Monoid) instance ToMarkup Markdown where -- | Sanitized by default toMarkup = markdownToHtml instance ToField Markdown master where toField = areq markdownField instance ToField (Maybe Markdown) master where toField = aopt markdownField markdownField :: RenderMessage master FormMessage => Field sub master Markdown markdownField = Field { fieldParse = parseHelper $ Right . Markdown , fieldView = \theId name attrs val _isReq -> toWidget [hamlet|$newline never