hablo/src/JSON.hs

105 lines
3.3 KiB
Haskell
Raw Normal View History

2019-02-04 18:30:23 +01:00
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE NamedFieldPuns #-}
2019-01-27 21:41:21 +01:00
module JSON (
exportBlog
2019-01-27 21:41:21 +01:00
) where
2019-02-04 18:30:23 +01:00
import Article (Article)
import qualified Article (Article(..))
import Blog (Blog)
2019-02-17 19:52:28 +01:00
import qualified Blog (Blog(..), Path(..), Skin(..), Wording(..))
import Control.Monad.Reader (ReaderT, ask)
2019-02-04 18:30:23 +01:00
import Data.Aeson (ToJSON(..), genericToEncoding, defaultOptions, encode)
import Data.ByteString.Lazy (ByteString)
import Data.Map (Map, mapWithKey)
import qualified Data.Map as Map (filter, keys)
import qualified Data.Set as Set (elems, member)
2019-02-17 19:52:28 +01:00
import Data.Text (Text)
import Data.Text.Template (showTemplate)
2019-02-04 18:30:23 +01:00
import GHC.Generics
data ArticleExport = ArticleExport {
title :: String
, bodyOffset :: Int
2019-02-15 14:13:43 +01:00
, metadata :: Map String String
, tagged :: [String]
2019-02-04 18:30:23 +01:00
} deriving (Generic)
instance ToJSON ArticleExport where
toEncoding = genericToEncoding defaultOptions
data PathExport = PathExport {
articlesPath :: FilePath
, commentsAt :: Maybe String
, pagesPath :: Maybe FilePath
} deriving (Generic)
instance ToJSON PathExport where
toEncoding = genericToEncoding defaultOptions
2019-02-15 14:13:43 +01:00
data SkinExport = SkinExport {
previewArticlesCount :: Int
, previewLinesCount :: Int
} deriving (Generic)
instance ToJSON SkinExport where
toEncoding = genericToEncoding defaultOptions
2019-02-17 19:52:28 +01:00
data WordingExport = WordingExport {
allLink :: Text
, allPage :: Text
, allTaggedPage :: Text
, latestLink :: Text
, latestPage :: Text
, latestTaggedPage :: Text
, tagsList :: Text
} deriving (Generic)
instance ToJSON WordingExport where
toEncoding = genericToEncoding defaultOptions
2019-02-04 18:30:23 +01:00
data BlogDB = BlogDB {
articles :: Map String ArticleExport
, path :: PathExport
2019-02-15 14:13:43 +01:00
, skin :: SkinExport
, tags :: Map String [String]
2019-02-17 19:52:28 +01:00
, wording :: WordingExport
2019-02-04 18:30:23 +01:00
} deriving (Generic)
instance ToJSON BlogDB where
toEncoding = genericToEncoding defaultOptions
export :: Blog -> String -> Article -> ArticleExport
export blog key article = ArticleExport {
title = Article.title article
, bodyOffset = Article.bodyOffset article
2019-02-15 14:13:43 +01:00
, metadata = Article.metadata article
, tagged = Map.keys . Map.filter (Set.member key) $ Blog.tags blog
2019-02-04 18:30:23 +01:00
}
exportBlog :: ReaderT Blog IO ByteString
2019-02-04 18:30:23 +01:00
exportBlog = do
blog <- ask
return . encode $ BlogDB {
articles = mapWithKey (export blog) $ Blog.articles blog
, path = PathExport {
articlesPath = Blog.articlesPath $ Blog.path blog
, commentsAt = Blog.commentsAt $ Blog.path blog
, pagesPath = Blog.pagesPath $ Blog.path blog
}
2019-02-15 14:13:43 +01:00
, skin = SkinExport {
previewArticlesCount = Blog.previewArticlesCount $ Blog.skin blog
, previewLinesCount = Blog.previewLinesCount $ Blog.skin blog
}
, tags = Set.elems <$> Blog.tags blog
2019-02-17 19:52:28 +01:00
, wording = WordingExport {
allLink = Blog.allLink $ Blog.wording blog
, allPage = Blog.allPage $ Blog.wording blog
, allTaggedPage = showTemplate . Blog.allTaggedPage $ Blog.wording blog
, latestLink = Blog.latestLink $ Blog.wording blog
, latestPage = Blog.latestPage $ Blog.wording blog
, latestTaggedPage = showTemplate . Blog.latestTaggedPage $ Blog.wording blog
, tagsList = Blog.tagsList $ Blog.wording blog
}
2019-02-04 18:30:23 +01:00
}