Consolidated Rss and Atom Feed types into one

This commit is contained in:
patrick brisbin 2011-01-18 10:15:05 -05:00
parent 8f73e2ab8d
commit bc40f62886
3 changed files with 77 additions and 75 deletions

View File

@ -17,42 +17,25 @@
-- | Generation of Atom newsfeeds. See -- | Generation of Atom newsfeeds. See
-- <http://en.wikipedia.org/wiki/Atom_(standard)>. -- <http://en.wikipedia.org/wiki/Atom_(standard)>.
module Yesod.Helpers.AtomFeed module Yesod.Helpers.AtomFeed
( AtomFeed (..) ( atomFeed
, AtomFeedEntry (..)
, atomFeed
, atomLink , atomLink
, RepAtom (..) , RepAtom (..)
, module Yesod.Helpers.Feed
) where ) where
import Yesod.Content import Yesod.Content
import Yesod.Handler import Yesod.Handler
import Yesod.Widget import Yesod.Widget
import Text.Hamlet import Yesod.Helpers.Feed
import Data.Time.Clock (UTCTime)
newtype RepAtom = RepAtom Content newtype RepAtom = RepAtom Content
instance HasReps RepAtom where instance HasReps RepAtom where
chooseRep (RepAtom c) _ = return (typeAtom, c) chooseRep (RepAtom c) _ = return (typeAtom, c)
atomFeed :: AtomFeed (Route master) -> GHandler sub master RepAtom atomFeed :: Feed (Route master) -> GHandler sub master RepAtom
atomFeed = fmap RepAtom . hamletToContent . template atomFeed = fmap RepAtom . hamletToContent . template
data AtomFeed url = AtomFeed template :: Feed url -> Hamlet url
{ atomTitle :: String
, atomLinkSelf :: url
, atomLinkHome :: url
, atomUpdated :: UTCTime
, atomEntries :: [AtomFeedEntry url]
}
data AtomFeedEntry url = AtomFeedEntry
{ atomEntryLink :: url
, atomEntryUpdated :: UTCTime
, atomEntryTitle :: String
, atomEntryContent :: Html
}
template :: AtomFeed url -> Hamlet url
template arg = template arg =
#if __GLASGOW_HASKELL__ >= 700 #if __GLASGOW_HASKELL__ >= 700
[xhamlet| [xhamlet|
@ -61,16 +44,16 @@ template arg =
#endif #endif
\<?xml version="1.0" encoding="utf-8"?> \<?xml version="1.0" encoding="utf-8"?>
%feed!xmlns="http://www.w3.org/2005/Atom" %feed!xmlns="http://www.w3.org/2005/Atom"
%title $atomTitle.arg$ %title $feedTitle.arg$
%link!rel=self!href=@atomLinkSelf.arg@ %link!rel=self!href=@feedLinkSelf.arg@
%link!href=@atomLinkHome.arg@ %link!href=@feedLinkHome.arg@
%updated $formatW3.atomUpdated.arg$ %updated $formatW3.feedUpdated.arg$
%id @atomLinkHome.arg@ %id @feedLinkHome.arg@
$forall atomEntries.arg entry $forall feedEntries.arg entry
^entryTemplate.entry^ ^entryTemplate.entry^
|] |]
entryTemplate :: AtomFeedEntry url -> Hamlet url entryTemplate :: FeedEntry url -> Hamlet url
entryTemplate arg = entryTemplate arg =
#if __GLASGOW_HASKELL__ >= 700 #if __GLASGOW_HASKELL__ >= 700
[xhamlet| [xhamlet|
@ -78,11 +61,11 @@ entryTemplate arg =
[$xhamlet| [$xhamlet|
#endif #endif
%entry %entry
%id @atomEntryLink.arg@ %id @feedEntryLink.arg@
%link!href=@atomEntryLink.arg@ %link!href=@feedEntryLink.arg@
%updated $formatW3.atomEntryUpdated.arg$ %updated $formatW3.feedEntryUpdated.arg$
%title $atomEntryTitle.arg$ %title $feedEntryTitle.arg$
%content!type=html $cdata.atomEntryContent.arg$ %content!type=html $cdata.feedEntryContent.arg$
|] |]
-- | Generates a link tag in the head of a widget. -- | Generates a link tag in the head of a widget.
@ -95,5 +78,5 @@ atomLink u title = addHamletHead
#else #else
[$hamlet| [$hamlet|
#endif #endif
%link!href=@u@!type="application/atom+xml"!rel="alternate"!title=$title$ %link!href=@u@!type=$typeAtom$!rel="alternate"!title=$title$
|] |]

40
Yesod/Helpers/Feed.hs Normal file
View File

@ -0,0 +1,40 @@
-------------------------------------------------------------------------------
--
-- 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 and
-- Rss feed or an Atom feed (or both, or other).
--
-------------------------------------------------------------------------------
module Yesod.Helpers.Feed
( Feed(..)
, FeedEntry(..)
) where
import Text.Hamlet (Html)
import Data.Time.Clock (UTCTime)
-- | The overal feed
data Feed url = Feed
{ feedTitle :: String
, feedLinkSelf :: url
, feedLinkHome :: url
, feedDescription :: Html
, feedLanguage :: String
, feedUpdated :: UTCTime
, feedEntries :: [FeedEntry url]
}
-- | Each feed entry
data FeedEntry url = FeedEntry
{ feedEntryLink :: url
, feedEntryUpdated :: UTCTime
, feedEntryTitle :: String
, feedEntryContent :: Html
}

View File

@ -12,68 +12,47 @@
-- --
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
module Yesod.Helpers.RssFeed module Yesod.Helpers.RssFeed
( RssFeed (..) ( rssFeed
, RssFeedEntry (..)
, rssFeed
, rssLink , rssLink
, RepRss (..) , RepRss (..)
, module Yesod.Helpers.Feed
) where ) where
import Yesod.Handler import Yesod.Handler
import Yesod.Content import Yesod.Content
import Yesod.Widget import Yesod.Widget
import Text.Hamlet import Yesod.Helpers.Feed
import Data.Time.Clock (UTCTime)
newtype RepRss = RepRss Content newtype RepRss = RepRss Content
instance HasReps RepRss where instance HasReps RepRss where
chooseRep (RepRss c) _ = return (typeRss, c) chooseRep (RepRss c) _ = return (typeRss, c)
-- | Generate the feed -- | Generate the feed
rssFeed :: RssFeed (Route master) -> GHandler sub master RepRss rssFeed :: Feed (Route master) -> GHandler sub master RepRss
rssFeed = fmap RepRss . hamletToContent . template rssFeed = fmap RepRss . hamletToContent . template
-- | Data type for the overall feed template :: Feed url -> Hamlet url
data RssFeed url = RssFeed
{ rssTitle :: String
, rssLinkSelf :: url
, rssLinkHome :: url
, rssDescription :: String
, rssLanguage :: String
, rssUpdated :: UTCTime
, rssEntries :: [RssFeedEntry url]
}
-- | Data type for each feed entry
data RssFeedEntry url = RssFeedEntry
{ rssEntryLink :: url
, rssEntryUpdated :: UTCTime
, rssEntryTitle :: String
, rssEntryContent :: Html
}
template :: RssFeed url -> Hamlet url
template arg = template arg =
#if __GLASGOW_HASKELL__ >= 700 #if __GLASGOW_HASKELL__ >= 700
[xhamlet| [xhamlet|
#else #else
[$xhamlet| [$xhamlet|
#endif #endif
%rss!version="2.0"!xmlns:atom="http://www.w3.org/2005/Atom" %rss!version="2.0"
%channel %channel
%atom:link!href=@rssLinkSelf.arg@!rel="self"!type=$typeRss$ %atom:link!href=@feedLinkSelf.arg@!rel="self"!type=$typeRss$
%title $rssTitle.arg$ %title $feedTitle.arg$
%link @rssLinkHome.arg@ %link @feedLinkHome.arg@
%description $rssDescription.arg$ %description $feedDescription.arg$
%lastBuildDate $formatRFC822.rssUpdated.arg$ %lastBuildDate $formatRFC822.feedUpdated.arg$
%language $rssLanguage.arg$ %language $feedLanguage.arg$
$forall rssEntries.arg entry $forall feedEntries.arg entry
^entryTemplate.entry^ ^entryTemplate.entry^
|] |]
entryTemplate :: RssFeedEntry url -> Hamlet url entryTemplate :: FeedEntry url -> Hamlet url
entryTemplate arg = entryTemplate arg =
#if __GLASGOW_HASKELL__ >= 700 #if __GLASGOW_HASKELL__ >= 700
[xhamlet| [xhamlet|
@ -81,11 +60,11 @@ entryTemplate arg =
[$xhamlet| [$xhamlet|
#endif #endif
%item %item
%title $rssEntryTitle.arg$ %title $feedEntryTitle.arg$
%link @rssEntryLink.arg@ %link @feedEntryLink.arg@
%guid @rssEntryLink.arg@ %guid @feedEntryLink.arg@
%pubDate $formatRFC822.rssEntryUpdated.arg$ %pubDate $formatRFC822.feedEntryUpdated.arg$
%description $rssEntryContent.arg$ %description $feedEntryContent.arg$
|] |]
-- | Generates a link tag in the head of a widget. -- | Generates a link tag in the head of a widget.