module RenderBlog (renderBlog) where
-import CMark (Node(..), CMarkOption(..), nodeToHtml, commonmarkToNode, optSafe)
+import CMark (commonmarkToHtml)
import Lucid (Html(..), toHtmlRaw)
import qualified Data.Text as T
renderBlog :: T.Text -> Html ()
-renderBlog = renderNode . cssToNode
-
-cmarkOptions :: [CMarkOption]
-cmarkOptions = [optSafe]
-
-cssToNode :: T.Text -> Node
-cssToNode = commonmarkToNode cmarkOptions
-
-renderNode :: Node -> Html ()
-renderNode = toHtmlRaw . nodeToHtml cmarkOptions
+renderBlog = toHtmlRaw . commonmarkToHtml []
module Server where
+import Control.Monad ((<=<))
import Control.Monad.IO.Class (liftIO)
import CssContentType
import Lucid
import RenderBlog (renderBlog)
import Servant
import Servant.HTML.Lucid (HTML(..))
+import System.Directory (getCurrentDirectory)
import qualified Data.Text as T
import qualified Data.Text.IO as T
apiProxy :: Proxy Api
apiProxy = Proxy
-type Api = MainPage :<|> BlogPost :<|> Themes
+type Api = MainPage :<|> BlogPost :<|> Themes :<|> TestPage
type MainPage = Get '[HTML] (Html ())
-type BlogPost = "blog" :> QueryParam "id" BlogId :> Get '[HTML] (Html ())
+type BlogPost = "blog" :> Capture "id" BlogId :> Get '[HTML] (Html ())
type Themes = DarkTheme :<|> LightTheme
type DarkTheme = "dark" :> Get '[CSS] T.Text
type LightTheme = "light" :> Get '[CSS] T.Text
+type TestPage = "test" :> Get '[HTML] T.Text
type BlogId = FilePath
api :: Server Api
-api = mainPage :<|> blogPost :<|> themes
+api = mainPage :<|> blogPost :<|> themes :<|> testPage
mainPage :: Handler (Html ())
mainPage = pure $ with doctypehtml_ [lang_ "en"] $ do
body_ $ div_ [role_ "main"] $ do
h1_ $ toHtml siteTitle
-blogPost :: Maybe BlogId -> Handler (Html ())
-blogPost Nothing = mainPage
-blogPost (Just blogId) = findBlogPost blogId >>= pure . renderBlog
+blogPost :: BlogId -> Handler (Html ())
+blogPost = pure . renderBlog <=< findBlogPost
findBlogPost :: BlogId -> Handler T.Text
-findBlogPost = liftIO . T.readFile . (<>) "/static/"
+findBlogPost = liftIO . T.readFile . (<>) "static/" . flip (<>) ".md"
themes :: Server Themes
themes = darkTheme :<|> lightTheme
siteTitle :: T.Text
siteTitle = "My Site"
+
+testPage :: Handler T.Text
+testPage = liftIO getCurrentDirectory >>= pure . T.pack