{-# LANGUAGE OverloadedStrings #-}
-- | simplistic rss builder, because both feed and rss modules are no good
module RssBuilder where
import Data.ByteString.Char8 (pack) -- also, IsString instance
import Blaze.ByteString.Builder
import Blaze.ByteString.Builder.Char.Utf8
import Data.ByteString (ByteString)
import Data.Monoid
import Data.Maybe (fromMaybe)
import TwoChSo
import TwoChSo.URI
infixl 4 <>
(<>) :: Monoid a => a -> a -> a
(<>) = mappend
fromB = fromByteString
fromS = fromString
rss :: BoardInfo -> [Post] -> Builder
rss boardI posts = rssBuilder boardI (mconcat $ map (itemBuilder boardI) posts)
rssBuilder :: BoardInfo -> Builder -> Builder
rssBuilder boardInfo items =
fromB "<rss version=\"2.0\"><channel><title><![CDATA["
<> fromB (boardName boardInfo) <> fromB "]]></title><link>"
<> fromString (show $ boardHtmlURI' boardInfo) <> fromB "</link>"
<> items
<> fromB "</channel></rss>"
itemBuilder :: BoardInfo -> Post -> Builder
itemBuilder boardI post =
fromB "<item><title><![CDATA[" <> title <> fromB "]]></title><link>"
<> fromS (show $ threadHtmlURI boardI (postId post)) <> fromB "</link><author><![CDATA[" <> maybeB (author post)
<> fromB "]]></author><description><![CDATA[" <> maybeB (body post) <> fromB "]]></description></item>"
where
maybeB :: Maybe ByteString -> Builder
maybeB = maybe mempty fromB
title = fromB $ fromMaybe (pack $ show $ postId post) (subject post)