hablo/src/JSON.hs

64 lines
1.9 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
import Blog (Blog, Path, Skin, URL, Wording)
import qualified Blog (Blog(..))
import Data.Aeson (Options(..), ToJSON(..), genericToEncoding, defaultOptions)
import Data.Map (Map, mapWithKey)
import qualified Data.Map as Map (filter, keys)
import qualified Data.Set as Set (elems, member)
2019-02-04 18:30:23 +01:00
import GHC.Generics
import Markdown (Markdown, MarkdownContent(..))
import qualified Markdown (Markdown(..))
2019-02-04 18:30:23 +01:00
data MarkdownExport = MarkdownExport {
title :: String
2019-02-15 14:13:43 +01:00
, metadata :: Map String String
, bodyOffset :: Int
, tagged :: Maybe [String]
2019-02-04 18:30:23 +01:00
} deriving (Generic)
instance ToJSON MarkdownExport where
toEncoding = genericToEncoding (defaultOptions {omitNothingFields = True})
2019-02-04 18:30:23 +01:00
exportMarkdown :: Maybe [String] -> Markdown -> MarkdownExport
exportMarkdown tagged markdown = MarkdownExport {
title = Markdown.title markdown
, metadata = Markdown.metadata markdown
, bodyOffset = Markdown.bodyOffset markdown
, tagged
}
data BlogExport = BlogExport {
articles :: Map String MarkdownExport
, hasRSS :: Bool
, path :: Path
, pages :: Map String MarkdownExport
, skin :: Skin
, tags :: Map String [String]
, urls :: URL
, wording :: Wording
2019-02-04 18:30:23 +01:00
} deriving (Generic)
instance ToJSON BlogExport where
2019-02-04 18:30:23 +01:00
toEncoding = genericToEncoding defaultOptions
exportBlog :: Blog -> BlogExport
exportBlog blog = BlogExport {
articles = getArticles $ getMarkdown <$> Blog.articles blog
, hasRSS = Blog.hasRSS blog
, pages = getPages $ getMarkdown <$> Blog.pages blog
, path = Blog.path blog
, skin = Blog.skin blog
, tags = Set.elems <$> Blog.tags blog
, urls = Blog.urls blog
, wording = Blog.wording blog
2019-02-04 18:30:23 +01:00
}
where
tag key = Just . Map.keys . Map.filter (Set.member key) $ Blog.tags blog
getArticles = mapWithKey (exportMarkdown . tag)
getPages = mapWithKey (\_-> exportMarkdown Nothing)