packages feed

ihp-sitemap-1.5.0: IHP/SEO/Sitemap/ControllerFunctions.hs

module IHP.SEO.Sitemap.ControllerFunctions where

import IHP.Prelude
import IHP.ControllerPrelude
import IHP.SEO.Sitemap.Types
import qualified Text.Blaze as Markup
import qualified Text.Blaze.Internal as Markup
import qualified Text.Blaze.Renderer.Utf8 as Markup

renderXmlSitemap :: (?context :: ControllerContext, ?request :: Request) => Sitemap -> IO ()
renderXmlSitemap Sitemap { links } = do
    let sitemap = Markup.toMarkup [xmlDocument, sitemapLinks]
    renderXml $ Markup.renderMarkup sitemap
    where
        xmlDocument = Markup.preEscapedText "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        urlSet = Markup.customParent "urlset" Markup.! Markup.customAttribute "xmlns" "http://www.sitemaps.org/schemas/sitemap/0.9"
        sitemapLinks = urlSet (Markup.toMarkup (map sitemapLink links))
        sitemapLink SitemapLink { url, lastModified, changeFrequency } =
            let
                loc = Markup.customParent "loc" (Markup.text url)
                lastMod =  Markup.customParent "lastmod" (Markup.text (maybe mempty formatUTCTime lastModified))
                changeFreq = Markup.customParent "changefreq" (Markup.text (maybe mempty show changeFrequency))
            in
                Markup.customParent "url" (Markup.toMarkup [loc, lastMod, changeFreq])

formatUTCTime :: UTCTime -> Text
formatUTCTime utcTime = cs (formatTime defaultTimeLocale "%Y-%m-%d" utcTime)