Merge pull request #1079 from nek0/master
added support for feed logos and item enclosures
This commit is contained in:
commit
c5533f8a6c
@ -0,0 +1,23 @@
|
|||||||
|
#Changelog
|
||||||
|
|
||||||
|
##2015-09-30:
|
||||||
|
|
||||||
|
###Yesod/FeedTypes.hs
|
||||||
|
|
||||||
|
* added `feedLogo` field to `Feed` type as `Maybe (url, Text)`. Should this field result in `Nothing`, nothing will be added to the feed.
|
||||||
|
* `url`: Defines the URL to the logi image
|
||||||
|
* `Text`: Is the description of the logo image. Will only be used for RSS feeds
|
||||||
|
* added `feedEntryEnclosure` field to `FeedEntry` type as `Maybe (url, Int, Text)`. Should this field result in `Nothing`, no data will be added to the feed entry.
|
||||||
|
* `url`: Defines the URL to the enclosed data
|
||||||
|
* `Int`: Is the content size in bytes. RSS requires this.
|
||||||
|
* `Text`: Is the MIME-type of the enclosed file. RSS requires this
|
||||||
|
|
||||||
|
###Yesod/AtomFeed.hs
|
||||||
|
|
||||||
|
* modified `template` function to append an `<logo>url</logo>` tag at the end of the feed, when the provided `feedLogo` is not `Nothing`. This might look awkward, since it will be appended *after* the entries.
|
||||||
|
* modified `entryTemplate` to append an `<link rel="enclosure" href=url>` to the feed entry.
|
||||||
|
|
||||||
|
###Yesod/RssFeed.hs
|
||||||
|
|
||||||
|
* modified `template` function to append an `<image>` tag with its three required components `<url>`, `<title>` and `<link>`. `<url>` and `<title>` will be filled from `feedLogo`, `<link>` will be `feedLinkHome`.
|
||||||
|
* modified `entryTemplate` function to append an `<enclosure type=mime length=length url=url>` to the feed entry
|
||||||
@ -70,15 +70,23 @@ template Feed {..} render =
|
|||||||
: Element "id" Map.empty [NodeContent $ render feedLinkHome]
|
: Element "id" Map.empty [NodeContent $ render feedLinkHome]
|
||||||
: Element "author" Map.empty [NodeElement $ Element "name" Map.empty [NodeContent feedAuthor]]
|
: Element "author" Map.empty [NodeElement $ Element "name" Map.empty [NodeContent feedAuthor]]
|
||||||
: map (flip entryTemplate render) feedEntries
|
: map (flip entryTemplate render) feedEntries
|
||||||
|
++
|
||||||
|
case feedLogo of
|
||||||
|
Nothing -> []
|
||||||
|
Just (route, _) -> [Element "logo" Map.empty [NodeContent $ render route]]
|
||||||
|
|
||||||
entryTemplate :: FeedEntry url -> (url -> Text) -> Element
|
entryTemplate :: FeedEntry url -> (url -> Text) -> Element
|
||||||
entryTemplate FeedEntry {..} render = Element "entry" Map.empty $ map NodeElement
|
entryTemplate FeedEntry {..} render = Element "entry" Map.empty $ map NodeElement $
|
||||||
[ Element "id" Map.empty [NodeContent $ render feedEntryLink]
|
[ Element "id" Map.empty [NodeContent $ render feedEntryLink]
|
||||||
, Element "link" (Map.singleton "href" $ render feedEntryLink) []
|
, Element "link" (Map.singleton "href" $ render feedEntryLink) []
|
||||||
, Element "updated" Map.empty [NodeContent $ formatW3 feedEntryUpdated]
|
, Element "updated" Map.empty [NodeContent $ formatW3 feedEntryUpdated]
|
||||||
, Element "title" Map.empty [NodeContent feedEntryTitle]
|
, Element "title" Map.empty [NodeContent feedEntryTitle]
|
||||||
, Element "content" (Map.singleton "type" "html") [NodeContent $ toStrict $ renderHtml feedEntryContent]
|
, Element "content" (Map.singleton "type" "html") [NodeContent $ toStrict $ renderHtml feedEntryContent]
|
||||||
]
|
]
|
||||||
|
++
|
||||||
|
case feedEntryEnclosure of
|
||||||
|
Nothing -> []
|
||||||
|
Just (route, _, _) -> [Element "link" (Map.fromList [("rel", "enclosure"), ("href", render route)]) []]
|
||||||
|
|
||||||
-- | Generates a link tag in the head of a widget.
|
-- | Generates a link tag in the head of a widget.
|
||||||
atomLink :: MonadWidget m
|
atomLink :: MonadWidget m
|
||||||
|
|||||||
@ -23,6 +23,7 @@ data Feed url = Feed
|
|||||||
, feedLanguage :: Text
|
, feedLanguage :: Text
|
||||||
|
|
||||||
, feedUpdated :: UTCTime
|
, feedUpdated :: UTCTime
|
||||||
|
, feedLogo :: Maybe (url, Text)
|
||||||
, feedEntries :: [FeedEntry url]
|
, feedEntries :: [FeedEntry url]
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,4 +33,5 @@ data FeedEntry url = FeedEntry
|
|||||||
, feedEntryUpdated :: UTCTime
|
, feedEntryUpdated :: UTCTime
|
||||||
, feedEntryTitle :: Text
|
, feedEntryTitle :: Text
|
||||||
, feedEntryContent :: Html
|
, feedEntryContent :: Html
|
||||||
|
, feedEntryEnclosure :: Maybe (url, Int, Text)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,15 +66,28 @@ template Feed {..} render =
|
|||||||
: Element "lastBuildDate" Map.empty [NodeContent $ formatRFC822 feedUpdated]
|
: Element "lastBuildDate" Map.empty [NodeContent $ formatRFC822 feedUpdated]
|
||||||
: Element "language" Map.empty [NodeContent feedLanguage]
|
: Element "language" Map.empty [NodeContent feedLanguage]
|
||||||
: map (flip entryTemplate render) feedEntries
|
: map (flip entryTemplate render) feedEntries
|
||||||
|
++
|
||||||
|
case feedLogo of
|
||||||
|
Nothing -> []
|
||||||
|
Just (route, desc) -> [Element "image" Map.empty
|
||||||
|
[ NodeElement $ Element "url" Map.empty [NodeContent $ render route]
|
||||||
|
, NodeElement $ Element "title" Map.empty [NodeContent desc]
|
||||||
|
, NodeElement $ Element "link" Map.empty [NodeContent $ render feedLinkHome]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
entryTemplate :: FeedEntry url -> (url -> Text) -> Element
|
entryTemplate :: FeedEntry url -> (url -> Text) -> Element
|
||||||
entryTemplate FeedEntry {..} render = Element "item" Map.empty $ map NodeElement
|
entryTemplate FeedEntry {..} render = Element "item" Map.empty $ map NodeElement $
|
||||||
[ Element "title" Map.empty [NodeContent feedEntryTitle]
|
[ Element "title" Map.empty [NodeContent feedEntryTitle]
|
||||||
, Element "link" Map.empty [NodeContent $ render feedEntryLink]
|
, Element "link" Map.empty [NodeContent $ render feedEntryLink]
|
||||||
, Element "guid" Map.empty [NodeContent $ render feedEntryLink]
|
, Element "guid" Map.empty [NodeContent $ render feedEntryLink]
|
||||||
, Element "pubDate" Map.empty [NodeContent $ formatRFC822 feedEntryUpdated]
|
, Element "pubDate" Map.empty [NodeContent $ formatRFC822 feedEntryUpdated]
|
||||||
, Element "description" Map.empty [NodeContent $ toStrict $ renderHtml feedEntryContent]
|
, Element "description" Map.empty [NodeContent $ toStrict $ renderHtml feedEntryContent]
|
||||||
]
|
]
|
||||||
|
++
|
||||||
|
case feedEntryEnclosure of
|
||||||
|
Nothing -> []
|
||||||
|
Just (route, length, mime) -> [Element "enclosure" (Map.fromList [("type", mime), ("length", pack $ show length), ("url", render route)]) []]
|
||||||
|
|
||||||
-- | Generates a link tag in the head of a widget.
|
-- | Generates a link tag in the head of a widget.
|
||||||
rssLink :: MonadWidget m
|
rssLink :: MonadWidget m
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user