~dbalan/blogng unlisted

ref: deploy-2019-10-30 blogng/site.hs -rw-r--r-- 4.5 KiB
7bf7721d — Dhananjay Balan Add post about open PGP keys. 10 months 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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
--------------------------------------------------------------------------------
{-# 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 <- buildTags "blog/*" (fromCapture "tags/*.html")

    match "images/*" $ do
        route   idRoute
        compile copyFileCompiler

    match "css/*" $ do
        route   idRoute
        compile compressCssCompiler

    match "fonts/*/*" $ do
      route $ idRoute
      compile copyFileCompiler

    match "notes/*" $ do
      route $ idRoute
      compile copyFileCompiler

    match "blog/*" $ do
        route $  octopressRoute
        compile $ pandocCompiler
            >>= loadAndApplyTemplate "templates/post.html"    (postCtxWTags tags)
            >>= saveSnapshot "content"
            >>= loadAndApplyTemplate "templates/default.html" (postCtxWTags tags)
            >>= relativizeUrls

    match "index.html" $ do
        route idRoute
        compile $ do
            posts <- recentFirst =<< loadAll "blog/*"
            let indexCtx =
                    listField "posts" postCtx (return $ take 8 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

    -- tags!
    tagsRules tags $ \tag pattern -> do
        let title = "Posts tagged \"" ++ tag ++ "\""
        route idRoute
        compile $ do
            posts <- recentFirst =<< loadAll pattern
            let ctx = constField "title" title
                      `mappend` listField "posts" postCtx (return posts)
                      `mappend` defaultContext

            makeItem ""
                >>= loadAndApplyTemplate "templates/tag.html" ctx
                >>= loadAndApplyTemplate "templates/default.html" ctx
                >>= 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

postCtxWTags :: Tags -> Context String
postCtxWTags tags = tagsField "tags" tags <> postCtx

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