on master help sign in
Update feedblog example to work with Hakyll 3.
commit9ddde6c0fac02268ebf0c22a0ee3e22079a5d124 authorBenedict Eastaugh <benedict@eastaugh.net> dateSun 27 Mar 2011, 22:50 (16 years ago) parent8723429
11 files changed+142−109
examples/feedblog/hakyll.hs+67−44 examples/feedblog/posts/2009-11-05-a-first-post.markdown+17−15 examples/feedblog/posts/2009-11-10-another-post.markdown+11−9 examples/feedblog/posts/2009-11-28-a-third-post.markdown+15−13 examples/feedblog/posts/2009-12-04-this-blog-aint-dead.markdown+8−6 examples/feedblog/posts/2009-12-23-almost-christmas.markdown+9−7 examples/feedblog/templates/default.html+7−7 examples/feedblog/index.html → examples/feedblog/templates/index.html+2−2 examples/feedblog/templates/post.html+3−3 examples/feedblog/templates/postitem.html+2−2 examples/feedblog/posts.html → examples/feedblog/templates/posts.html+1−1
examples/feedblog/hakyll.hs+67−44
@@ -1,49 +1,72 @@
1+{-# LANGUAGE OverloadedStrings #-}
12module Main where
23
3−import Control.Arrow ((>>>))
4−import Text.Hakyll (hakyll)
5−import Text.Hakyll.Render
6−import Text.Hakyll.Context
7−import Text.Hakyll.File (getRecursiveContents, directory)
8−import Text.Hakyll.CreateContext (createPage, createCustomPage, createListing)
9−import Text.Hakyll.ContextManipulations (copyValue)
10−import Text.Hakyll.Feed (FeedConfiguration (..), renderRss)
11−import Data.List (sort)
12−import Control.Monad (forM_, liftM)
13−import Control.Monad.Reader (liftIO)
14−import Data.Either (Either(..))
15−
16−main = hakyll "http://example.com" $ do
17− -- Static directory.
18− directory css "css"
19−
20− -- Find all post paths.
21− postPaths <- liftM (reverse . sort) $ getRecursiveContents "posts"
22− let postPages = map createPage postPaths
23−
24− -- Render index, including recent posts.
25− let index = createListing "index.html" ["templates/postitem.html"]
26− (take 3 postPages) [("title", Left "Home")]
27− renderChain ["index.html", "templates/default.html"] index
28−
29− -- Render all posts list.
30− let posts = createListing "posts.html" ["templates/postitem.html"]
31− postPages [("title", Left "All posts")]
32− renderChain ["posts.html", "templates/default.html"] posts
33−
34− -- Render all posts.
35− liftIO $ putStrLn "Generating posts..."
36− forM_ postPages $ renderChain [ "templates/post.html"
37− , "templates/default.html"
38− ]
39−
40− -- Render RSS feed.
41− renderRss myFeedConfiguration $
42− map (>>> copyValue "body" "description") (take 3 postPages)
43−
44−myFeedConfiguration = FeedConfiguration
45− { feedUrl = "rss.xml"
46− , feedTitle = "SimpleBlog RSS feed."
4+import Prelude hiding (id)
5+import Control.Category (id)
6+import Control.Arrow ((>>>), (***), arr)
7+import Data.Monoid (mempty, mconcat)
8+
9+import Hakyll
10+
11+main :: IO ()
12+main = hakyll $ do
13+ -- Compress CSS
14+ route "css/*" idRoute
15+ compile "css/*" compressCssCompiler
16+
17+ -- Render posts
18+ route "posts/*" $ setExtension ".html"
19+ compile "posts/*" $
20+ pageCompiler
21+ >>> applyTemplateCompiler "templates/post.html"
22+ >>> applyTemplateCompiler "templates/default.html"
23+ >>> relativizeUrlsCompiler
24+
25+ -- Render posts list
26+ route "posts.html" $ idRoute
27+ create "posts.html" $
28+ constA mempty
29+ >>> arr (setField "title" "All posts")
30+ >>> requireAllA "posts/*" addPostList
31+ >>> applyTemplateCompiler "templates/posts.html"
32+ >>> applyTemplateCompiler "templates/default.html"
33+ >>> relativizeUrlsCompiler
34+
35+ -- Index
36+ route "index.html" $ idRoute
37+ create "index.html" $
38+ constA mempty
39+ >>> arr (setField "title" "Home")
40+ >>> requireAllA "posts/*" (id *** arr (take 3 . reverse . sortByBaseName) >>> addPostList)
41+ >>> applyTemplateCompiler "templates/index.html"
42+ >>> applyTemplateCompiler "templates/default.html"
43+ >>> relativizeUrlsCompiler
44+
45+ -- Render RSS feed
46+ route "rss.xml" $ idRoute
47+ create "rss.xml" $
48+ requireAll_ "posts/*" >>> renderRss feedConfiguration
49+
50+ -- Read templates
51+ compile "templates/*" templateCompiler
52+
53+ -- End
54+ return ()
55+
56+-- | Auxiliary compiler: generate a post list from a list of given posts, and
57+-- add it to the current page under @$posts@
58+--
59+addPostList :: Compiler (Page String, [Page String]) (Page String)
60+addPostList = setFieldA "posts" $
61+ arr (reverse . sortByBaseName)
62+ >>> require "templates/postitem.html" (\p t -> map (applyTemplate t) p)
63+ >>> arr mconcat
64+ >>> arr pageBody
65+
66+feedConfiguration :: FeedConfiguration
67+feedConfiguration = FeedConfiguration
68+ { feedTitle = "SimpleBlog RSS feed."
4769 , feedDescription = "A simple demo of an RSS feed created with Hakyll."
4870 , feedAuthorName = "Jasper Van der Jeugt"
71+ , feedRoot = "http://example.com"
4972 }
examples/feedblog/posts/2009-11-05-a-first-post.markdown+17−15
@@ -2,20 +2,22 @@
22title: A first post
33author: Julius Caesar
44date: November 5, 2009
5+description: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
56---
6−Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus pretium leo
7−adipiscing lectus iaculis lobortis. Vivamus scelerisque velit dignissim metus
8−gravida sit amet dapibus ligula tempor. Quisque sit amet viverra nunc.
9−Suspendisse cursus elementum ante, ut venenatis nisi dictum eu. Nulla diam
10−ligula, eleifend in varius quis, malesuada a nibh. Vivamus consequat
11−pellentesque erat non blandit. Nunc sit amet eros vel massa semper ullamcorper
12−quis iaculis magna. Vestibulum ullamcorper urna sit amet est elementum
13−pulvinar. Vestibulum consequat lacus ac quam hendrerit tincidunt. Praesent
14−bibendum vehicula diam, nec sagittis risus tempus a. Nulla quis odio sit amet
15−odio vehicula cursus ut id odio. Curabitur semper magna euismod magna mollis
16−venenatis. Nunc eget eleifend velit. Mauris sed posuere sem. Fusce id nunc
17−nisi, a aliquam orci. Suspendisse laoreet justo non enim laoreet eget consequat
18−velit porttitor. Aenean faucibus sodales metus at tincidunt. Donec vestibulum
19−leo pulvinar erat auctor ac ultrices massa euismod. Phasellus blandit cursus
20−magna, eget lacinia mi lobortis sed. Suspendisse ultricies enim ligula, vel
7+
8+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus pretium leo
9+adipiscing lectus iaculis lobortis. Vivamus scelerisque velit dignissim metus
10+gravida sit amet dapibus ligula tempor. Quisque sit amet viverra nunc.
11+Suspendisse cursus elementum ante, ut venenatis nisi dictum eu. Nulla diam
12+ligula, eleifend in varius quis, malesuada a nibh. Vivamus consequat
13+pellentesque erat non blandit. Nunc sit amet eros vel massa semper ullamcorper
14+quis iaculis magna. Vestibulum ullamcorper urna sit amet est elementum
15+pulvinar. Vestibulum consequat lacus ac quam hendrerit tincidunt. Praesent
16+bibendum vehicula diam, nec sagittis risus tempus a. Nulla quis odio sit amet
17+odio vehicula cursus ut id odio. Curabitur semper magna euismod magna mollis
18+venenatis. Nunc eget eleifend velit. Mauris sed posuere sem. Fusce id nunc
19+nisi, a aliquam orci. Suspendisse laoreet justo non enim laoreet eget consequat
20+velit porttitor. Aenean faucibus sodales metus at tincidunt. Donec vestibulum
21+leo pulvinar erat auctor ac ultrices massa euismod. Phasellus blandit cursus
22+magna, eget lacinia mi lobortis sed. Suspendisse ultricies enim ligula, vel
2123scelerisque mauris.
examples/feedblog/posts/2009-11-10-another-post.markdown+11−9
@@ -2,14 +2,16 @@
22title: Another post
33author: Marcus Tullius Cicero
44date: November 10, 2009
5+description: Vestibulum in ultrices urna. Etiam tempor enim dui, nec malesuada elit.
56---
6−Vestibulum in ultrices urna. Etiam tempor enim dui, nec malesuada elit. Donec
7−tempor ligula et quam volutpat quis fermentum eros congue. Sed ut pulvinar sem.
8−Sed aliquam ipsum id purus sollicitudin vulputate. Cras et mauris dui, vel
9−hendrerit leo. Ut metus ipsum, fermentum ac malesuada id, tempus pharetra quam.
10−Donec diam felis, consequat ac scelerisque cursus, gravida non lectus. Sed
11−faucibus elit dapibus diam elementum id varius nisi tristique. Proin consequat
12−faucibus neque in aliquam. Vestibulum ligula odio, pulvinar vel hendrerit
13−vitae, egestas ut nibh. Praesent ut velit elit, in consequat dolor. Praesent
14−sem enim, commodo in gravida sed, adipiscing vel eros. Lorem ipsum dolor sit
7+
8+Vestibulum in ultrices urna. Etiam tempor enim dui, nec malesuada elit. Donec
9+tempor ligula et quam volutpat quis fermentum eros congue. Sed ut pulvinar sem.
10+Sed aliquam ipsum id purus sollicitudin vulputate. Cras et mauris dui, vel
11+hendrerit leo. Ut metus ipsum, fermentum ac malesuada id, tempus pharetra quam.
12+Donec diam felis, consequat ac scelerisque cursus, gravida non lectus. Sed
13+faucibus elit dapibus diam elementum id varius nisi tristique. Proin consequat
14+faucibus neque in aliquam. Vestibulum ligula odio, pulvinar vel hendrerit
15+vitae, egestas ut nibh. Praesent ut velit elit, in consequat dolor. Praesent
16+sem enim, commodo in gravida sed, adipiscing vel eros. Lorem ipsum dolor sit
1517amet, consectetur adipiscing elit. Proin non aliquam nunc.
examples/feedblog/posts/2009-11-28-a-third-post.markdown+15−13
@@ -2,18 +2,20 @@
22title: A third post
33author: Publius Ovidius Naso
44date: November 28, 2009
5+description: Pellentesque tempor blandit elit, vel ultricies arcu congue egestas.
56---
6−Pellentesque tempor blandit elit, vel ultricies arcu congue egestas. Fusce
7−vitae rutrum nisl. Fusce id mauris libero, a venenatis tellus. Fusce iaculis,
8−lorem et ornare molestie, mauris risus mollis nisi, non fermentum lacus lacus
9−sit amet ipsum. Praesent lobortis ullamcorper dolor, eget convallis ligula
10−dignissim a. Suspendisse nulla nisi, congue et pharetra vel, convallis non
11−libero. Ut a nulla ipsum. Phasellus cursus velit id neque viverra ut
12−pellentesque justo posuere. Curabitur laoreet enim et velit tempor consectetur.
13−Donec eu pretium urna. Suspendisse vitae nisi at metus vestibulum aliquam in
14−sit amet nisl. Donec convallis lacinia odio, vestibulum molestie nunc feugiat
15−a. Suspendisse vehicula, sapien id aliquet consectetur, sem sapien ullamcorper
16−arcu, scelerisque porttitor elit ipsum posuere ligula. Nulla at velit eu metus
17−tincidunt auctor ut sit amet enim. Donec placerat dapibus nisi id facilisis.
18−Maecenas pellentesque pulvinar auctor. Curabitur gravida quam sit amet purus
7+
8+Pellentesque tempor blandit elit, vel ultricies arcu congue egestas. Fusce
9+vitae rutrum nisl. Fusce id mauris libero, a venenatis tellus. Fusce iaculis,
10+lorem et ornare molestie, mauris risus mollis nisi, non fermentum lacus lacus
11+sit amet ipsum. Praesent lobortis ullamcorper dolor, eget convallis ligula
12+dignissim a. Suspendisse nulla nisi, congue et pharetra vel, convallis non
13+libero. Ut a nulla ipsum. Phasellus cursus velit id neque viverra ut
14+pellentesque justo posuere. Curabitur laoreet enim et velit tempor consectetur.
15+Donec eu pretium urna. Suspendisse vitae nisi at metus vestibulum aliquam in
16+sit amet nisl. Donec convallis lacinia odio, vestibulum molestie nunc feugiat
17+a. Suspendisse vehicula, sapien id aliquet consectetur, sem sapien ullamcorper
18+arcu, scelerisque porttitor elit ipsum posuere ligula. Nulla at velit eu metus
19+tincidunt auctor ut sit amet enim. Donec placerat dapibus nisi id facilisis.
20+Maecenas pellentesque pulvinar auctor. Curabitur gravida quam sit amet purus
1921consectetur blandit.
examples/feedblog/posts/2009-12-04-this-blog-aint-dead.markdown+8−6
@@ -2,11 +2,13 @@
22title: This blog ain't dead
33author: Marcus Antonius
44date: December 4, 2009
5+description: Etiam non felis aliquet tellus dictum vestibulum.
56---
6−Etiam non felis aliquet tellus dictum vestibulum. Aliquam accumsan mauris non
7−lacus ultricies nec lacinia enim rhoncus. Curabitur vel tortor massa, elementum
8−tincidunt elit. Maecenas venenatis luctus arcu ut ullamcorper. Donec interdum
9−dolor eu enim tristique vel vehicula risus mollis. Nunc nec tortor quam. Nulla
10−a mauris arcu. Phasellus venenatis tortor vel odio tincidunt consequat. Integer
11−venenatis nibh vitae lectus laoreet eu feugiat nunc pretium. Integer nec turpis
7+
8+Etiam non felis aliquet tellus dictum vestibulum. Aliquam accumsan mauris non
9+lacus ultricies nec lacinia enim rhoncus. Curabitur vel tortor massa, elementum
10+tincidunt elit. Maecenas venenatis luctus arcu ut ullamcorper. Donec interdum
11+dolor eu enim tristique vel vehicula risus mollis. Nunc nec tortor quam. Nulla
12+a mauris arcu. Phasellus venenatis tortor vel odio tincidunt consequat. Integer
13+venenatis nibh vitae lectus laoreet eu feugiat nunc pretium. Integer nec turpis
1214metus, in fermentum lorem.
examples/feedblog/posts/2009-12-23-almost-christmas.markdown+9−7
@@ -2,12 +2,14 @@
22title: Almost Christmas!
33author: Publius Vergilius Maro
44date: December 23, 2009
5+description: Morbi tincidunt eleifend ante, eu gravida ante rutrum vel.
56---
6−Morbi tincidunt eleifend ante, eu gravida ante rutrum vel. Nunc bibendum nulla
7−tellus, eget egestas sapien. Nam rhoncus interdum libero, eget congue orci
8−imperdiet eu. Quisque pellentesque fringilla urna, ac venenatis ante ultricies
9−et. Pellentesque habitant morbi tristique senectus et netus et malesuada fames
10−ac turpis egestas. Mauris eleifend sagittis ultrices. Quisque ultrices accumsan
11−nisl, sed pellentesque metus porta vitae. Nulla facilisi. In et nibh tincidunt
12−mi volutpat pellentesque vitae nec sapien. Integer massa ipsum, pellentesque in
7+
8+Morbi tincidunt eleifend ante, eu gravida ante rutrum vel. Nunc bibendum nulla
9+tellus, eget egestas sapien. Nam rhoncus interdum libero, eget congue orci
10+imperdiet eu. Quisque pellentesque fringilla urna, ac venenatis ante ultricies
11+et. Pellentesque habitant morbi tristique senectus et netus et malesuada fames
12+ac turpis egestas. Mauris eleifend sagittis ultrices. Quisque ultrices accumsan
13+nisl, sed pellentesque metus porta vitae. Nulla facilisi. In et nibh tincidunt
14+mi volutpat pellentesque vitae nec sapien. Integer massa ipsum, pellentesque in
1315elementum at, cursus sit amet diam.
examples/feedblog/templates/default.html+7−7
@@ -4,20 +4,20 @@
44<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
55 <head>
66 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
7− <title>SimpleBlog - $title</title>
8− <link rel="stylesheet" type="text/css" href="$root/css/default.css" />
7+ <title>SimpleBlog - $title$</title>
8+ <link rel="stylesheet" type="text/css" href="/css/default.css" />
99 <link rel="alternate"
1010 type="application/rss+xml"
1111 title="SimpleBlog"
12− href="$root/rss.xml" />
12+ href="/rss.xml" />
1313 </head>
1414 <body>
15− <h1>SimpleBlog - $title</h1>
15+ <h1>SimpleBlog - $title$</h1>
1616 <div id="navigation">
17− <a href="$root/index.html">Home</a>
18− <a href="$root/posts.html">All posts</a>
17+ <a href="/index.html">Home</a>
18+ <a href="/posts.html">All posts</a>
1919 </div>
2020
21− $body
21+ $body$
2222 </body>
2323</html>
examples/feedblog/index.html → examples/feedblog/templates/index.htmlrenamed+2−2
@@ -1,9 +1,9 @@
11<div id="posts">
22 <h1>Recent posts</h1>
33 <ul>
4− $body
4+ $posts$
55 </ul>
6− <a href="$root/posts.html">All posts...</a>
6+ <p><a href="/posts.html">All posts&hellip;</a></p>
77</div>
88
99<div class="about">
examples/feedblog/templates/post.html+3−3
@@ -1,4 +1,4 @@
1−<h1>$title</h1>
2−by <em>$author</em> on <strong>$date</strong>
1+<h1>$title$</h1>
2+by <em>$author$</em> on <strong>$date$</strong>
33
4−$body
4+$body$
examples/feedblog/templates/postitem.html+2−2
@@ -1,4 +1,4 @@
11<li>
2− <a href="$root/$url">$title</a>
3− - <em>$date</em> - by <em>$author</em>
2+ <a href="/$url">$title$</a>
3+ - <em>$date$</em> - by <em>$author$</em>
44</li>
examples/feedblog/posts.html → examples/feedblog/templates/posts.htmlrenamed+1−1
@@ -1,4 +1,4 @@
11<h1>All posts</h1>
22<ul>
3− $body
3+ $posts$
44</ul>