@@ -1,14 +1,13 @@
1--------------------------------------------------------------------------------
1--------------------------------------------------------------------------------
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3−import Control.Applicative ((<$>))
3+import Control.Arrow (second)
4−import Control.Arrow (second)
5−import Control.Monad (forM_)
4+import Control.Monad (forM_)
6−import Data.Char (isDigit)
5+import Data.Char (isDigit)
7−import Data.List (isPrefixOf, partition, sortBy)
6+import Data.List (isPrefixOf, sortBy)
8−import Data.Monoid (mappend)
7+import Data.Monoid ((<>))
9−import Data.Ord (comparing)
8+import Data.Ord (comparing)
10import Hakyll
9import Hakyll
11−import System.FilePath (dropTrailingPathSeparator, splitPath)
10+import System.FilePath (dropTrailingPathSeparator, splitPath)
12import Text.Pandoc
11import Text.Pandoc
@@ -53,18 +52,12 @@ main = hakyllWith config $ do
53 create ["tutorials.html"] $ do
52 create ["tutorials.html"] $ do
54 route idRoute
53 route idRoute
55 compile $ do
54 compile $ do
56− tutorials <- loadAll "tutorials/*"
55+ tuts <-
57− itemTpl <- loadBody "templates/tutorial-item.html"
58− let (series, articles) = partitionTutorials $
59− sortBy (comparing itemIdentifier) tutorials
56+ sortBy (comparing itemIdentifier) <$> loadAll "tutorials/*"
61− series' <- applyTemplateList itemTpl defaultContext series
62− articles' <- applyTemplateList itemTpl defaultContext articles
64 let tutorialsCtx =
58 let tutorialsCtx =
65 constField "title" "Tutorials" `mappend`
59 constField "title" "Tutorials" `mappend`
66− constField "series" series' `mappend`
60+ listField "tutorials" tutorialCtx (return tuts) `mappend`
67− constField "articles" articles' `mappend`
68 defaultContext
61 defaultContext
70 makeItem ""
63 makeItem ""
@@ -112,9 +105,27 @@ hackage url
114--------------------------------------------------------------------------------
107--------------------------------------------------------------------------------
108+data TutorialType = SeriesTutorial | ArticlesTutorial | ExternalTutorial
112+--------------------------------------------------------------------------------
115−-- | Partition tutorials into tutorial series & other articles
113+-- | Partition tutorials into tutorial series, other articles, external articles
116−partitionTutorials :: [Item a] -> ([Item a], [Item a])
114+tutorialCtx :: Context String
117−partitionTutorials = partition $ \i ->
115+tutorialCtx =
116+ field "isSeries" (isTutorialType SeriesTutorial) <>
117+ field "isArticle" (isTutorialType ArticlesTutorial) <>
118+ field "isExternal" (isTutorialType ExternalTutorial) <>
121+ getTutorialType item = do
122+ mbExternal <- getMetadataField (itemIdentifier item) "external"
123+ return $ case mbExternal of
124+ Just _ -> ExternalTutorial
118− case splitPath (toFilePath $ itemIdentifier i) of
125+ _ -> case splitPath (toFilePath $ itemIdentifier item) of
119− [_, (x : _)] -> isDigit x
126+ [_, (x : _)] -> if isDigit x then SeriesTutorial else ArticlesTutorial
120− _ -> False
127+ _ -> ArticlesTutorial
129+ isTutorialType ty0 item = do
130+ ty1 <- getTutorialType item
131+ if ty0 == ty1 then return "yes" else fail "no"