summaryrefslogtreecommitdiff
path: root/build/generate-rss.hs
diff options
context:
space:
mode:
Diffstat (limited to 'build/generate-rss.hs')
-rwxr-xr-xbuild/generate-rss.hs88
1 files changed, 0 insertions, 88 deletions
diff --git a/build/generate-rss.hs b/build/generate-rss.hs
deleted file mode 100755
index 2263ba8..0000000
--- a/build/generate-rss.hs
+++ /dev/null
@@ -1,88 +0,0 @@
1#!/usr/bin/env runhaskell
2
3import System.Environment (getArgs)
4import qualified Control.Monad.State as S
5import Control.Monad (sequence)
6
7import Text.Feed.Constructor
8import Text.Feed.Util
9import Text.Feed.Export
10import Text.Feed.Types
11
12import Text.Pandoc
13import Text.Pandoc.Pretty
14
15import qualified System.Time as T
16import qualified System.Posix.Files as F
17import qualified Text.XML.Light.Output as X
18import qualified System.FilePath as FP
19import System.Posix.Types
20
21import Data.Maybe (fromMaybe)
22import Data.List (dropWhileEnd, isSuffixOf)
23
24type FeedState = (Feed, Maybe T.ClockTime)
25
26feedKind = RSSKind $ Just "2.0"
27
28baseurl = "http://dirty-haskell.org"
29
30description = "dirty-haskell.org — a blog"
31
32mkUrl' :: FilePath -> String
33mkUrl' path = (++) (baseurl ++ "/posts/") $ (flip FP.replaceExtension) "html" $ FP.takeFileName path
34
35
36extract_title :: Pandoc -> String
37extract_title (Pandoc m _) = do
38 title <- render Nothing $ cat $ map pretty (docTitle m)
39 return title
40 where pretty :: Inline -> Doc
41 pretty (Str s) = text s
42 pretty Space = space
43 pretty _ = empty
44
45main :: IO ()
46main = do
47 (title:entries) <- getArgs
48 currentTime <- T.getClockTime
49 let feed = foldl1 (.)
50 [ withFeedDescription description
51 , withFeedHome baseurl
52 , withFeedTitle title
53 ] $ newFeed feedKind
54 (populatedFeed, itemTime) <- S.execStateT (sequence $ map addItem' entries) (feed, Nothing)
55 let populatedFeed' = withFeedPubDate (toFeedDateString feedKind $ fromMaybe currentTime itemTime) $ withFeedLastUpdate (toFeedDateString feedKind currentTime) $ populatedFeed
56 putStrLn $ X.ppElement $ xmlFeed populatedFeed'
57
58addItem' :: FilePath -> S.StateT FeedState IO ()
59addItem' mdFile = do
60 url <- S.liftIO $ mkUrl mdFile
61 fileStatus <- S.liftIO $ F.getSymbolicLinkStatus mdFile
62 fileContents <- S.liftIO $ readFile mdFile
63 let title = extract_title $ document
64 contents = writeAsciiDoc def document
65 document = readMarkdown def fileContents
66 (feed, time) <- S.get
67 let fileTime = maximum ([F.modificationTime, F.statusChangeTime] <-> fileStatus) :: System.Posix.Types.EpochTime
68 fileTime' = T.TOD (toInteger $ fromEnum fileTime) 0
69 let item = foldl1 (.)
70 [ withItemTitle title
71 , withItemLink url
72 , withItemId True url
73 , withItemDate $ toFeedDateString feedKind fileTime'
74 , withItemDescription contents
75 ] $ newItem feedKind :: Item
76 S.put (addItem item feed, if (Just fileTime' > time) then Just fileTime' else time)
77
78mkUrl :: FilePath -> IO String
79mkUrl link = do
80 status <- F.getSymbolicLinkStatus link
81 if F.isSymbolicLink status then
82 do target <- F.readSymbolicLink link
83 mkUrl $ FP.combine (FP.takeDirectory link) target
84 else
85 return $ mkUrl' link
86(<->) :: [(a -> b)] -> a -> [b]
87[] <-> _ = []
88(f:fs) <-> x = (f x:fs <-> x)