packages feed

yesod-newsfeed 0.1.0 → 0.2.0

raw patch · 9 files changed

+247/−247 lines, 9 files

Files

+ 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