{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE NamedFieldPuns #-} module JSON ( exportBlog ) 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) import GHC.Generics import Markdown (Markdown, MarkdownContent(..)) import qualified Markdown (Markdown(..)) data MarkdownExport = MarkdownExport { title :: String , metadata :: Map String String , bodyOffset :: Int , tagged :: Maybe [String] } deriving (Generic) instance ToJSON MarkdownExport where toEncoding = genericToEncoding (defaultOptions {omitNothingFields = True}) 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 } deriving (Generic) instance ToJSON BlogExport where 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 } where tag key = Just . Map.keys . Map.filter (Set.member key) $ Blog.tags blog getArticles = mapWithKey (exportMarkdown . tag) getPages = mapWithKey (\_-> exportMarkdown Nothing)