2019-02-04 18:30:23 +01:00
|
|
|
{-# LANGUAGE DeriveGeneric #-}
|
2019-02-05 17:31:11 +01:00
|
|
|
{-# LANGUAGE NamedFieldPuns #-}
|
2019-01-27 21:41:21 +01:00
|
|
|
module JSON (
|
2019-02-06 17:16:52 +01:00
|
|
|
exportBlog
|
2019-01-27 21:41:21 +01:00
|
|
|
) where
|
|
|
|
|
2019-12-21 12:50:38 +01:00
|
|
|
import Blog (Blog, Path, Skin, URL, Wording)
|
2019-02-22 23:29:35 +01:00
|
|
|
import qualified Blog (Blog(..))
|
2020-12-13 20:09:23 +01:00
|
|
|
import Data.Aeson (Options(..), ToJSON(..), genericToEncoding, defaultOptions)
|
2019-02-15 14:16:21 +01:00
|
|
|
import Data.Map (Map, mapWithKey)
|
|
|
|
import qualified Data.Map as Map (filter, keys)
|
2019-02-05 17:31:11 +01:00
|
|
|
import qualified Data.Set as Set (elems, member)
|
2019-02-04 18:30:23 +01:00
|
|
|
import GHC.Generics
|
2020-12-13 20:09:23 +01:00
|
|
|
import Markdown (Markdown, MarkdownContent(..))
|
|
|
|
import qualified Markdown (Markdown(..))
|
2019-02-04 18:30:23 +01:00
|
|
|
|
2020-12-13 20:09:23 +01:00
|
|
|
data MarkdownExport = MarkdownExport {
|
2019-02-15 18:07:59 +01:00
|
|
|
title :: String
|
2019-02-15 14:13:43 +01:00
|
|
|
, metadata :: Map String String
|
2020-12-13 20:09:23 +01:00
|
|
|
, bodyOffset :: Int
|
|
|
|
, tagged :: Maybe [String]
|
2019-02-04 18:30:23 +01:00
|
|
|
} deriving (Generic)
|
|
|
|
|
2020-12-13 20:09:23 +01:00
|
|
|
instance ToJSON MarkdownExport where
|
|
|
|
toEncoding = genericToEncoding (defaultOptions {omitNothingFields = True})
|
2019-02-04 18:30:23 +01:00
|
|
|
|
2020-12-13 20:09: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
|
2020-05-08 15:51:25 +02:00
|
|
|
, hasRSS :: Bool
|
2019-02-22 23:29:35 +01:00
|
|
|
, path :: Path
|
2020-12-13 20:09:23 +01:00
|
|
|
, pages :: Map String MarkdownExport
|
2019-02-22 23:29:35 +01:00
|
|
|
, skin :: Skin
|
2019-02-15 15:11:31 +01:00
|
|
|
, tags :: Map String [String]
|
2019-12-21 12:50:38 +01:00
|
|
|
, urls :: URL
|
2019-02-22 23:29:35 +01:00
|
|
|
, wording :: Wording
|
2019-02-04 18:30:23 +01:00
|
|
|
} deriving (Generic)
|
|
|
|
|
2020-12-13 20:09:23 +01:00
|
|
|
instance ToJSON BlogExport where
|
2019-02-04 18:30:23 +01:00
|
|
|
toEncoding = genericToEncoding defaultOptions
|
|
|
|
|
2020-12-13 20:09:23 +01:00
|
|
|
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
|
|
|
}
|
2020-12-13 20:09: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)
|