Software /
code /
prosody-modules
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 } |