X-Git-Url: https://git.lukelau.me/?p=blog.git;a=blobdiff_plain;f=Main.hs;h=8a0c5a30e3c72642901247ca4f89ec630ff2bfa3;hp=7aabc89cdd771cf58b283a57495df3edcd92e07e;hb=f500b88dce0855766c5a8da4fdf3a855eb0a4d9b;hpb=97eb4a9e8756ac8e49efa6d31c6dfe5169637c3f diff --git a/Main.hs b/Main.hs index 7aabc89..8a0c5a3 100644 --- a/Main.hs +++ b/Main.hs @@ -13,6 +13,7 @@ import Control.Monad import qualified Text.MMark as M import qualified Text.MMark.Extension.Common as M import Text.Casing +import Text.Read (readMaybe) import Lucid import Lucid.Base import System.Directory @@ -40,7 +41,7 @@ main = scotty 3000 $ do t <- param "title" b <- param "body" p <- liftIO $ save b t - redirect ("post/" <> title p) + redirect ("posts/" <> title p) post "/login" $ do username <- param "username" @@ -51,8 +52,7 @@ main = scotty 3000 $ do get "/" $ do posts <- liftIO $ do - names <- listDirectory "posts" - let files = ("posts" ) <$> names + files <- listDirectory "posts" posts <- catMaybes <$> mapM load files return $ take 5 $ sortOn (Down . date) posts html $ renderText $ html_ $ do @@ -67,7 +67,7 @@ main = scotty 3000 $ do get "/posts/:post" $ do name <- param "post" - mPost <- liftIO $ load ("posts" name <.> "md") + mPost <- liftIO (load name) case mPost of Nothing -> status notFound404 Just post -> @@ -87,15 +87,13 @@ data Post = Post { markdown :: T.Text , title :: T.Text , date :: UTCTime - } + } deriving (Read, Show) -load :: FilePath -> IO (Maybe Post) -load file = do - liftIO $ guard (takeExtension file == ".md") - md <- liftIO (T.readFile file) - modTime <- getModificationTime file - let title = T.pack $ takeBaseName file - return $ Just (Post md title modTime) +load :: String -> IO (Maybe Post) +load name = do + let file = "posts" name + guard =<< doesFileExist file + readMaybe <$> readFile file render :: Post -> Maybe (Html ()) render p@(Post markdown title date) = @@ -104,21 +102,22 @@ render p@(Post markdown title date) = Right doc -> Just $ with div_ [id_ (T.toStrict title)] $ do with a_ [href_ (T.toStrict $ linkToPost p)] $ + h1_ $ toHtml title i_ $ toHtml $ formatTime defaultTimeLocale "%a %e %B %Y" date br_ [] M.render (M.useExtensions extensions doc) where extensions = [M.ghcSyntaxHighlighter, M.skylighting, M.footnotes] linkToPost :: Post -> T.Text -linkToPost p = T.pack $ "/posts" T.unpack (title p) +linkToPost p = T.pack $ "/posts" kebab (T.unpack (title p)) pathToPost :: Post -> FilePath -pathToPost p = "posts" T.unpack (title p) <.> "md" +pathToPost p = "posts" kebab (T.unpack (title p)) save :: T.Text -> T.Text -> IO Post save md title = do curTime <- getCurrentTime let kTitle = T.pack $ kebab $ T.unpack title p = Post md kTitle curTime - T.writeFile (pathToPost p) (markdown p) + writeFile (pathToPost p) (show p) return p