Comparison

mod_pubsub_feeds/feeds.lib.lua @ 2132:b149ea428b81

mod_pubsub_feeds: Switch to use util.xml for parsing feeds and include RSS to Atom translation code from lua-feeds
author Kim Alvefur <zash@zash.se>
date Sun, 20 Mar 2016 12:32:45 +0100
child 2133:85762420a2c0
comparison
equal deleted inserted replaced
2131:ba42c8882026 2132:b149ea428b81
1 local st = require "util.stanza";
2 -- RSS->Atom translator
3 -- http://code.matthewwild.co.uk/lua-feeds/
4
5 -- Helpers to translate item child elements
6 local rss2atom = {};
7 function rss2atom.title(atom_entry, tag)
8 atom_entry:tag("title"):text(tag:get_text()):up();
9 end
10
11 function rss2atom.link(atom_entry, tag)
12 atom_entry:tag("link", { href = tag:get_text() }):up();
13 end
14
15 function rss2atom.author(atom_entry, tag)
16 atom_entry:tag("author")
17 :tag("email"):text(tag:get_text()):up()
18 :up();
19 end
20
21 function rss2atom.guid(atom_entry, tag)
22 atom_entry:tag("id"):text(tag:get_text()):up();
23 end
24
25 function rss2atom.category(atom_entry, tag)
26 atom_entry:tag("category", { term = tag:get_text(), scheme = tag.attr.domain }):up();
27 end
28
29 function rss2atom.description(atom_entry, tag)
30 atom_entry:tag("summary"):text(tag:get_text()):up();
31 end
32
33 local months = {
34 jan = "01", feb = "02", mar = "03", apr = "04", may = "05", jun = "06";
35 jul = "07", aug = "08", sep = "09", oct = "10", nov = "11", dec = "12";
36 };
37
38 function rss2atom.pubDate(atom_entry, tag)
39 local pubdate = tag:get_text():gsub("^%a+,", ""):gsub("^%s*", "");
40 local date, month, year, hour, minute, second, zone =
41 pubdate:match("^(%d%d?) (%a+) (%d+) (%d+):(%d+):?(%d*) ?(.*)$");
42 if not date then return; end
43 if #date == 1 then
44 date = "0"..date;
45 end
46 month = months[month:sub(1,3):lower()];
47 if #year == 2 then -- GAH!
48 if tonumber(year) > 80 then
49 year = "19"..year;
50 else
51 year = "20"..year;
52 end
53 end
54 if zone == "UT" or zone == "GMT" then zone = "Z"; end
55 if #second == 0 then
56 second = "00";
57 end
58 local date_string = string.format("%s-%s-%sT%s:%s:%s%s", year, month, date, hour, minute, second, zone);
59 atom_entry:tag("published"):text(date_string):up();
60 end
61
62 -- Translate a single item to atom
63 local function translate_rss(rss_feed)
64 local feed = st.stanza("feed", { xmlns = "http://www.w3.org/2005/Atom" });
65 local channel = rss_feed:get_child("channel");
66 -- TODO channel properties
67 feed:tag("entry");
68 for item in channel:childtags("item") do
69 for tag in rss_item:childtags() do
70 local translator = rss2atom[tag.name];
71 if translator then
72 translator(feed, tag);
73 end
74 end
75 end
76 feed:reset();
77 return feed;
78 end
79
80 return { translate_rss = translate_rss }