darcsden :: pseudonymous -> 2chsotools -> blob

root / 2chso / examples / RssBuilder.hs

{-# 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)