-------------------------------------------------------------------------------- {-# LANGUAGE OverloadedStrings #-} import Data.Monoid (mappend) import Hakyll import Hakyll.Core.Identifier (toFilePath) import Hakyll.Web.Feed import System.FilePath import Text.Regex (splitRegex, mkRegex) -------------------------------------------------------------------------------- config :: Configuration {- deploy command expects www to point to web server - this is the current config Host www Hostname 10.1.10.30 User root ProxyJump dj@ares.dbalan.in -} config = defaultConfiguration { destinationDirectory = "public" , deployCommand = "rsync -vrP public/ www:/usr/local/www/nginx/blog/" } feedConfig :: FeedConfiguration feedConfig = FeedConfiguration { feedTitle = "Binary Strolls" , feedDescription = "Blag" , feedAuthorName = "Dhananjay Balan" , feedRoot = "https://blog.dbalan.in" , feedAuthorEmail = "blog@dbalan.in" } main :: IO () main = hakyllWith config $ do tags <- extractTags match "images/*" $ do route idRoute compile copyFileCompiler match "css/*" $ do route idRoute compile compressCssCompiler match "fonts/icomoon/*" $ do route $ idRoute compile copyFileCompiler match "fonts/et-book/*/*" $ do route $ idRoute compile copyFileCompiler match "notes/*" $ do route $ idRoute compile copyFileCompiler match "blog/*" $ do route $ octopressRoute compile $ pandocCompiler >>= loadAndApplyTemplate "templates/post.html" postCtx >>= saveSnapshot "content" >>= loadAndApplyTemplate "templates/default.html" postCtx >>= relativizeUrls match "index.html" $ do route idRoute compile $ do posts <- recentFirst =<< loadAll "blog/*" let indexCtx = listField "posts" postCtx (return $ take 5 posts) `mappend` constField "title" "Home" `mappend` tagsField "tags" tags `mappend` defaultContext getResourceBody >>= applyAsTemplate indexCtx >>= loadAndApplyTemplate "templates/default.html" indexCtx >>= relativizeUrls create ["archive.html"] $ do route idRoute compile $ do posts <- recentFirst =<< loadAll "blog/*" let archiveCtx = listField "posts" postCtx (return posts) `mappend` constField "title" "Archives" `mappend` defaultContext makeItem "" >>= loadAndApplyTemplate "templates/archive.html" archiveCtx >>= loadAndApplyTemplate "templates/default.html" archiveCtx >>= relativizeUrls create ["atom.xml"] $ do route idRoute compile $ do posts <- fmap (take 5) . recentFirst =<< loadAllSnapshots "blog/*" "content" let feedCtx = postCtx `mappend` bodyField "description" renderAtom feedConfig feedCtx posts match "templates/*" $ compile templateBodyCompiler -------------------------------------------------------------------------------- extractTags :: Rules Tags extractTags = do tags <- buildTags ("blogs/**" .&&. hasNoVersion) $ fromCapture "tags/*.html" return $ sortTagsBy caseInsensitiveTags tags postCtx :: Context String postCtx = dateField "date" "%B %e, %Y" `mappend` defaultContext -- octopress compatible routes octopressRoute :: Routes octopressRoute = customRoute $ octoMangaling octoMangaling :: Identifier -> FilePath octoMangaling pathId = base year month day post "index.html" where p = toFilePath pathId base = takeDirectory p seps = splitRegex (mkRegex "-") $ takeBaseName p year:month:day:xs = seps post = tail $ foldl (\a b -> a ++ "-" ++ b) "" xs