packages feed

hakyll-convert-0.1.0.0: tools/hakyll-convert-demo.hs

--------------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
import           Control.Applicative ((<$>))
import           Data.Monoid         ((<>),mappend,mconcat)
import           Hakyll

import           Hakyll.Convert.Blogger
import           Debug.Trace

--------------------------------------------------------------------------------
main :: IO ()
main = hakyll $ do
    match "images/*" $ do
        route   idRoute
        compile copyFileCompiler

    match "css/*" $ do
        route   idRoute
        compile compressCssCompiler

    match (fromList ["about.markdown"]) $ do
        route   $ setExtension "html"
        compile $ pandocCompiler
            >>= loadAndApplyTemplate "templates/default.html" defaultContext
            >>= relativizeUrls

    -- distilled <- match koweycodePattern $ compile bloggerCompiler

    -- tags0 <- buildTags "posts/*" (fromCapture "tags/*.html")
    tags <- buildTags koweycodePattern (fromCapture "tags/*.html")

{-
    match "posts/*" $ do
        route $ setExtension "html"
        compile $ pandocCompiler
            >>= loadAndApplyTemplate "templates/post.html"    (postCtx tags)
            >>= loadAndApplyTemplate "templates/default.html" (postCtx tags)
            >>= relativizeUrls
-}

    match koweycodePattern $ do
        route $ setExtension "html"
        compile $ pandocCompiler -- TODO shouldn't be needed
            >>= loadAndApplyTemplate "templates/post.html"    (postCtx tags)
            >>= loadAndApplyTemplate "templates/default.html" (postCtx tags)
            >>= relativizeUrls

    -- Post tags
    tagsRules tags $ \tag pattern -> do
        let title = "Posts tagged " ++ tag
            archiveCtx = archiveContext "Posts tagged" tags pattern

        -- Copied from posts, need to refactor
        route idRoute
        compile $ do
            list <- postList tags pattern recentFirst
            makeItem ""
                >>= loadAndApplyTemplate "templates/archive.html" archiveCtx
                >>= loadAndApplyTemplate "templates/default.html" defaultContext
                >>= relativizeUrls

{-
        -- Create RSS feed as well
        version "rss" $ do
            route   $ setExtension "xml"
            compile $ loadAllSnapshots pattern "content"
                >>= fmap (take 10) . recentFirst
                >>= renderAtom (feedConfiguration title) feedCtx
-}

    let plainPattern = "posts/*"

    create ["archive.html"] $ do
        route idRoute
        compile $ do
            let archiveCtx = archiveContext "Archives" tags koweycodePattern
            makeItem ""
                >>= loadAndApplyTemplate "templates/archive.html" archiveCtx
                >>= loadAndApplyTemplate "templates/default.html" archiveCtx
                >>= relativizeUrls

    match "index.html" $ do
        route idRoute
        compile $ do
            let indexCtx = field "posts" $ \_ -> postList tags koweycodePattern (fmap (take 3) . recentFirst)

            getResourceBody
                >>= applyAsTemplate indexCtx
                >>= loadAndApplyTemplate "templates/default.html" (postCtx tags)
                >>= relativizeUrls

    match "templates/*" $ compile templateCompiler
  where
    koweycodePattern = "koweycode/**"

archiveContext title tags pattern =
    field "posts" (const getList) `mappend`
    constField "title" title      `mappend`
    defaultContext
  where
    getList = postList tags pattern recentFirst


--------------------------------------------------------------------------------
{-
postCtx :: Context String
postCtx =
    dateField "date" "%e %B %Y" `mappend`
    defaultContext
-}

postCtx :: Tags -> Context String
postCtx tags = mconcat
    [ modificationTimeField "mtime" "%U"
    , dateField "date" "%e %B %Y"
    , tagsField "tags" tags
    , defaultContext
    ]

--------------------------------------------------------------------------------

postList :: Tags -> Pattern -> ([Item String] -> Compiler [Item String])
         -> Compiler String
postList tags pattern sortFilter = do
    posts   <- sortFilter =<< loadAll pattern
    itemTpl <- loadBody "templates/post-item.html"
    applyTemplateList itemTpl (postCtx tags) posts

{-

postList :: ([Item String] -> [Item String]) -> Compiler String
postList sortFilter = do
    posts1_  <- loadAll "posts/*"
    --posts2_  <- loadAll "koweycode/*/*/*"
    let posts1 = posts1_
        posts2 = []
    let posts = sortFilter (posts1 ++ posts2)
    itemTpl <- loadBody "templates/post-item.html"
    list    <- applyTemplateList itemTpl postCtx posts
    return list

-}

{-
oldPostList :: ([Item String] -> [Item String]) -> Compiler String
oldPostList sortFilter = do
    posts  <- sortFilter <$> loadAll "koweycode/*/*/*"
    itemTpl <- loadBody "templates/post-item.html"
    list    <- applyTemplateList itemTpl postCtx posts
    return list
-}