aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Conway <john.a.conway@gmail.com>2019-05-17 15:36:59 +0100
committerJohn Conway <john.a.conway@gmail.com>2019-05-17 15:36:59 +0100
commite6affb91d689161971d73a70f22400e32a14324a (patch)
tree0621b1fa4c8a37ec5579514aaef2925c6a8f5ea1 /src
parent289cd01606adcdf4803307c8fc761c7bdc5a84f7 (diff)
downloadfeed-nim-e6affb91d689161971d73a70f22400e32a14324a.tar.gz
feed-nim-e6affb91d689161971d73a70f22400e32a14324a.zip
Pack structure (capitalised FeedNim)
Diffstat (limited to 'src')
-rw-r--r--src/FeedNim/wrangler.nim85
-rw-r--r--src/feednim/atom.nim4
-rw-r--r--src/feednim/jsonfeed.nim2
3 files changed, 88 insertions, 3 deletions
diff --git a/src/FeedNim/wrangler.nim b/src/FeedNim/wrangler.nim
new file mode 100644
index 0000000..2afc99c
--- /dev/null
+++ b/src/FeedNim/wrangler.nim
@@ -0,0 +1,85 @@
+import
+ strUtils
+
+import
+ atom,
+ jsonfeed,
+ rss
+
+type
+ Feed = ref object of JSONFeed
+
+func wrangleAtomItems( xml_feed:( Atom | Rss ) ):seq[JsonFeedItem] =
+ var items: seq[JsonFeedItem] = @[]
+ for atom_item in xml_feed.entries:
+
+ var item = JsonFeedItem()
+
+ item.author.name = atom_item.author.name
+ item.author.url = atom_item.author.uri
+ item.title = atom_item.title
+
+ if atom_item.content == "":
+ item.content_text = atom_item.summary
+ else:
+ if atom_item.content.textType == "html" or atom_item.content.textType == "xhtml":
+ item.content_html = atom_item.content
+ else: item.content_text = atom_item.content
+
+ item.date_published = atom_item.published
+ item.date_modified = atom_item.updated
+
+ for category in atom_item.categories:
+ item.tags.add( category.term )
+
+ item.attachments[0].url = atom_item.link.href
+ item.attachments[0].mime_type = atom_item.link.linktype # WONT WORK!
+ item.attachments[0].title = atom_item.link.title
+ item.attachments[0].size_in_bytes = atom_item.link.length
+
+ items.add( item )
+
+ return items
+
+func wrangleAtom( xml_feed: Atom ): Feed =
+ var feed = Feed()
+
+ feed.author.name = xml_feed.author.name
+ feed.author.url = xml_feed.author.uri
+ feed.author.avatar = xml_feed.icon # Munged!
+ feed.title = xml_feed.title
+ feed.home_page_url = xml_feed.link.href # MAYBE NOT
+ feed.feed_url = xml_feed.link.href
+ feed.description = xml_feed.subtitle
+ feed.icon = xml_feed.icon
+ feed.favicon = xml_feed.icon
+ feed.items = xml_feed.wrangleAtomItems()
+
+ return feed
+
+func wrangleRss( xml_feed: Rss ): Feed =
+ var feed = Feed()
+
+ func rssAuthor( feild:string ): JSONFeedAuthor =
+ var author = JSONFeedAuthor()
+ var name = feild.split(" ")[1] # RSS author feilds look like this remember:
+ if name.len > 3: # <element>joe@bloggs.com (Joe Bloggs)</element>
+ author.name = name.substr[1 .. name.len()-2]
+ return author
+
+ feed.author = rssAuthor( xml_feed.managingEditor ) # Munged!
+ feed.title = xml_feed.title
+ feed.home_page_url = xml_feed.link.link # MAYBE NOT
+ feed.feed_url = xml_feed.link.href
+ feed.description = xml_feed.description
+ feed.icon = xml_feed.image.url # Munged!
+ feed.items = xml_feed.wrangleAtomItems()
+
+ return feed
+
+
+proc wrangle*( xml_feed:( Atom | Rss ) ):Feed =
+ if xml_feed.kind == Atom:
+ return wrangleAtom( xml_feed )
+ elif xml_feed.kind == Rss:
+ return wrangleRss( xml_feed ) \ No newline at end of file
diff --git a/src/feednim/atom.nim b/src/feednim/atom.nim
index bbdcbe9..ee60672 100644
--- a/src/feednim/atom.nim
+++ b/src/feednim/atom.nim
@@ -58,7 +58,7 @@ type
linktype*: string
hreflang*: string
title*: string
- length*: string
+ length*: int
AtomEntry* = ref object of AtomCommon
id*: string # Required Atom field
@@ -137,7 +137,7 @@ func parseLink ( node: XmlNode ): AtomLink =
if node.attr("type") != "": link.linktype = node.attr("type")
if node.attr("hreflang") != "": link.hreflang = node.attr("hreflang")
if node.attr("title") != "": link.title = node.attr("title")
- if node.attr("length") != "": link.length = node.attr("length")
+ if node.attr("length") != "": link.length = node.attr("length").parseInt()
return link
func parseText ( node: XmlNode ): string =
diff --git a/src/feednim/jsonfeed.nim b/src/feednim/jsonfeed.nim
index e6562a2..e523778 100644
--- a/src/feednim/jsonfeed.nim
+++ b/src/feednim/jsonfeed.nim
@@ -10,7 +10,7 @@ import streams
import sugar
type
- JSONFeed* = object
+ JSONFeed* = ref object of RootObj
author*: JSONFeedAuthor
version*: string
title*: string