2019-02-04 18:30:23 +01:00
|
|
|
{-# LANGUAGE DeriveGeneric #-}
|
2019-01-27 21:41:21 +01:00
|
|
|
module JSON (
|
|
|
|
generate
|
|
|
|
) where
|
|
|
|
|
2019-02-04 18:30:23 +01:00
|
|
|
import Article (Article)
|
|
|
|
import qualified Article (Article(..))
|
|
|
|
import Blog (Blog)
|
|
|
|
import qualified Blog (Blog(..), get)
|
2019-01-27 21:41:21 +01:00
|
|
|
import Control.Monad.IO.Class (MonadIO(..))
|
2019-02-04 18:30:23 +01:00
|
|
|
import Control.Monad.Reader (ReaderT)
|
|
|
|
import Data.Aeson (ToJSON(..), genericToEncoding, defaultOptions, encode)
|
2019-01-27 21:41:21 +01:00
|
|
|
import Data.ByteString.Lazy (writeFile)
|
2019-02-04 18:30:23 +01:00
|
|
|
import qualified Data.Map as Map (elems)
|
|
|
|
import System.FilePath.Posix ((</>), (<.>))
|
2019-01-27 21:41:21 +01:00
|
|
|
import Prelude hiding (writeFile)
|
2019-02-04 18:30:23 +01:00
|
|
|
import GHC.Generics
|
|
|
|
|
|
|
|
data ArticleExport = ArticleExport {
|
|
|
|
source :: String
|
|
|
|
, title :: String
|
|
|
|
} deriving (Generic)
|
|
|
|
|
|
|
|
instance ToJSON ArticleExport where
|
|
|
|
toEncoding = genericToEncoding defaultOptions
|
|
|
|
|
|
|
|
data BlogDB = BlogDB {
|
|
|
|
articles :: [ArticleExport]
|
|
|
|
} deriving (Generic)
|
|
|
|
|
|
|
|
instance ToJSON BlogDB where
|
|
|
|
toEncoding = genericToEncoding defaultOptions
|
|
|
|
|
|
|
|
export :: Article -> ArticleExport
|
|
|
|
export article = ArticleExport {
|
|
|
|
source = "/" </> Article.urlPath article <.> "md"
|
|
|
|
, title = Article.title article
|
|
|
|
}
|
|
|
|
|
|
|
|
exportBlog :: ReaderT Blog IO BlogDB
|
|
|
|
exportBlog = do
|
|
|
|
allArticles <- Blog.get Blog.articles
|
|
|
|
return $ BlogDB {
|
|
|
|
articles = export <$> Map.elems allArticles
|
|
|
|
}
|
2019-01-27 21:41:21 +01:00
|
|
|
|
2019-01-29 23:08:38 +01:00
|
|
|
generate :: ReaderT Blog IO ()
|
|
|
|
generate = do
|
2019-02-04 18:30:23 +01:00
|
|
|
path <- Blog.get Blog.root
|
|
|
|
jsonContent <- exportBlog
|
|
|
|
liftIO $ writeFile (path </> "articles.json") (encode jsonContent)
|