on master help sign in
Added categoryblog example.
commit4f335aa6a2ffcd663c4bdb2c139bf4e1ea5237bf authorJasper Van der Jeugt <jaspervdj@gmail.com> dateFri 29 Jan 2010, 15:16 (17 years ago) parent8ff7025
16 files changed+228−10
examples/categoryblog/css/default.css+17 examples/categoryblog/hakyll.hs+64 examples/categoryblog/index.html+18 examples/categoryblog/posts.html+4 examples/categoryblog/posts/coding/2009-11-05-a-first-post.markdown+20 examples/categoryblog/posts/coding/2009-11-28-a-third-post.markdown+18 examples/categoryblog/posts/coding/2009-12-04-this-blog-aint-dead.markdown+11 examples/categoryblog/posts/random/2009-11-10-another-post.markdown+14 examples/categoryblog/posts/random/2009-12-23-almost-christmas.markdown+12 examples/categoryblog/templates/default.html+23 examples/categoryblog/templates/post.html+5 examples/categoryblog/templates/postitem.html+4 examples/categoryblog/templates/rss.xml+9 examples/categoryblog/templates/rssitem.xml+5 examples/tagblog/hakyll.hs+3−9 examples/tagblog/templates/rss.xml+1−1
examples/categoryblog/css/default.cssnew file+17
@@ -0,0 +1,17 @@
1+body {
2+ width: 600px;
3+ margin: 0px auto 0px auto;
4+}
5+
6+div#navigation {
7+ text-align: center;
8+ border-bottom: 4px solid black;
9+}
10+
11+div#navigation a {
12+ color: white;
13+ text-decoration: none;
14+ background-color: black;
15+ padding: 3px 10px 3px 10px;
16+ margin: 0px 10px 0px 10px;
17+}
examples/categoryblog/hakyll.hsnew file+64
@@ -0,0 +1,64 @@
1+module Main where
2+
3+import Text.Hakyll (hakyll)
4+import Text.Hakyll.Render
5+import Text.Hakyll.Tags (readCategoryMap)
6+import Text.Hakyll.File (getRecursiveContents, directory, removeSpaces)
7+import Text.Hakyll.Renderables (createPagePath, createCustomPage, createListingWith, createListing)
8+import Text.Hakyll.Context (ContextManipulation, renderDate)
9+import Text.Hakyll.Util (link)
10+import Data.List (sort)
11+import Data.Map (toList)
12+import Control.Monad (mapM_, liftM, (<=<))
13+import Data.Either (Either(..))
14+
15+main = hakyll $ do
16+ -- Static directory.
17+ directory css "css"
18+
19+ -- Find all post paths.
20+ postPaths <- liftM (reverse . sort) $ getRecursiveContents "posts"
21+ let renderablePosts = map createPagePath postPaths
22+
23+ -- Read category map.
24+ categoryMap <- readCategoryMap "categoryMap" renderablePosts
25+
26+ -- Render all posts list.
27+ renderPostList "posts.html" "All posts" renderablePosts
28+
29+ -- Render post list per category
30+ mapM_ (\(category, posts) -> renderPostList (categoryToURL category) ("Posts about " ++ category) posts)
31+ (toList categoryMap)
32+
33+ -- Render index, including recent posts.
34+ let index = createListingWith postManipulation "index.html"
35+ "templates/postitem.html"
36+ (take 3 renderablePosts)
37+ [ ("title", "Home")
38+ , ("categories", categoryList categoryMap)
39+ ]
40+ renderChain ["index.html", "templates/default.html"] index
41+
42+ -- Render all posts.
43+ mapM_ (renderChainWith postManipulation
44+ ["templates/post.html"
45+ ,"templates/default.html"
46+ ]) renderablePosts
47+
48+ -- Render rss feed
49+ let rss = createListing "rss.xml" "templates/rssitem.xml" (take 3 renderablePosts) []
50+ renderChain ["templates/rss.xml"] rss
51+
52+ where postManipulation :: ContextManipulation
53+ postManipulation = renderDate "date" "%B %e, %Y" "Date unknown"
54+
55+ categoryToURL category = "$root/categories/" ++ removeSpaces category ++ ".html"
56+
57+ categoryList = uncurry categoryListItem <=< toList
58+
59+ categoryListItem category posts = "<li>" ++ link category (categoryToURL category)
60+ ++ " - " ++ show (length posts) ++ " items.</li>"
61+
62+ renderPostList url title posts = do
63+ let list = createListingWith postManipulation url "templates/postitem.html" posts [("title", title)]
64+ renderChain ["posts.html", "templates/default.html"] list
examples/categoryblog/index.htmlnew file+18
@@ -0,0 +1,18 @@
1+<div id="posts">
2+ <h1>Recent posts</h1>
3+ <ul>
4+ $body
5+ </ul>
6+ <a href="$root/posts.html">All posts...</a>
7+ <h1>Categories</h1>
8+ <ul>
9+ $categories
10+ </ul>
11+</div>
12+
13+<div class="about">
14+ <h1>About</h1>
15+ <p>
16+ This is a sample blog for educational purposes.
17+ </p>
18+</div>
examples/categoryblog/posts.htmlnew file+4
@@ -0,0 +1,4 @@
1+<h1>$title</h1>
2+<ul>
3+ $body
4+</ul>
examples/categoryblog/posts/coding/2009-11-05-a-first-post.markdownnew file+20
@@ -0,0 +1,20 @@
1+---
2+title: A first post
3+author: Julius Caesar
4+---
5+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus pretium leo
6+adipiscing lectus iaculis lobortis. Vivamus scelerisque velit dignissim metus
7+gravida sit amet dapibus ligula tempor. Quisque sit amet viverra nunc.
8+Suspendisse cursus elementum ante, ut venenatis nisi dictum eu. Nulla diam
9+ligula, eleifend in varius quis, malesuada a nibh. Vivamus consequat
10+pellentesque erat non blandit. Nunc sit amet eros vel massa semper ullamcorper
11+quis iaculis magna. Vestibulum ullamcorper urna sit amet est elementum
12+pulvinar. Vestibulum consequat lacus ac quam hendrerit tincidunt. Praesent
13+bibendum vehicula diam, nec sagittis risus tempus a. Nulla quis odio sit amet
14+odio vehicula cursus ut id odio. Curabitur semper magna euismod magna mollis
15+venenatis. Nunc eget eleifend velit. Mauris sed posuere sem. Fusce id nunc
16+nisi, a aliquam orci. Suspendisse laoreet justo non enim laoreet eget consequat
17+velit porttitor. Aenean faucibus sodales metus at tincidunt. Donec vestibulum
18+leo pulvinar erat auctor ac ultrices massa euismod. Phasellus blandit cursus
19+magna, eget lacinia mi lobortis sed. Suspendisse ultricies enim ligula, vel
20+scelerisque mauris.
examples/categoryblog/posts/coding/2009-11-28-a-third-post.markdownnew file+18
@@ -0,0 +1,18 @@
1+---
2+title: A third post
3+author: Publius Ovidius Naso
4+---
5+Pellentesque tempor blandit elit, vel ultricies arcu congue egestas. Fusce
6+vitae rutrum nisl. Fusce id mauris libero, a venenatis tellus. Fusce iaculis,
7+lorem et ornare molestie, mauris risus mollis nisi, non fermentum lacus lacus
8+sit amet ipsum. Praesent lobortis ullamcorper dolor, eget convallis ligula
9+dignissim a. Suspendisse nulla nisi, congue et pharetra vel, convallis non
10+libero. Ut a nulla ipsum. Phasellus cursus velit id neque viverra ut
11+pellentesque justo posuere. Curabitur laoreet enim et velit tempor consectetur.
12+Donec eu pretium urna. Suspendisse vitae nisi at metus vestibulum aliquam in
13+sit amet nisl. Donec convallis lacinia odio, vestibulum molestie nunc feugiat
14+a. Suspendisse vehicula, sapien id aliquet consectetur, sem sapien ullamcorper
15+arcu, scelerisque porttitor elit ipsum posuere ligula. Nulla at velit eu metus
16+tincidunt auctor ut sit amet enim. Donec placerat dapibus nisi id facilisis.
17+Maecenas pellentesque pulvinar auctor. Curabitur gravida quam sit amet purus
18+consectetur blandit.
examples/categoryblog/posts/coding/2009-12-04-this-blog-aint-dead.markdownnew file+11
@@ -0,0 +1,11 @@
1+---
2+title: This blog ain't dead
3+author: Marcus Antonius
4+---
5+Etiam non felis aliquet tellus dictum vestibulum. Aliquam accumsan mauris non
6+lacus ultricies nec lacinia enim rhoncus. Curabitur vel tortor massa, elementum
7+tincidunt elit. Maecenas venenatis luctus arcu ut ullamcorper. Donec interdum
8+dolor eu enim tristique vel vehicula risus mollis. Nunc nec tortor quam. Nulla
9+a mauris arcu. Phasellus venenatis tortor vel odio tincidunt consequat. Integer
10+venenatis nibh vitae lectus laoreet eu feugiat nunc pretium. Integer nec turpis
11+metus, in fermentum lorem.
examples/categoryblog/posts/random/2009-11-10-another-post.markdownnew file+14
@@ -0,0 +1,14 @@
1+---
2+title: Another post
3+author: Marcus Tullius Cicero
4+---
5+Vestibulum in ultrices urna. Etiam tempor enim dui, nec malesuada elit. Donec
6+tempor ligula et quam volutpat quis fermentum eros congue. Sed ut pulvinar sem.
7+Sed aliquam ipsum id purus sollicitudin vulputate. Cras et mauris dui, vel
8+hendrerit leo. Ut metus ipsum, fermentum ac malesuada id, tempus pharetra quam.
9+Donec diam felis, consequat ac scelerisque cursus, gravida non lectus. Sed
10+faucibus elit dapibus diam elementum id varius nisi tristique. Proin consequat
11+faucibus neque in aliquam. Vestibulum ligula odio, pulvinar vel hendrerit
12+vitae, egestas ut nibh. Praesent ut velit elit, in consequat dolor. Praesent
13+sem enim, commodo in gravida sed, adipiscing vel eros. Lorem ipsum dolor sit
14+amet, consectetur adipiscing elit. Proin non aliquam nunc.
examples/categoryblog/posts/random/2009-12-23-almost-christmas.markdownnew file+12
@@ -0,0 +1,12 @@
1+---
2+title: Almost Christmas!
3+author: Publius Vergilius Maro
4+---
5+Morbi tincidunt eleifend ante, eu gravida ante rutrum vel. Nunc bibendum nulla
6+tellus, eget egestas sapien. Nam rhoncus interdum libero, eget congue orci
7+imperdiet eu. Quisque pellentesque fringilla urna, ac venenatis ante ultricies
8+et. Pellentesque habitant morbi tristique senectus et netus et malesuada fames
9+ac turpis egestas. Mauris eleifend sagittis ultrices. Quisque ultrices accumsan
10+nisl, sed pellentesque metus porta vitae. Nulla facilisi. In et nibh tincidunt
11+mi volutpat pellentesque vitae nec sapien. Integer massa ipsum, pellentesque in
12+elementum at, cursus sit amet diam.
examples/categoryblog/templates/default.htmlnew file+23
@@ -0,0 +1,23 @@
1+<?xml version="1.0" encoding="UTF-8"?>
2+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5+ <head>
6+ <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" />
9+ <link rel="alternate"
10+ type="application/rss+xml"
11+ title="SimpleBlog"
12+ href="http://example.com/rss.xml" />
13+ </head>
14+ <body>
15+ <h1>SimpleBlog - $title</h1>
16+ <div id="navigation">
17+ <a href="$root/index.html">Home</a>
18+ <a href="$root/posts.html">All posts</a>
19+ </div>
20+
21+ $body
22+ </body>
23+</html>
examples/categoryblog/templates/post.htmlnew file+5
@@ -0,0 +1,5 @@
1+<h1>$title</h1>
2+by <em>$author</em> on <strong>$date</strong>
3+<div>Tagged as: $tags.</div>
4+
5+$body
examples/categoryblog/templates/postitem.htmlnew file+4
@@ -0,0 +1,4 @@
1+<li>
2+ <a href="$root/$url">$title</a>
3+ - <em>$date</em> - by <em>$author</em>
4+</li>
examples/categoryblog/templates/rss.xmlnew file+9
@@ -0,0 +1,9 @@
1+<?xml version="1.0" ?>
2+<rss version="2.0">
3+ <channel>
4+ <title>The SimpleBlog</title>
5+ <link>http://example.com</link>
6+ <description>Simple blog in hakyll</description>
7+ $items
8+ </channel>
9+</rss>
examples/categoryblog/templates/rssitem.xmlnew file+5
@@ -0,0 +1,5 @@
1+<item>
2+ <title>$title</title>
3+ <link>http://example.com/$url</link>
4+ <description>$title by $author</description>
5+</item>
examples/tagblog/hakyll.hs+3−9
@@ -4,7 +4,7 @@ import Text.Hakyll (hakyll)
44import Text.Hakyll.Render
55import Text.Hakyll.Tags (readTagMap, renderTagCloud, renderTagLinks)
66import Text.Hakyll.File (getRecursiveContents, directory, removeSpaces)
7−import Text.Hakyll.Renderables (createPagePath, createCustomPage, createListingWith)
7+import Text.Hakyll.Renderables (createPagePath, createCustomPage, createListingWith, createListing)
88import Text.Hakyll.Context (ContextManipulation, renderDate)
99import Data.List (sort)
1010import Data.Map (toList)
@@ -46,14 +46,8 @@ main = hakyll $ do
4646 ]) renderablePosts
4747
4848 -- Render rss feed
49− let recentRSSItems = renderAndConcat ["templates/rssitem.xml"] $ take 3 renderablePosts
50− let rssPage = createCustomPage "rss.xml"
51− ("templates/postitem.html" : take 3 postPaths)
52− [("items", Right recentRSSItems)]
53− renderChain ["templates/rss.xml"] rssPage
54−
55− -- Render index.
56− renderChain ["templates/default.html"] $ createPagePath "index.html"
49+ let rss = createListing "rss.xml" "templates/rssitem.xml" (take 3 renderablePosts) []
50+ renderChain ["templates/rss.xml"] rss
5751
5852 where postManipulation :: ContextManipulation
5953 postManipulation = renderDate "date" "%B %e, %Y" "Date unknown"
examples/tagblog/templates/rss.xml+1−1
@@ -4,6 +4,6 @@
44 <title>The SimpleBlog</title>
55 <link>http://example.com</link>
66 <description>Simple blog in hakyll</description>
7− $items
7+ $body
88 </channel>
99</rss>