add support for RSS categories
This commit is contained in:
parent
2a71af250f
commit
a0d35dfe4c
@ -74,6 +74,15 @@ template Feed {..} render =
|
||||
Nothing -> []
|
||||
Just (route, _) -> [Element "logo" Map.empty [NodeContent $ render route]]
|
||||
|
||||
entryCategoryTemplate :: EntryCategory -> Element
|
||||
entryCategoryTemplate (EntryCategory mdomain mlabel category) =
|
||||
Element "category" (Map.fromList ([("term",category)]
|
||||
++ (maybe [] (\d -> [("scheme",d)]) mdomain)
|
||||
++ (maybe [] (\l -> [("label",l)]) mlabel)
|
||||
)
|
||||
|
||||
) []
|
||||
|
||||
entryTemplate :: FeedEntry url -> (url -> Text) -> Element
|
||||
entryTemplate FeedEntry {..} render = Element "entry" Map.empty $ map NodeElement $
|
||||
[ Element "id" Map.empty [NodeContent $ render feedEntryLink]
|
||||
@ -82,6 +91,7 @@ entryTemplate FeedEntry {..} render = Element "entry" Map.empty $ map NodeElemen
|
||||
, Element "title" Map.empty [NodeContent feedEntryTitle]
|
||||
, Element "content" (Map.singleton "type" "html") [NodeContent $ toStrict $ renderHtml feedEntryContent]
|
||||
]
|
||||
++ map entryCategoryTemplate feedEntryCategories
|
||||
++
|
||||
case feedEntryEnclosure of
|
||||
Nothing -> []
|
||||
|
||||
@ -2,6 +2,7 @@ module Yesod.FeedTypes
|
||||
( Feed (..)
|
||||
, FeedEntry (..)
|
||||
, EntryEnclosure (..)
|
||||
, EntryCategory (..)
|
||||
) where
|
||||
|
||||
import Text.Hamlet (Html)
|
||||
@ -40,6 +41,18 @@ data EntryEnclosure url = EntryEnclosure
|
||||
, enclosedMimeType :: Text
|
||||
}
|
||||
|
||||
-- | RSS 2.0 and Atom allow category in a feed entry.
|
||||
-- See http://www.rssboard.org/rss-specification#ltcategorygtSubelementOfLtitemgt
|
||||
--
|
||||
-- RSS feeds ignore 'categoryLabel'
|
||||
--
|
||||
-- @since 1.7
|
||||
data EntryCategory = EntryCategory
|
||||
{ categoryDomain :: Maybe Text -- ^ category identifier
|
||||
, categoryLabel :: Maybe Text -- ^ Human-readable label Atom only
|
||||
, categoryValue :: Text -- ^ identified categorization scheme via URI
|
||||
}
|
||||
|
||||
-- | Each feed entry
|
||||
data FeedEntry url = FeedEntry
|
||||
{ feedEntryLink :: url
|
||||
@ -51,4 +64,5 @@ data FeedEntry url = FeedEntry
|
||||
-- rel=enclosure>
|
||||
--
|
||||
-- @since 1.5
|
||||
, feedEntryCategories :: [EntryCategory]
|
||||
}
|
||||
|
||||
@ -75,6 +75,7 @@ template Feed {..} render =
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
entryTemplate :: FeedEntry url -> (url -> Text) -> Element
|
||||
entryTemplate FeedEntry {..} render = Element "item" Map.empty $ map NodeElement $
|
||||
[ Element "title" Map.empty [NodeContent feedEntryTitle]
|
||||
@ -83,6 +84,7 @@ entryTemplate FeedEntry {..} render = Element "item" Map.empty $ map NodeElement
|
||||
, Element "pubDate" Map.empty [NodeContent $ formatRFC822 feedEntryUpdated]
|
||||
, Element "description" Map.empty [NodeContent $ toStrict $ renderHtml feedEntryContent]
|
||||
]
|
||||
++ map entryCategoryTemplate feedEntryCategories
|
||||
++
|
||||
case feedEntryEnclosure of
|
||||
Nothing -> []
|
||||
@ -92,6 +94,11 @@ entryTemplate FeedEntry {..} render = Element "item" Map.empty $ map NodeElement
|
||||
,("length", pack $ show enclosedSize)
|
||||
,("url", render enclosedUrl)]) []]
|
||||
|
||||
entryCategoryTemplate :: EntryCategory -> Element
|
||||
entryCategoryTemplate (EntryCategory mdomain _ category) =
|
||||
Element "category" prop [NodeContent category]
|
||||
where prop = maybe Map.empty (\domain -> Map.fromList [("domain",domain)]) mdomain
|
||||
|
||||
-- | Generates a link tag in the head of a widget.
|
||||
rssLink :: MonadWidget m
|
||||
=> Route (HandlerSite m)
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
name: yesod-newsfeed
|
||||
version: 1.6.1.0
|
||||
version: 1.7.0.0
|
||||
license: MIT
|
||||
license-file: LICENSE
|
||||
author: Michael Snoyman, Patrick Brisbin
|
||||
|
||||
Loading…
Reference in New Issue
Block a user