@@ -3,7 +3,7 @@
3import Control.Applicative ((<$>))
3import Control.Applicative ((<$>))
4import Control.Arrow (second)
4import Control.Arrow (second)
5import Control.Monad (forM_)
5import Control.Monad (forM_)
6−import Data.List (isPrefixOf)
6+import Data.List (isPrefixOf, partition)
7import Data.Monoid (mappend)
7import Data.Monoid (mappend)
8import Hakyll
8import Hakyll
9import System.FilePath (dropTrailingPathSeparator, splitPath)
9import System.FilePath (dropTrailingPathSeparator, splitPath)
@@ -53,12 +53,16 @@ main = hakyllWith config $ do
53 compile $ do
53 compile $ do
54 tutorials <- loadAll "tutorials/*"
54 tutorials <- loadAll "tutorials/*"
55 itemTpl <- loadBody "templates/tutorial-item.html"
55 itemTpl <- loadBody "templates/tutorial-item.html"
56− list <- applyTemplateList itemTpl defaultContext $
56+ let (series, articles) = partitionTutorials $
57− chronological tutorials
57+ chronological tutorials
59+ series' <- applyTemplateList itemTpl defaultContext series
60+ articles' <- applyTemplateList itemTpl defaultContext articles
59 let tutorialsCtx =
62 let tutorialsCtx =
60− constField "title" "Tutorials" `mappend`
63+ constField "title" "Tutorials" `mappend`
64+ constField "series" series' `mappend`
61− constField "tutorials" list `mappend`
65+ constField "articles" articles' `mappend`
62 defaultContext
66 defaultContext
64 makeItem ""
68 makeItem ""
@@ -102,3 +106,9 @@ hackage url
102 (packageName, version') = second (drop 1) $ break (== '-') package
106 (packageName, version') = second (drop 1) $ break (== '-') package
103 (baseName : package : _) = map dropTrailingPathSeparator $
107 (baseName : package : _) = map dropTrailingPathSeparator $
104 reverse $ splitPath url
108 reverse $ splitPath url
111+--------------------------------------------------------------------------------
112+-- | Partition tutorials into tutorial series & other articles
113+partitionTutorials :: [Item a] -> ([Item a], [Item a])
114+partitionTutorials = partition $ matches (fromRegex "\\d*-.*") . itemIdentifier