{-# LANGUAGE CPP #-} {-# 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 #if __GLASGOW_HASKELL__ < 710 import Data.Monoid (Monoid) #endif import Data.String (IsString) import Data.Text (Text) import Data.Text.Encoding (decodeUtf8With) import Data.Text.Encoding.Error (lenientDecode) import Database.Persist (PersistField, SqlType(SqlString)) import Database.Persist.Sql (PersistFieldSql(..)) 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 Text.Pandoc.Error import Yesod.Core (RenderMessage, HandlerSite) import Yesod.Form.Functions (parseHelper) import Yesod.Form.Types import Yesod.Core.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 PersistFieldSql Markdown where sqlType _ = SqlString instance ToMarkup Markdown where -- | Sanitized by default toMarkup = handleError . markdownToHtml markdownField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Markdown markdownField = Field { fieldParse = parseHelper $ Right . Markdown . T.filter (/= '\r') , fieldView = \theId name attrs val _isReq -> toWidget [hamlet|$newline never