diff options
Diffstat (limited to 'build/generate-rss.hs')
-rwxr-xr-x | build/generate-rss.hs | 88 |
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 | |||
3 | import System.Environment (getArgs) | ||
4 | import qualified Control.Monad.State as S | ||
5 | import Control.Monad (sequence) | ||
6 | |||
7 | import Text.Feed.Constructor | ||
8 | import Text.Feed.Util | ||
9 | import Text.Feed.Export | ||
10 | import Text.Feed.Types | ||
11 | |||
12 | import Text.Pandoc | ||
13 | import Text.Pandoc.Pretty | ||
14 | |||
15 | import qualified System.Time as T | ||
16 | import qualified System.Posix.Files as F | ||
17 | import qualified Text.XML.Light.Output as X | ||
18 | import qualified System.FilePath as FP | ||
19 | import System.Posix.Types | ||
20 | |||
21 | import Data.Maybe (fromMaybe) | ||
22 | import Data.List (dropWhileEnd, isSuffixOf) | ||
23 | |||
24 | type FeedState = (Feed, Maybe T.ClockTime) | ||
25 | |||
26 | feedKind = RSSKind $ Just "2.0" | ||
27 | |||
28 | baseurl = "http://dirty-haskell.org" | ||
29 | |||
30 | description = "dirty-haskell.org — a blog" | ||
31 | |||
32 | mkUrl' :: FilePath -> String | ||
33 | mkUrl' path = (++) (baseurl ++ "/posts/") $ (flip FP.replaceExtension) "html" $ FP.takeFileName path | ||
34 | |||
35 | |||
36 | extract_title :: Pandoc -> String | ||
37 | extract_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 | |||
45 | main :: IO () | ||
46 | main = 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 | |||
58 | addItem' :: FilePath -> S.StateT FeedState IO () | ||
59 | addItem' 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 | |||
78 | mkUrl :: FilePath -> IO String | ||
79 | mkUrl 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) | ||