hakyll/examples/tagblog/hakyll.hs

72 lines
2.7 KiB
Haskell
Raw Normal View History

module Main where
2010-03-21 14:57:12 +00:00
import Control.Arrow ((>>>))
import Text.Hakyll (hakyll)
import Text.Hakyll.Render
2010-03-21 14:57:12 +00:00
import Text.Hakyll.Tags (readTagMap, renderTagCloud, renderTagLinks, withTagMap)
import Text.Hakyll.Feed (FeedConfiguration (..), renderRss)
import Text.Hakyll.File (getRecursiveContents, directory, removeSpaces)
2010-03-21 14:57:12 +00:00
import Text.Hakyll.CreateContext (createPage, createCustomPage, createListing)
import Text.Hakyll.ContextManipulations (renderDate, copyValue)
import Data.List (sort)
import Data.Map (toList)
import Control.Monad (forM_, liftM)
import Data.Either (Either(..))
2010-03-21 14:57:12 +00:00
main = hakyll "http://example.com" $ do
-- Static directory.
directory css "css"
-- Find all post paths.
postPaths <- liftM (reverse . sort) $ getRecursiveContents "posts"
2010-03-21 14:57:12 +00:00
let renderablePosts = map ((>>> postManipulation) . createPage) postPaths
-- Read tag map.
2010-03-21 14:57:12 +00:00
let tagMap = readTagMap "postTags" postPaths
-- Render all posts list.
renderPostList "posts.html" "All posts" renderablePosts
-- Render post list per tag
let renderListForTag tag posts =
renderPostList (tagToUrl tag) ("Posts tagged " ++ tag)
(map (>>> postManipulation) posts)
withTagMap tagMap renderListForTag
-- Render index, including recent posts.
2010-03-21 14:57:12 +00:00
let tagCloud = tagMap >>> renderTagCloud tagToUrl 100 200
index = createListing "index.html"
["templates/postitem.html"]
(take 3 renderablePosts)
[ ("title", Left "Home")
, ("tagcloud", Right tagCloud)
]
renderChain ["index.html", "templates/default.html"] index
-- Render all posts.
forM_ renderablePosts $ renderChain [ "templates/post.html"
, "templates/default.html"
]
-- Render rss feed
2010-03-21 14:57:12 +00:00
renderRss myFeedConfiguration $
map (>>> copyValue "body" "description") (take 3 renderablePosts)
where
postManipulation = renderDate "date" "%B %e, %Y" "Date unknown"
>>> renderTagLinks tagToUrl
tagToUrl tag = "$root/tags/" ++ removeSpaces tag ++ ".html"
renderPostList url title posts = do
let list = createListing url ["templates/postitem.html"]
posts [("title", Left title)]
renderChain ["posts.html", "templates/default.html"] list
2010-03-21 14:57:12 +00:00
myFeedConfiguration = FeedConfiguration
{ feedUrl = "rss.xml"
, feedTitle = "SimpleBlog RSS feed."
, feedDescription = "A simple demo of an RSS feed created with Hakyll."
, feedAuthorName = "Jasper Van der Jeugt"
}