{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
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 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)
import Data.Char (isSpace)
{-
{{ 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
]
).reject (all isSpace).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