From 29e8a09a64b00ed497c864bfab83d7c3b95c4c87 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Sat, 25 Dec 2010 22:53:50 +0200 Subject: [PATCH 01/18] initial commit --- README | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README diff --git a/README b/README new file mode 100644 index 00000000..e69de29b From 240374b12744013b7408e3cbfbb29ca10e13adbf Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Sat, 25 Dec 2010 22:54:06 +0200 Subject: [PATCH 02/18] Imported code from yesod --- LICENSE | 25 ++++++++++ Yesod/Helpers/AtomFeed.hs | 99 +++++++++++++++++++++++++++++++++++++++ yesod-newsfeed.cabal | 24 ++++++++++ 3 files changed, 148 insertions(+) create mode 100644 LICENSE create mode 100644 Yesod/Helpers/AtomFeed.hs create mode 100644 yesod-newsfeed.cabal diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..8643e5d8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,25 @@ +The following license covers this documentation, and the source code, except +where otherwise indicated. + +Copyright 2010, Michael Snoyman. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Yesod/Helpers/AtomFeed.hs b/Yesod/Helpers/AtomFeed.hs new file mode 100644 index 00000000..c8136c65 --- /dev/null +++ b/Yesod/Helpers/AtomFeed.hs @@ -0,0 +1,99 @@ +{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE CPP #-} +--------------------------------------------------------- +-- +-- Module : Yesod.Helpers.AtomFeed +-- Copyright : Michael Snoyman +-- License : BSD3 +-- +-- Maintainer : Michael Snoyman +-- Stability : Stable +-- Portability : portable +-- +-- Generating atom news feeds. +-- +--------------------------------------------------------- + +-- | Generation of Atom newsfeeds. See +-- . +module Yesod.Helpers.AtomFeed + ( AtomFeed (..) + , AtomFeedEntry (..) + , atomFeed + , atomLink + , RepAtom (..) + ) where + +import Yesod.Content +import Yesod.Handler +import Yesod.Widget +import Text.Hamlet +import Data.Time.Clock (UTCTime) + +newtype RepAtom = RepAtom Content +instance HasReps RepAtom where + chooseRep (RepAtom c) _ = return (typeAtom, c) + +atomFeed :: AtomFeed (Route master) -> GHandler sub master RepAtom +atomFeed = fmap RepAtom . hamletToContent . template + +data AtomFeed url = AtomFeed + { 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 = +#if __GLASGOW_HASKELL__ >= 700 + [xhamlet| +#else + [$xhamlet| +#endif +\ +%feed!xmlns="http://www.w3.org/2005/Atom" + %title $atomTitle.arg$ + %link!rel=self!href=@atomLinkSelf.arg@ + %link!href=@atomLinkHome.arg@ + %updated $formatW3.atomUpdated.arg$ + %id @atomLinkHome.arg@ + $forall atomEntries.arg entry + ^entryTemplate.entry^ +|] + +entryTemplate :: AtomFeedEntry url -> Hamlet url +entryTemplate arg = +#if __GLASGOW_HASKELL__ >= 700 + [xhamlet| +#else + [$xhamlet| +#endif +%entry + %id @atomEntryLink.arg@ + %link!href=@atomEntryLink.arg@ + %updated $formatW3.atomEntryUpdated.arg$ + %title $atomEntryTitle.arg$ + %content!type=html $cdata.atomEntryContent.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="application/atom+xml"!rel="alternate"!title=$title$ +|] diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal new file mode 100644 index 00000000..bd7eae2b --- /dev/null +++ b/yesod-newsfeed.cabal @@ -0,0 +1,24 @@ +name: yesod-newsfeed +version: 0.7.0 +license: BSD3 +license-file: LICENSE +author: Michael Snoyman +maintainer: Michael Snoyman +synopsis: Helper functions and data types for producing Atom feeds. +category: Web, Yesod +stability: Stable +cabal-version: >= 1.6 +build-type: Simple +homepage: http://docs.yesodweb.com/ + +library + build-depends: base >= 4 && < 5 + , yesod-core >= 0.7 && < 0.8 + , time >= 1.1.4 && < 1.3 + , hamlet >= 0.7 && < 0.8 + exposed-modules: Yesod.Helpers.AtomFeed + ghc-options: -Wall + +source-repository head + type: git + location: git://github.com/snoyberg/yesod-newsfeed.git From de660617c4a1782259d917a3a1357e46a027b2b5 Mon Sep 17 00:00:00 2001 From: patrick brisbin Date: Sat, 15 Jan 2011 18:30:51 -0500 Subject: [PATCH 03/18] Added Yesod.Helpers.Feed --- Yesod/Helpers/RssFeed.hs | 89 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 Yesod/Helpers/RssFeed.hs diff --git a/Yesod/Helpers/RssFeed.hs b/Yesod/Helpers/RssFeed.hs new file mode 100644 index 00000000..9ad70419 --- /dev/null +++ b/Yesod/Helpers/RssFeed.hs @@ -0,0 +1,89 @@ +{-# LANGUAGE QuasiQuotes #-} +------------------------------------------------------------------------------- +-- +-- Module : Yesod.Helpers.RssFeed +-- Copyright : Patrick Brisbin +-- License : as-is +-- +-- Maintainer : Patrick Brisbin +-- Stability : Stable +-- Portability : Portable +-- +------------------------------------------------------------------------------- +module Yesod.Helpers.RssFeed + ( RssFeed (..) + , RssFeedEntry (..) + , rssFeed + , RepRss (..) + ) where + +import Yesod +import System.Locale (defaultTimeLocale) +import Data.Time.Clock (UTCTime) +import Data.Time.Format (formatTime) + +-- | note: This would normally be added in Yesod.Content +typeRss :: ContentType +typeRss = "application/rss+xml" + +newtype RepRss = RepRss Content +instance HasReps RepRss where + chooseRep (RepRss c) _ = return (typeRss, c) + +-- | Generate the feed +rssFeed :: RssFeed (Route master) -> GHandler sub master RepRss +rssFeed = fmap RepRss . hamletToContent . template + +-- | Data type for the overall feed +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 = [$xhamlet| +%rss!version="2.0"!xmlns:atom="http://www.w3.org/2005/Atom" + + %channel + %atom:link!href=@rssLinkSelf.arg@!rel="self"!type="application/rss+xml" + %title $rssTitle.arg$ + %link @rssLinkHome.arg@ + %description $rssDescription.arg$ + %lastBuildDate $format.rssUpdated.arg$ + %language $rssLanguage.arg$ + + $forall rssEntries.arg entry + ^entryTemplate.entry^ +|] + +entryTemplate :: RssFeedEntry url -> Hamlet url +entryTemplate arg = [$xhamlet| +%item + %title $rssEntryTitle.arg$ + %link @rssEntryLink.arg@ + %guid @rssEntryLink.arg@ + %pubDate $format.rssEntryUpdated.arg$ + %description $rssEntryContent.arg$ +|] + +-- | Format as string +format :: UTCTime -> String +format = formatTime defaultTimeLocale rfc822DateFormat + +-- | System.Local.rfc822DateFormat disagrees with date -R and does not +-- validate, this one does. +rfc822DateFormat :: String +rfc822DateFormat = "%a, %d %b %Y %H:%M:%S %z" From f6328872c2821bd43d50d182238c5eb48e301ffd Mon Sep 17 00:00:00 2001 From: patrick brisbin Date: Sat, 15 Jan 2011 18:31:28 -0500 Subject: [PATCH 04/18] cabal file: added module, version bump --- yesod-newsfeed.cabal | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal index bd7eae2b..cd4d67f9 100644 --- a/yesod-newsfeed.cabal +++ b/yesod-newsfeed.cabal @@ -1,5 +1,5 @@ name: yesod-newsfeed -version: 0.7.0 +version: 0.7.0.1 license: BSD3 license-file: LICENSE author: Michael Snoyman @@ -16,7 +16,7 @@ library , yesod-core >= 0.7 && < 0.8 , time >= 1.1.4 && < 1.3 , hamlet >= 0.7 && < 0.8 - exposed-modules: Yesod.Helpers.AtomFeed + exposed-modules: Yesod.Helpers.AtomFeed, Yesod.Helpers.RssFeed ghc-options: -Wall source-repository head From 76eabc2969b74fe67e83e291a03446d8abe3b6b7 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Sun, 16 Jan 2011 10:36:18 +0200 Subject: [PATCH 05/18] Get Rss module working with yesod-core 0.7 --- Yesod/Helpers/RssFeed.hs | 20 +++++++++++++++++++- yesod-newsfeed.cabal | 5 +++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Yesod/Helpers/RssFeed.hs b/Yesod/Helpers/RssFeed.hs index 9ad70419..7b6dcba3 100644 --- a/Yesod/Helpers/RssFeed.hs +++ b/Yesod/Helpers/RssFeed.hs @@ -1,4 +1,5 @@ {-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE CPP #-} ------------------------------------------------------------------------------- -- -- Module : Yesod.Helpers.RssFeed @@ -14,10 +15,14 @@ module Yesod.Helpers.RssFeed ( RssFeed (..) , RssFeedEntry (..) , rssFeed + , rssLink , RepRss (..) ) where -import Yesod +import Yesod.Handler +import Yesod.Content +import Yesod.Widget +import Text.Hamlet import System.Locale (defaultTimeLocale) import Data.Time.Clock (UTCTime) import Data.Time.Format (formatTime) @@ -87,3 +92,16 @@ format = formatTime defaultTimeLocale rfc822DateFormat -- validate, this one does. rfc822DateFormat :: String rfc822DateFormat = "%a, %d %b %Y %H:%M:%S %z" + +-- | 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="application/rss+xml"!rel="alternate"!title=$title$ +|] diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal index cd4d67f9..72bab07f 100644 --- a/yesod-newsfeed.cabal +++ b/yesod-newsfeed.cabal @@ -1,8 +1,8 @@ name: yesod-newsfeed -version: 0.7.0.1 +version: 0.0.0 license: BSD3 license-file: LICENSE -author: Michael Snoyman +author: Michael Snoyman, Patrick Brisbin maintainer: Michael Snoyman synopsis: Helper functions and data types for producing Atom feeds. category: Web, Yesod @@ -16,6 +16,7 @@ library , yesod-core >= 0.7 && < 0.8 , time >= 1.1.4 && < 1.3 , hamlet >= 0.7 && < 0.8 + , old-locale >= 1.0 && < 1.1 exposed-modules: Yesod.Helpers.AtomFeed, Yesod.Helpers.RssFeed ghc-options: -Wall From b530166c09577ef70833e5487355676d73d77d1b Mon Sep 17 00:00:00 2001 From: patrick brisbin Date: Sun, 16 Jan 2011 17:57:22 -0500 Subject: [PATCH 06/18] Minor fixes * Added GHC7 checks where missing * used typeRss whenever possible * added formatRFC822 * minor whitespace changes --- Yesod/Helpers/RssFeed.hs | 79 ++++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/Yesod/Helpers/RssFeed.hs b/Yesod/Helpers/RssFeed.hs index 7b6dcba3..aaacdf5c 100644 --- a/Yesod/Helpers/RssFeed.hs +++ b/Yesod/Helpers/RssFeed.hs @@ -23,11 +23,17 @@ import Yesod.Handler import Yesod.Content import Yesod.Widget import Text.Hamlet -import System.Locale (defaultTimeLocale) import Data.Time.Clock (UTCTime) -import Data.Time.Format (formatTime) --- | note: This would normally be added in Yesod.Content +-- | FIXME unneeded if formatRFC822 moves +import Data.Time.Format (formatTime) +import System.Locale (defaultTimeLocale) + +-- | FIXME move this to Yesod.Content +formatRFC822 :: UTCTime -> String +formatRFC822 = formatTime defaultTimeLocale "%a, %d %b %Y %H:%M:%S %z" + +-- | FIXME move this to Yesod.Content typeRss :: ContentType typeRss = "application/rss+xml" @@ -59,39 +65,40 @@ data RssFeedEntry url = RssFeedEntry } template :: RssFeed url -> Hamlet url -template arg = [$xhamlet| -%rss!version="2.0"!xmlns:atom="http://www.w3.org/2005/Atom" +template arg = +#if __GLASGOW_HASKELL__ >= 700 + [xhamlet| +#else + [$xhamlet| +#endif + %rss!version="2.0"!xmlns:atom="http://www.w3.org/2005/Atom" - %channel - %atom:link!href=@rssLinkSelf.arg@!rel="self"!type="application/rss+xml" - %title $rssTitle.arg$ - %link @rssLinkHome.arg@ - %description $rssDescription.arg$ - %lastBuildDate $format.rssUpdated.arg$ - %language $rssLanguage.arg$ + %channel + %atom:link!href=@rssLinkSelf.arg@!rel="self"!type=$typeRss$ + %title $rssTitle.arg$ + %link @rssLinkHome.arg@ + %description $rssDescription.arg$ + %lastBuildDate $formatRFC822.rssUpdated.arg$ + %language $rssLanguage.arg$ - $forall rssEntries.arg entry - ^entryTemplate.entry^ -|] + $forall rssEntries.arg entry + ^entryTemplate.entry^ + |] entryTemplate :: RssFeedEntry url -> Hamlet url -entryTemplate arg = [$xhamlet| -%item - %title $rssEntryTitle.arg$ - %link @rssEntryLink.arg@ - %guid @rssEntryLink.arg@ - %pubDate $format.rssEntryUpdated.arg$ - %description $rssEntryContent.arg$ -|] - --- | Format as string -format :: UTCTime -> String -format = formatTime defaultTimeLocale rfc822DateFormat - --- | System.Local.rfc822DateFormat disagrees with date -R and does not --- validate, this one does. -rfc822DateFormat :: String -rfc822DateFormat = "%a, %d %b %Y %H:%M:%S %z" +entryTemplate arg = +#if __GLASGOW_HASKELL__ >= 700 + [xhamlet| +#else + [$xhamlet| +#endif + %item + %title $rssEntryTitle.arg$ + %link @rssEntryLink.arg@ + %guid @rssEntryLink.arg@ + %pubDate $formatRFC822.rssEntryUpdated.arg$ + %description $rssEntryContent.arg$ + |] -- | Generates a link tag in the head of a widget. rssLink :: Route m @@ -99,9 +106,9 @@ rssLink :: Route m -> GWidget s m () rssLink u title = addHamletHead #if __GLASGOW_HASKELL__ >= 700 - [hamlet| + [hamlet| #else - [$hamlet| + [$hamlet| #endif -%link!href=@u@!type="application/rss+xml"!rel="alternate"!title=$title$ -|] + %link!href=@u@!type=$typeRss$!rel="alternate"!title=$title$ + |] From 8f73e2ab8dfccd337a3116dfcd5575f05355be96 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Mon, 17 Jan 2011 08:18:07 +0200 Subject: [PATCH 07/18] Moved some functions to yesod-core --- Yesod/Helpers/RssFeed.hs | 12 ------------ yesod-newsfeed.cabal | 4 ++-- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/Yesod/Helpers/RssFeed.hs b/Yesod/Helpers/RssFeed.hs index aaacdf5c..d418cae2 100644 --- a/Yesod/Helpers/RssFeed.hs +++ b/Yesod/Helpers/RssFeed.hs @@ -25,18 +25,6 @@ import Yesod.Widget import Text.Hamlet import Data.Time.Clock (UTCTime) --- | FIXME unneeded if formatRFC822 moves -import Data.Time.Format (formatTime) -import System.Locale (defaultTimeLocale) - --- | FIXME move this to Yesod.Content -formatRFC822 :: UTCTime -> String -formatRFC822 = formatTime defaultTimeLocale "%a, %d %b %Y %H:%M:%S %z" - --- | FIXME move this to Yesod.Content -typeRss :: ContentType -typeRss = "application/rss+xml" - newtype RepRss = RepRss Content instance HasReps RepRss where chooseRep (RepRss c) _ = return (typeRss, c) diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal index 72bab07f..8ba2034f 100644 --- a/yesod-newsfeed.cabal +++ b/yesod-newsfeed.cabal @@ -16,8 +16,8 @@ library , yesod-core >= 0.7 && < 0.8 , time >= 1.1.4 && < 1.3 , hamlet >= 0.7 && < 0.8 - , old-locale >= 1.0 && < 1.1 - exposed-modules: Yesod.Helpers.AtomFeed, Yesod.Helpers.RssFeed + exposed-modules: Yesod.Helpers.AtomFeed + , Yesod.Helpers.RssFeed ghc-options: -Wall source-repository head From bc40f628861ab709c696e337cbf45f227ba30cf0 Mon Sep 17 00:00:00 2001 From: patrick brisbin Date: Tue, 18 Jan 2011 10:15:05 -0500 Subject: [PATCH 08/18] Consolidated Rss and Atom Feed types into one --- Yesod/Helpers/AtomFeed.hs | 53 ++++++++++++----------------------- Yesod/Helpers/Feed.hs | 40 ++++++++++++++++++++++++++ Yesod/Helpers/RssFeed.hs | 59 +++++++++++++-------------------------- 3 files changed, 77 insertions(+), 75 deletions(-) create mode 100644 Yesod/Helpers/Feed.hs diff --git a/Yesod/Helpers/AtomFeed.hs b/Yesod/Helpers/AtomFeed.hs index c8136c65..57d2144e 100644 --- a/Yesod/Helpers/AtomFeed.hs +++ b/Yesod/Helpers/AtomFeed.hs @@ -17,42 +17,25 @@ -- | Generation of Atom newsfeeds. See -- . module Yesod.Helpers.AtomFeed - ( AtomFeed (..) - , AtomFeedEntry (..) - , atomFeed + ( atomFeed , atomLink , RepAtom (..) + , module Yesod.Helpers.Feed ) where import Yesod.Content import Yesod.Handler import Yesod.Widget -import Text.Hamlet -import Data.Time.Clock (UTCTime) +import Yesod.Helpers.Feed newtype RepAtom = RepAtom Content instance HasReps RepAtom where 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 -data AtomFeed url = AtomFeed - { 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 :: Feed url -> Hamlet url template arg = #if __GLASGOW_HASKELL__ >= 700 [xhamlet| @@ -61,16 +44,16 @@ template arg = #endif \ %feed!xmlns="http://www.w3.org/2005/Atom" - %title $atomTitle.arg$ - %link!rel=self!href=@atomLinkSelf.arg@ - %link!href=@atomLinkHome.arg@ - %updated $formatW3.atomUpdated.arg$ - %id @atomLinkHome.arg@ - $forall atomEntries.arg entry + %title $feedTitle.arg$ + %link!rel=self!href=@feedLinkSelf.arg@ + %link!href=@feedLinkHome.arg@ + %updated $formatW3.feedUpdated.arg$ + %id @feedLinkHome.arg@ + $forall feedEntries.arg entry ^entryTemplate.entry^ |] -entryTemplate :: AtomFeedEntry url -> Hamlet url +entryTemplate :: FeedEntry url -> Hamlet url entryTemplate arg = #if __GLASGOW_HASKELL__ >= 700 [xhamlet| @@ -78,11 +61,11 @@ entryTemplate arg = [$xhamlet| #endif %entry - %id @atomEntryLink.arg@ - %link!href=@atomEntryLink.arg@ - %updated $formatW3.atomEntryUpdated.arg$ - %title $atomEntryTitle.arg$ - %content!type=html $cdata.atomEntryContent.arg$ + %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. @@ -95,5 +78,5 @@ atomLink u title = addHamletHead #else [$hamlet| #endif -%link!href=@u@!type="application/atom+xml"!rel="alternate"!title=$title$ +%link!href=@u@!type=$typeAtom$!rel="alternate"!title=$title$ |] diff --git a/Yesod/Helpers/Feed.hs b/Yesod/Helpers/Feed.hs new file mode 100644 index 00000000..581b5a04 --- /dev/null +++ b/Yesod/Helpers/Feed.hs @@ -0,0 +1,40 @@ +------------------------------------------------------------------------------- +-- +-- Module : Yesod.Helpers.Feed +-- Copyright : Patrick Brisbin +-- License : as-is +-- +-- Maintainer : Patrick Brisbin +-- 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 + } diff --git a/Yesod/Helpers/RssFeed.hs b/Yesod/Helpers/RssFeed.hs index d418cae2..892546a2 100644 --- a/Yesod/Helpers/RssFeed.hs +++ b/Yesod/Helpers/RssFeed.hs @@ -12,68 +12,47 @@ -- ------------------------------------------------------------------------------- module Yesod.Helpers.RssFeed - ( RssFeed (..) - , RssFeedEntry (..) - , rssFeed + ( rssFeed , rssLink , RepRss (..) + , module Yesod.Helpers.Feed ) where import Yesod.Handler import Yesod.Content import Yesod.Widget -import Text.Hamlet -import Data.Time.Clock (UTCTime) +import Yesod.Helpers.Feed newtype RepRss = RepRss Content instance HasReps RepRss where chooseRep (RepRss c) _ = return (typeRss, c) -- | Generate the feed -rssFeed :: RssFeed (Route master) -> GHandler sub master RepRss +rssFeed :: Feed (Route master) -> GHandler sub master RepRss rssFeed = fmap RepRss . hamletToContent . template --- | Data type for the overall feed -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 :: Feed url -> Hamlet url template arg = #if __GLASGOW_HASKELL__ >= 700 [xhamlet| #else [$xhamlet| #endif - %rss!version="2.0"!xmlns:atom="http://www.w3.org/2005/Atom" + %rss!version="2.0" %channel - %atom:link!href=@rssLinkSelf.arg@!rel="self"!type=$typeRss$ - %title $rssTitle.arg$ - %link @rssLinkHome.arg@ - %description $rssDescription.arg$ - %lastBuildDate $formatRFC822.rssUpdated.arg$ - %language $rssLanguage.arg$ + %atom:link!href=@feedLinkSelf.arg@!rel="self"!type=$typeRss$ + %title $feedTitle.arg$ + %link @feedLinkHome.arg@ + %description $feedDescription.arg$ + %lastBuildDate $formatRFC822.feedUpdated.arg$ + %language $feedLanguage.arg$ - $forall rssEntries.arg entry + $forall feedEntries.arg entry ^entryTemplate.entry^ |] -entryTemplate :: RssFeedEntry url -> Hamlet url +entryTemplate :: FeedEntry url -> Hamlet url entryTemplate arg = #if __GLASGOW_HASKELL__ >= 700 [xhamlet| @@ -81,11 +60,11 @@ entryTemplate arg = [$xhamlet| #endif %item - %title $rssEntryTitle.arg$ - %link @rssEntryLink.arg@ - %guid @rssEntryLink.arg@ - %pubDate $formatRFC822.rssEntryUpdated.arg$ - %description $rssEntryContent.arg$ + %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. From a17df14798764981d27759e591addc7e8f683459 Mon Sep 17 00:00:00 2001 From: patrick brisbin Date: Tue, 18 Jan 2011 10:19:55 -0500 Subject: [PATCH 09/18] cabal file changes --- yesod-newsfeed.cabal | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal index 8ba2034f..5bfb65e3 100644 --- a/yesod-newsfeed.cabal +++ b/yesod-newsfeed.cabal @@ -4,7 +4,7 @@ license: BSD3 license-file: LICENSE author: Michael Snoyman, Patrick Brisbin maintainer: Michael Snoyman -synopsis: Helper functions and data types for producing Atom feeds. +synopsis: Helper functions and data types for producing News feeds. category: Web, Yesod stability: Stable cabal-version: >= 1.6 @@ -18,6 +18,7 @@ library , hamlet >= 0.7 && < 0.8 exposed-modules: Yesod.Helpers.AtomFeed , Yesod.Helpers.RssFeed + , Yesod.Helpers.Feed ghc-options: -Wall source-repository head From be89f673ae3a5788d3d9ec1e187e6c79e0374af4 Mon Sep 17 00:00:00 2001 From: patrick brisbin Date: Tue, 18 Jan 2011 10:40:15 -0500 Subject: [PATCH 10/18] atom namespace is required for self link, which is recommended always --- Yesod/Helpers/RssFeed.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Yesod/Helpers/RssFeed.hs b/Yesod/Helpers/RssFeed.hs index 892546a2..0bf6b5b3 100644 --- a/Yesod/Helpers/RssFeed.hs +++ b/Yesod/Helpers/RssFeed.hs @@ -38,7 +38,8 @@ template arg = #else [$xhamlet| #endif - %rss!version="2.0" + \ + %rss!version="2.0"!xmlns:atom="http://www.w3.org/2005/Atom" %channel %atom:link!href=@feedLinkSelf.arg@!rel="self"!type=$typeRss$ From 45265660f7810e0e3f8d1592447f27a8782d4d28 Mon Sep 17 00:00:00 2001 From: patrick brisbin Date: Tue, 18 Jan 2011 17:41:55 -0500 Subject: [PATCH 11/18] documentation fixes --- Yesod/Helpers/AtomFeed.hs | 3 +-- Yesod/Helpers/Feed.hs | 12 +++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Yesod/Helpers/AtomFeed.hs b/Yesod/Helpers/AtomFeed.hs index 57d2144e..ac559a4c 100644 --- a/Yesod/Helpers/AtomFeed.hs +++ b/Yesod/Helpers/AtomFeed.hs @@ -14,8 +14,7 @@ -- --------------------------------------------------------- --- | Generation of Atom newsfeeds. See --- . +-- | Generation of Atom newsfeeds. module Yesod.Helpers.AtomFeed ( atomFeed , atomLink diff --git a/Yesod/Helpers/Feed.hs b/Yesod/Helpers/Feed.hs index 581b5a04..9057529c 100644 --- a/Yesod/Helpers/Feed.hs +++ b/Yesod/Helpers/Feed.hs @@ -8,9 +8,12 @@ -- Stability : Stable -- Portability : Portable -- --- Generic Feed and Feed Entry data types that can be used as either and +-- 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: +-- Rss spec: +-- ------------------------------------------------------------------------------- module Yesod.Helpers.Feed ( Feed(..) @@ -25,8 +28,15 @@ data Feed url = Feed { feedTitle :: String , feedLinkSelf :: url , feedLinkHome :: url + + + -- | note: currently only used for Rss , feedDescription :: Html + + -- | note: currently only used for Rss, possible values: + -- , feedLanguage :: String + , feedUpdated :: UTCTime , feedEntries :: [FeedEntry url] } From f4817dcfd850839946d2881662d0e1cff37b0818 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Wed, 19 Jan 2011 07:27:08 +0200 Subject: [PATCH 12/18] Removed #sampleFiles --- Yesod/Helpers/Feed.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Yesod/Helpers/Feed.hs b/Yesod/Helpers/Feed.hs index 9057529c..ef1e44dc 100644 --- a/Yesod/Helpers/Feed.hs +++ b/Yesod/Helpers/Feed.hs @@ -12,7 +12,7 @@ -- Rss feed or an Atom feed (or both, or other). -- -- Atom spec: --- Rss spec: +-- Rss spec: -- ------------------------------------------------------------------------------- module Yesod.Helpers.Feed From b246471efbde7b48ad4e2400fa1eacc70f645769 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Thu, 3 Feb 2011 22:10:57 +0200 Subject: [PATCH 13/18] Hamlet 0.7 fixes --- Yesod/Helpers/AtomFeed.hs | 32 +++++++++++++++++--------------- Yesod/Helpers/RssFeed.hs | 37 +++++++++++++++++++------------------ yesod-newsfeed.cabal | 1 + 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/Yesod/Helpers/AtomFeed.hs b/Yesod/Helpers/AtomFeed.hs index ac559a4c..e07a585c 100644 --- a/Yesod/Helpers/AtomFeed.hs +++ b/Yesod/Helpers/AtomFeed.hs @@ -26,6 +26,8 @@ import Yesod.Content import Yesod.Handler import Yesod.Widget import Yesod.Helpers.Feed +import Text.Hamlet (Hamlet, xhamlet, hamlet, cdata) +import qualified Data.ByteString.Char8 as S8 newtype RepAtom = RepAtom Content instance HasReps RepAtom where @@ -42,14 +44,14 @@ template arg = [$xhamlet| #endif \ -%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 feedEntries.arg entry - ^entryTemplate.entry^ +#{feedTitle arg} + #{formatW3 $ feedUpdated arg} + @{feedLinkHome arg} + $forall entry <- feedEntries arg + ^{entryTemplate entry} |] entryTemplate :: FeedEntry url -> Hamlet url @@ -59,12 +61,12 @@ entryTemplate arg = #else [$xhamlet| #endif -%entry - %id @feedEntryLink.arg@ - %link!href=@feedEntryLink.arg@ - %updated $formatW3.feedEntryUpdated.arg$ - %title $feedEntryTitle.arg$ - %content!type=html $cdata.feedEntryContent.arg$ +@{feedEntryLink arg} + #{formatW3 $ feedEntryUpdated arg} + #{feedEntryTitle arg} + <content type=html>#{cdata $ feedEntryContent arg} |] -- | Generates a link tag in the head of a widget. @@ -77,5 +79,5 @@ atomLink u title = addHamletHead #else [$hamlet| #endif -%link!href=@u@!type=$typeAtom$!rel="alternate"!title=$title$ +<link href=@{u} type=#{S8.unpack typeAtom} rel="alternate" title=#{title} |] diff --git a/Yesod/Helpers/RssFeed.hs b/Yesod/Helpers/RssFeed.hs index 0bf6b5b3..90d87122 100644 --- a/Yesod/Helpers/RssFeed.hs +++ b/Yesod/Helpers/RssFeed.hs @@ -22,6 +22,8 @@ import Yesod.Handler import Yesod.Content import Yesod.Widget import Yesod.Helpers.Feed +import Text.Hamlet (Hamlet, xhamlet, hamlet) +import qualified Data.ByteString.Char8 as S8 newtype RepRss = RepRss Content instance HasReps RepRss where @@ -39,18 +41,17 @@ template arg = [$xhamlet| #endif \<?xml version="1.0" encoding="utf-8"?> - %rss!version="2.0"!xmlns:atom="http://www.w3.org/2005/Atom" + <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} - %channel - %atom:link!href=@feedLinkSelf.arg@!rel="self"!type=$typeRss$ - %title $feedTitle.arg$ - %link @feedLinkHome.arg@ - %description $feedDescription.arg$ - %lastBuildDate $formatRFC822.feedUpdated.arg$ - %language $feedLanguage.arg$ - - $forall feedEntries.arg entry - ^entryTemplate.entry^ + $forall entry <- feedEntries arg + ^{entryTemplate entry} |] entryTemplate :: FeedEntry url -> Hamlet url @@ -60,12 +61,12 @@ entryTemplate arg = #else [$xhamlet| #endif - %item - %title $feedEntryTitle.arg$ - %link @feedEntryLink.arg@ - %guid @feedEntryLink.arg@ - %pubDate $formatRFC822.feedEntryUpdated.arg$ - %description $feedEntryContent.arg$ + <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. @@ -78,5 +79,5 @@ rssLink u title = addHamletHead #else [$hamlet| #endif - %link!href=@u@!type=$typeRss$!rel="alternate"!title=$title$ + <link href=@{u} type=#{S8.unpack typeRss} rel="alternate" title=#{title} |] diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal index 5bfb65e3..0e6f68fb 100644 --- a/yesod-newsfeed.cabal +++ b/yesod-newsfeed.cabal @@ -16,6 +16,7 @@ library , yesod-core >= 0.7 && < 0.8 , time >= 1.1.4 && < 1.3 , hamlet >= 0.7 && < 0.8 + , bytestring >= 0.9 && < 0.10 exposed-modules: Yesod.Helpers.AtomFeed , Yesod.Helpers.RssFeed , Yesod.Helpers.Feed From c961daa0997192c24b89405d809a27164a3b8937 Mon Sep 17 00:00:00 2001 From: Michael Snoyman <michael@snoyman.com> Date: Fri, 4 Feb 2011 07:22:41 +0200 Subject: [PATCH 14/18] RepAtomRss --- Yesod/Helpers/AtomFeed.hs | 9 +++---- Yesod/Helpers/Feed.hs | 48 +++++++++++++++----------------------- Yesod/Helpers/FeedTypes.hs | 33 ++++++++++++++++++++++++++ Yesod/Helpers/RssFeed.hs | 9 +++---- yesod-newsfeed.cabal | 1 + 5 files changed, 63 insertions(+), 37 deletions(-) create mode 100644 Yesod/Helpers/FeedTypes.hs diff --git a/Yesod/Helpers/AtomFeed.hs b/Yesod/Helpers/AtomFeed.hs index e07a585c..3ed3a461 100644 --- a/Yesod/Helpers/AtomFeed.hs +++ b/Yesod/Helpers/AtomFeed.hs @@ -19,22 +19,23 @@ module Yesod.Helpers.AtomFeed ( atomFeed , atomLink , RepAtom (..) - , module Yesod.Helpers.Feed + , module Yesod.Helpers.FeedTypes ) where import Yesod.Content import Yesod.Handler import Yesod.Widget -import Yesod.Helpers.Feed +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 :: Feed (Route master) -> GHandler sub master RepAtom -atomFeed = fmap RepAtom . hamletToContent . template +atomFeed :: Monad mo => Feed (Route master) -> GGHandler sub master mo RepAtom +atomFeed = liftM RepAtom . hamletToContent . template template :: Feed url -> Hamlet url template arg = diff --git a/Yesod/Helpers/Feed.hs b/Yesod/Helpers/Feed.hs index ef1e44dc..53725c8f 100644 --- a/Yesod/Helpers/Feed.hs +++ b/Yesod/Helpers/Feed.hs @@ -16,35 +16,25 @@ -- ------------------------------------------------------------------------------- module Yesod.Helpers.Feed - ( Feed(..) - , FeedEntry(..) + ( newsFeed + , RepAtomRss (..) + , module Yesod.Helpers.FeedTypes ) where -import Text.Hamlet (Html) -import Data.Time.Clock (UTCTime) +import Yesod.Helpers.FeedTypes +import Yesod.Helpers.AtomFeed +import Yesod.Helpers.RssFeed +import Yesod.Content (HasReps (chooseRep), typeAtom, typeRss) +import Yesod.Handler (Route, GGHandler) --- | The overal feed -data Feed url = Feed - { feedTitle :: String - , 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 :: String - - , feedUpdated :: UTCTime - , feedEntries :: [FeedEntry url] - } - --- | Each feed entry -data FeedEntry url = FeedEntry - { feedEntryLink :: url - , feedEntryUpdated :: UTCTime - , feedEntryTitle :: String - , feedEntryContent :: Html - } +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 diff --git a/Yesod/Helpers/FeedTypes.hs b/Yesod/Helpers/FeedTypes.hs new file mode 100644 index 00000000..c45c0e1a --- /dev/null +++ b/Yesod/Helpers/FeedTypes.hs @@ -0,0 +1,33 @@ +module Yesod.Helpers.FeedTypes + ( 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 + + + -- | note: currently only used for Rss + , feedDescription :: Html + + -- | note: currently only used for Rss, possible values: + -- <http://www.rssboard.org/rss-language-codes> + , feedLanguage :: String + + , feedUpdated :: UTCTime + , feedEntries :: [FeedEntry url] + } + +-- | Each feed entry +data FeedEntry url = FeedEntry + { feedEntryLink :: url + , feedEntryUpdated :: UTCTime + , feedEntryTitle :: String + , feedEntryContent :: Html + } diff --git a/Yesod/Helpers/RssFeed.hs b/Yesod/Helpers/RssFeed.hs index 90d87122..4556bd26 100644 --- a/Yesod/Helpers/RssFeed.hs +++ b/Yesod/Helpers/RssFeed.hs @@ -15,23 +15,24 @@ module Yesod.Helpers.RssFeed ( rssFeed , rssLink , RepRss (..) - , module Yesod.Helpers.Feed + , module Yesod.Helpers.FeedTypes ) where import Yesod.Handler import Yesod.Content import Yesod.Widget -import Yesod.Helpers.Feed +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 :: Feed (Route master) -> GHandler sub master RepRss -rssFeed = fmap RepRss . hamletToContent . template +rssFeed :: Monad mo => Feed (Route master) -> GGHandler sub master mo RepRss +rssFeed = liftM RepRss . hamletToContent . template template :: Feed url -> Hamlet url template arg = diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal index 0e6f68fb..e80e6e4f 100644 --- a/yesod-newsfeed.cabal +++ b/yesod-newsfeed.cabal @@ -20,6 +20,7 @@ library exposed-modules: Yesod.Helpers.AtomFeed , Yesod.Helpers.RssFeed , Yesod.Helpers.Feed + other-modules: Yesod.Helpers.FeedTypes ghc-options: -Wall source-repository head From 8b82058c4949b5690e912e3d4ea791382c0f98e0 Mon Sep 17 00:00:00 2001 From: Michael Snoyman <michael@snoyman.com> Date: Sun, 10 Apr 2011 21:42:17 +0300 Subject: [PATCH 15/18] Yesod 0.8 --- yesod-newsfeed.cabal | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal index e80e6e4f..37d561f7 100644 --- a/yesod-newsfeed.cabal +++ b/yesod-newsfeed.cabal @@ -1,5 +1,5 @@ name: yesod-newsfeed -version: 0.0.0 +version: 0.1.0 license: BSD3 license-file: LICENSE author: Michael Snoyman, Patrick Brisbin @@ -13,9 +13,9 @@ homepage: http://docs.yesodweb.com/ library build-depends: base >= 4 && < 5 - , yesod-core >= 0.7 && < 0.8 + , yesod-core >= 0.8 && < 0.9 , time >= 1.1.4 && < 1.3 - , hamlet >= 0.7 && < 0.8 + , hamlet >= 0.8 && < 0.9 , bytestring >= 0.9 && < 0.10 exposed-modules: Yesod.Helpers.AtomFeed , Yesod.Helpers.RssFeed From 52441303f4f6f10ff1fc2937fe5cef1de0cecb13 Mon Sep 17 00:00:00 2001 From: Michael Snoyman <michael@snoyman.com> Date: Fri, 15 Apr 2011 11:35:36 +0300 Subject: [PATCH 16/18] Switch to Text --- Yesod/Helpers/FeedTypes.hs | 7 ++++--- yesod-newsfeed.cabal | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Yesod/Helpers/FeedTypes.hs b/Yesod/Helpers/FeedTypes.hs index c45c0e1a..249401e6 100644 --- a/Yesod/Helpers/FeedTypes.hs +++ b/Yesod/Helpers/FeedTypes.hs @@ -5,10 +5,11 @@ module Yesod.Helpers.FeedTypes import Text.Hamlet (Html) import Data.Time.Clock (UTCTime) +import Data.Text (Text) -- | The overal feed data Feed url = Feed - { feedTitle :: String + { feedTitle :: Text , feedLinkSelf :: url , feedLinkHome :: url @@ -18,7 +19,7 @@ data Feed url = Feed -- | note: currently only used for Rss, possible values: -- <http://www.rssboard.org/rss-language-codes> - , feedLanguage :: String + , feedLanguage :: Text , feedUpdated :: UTCTime , feedEntries :: [FeedEntry url] @@ -28,6 +29,6 @@ data Feed url = Feed data FeedEntry url = FeedEntry { feedEntryLink :: url , feedEntryUpdated :: UTCTime - , feedEntryTitle :: String + , feedEntryTitle :: Text , feedEntryContent :: Html } diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal index 37d561f7..479d5e53 100644 --- a/yesod-newsfeed.cabal +++ b/yesod-newsfeed.cabal @@ -17,6 +17,7 @@ library , time >= 1.1.4 && < 1.3 , 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 From f84d26533bfbb90678350f593b8a40e813765a44 Mon Sep 17 00:00:00 2001 From: Michael Snoyman <michael@snoyman.com> Date: Fri, 15 Jul 2011 11:11:12 +0300 Subject: [PATCH 17/18] Remove Helpers --- Yesod/{Helpers => }/AtomFeed.hs | 8 ++++---- Yesod/{Helpers => }/Feed.hs | 12 ++++++------ Yesod/{Helpers => }/FeedTypes.hs | 2 +- Yesod/{Helpers => }/RssFeed.hs | 8 ++++---- yesod-newsfeed.cabal | 10 +++++----- 5 files changed, 20 insertions(+), 20 deletions(-) rename Yesod/{Helpers => }/AtomFeed.hs (93%) rename Yesod/{Helpers => }/Feed.hs (85%) rename Yesod/{Helpers => }/FeedTypes.hs (96%) rename Yesod/{Helpers => }/RssFeed.hs (94%) diff --git a/Yesod/Helpers/AtomFeed.hs b/Yesod/AtomFeed.hs similarity index 93% rename from Yesod/Helpers/AtomFeed.hs rename to Yesod/AtomFeed.hs index 3ed3a461..f3456799 100644 --- a/Yesod/Helpers/AtomFeed.hs +++ b/Yesod/AtomFeed.hs @@ -2,7 +2,7 @@ {-# LANGUAGE CPP #-} --------------------------------------------------------- -- --- Module : Yesod.Helpers.AtomFeed +-- Module : Yesod.AtomFeed -- Copyright : Michael Snoyman -- License : BSD3 -- @@ -15,17 +15,17 @@ --------------------------------------------------------- -- | Generation of Atom newsfeeds. -module Yesod.Helpers.AtomFeed +module Yesod.AtomFeed ( atomFeed , atomLink , RepAtom (..) - , module Yesod.Helpers.FeedTypes + , module Yesod.FeedTypes ) where import Yesod.Content import Yesod.Handler import Yesod.Widget -import Yesod.Helpers.FeedTypes +import Yesod.FeedTypes import Text.Hamlet (Hamlet, xhamlet, hamlet, cdata) import qualified Data.ByteString.Char8 as S8 import Control.Monad (liftM) diff --git a/Yesod/Helpers/Feed.hs b/Yesod/Feed.hs similarity index 85% rename from Yesod/Helpers/Feed.hs rename to Yesod/Feed.hs index 53725c8f..a14d07d0 100644 --- a/Yesod/Helpers/Feed.hs +++ b/Yesod/Feed.hs @@ -1,6 +1,6 @@ ------------------------------------------------------------------------------- -- --- Module : Yesod.Helpers.Feed +-- Module : Yesod.Feed -- Copyright : Patrick Brisbin -- License : as-is -- @@ -15,15 +15,15 @@ -- Rss spec: <http://www.rssboard.org/rss-specification> -- ------------------------------------------------------------------------------- -module Yesod.Helpers.Feed +module Yesod.Feed ( newsFeed , RepAtomRss (..) - , module Yesod.Helpers.FeedTypes + , module Yesod.FeedTypes ) where -import Yesod.Helpers.FeedTypes -import Yesod.Helpers.AtomFeed -import Yesod.Helpers.RssFeed +import Yesod.FeedTypes +import Yesod.AtomFeed +import Yesod.RssFeed import Yesod.Content (HasReps (chooseRep), typeAtom, typeRss) import Yesod.Handler (Route, GGHandler) diff --git a/Yesod/Helpers/FeedTypes.hs b/Yesod/FeedTypes.hs similarity index 96% rename from Yesod/Helpers/FeedTypes.hs rename to Yesod/FeedTypes.hs index 249401e6..2b597094 100644 --- a/Yesod/Helpers/FeedTypes.hs +++ b/Yesod/FeedTypes.hs @@ -1,4 +1,4 @@ -module Yesod.Helpers.FeedTypes +module Yesod.FeedTypes ( Feed (..) , FeedEntry (..) ) where diff --git a/Yesod/Helpers/RssFeed.hs b/Yesod/RssFeed.hs similarity index 94% rename from Yesod/Helpers/RssFeed.hs rename to Yesod/RssFeed.hs index 4556bd26..8900d5ff 100644 --- a/Yesod/Helpers/RssFeed.hs +++ b/Yesod/RssFeed.hs @@ -2,7 +2,7 @@ {-# LANGUAGE CPP #-} ------------------------------------------------------------------------------- -- --- Module : Yesod.Helpers.RssFeed +-- Module : Yesod.RssFeed -- Copyright : Patrick Brisbin -- License : as-is -- @@ -11,17 +11,17 @@ -- Portability : Portable -- ------------------------------------------------------------------------------- -module Yesod.Helpers.RssFeed +module Yesod.RssFeed ( rssFeed , rssLink , RepRss (..) - , module Yesod.Helpers.FeedTypes + , module Yesod.FeedTypes ) where import Yesod.Handler import Yesod.Content import Yesod.Widget -import Yesod.Helpers.FeedTypes +import Yesod.FeedTypes import Text.Hamlet (Hamlet, xhamlet, hamlet) import qualified Data.ByteString.Char8 as S8 import Control.Monad (liftM) diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal index 479d5e53..64cd6f53 100644 --- a/yesod-newsfeed.cabal +++ b/yesod-newsfeed.cabal @@ -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 @@ library , 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 From e68851b9db97519e0cade5dc10bb964c270b4a9a Mon Sep 17 00:00:00 2001 From: Michael Snoyman <michael@snoyman.com> Date: Tue, 19 Jul 2011 09:41:00 +0300 Subject: [PATCH 18/18] yesod 0.9 --- Yesod/AtomFeed.hs | 7 +++++-- yesod-newsfeed.cabal | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Yesod/AtomFeed.hs b/Yesod/AtomFeed.hs index f3456799..b1da99f3 100644 --- a/Yesod/AtomFeed.hs +++ b/Yesod/AtomFeed.hs @@ -26,7 +26,7 @@ import Yesod.Content import Yesod.Handler import Yesod.Widget import Yesod.FeedTypes -import Text.Hamlet (Hamlet, xhamlet, hamlet, cdata) +import Text.Hamlet (Hamlet, xhamlet, hamlet) import qualified Data.ByteString.Char8 as S8 import Control.Monad (liftM) @@ -67,7 +67,10 @@ entryTemplate arg = <link href=@{feedEntryLink arg} <updated>#{formatW3 $ feedEntryUpdated arg} <title>#{feedEntryTitle arg} - <content type=html>#{cdata $ feedEntryContent arg} + <content type=html> + \<![CDATA[ + \#{feedEntryContent arg} + ]]> |] -- | Generates a link tag in the head of a widget. diff --git a/yesod-newsfeed.cabal b/yesod-newsfeed.cabal index 64cd6f53..0adbba0f 100644 --- a/yesod-newsfeed.cabal +++ b/yesod-newsfeed.cabal @@ -1,5 +1,5 @@ name: yesod-newsfeed -version: 0.2.0 +version: 0.3.0 license: BSD3 license-file: LICENSE author: Michael Snoyman, Patrick Brisbin @@ -13,9 +13,9 @@ homepage: http://docs.yesodweb.com/ library build-depends: base >= 4 && < 5 - , yesod-core >= 0.8 && < 0.9 + , yesod-core >= 0.9 && < 0.10 , time >= 1.1.4 && < 1.3 - , hamlet >= 0.8 && < 0.9 + , hamlet >= 0.9 && < 0.10 , bytestring >= 0.9 && < 0.10 , text >= 0.9 && < 1.0 exposed-modules: Yesod.AtomFeed