shakebook-0.13.1.0: src/Shakebook/Lucid.hs
module Shakebook.Lucid where
import Control.Comonad.Cofree
import Control.Comonad.Zipper.Extra
import Data.IxSet.Typed as Ix
import Development.Shake.Plus
import Lucid
import Lucid.Base
import RIO
import RIO.List
import qualified RIO.Text as T
import qualified RIO.Text.Lazy as LT
import Text.Pandoc.Highlighting
newtype HtmlFragment = HtmlFragment { unHtmlFragment :: Text }
deriving (Eq, Show, Generic, NFData, Binary, Hashable, ToHtml)
toHtmlFragment :: Html () -> HtmlFragment
toHtmlFragment = HtmlFragment . LT.toStrict . renderText
toHtmlFragmentM :: Monad m => HtmlT m () -> m HtmlFragment
toHtmlFragmentM = fmap toHtmlFragment . commuteHtmlT
renderLink :: Monad m => Text -> Text -> HtmlT m ()
renderLink x y = a_ [href_ y] (toHtml x)
renderCofree :: Monad m => (a -> HtmlT m ()) -> Cofree [] a -> HtmlT m ()
renderCofree f (x :< []) = f x
renderCofree f (x :< xs) = f x >> ul_ (forM_ xs (li_ . renderCofree f))
renderZipperWithin :: Monad m => (a -> HtmlT m ()) -> Int -> Zipper [] a -> HtmlT m ()
renderZipperWithin f a xs = mapM_ f (zipperWithin a xs)
renderIxSetGroupDescBy :: (Ord b, Ix.IsIndexOf ix ixs, Monad m)
=> (ix -> HtmlT m ())
-> (a -> HtmlT m ())
-> (a -> b)
-> Ix.IxSet ixs a
-> HtmlT m ()
renderIxSetGroupDescBy f g h as = ul_ $ forM_ (Ix.groupDescBy as) $ \(y, xs) -> li_ $ do
f y
ul_ $ forM_ (sortOn h xs) $ li_ . g
newtype StyleFragment = StyleFragment { unStyleFragment :: Text }
deriving (Eq, Show, Generic, NFData, Binary, Hashable, ToHtml)
toStyleFragment :: Style -> StyleFragment
toStyleFragment = StyleFragment . T.pack . styleToCss