~dbalan/blogng

ref: f41c5e6a5a2ea7e34b584bcafbc7a2541a69e63f blogng/site.hs -rw-r--r-- 3.9 KiB
f41c5e6a — Dhananjay Balan Experiments in owning data, part 2 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
--------------------------------------------------------------------------------
{-# 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