yesod-newsfeed 0.1.0 → 0.2.0
raw patch · 9 files changed
+247/−247 lines, 9 files
Files
- Yesod/AtomFeed.hs +84/−0
- Yesod/Feed.hs +40/−0
- Yesod/FeedTypes.hs +34/−0
- Yesod/Helpers/AtomFeed.hs +0/−84
- Yesod/Helpers/Feed.hs +0/−40
- Yesod/Helpers/FeedTypes.hs +0/−34
- Yesod/Helpers/RssFeed.hs +0/−84
- Yesod/RssFeed.hs +84/−0
- yesod-newsfeed.cabal +5/−5
+ Yesod/AtomFeed.hs view
@@ -0,0 +1,84 @@+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE CPP #-}+---------------------------------------------------------+--+-- Module : Yesod.AtomFeed+-- Copyright : Michael Snoyman+-- License : BSD3+--+-- Maintainer : Michael Snoyman <michael@snoyman.com>+-- Stability : Stable+-- Portability : portable+--+-- Generating atom news feeds.+--+---------------------------------------------------------++-- | Generation of Atom newsfeeds.+module Yesod.AtomFeed+ ( atomFeed+ , atomLink+ , RepAtom (..)+ , module Yesod.FeedTypes+ ) where++import Yesod.Content+import Yesod.Handler+import Yesod.Widget+import Yesod.FeedTypes+import Text.Hamlet (Hamlet, xhamlet, hamlet, cdata)+import qualified Data.ByteString.Char8 as S8+import Control.Monad (liftM)++newtype RepAtom = RepAtom Content+instance HasReps RepAtom where+ chooseRep (RepAtom c) _ = return (typeAtom, c)++atomFeed :: Monad mo => Feed (Route master) -> GGHandler sub master mo RepAtom+atomFeed = liftM RepAtom . hamletToContent . template++template :: Feed url -> Hamlet url+template arg =+#if __GLASGOW_HASKELL__ >= 700+ [xhamlet|+#else+ [$xhamlet|+#endif+\<?xml version="1.0" encoding="utf-8"?>+<feed xmlns="http://www.w3.org/2005/Atom"+ <title>#{feedTitle arg}+ <link rel=self href=@{feedLinkSelf arg}+ <link href=@{feedLinkHome arg}+ <updated>#{formatW3 $ feedUpdated arg}+ <id>@{feedLinkHome arg}+ $forall entry <- feedEntries arg+ ^{entryTemplate entry}+|]++entryTemplate :: FeedEntry url -> Hamlet url+entryTemplate arg =+#if __GLASGOW_HASKELL__ >= 700+ [xhamlet|+#else+ [$xhamlet|+#endif+<entry+ <id>@{feedEntryLink arg}+ <link href=@{feedEntryLink arg}+ <updated>#{formatW3 $ feedEntryUpdated arg}+ <title>#{feedEntryTitle arg}+ <content type=html>#{cdata $ feedEntryContent arg}+|]++-- | Generates a link tag in the head of a widget.+atomLink :: Route m+ -> String -- ^ title+ -> GWidget s m ()+atomLink u title = addHamletHead+#if __GLASGOW_HASKELL__ >= 700+ [hamlet|+#else+ [$hamlet|+#endif+<link href=@{u} type=#{S8.unpack typeAtom} rel="alternate" title=#{title}+|]
+ Yesod/Feed.hs view
@@ -0,0 +1,40 @@+-------------------------------------------------------------------------------+--+-- Module : Yesod.Feed+-- Copyright : Patrick Brisbin+-- License : as-is+--+-- Maintainer : Patrick Brisbin <me@pbrisbin.com>+-- Stability : Stable+-- Portability : Portable+--+-- Generic Feed and Feed Entry data types that can be used as either an+-- Rss feed or an Atom feed (or both, or other).+--+-- Atom spec: <http://en.wikipedia.org/wiki/Atom_(standard)>+-- Rss spec: <http://www.rssboard.org/rss-specification>+--+-------------------------------------------------------------------------------+module Yesod.Feed+ ( newsFeed+ , RepAtomRss (..)+ , module Yesod.FeedTypes+ ) where++import Yesod.FeedTypes+import Yesod.AtomFeed+import Yesod.RssFeed+import Yesod.Content (HasReps (chooseRep), typeAtom, typeRss)+import Yesod.Handler (Route, GGHandler)++data RepAtomRss = RepAtomRss RepAtom RepRss+instance HasReps RepAtomRss where+ chooseRep (RepAtomRss (RepAtom a) (RepRss r)) = chooseRep+ [ (typeAtom, a)+ , (typeRss, r)+ ]+newsFeed :: Monad mo => Feed (Route master) -> GGHandler sub master mo RepAtomRss+newsFeed f = do+ a <- atomFeed f+ r <- rssFeed f+ return $ RepAtomRss a r
+ Yesod/FeedTypes.hs view
@@ -0,0 +1,34 @@+module Yesod.FeedTypes+ ( Feed (..)+ , FeedEntry (..)+ ) where++import Text.Hamlet (Html)+import Data.Time.Clock (UTCTime)+import Data.Text (Text)++-- | The overal feed+data Feed url = Feed+ { feedTitle :: Text+ , feedLinkSelf :: url+ , feedLinkHome :: url+++ -- | note: currently only used for Rss+ , feedDescription :: Html++ -- | note: currently only used for Rss, possible values: + -- <http://www.rssboard.org/rss-language-codes>+ , feedLanguage :: Text++ , feedUpdated :: UTCTime+ , feedEntries :: [FeedEntry url]+ }++-- | Each feed entry+data FeedEntry url = FeedEntry+ { feedEntryLink :: url+ , feedEntryUpdated :: UTCTime+ , feedEntryTitle :: Text+ , feedEntryContent :: Html+ }
− Yesod/Helpers/AtomFeed.hs
@@ -1,84 +0,0 @@-{-# LANGUAGE QuasiQuotes #-}-{-# LANGUAGE CPP #-}---------------------------------------------------------------- Module : Yesod.Helpers.AtomFeed--- Copyright : Michael Snoyman--- License : BSD3------ Maintainer : Michael Snoyman <michael@snoyman.com>--- Stability : Stable--- Portability : portable------ Generating atom news feeds.----------------------------------------------------------------- | Generation of Atom newsfeeds.-module Yesod.Helpers.AtomFeed- ( atomFeed- , atomLink- , RepAtom (..)- , module Yesod.Helpers.FeedTypes- ) where--import Yesod.Content-import Yesod.Handler-import Yesod.Widget-import Yesod.Helpers.FeedTypes-import Text.Hamlet (Hamlet, xhamlet, hamlet, cdata)-import qualified Data.ByteString.Char8 as S8-import Control.Monad (liftM)--newtype RepAtom = RepAtom Content-instance HasReps RepAtom where- chooseRep (RepAtom c) _ = return (typeAtom, c)--atomFeed :: Monad mo => Feed (Route master) -> GGHandler sub master mo RepAtom-atomFeed = liftM RepAtom . hamletToContent . template--template :: Feed url -> Hamlet url-template arg =-#if __GLASGOW_HASKELL__ >= 700- [xhamlet|-#else- [$xhamlet|-#endif-\<?xml version="1.0" encoding="utf-8"?>-<feed xmlns="http://www.w3.org/2005/Atom"- <title>#{feedTitle arg}- <link rel=self href=@{feedLinkSelf arg}- <link href=@{feedLinkHome arg}- <updated>#{formatW3 $ feedUpdated arg}- <id>@{feedLinkHome arg}- $forall entry <- feedEntries arg- ^{entryTemplate entry}-|]--entryTemplate :: FeedEntry url -> Hamlet url-entryTemplate arg =-#if __GLASGOW_HASKELL__ >= 700- [xhamlet|-#else- [$xhamlet|-#endif-<entry- <id>@{feedEntryLink arg}- <link href=@{feedEntryLink arg}- <updated>#{formatW3 $ feedEntryUpdated arg}- <title>#{feedEntryTitle arg}- <content type=html>#{cdata $ feedEntryContent arg}-|]---- | Generates a link tag in the head of a widget.-atomLink :: Route m- -> String -- ^ title- -> GWidget s m ()-atomLink u title = addHamletHead-#if __GLASGOW_HASKELL__ >= 700- [hamlet|-#else- [$hamlet|-#endif-<link href=@{u} type=#{S8.unpack typeAtom} rel="alternate" title=#{title}-|]
− Yesod/Helpers/Feed.hs
@@ -1,40 +0,0 @@-------------------------------------------------------------------------------------- Module : Yesod.Helpers.Feed--- Copyright : Patrick Brisbin--- License : as-is------ Maintainer : Patrick Brisbin <me@pbrisbin.com>--- Stability : Stable--- Portability : Portable------ Generic Feed and Feed Entry data types that can be used as either an--- Rss feed or an Atom feed (or both, or other).------ Atom spec: <http://en.wikipedia.org/wiki/Atom_(standard)>--- Rss spec: <http://www.rssboard.org/rss-specification>------------------------------------------------------------------------------------module Yesod.Helpers.Feed- ( newsFeed- , RepAtomRss (..)- , module Yesod.Helpers.FeedTypes- ) where--import Yesod.Helpers.FeedTypes-import Yesod.Helpers.AtomFeed-import Yesod.Helpers.RssFeed-import Yesod.Content (HasReps (chooseRep), typeAtom, typeRss)-import Yesod.Handler (Route, GGHandler)--data RepAtomRss = RepAtomRss RepAtom RepRss-instance HasReps RepAtomRss where- chooseRep (RepAtomRss (RepAtom a) (RepRss r)) = chooseRep- [ (typeAtom, a)- , (typeRss, r)- ]-newsFeed :: Monad mo => Feed (Route master) -> GGHandler sub master mo RepAtomRss-newsFeed f = do- a <- atomFeed f- r <- rssFeed f- return $ RepAtomRss a r
− Yesod/Helpers/FeedTypes.hs
@@ -1,34 +0,0 @@-module Yesod.Helpers.FeedTypes- ( Feed (..)- , FeedEntry (..)- ) where--import Text.Hamlet (Html)-import Data.Time.Clock (UTCTime)-import Data.Text (Text)---- | The overal feed-data Feed url = Feed- { feedTitle :: Text- , feedLinkSelf :: url- , feedLinkHome :: url--- -- | note: currently only used for Rss- , feedDescription :: Html-- -- | note: currently only used for Rss, possible values: - -- <http://www.rssboard.org/rss-language-codes>- , feedLanguage :: Text-- , feedUpdated :: UTCTime- , feedEntries :: [FeedEntry url]- }---- | Each feed entry-data FeedEntry url = FeedEntry- { feedEntryLink :: url- , feedEntryUpdated :: UTCTime- , feedEntryTitle :: Text- , feedEntryContent :: Html- }
− Yesod/Helpers/RssFeed.hs
@@ -1,84 +0,0 @@-{-# LANGUAGE QuasiQuotes #-}-{-# LANGUAGE CPP #-}-------------------------------------------------------------------------------------- Module : Yesod.Helpers.RssFeed--- Copyright : Patrick Brisbin--- License : as-is------ Maintainer : Patrick Brisbin <me@pbrisbin.com>--- Stability : Stable--- Portability : Portable------------------------------------------------------------------------------------module Yesod.Helpers.RssFeed- ( rssFeed- , rssLink- , RepRss (..)- , module Yesod.Helpers.FeedTypes- ) where--import Yesod.Handler-import Yesod.Content-import Yesod.Widget-import Yesod.Helpers.FeedTypes-import Text.Hamlet (Hamlet, xhamlet, hamlet)-import qualified Data.ByteString.Char8 as S8-import Control.Monad (liftM)--newtype RepRss = RepRss Content-instance HasReps RepRss where- chooseRep (RepRss c) _ = return (typeRss, c)---- | Generate the feed-rssFeed :: Monad mo => Feed (Route master) -> GGHandler sub master mo RepRss-rssFeed = liftM RepRss . hamletToContent . template--template :: Feed url -> Hamlet url-template arg = -#if __GLASGOW_HASKELL__ >= 700- [xhamlet|-#else- [$xhamlet|-#endif- \<?xml version="1.0" encoding="utf-8"?> - <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"- <channel- <atom:link href=@{feedLinkSelf arg} rel="self" type=#{S8.unpack typeRss}- <title> #{feedTitle arg}- <link> @{feedLinkHome arg}- <description> #{feedDescription arg}- <lastBuildDate>#{formatRFC822 $ feedUpdated arg}- <language> #{feedLanguage arg}-- $forall entry <- feedEntries arg- ^{entryTemplate entry}- |]--entryTemplate :: FeedEntry url -> Hamlet url-entryTemplate arg = -#if __GLASGOW_HASKELL__ >= 700- [xhamlet|-#else- [$xhamlet|-#endif- <item- <title> #{feedEntryTitle arg}- <link> @{feedEntryLink arg}- <guid> @{feedEntryLink arg}- <pubDate> #{formatRFC822 $ feedEntryUpdated arg}- <description>#{feedEntryContent arg}- |]---- | Generates a link tag in the head of a widget.-rssLink :: Route m- -> String -- ^ title- -> GWidget s m ()-rssLink u title = addHamletHead-#if __GLASGOW_HASKELL__ >= 700- [hamlet|-#else- [$hamlet|-#endif- <link href=@{u} type=#{S8.unpack typeRss} rel="alternate" title=#{title}- |]
+ Yesod/RssFeed.hs view
@@ -0,0 +1,84 @@+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE CPP #-}+-------------------------------------------------------------------------------+--+-- Module : Yesod.RssFeed+-- Copyright : Patrick Brisbin+-- License : as-is+--+-- Maintainer : Patrick Brisbin <me@pbrisbin.com>+-- Stability : Stable+-- Portability : Portable+--+-------------------------------------------------------------------------------+module Yesod.RssFeed+ ( rssFeed+ , rssLink+ , RepRss (..)+ , module Yesod.FeedTypes+ ) where++import Yesod.Handler+import Yesod.Content+import Yesod.Widget+import Yesod.FeedTypes+import Text.Hamlet (Hamlet, xhamlet, hamlet)+import qualified Data.ByteString.Char8 as S8+import Control.Monad (liftM)++newtype RepRss = RepRss Content+instance HasReps RepRss where+ chooseRep (RepRss c) _ = return (typeRss, c)++-- | Generate the feed+rssFeed :: Monad mo => Feed (Route master) -> GGHandler sub master mo RepRss+rssFeed = liftM RepRss . hamletToContent . template++template :: Feed url -> Hamlet url+template arg = +#if __GLASGOW_HASKELL__ >= 700+ [xhamlet|+#else+ [$xhamlet|+#endif+ \<?xml version="1.0" encoding="utf-8"?> + <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"+ <channel+ <atom:link href=@{feedLinkSelf arg} rel="self" type=#{S8.unpack typeRss}+ <title> #{feedTitle arg}+ <link> @{feedLinkHome arg}+ <description> #{feedDescription arg}+ <lastBuildDate>#{formatRFC822 $ feedUpdated arg}+ <language> #{feedLanguage arg}++ $forall entry <- feedEntries arg+ ^{entryTemplate entry}+ |]++entryTemplate :: FeedEntry url -> Hamlet url+entryTemplate arg = +#if __GLASGOW_HASKELL__ >= 700+ [xhamlet|+#else+ [$xhamlet|+#endif+ <item+ <title> #{feedEntryTitle arg}+ <link> @{feedEntryLink arg}+ <guid> @{feedEntryLink arg}+ <pubDate> #{formatRFC822 $ feedEntryUpdated arg}+ <description>#{feedEntryContent arg}+ |]++-- | Generates a link tag in the head of a widget.+rssLink :: Route m+ -> String -- ^ title+ -> GWidget s m ()+rssLink u title = addHamletHead+#if __GLASGOW_HASKELL__ >= 700+ [hamlet|+#else+ [$hamlet|+#endif+ <link href=@{u} type=#{S8.unpack typeRss} rel="alternate" title=#{title}+ |]
yesod-newsfeed.cabal view
@@ -1,5 +1,5 @@ name: yesod-newsfeed-version: 0.1.0+version: 0.2.0 license: BSD3 license-file: LICENSE author: Michael Snoyman, Patrick Brisbin@@ -18,10 +18,10 @@ , hamlet >= 0.8 && < 0.9 , bytestring >= 0.9 && < 0.10 , text >= 0.9 && < 1.0- exposed-modules: Yesod.Helpers.AtomFeed- , Yesod.Helpers.RssFeed- , Yesod.Helpers.Feed- other-modules: Yesod.Helpers.FeedTypes+ exposed-modules: Yesod.AtomFeed+ , Yesod.RssFeed+ , Yesod.Feed+ other-modules: Yesod.FeedTypes ghc-options: -Wall source-repository head