{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Web.Geek.RSS (rss) where
import Air.Data.Record.SimpleLabel hiding (get)
import Air.Env hiding (head, div)
import Air.Extra hiding (date)
import Air.TH (here)
import qualified Web.Geek.Type as Geek
import Data.Text (Text)
import Text.HTML.Moe2 hiding ((/), text)
import Text.HTML.Moe2.Type (MoeUnit)
import Data.ByteString (ByteString)
import qualified Data.Text as T
import Data.Maybe
import Control.Monad (forM_)
import System.Locale (defaultTimeLocale)
import Data.Time (formatTime)
{-
{{ site.name }}
{{ site.description }}
{{ site.url }}
{% for post in site.posts limit:10 %}
-
{{ post.title }}
{{ post.content | xml_escape }}
{{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }}
{{ site.url }}{{ post.url }}
{{ site.url }}{{ post.url }}
{% endfor %}
-}
-- xml_header
xml_header :: MoeUnit
xml_header = no_escape_no_indent_str ""
text :: T.Text -> MoeUnit
text = T.unpack > str
rss :: Geek.Config -> [Geek.Post] -> Maybe Text -> ByteString
rss _config _posts _maybe_tag = l2s - render_bytestring - do
let drop_tail_slash xs = xs.reverse.dropWhile (is '/').reverse
site_link = _config.Geek.rss_site_link.T.unpack.drop_tail_slash
site_link_with_prefix =
(
[
site_link
, _config.Geek.rss_site_root_prefix.T.unpack.drop_tail_slash.reverse.drop_tail_slash
]
).join "/"
xml_header
element "rss" ! [attr "version" "2.0", attr "xmlns:atom" "http://www.w3.org/2005/Atom"] - do
element "channel" - do
title - do
text - _config.Geek.rss_site_title
element "description" - do
text - _config.Geek.rss_site_description
element "link" - do
str - site_link
element "atom:link" ! [href (site_link + "/rss.xml"), attr "rel" "self", _type "application/rss+xml"] -
return ()
forM_ _posts - \_post ->
element "item" - do
title - do
text - _post.Geek.title
element "description" - do
text - _post.Geek.body.Geek.unHTMLText
element "pubDate" - do
let pub_date_format_string = "%a, %d %b %Y %H:%M:%S %z"
str - _post.Geek.date.fromMaybe def.formatTime defaultTimeLocale pub_date_format_string
let post_link = site_link_with_prefix + "/" + _post.Geek.link.Geek.unURIEscapedText.T.unpack
element "link" - do
str - post_link
element "guid" ! [attr "isPermaLink" "true"] - do
str - post_link