contrib: Imported the rss widget, by olcc

It is a bit different from the overall vicious design, for now it is
in the contrib branch. We just gained some exposure and I expect more
people to send me stuff like this. It is still unclear weather vicious
will depend on third party libs (in which case we take an XML
parser). If not, maybe we will have a very basic html/xml parser as a
helper, or maybe neither and this widget will be introduced to master
(with a few more improvements I hope). It is too early to say, we just
got some users.
This commit is contained in:
Adrian C. (anrxc) 2009-09-28 20:39:49 +02:00
parent 338a2ee952
commit 42269dcb99
1 changed files with 64 additions and 0 deletions

64
rss.lua Normal file
View File

@ -0,0 +1,64 @@
----------------------------------------------------------
-- Licensed under the GNU General Public License version 2
-- * Copyright (C) 2009 olcc
----------------------------------------------------------
-- {{{ Grab environment
local pairs = pairs
local io = { popen = io.popen }
local setmetatable = setmetatable
-- }}}
-- RSS: provides latest world news
module("vicious.rss")
-- {{{ RSS widget type
local function worker(format, input)
-- input: * feed - feed url
-- * object - entity to look for (typically: 'item')
-- * fields - fields to read (example: 'link', 'title', 'description')
-- output: * count - number of entities found
-- * one table for each field, containing wanted values
local feed = input.feed
local object = input.object
local fields = input.fields
-- Initialise tables
local out = {}
for _, v in pairs(fields) do
out[v] = {}
end
-- Initialise variables
local ob = nil
local i,j,k = 1, 1, 0
local curl = "curl -A 'Mozilla/4.0' -fsm 5 --connect-timeout 3 "
-- Get the feed
local f = io.popen(curl .. '"' .. feed .. '"')
local feed = f:read("*all")
f:close()
while true do
i, j, ob = feed.find(feed, "<" .. object .. ">(.-)</" .. object .. ">", i)
if not ob then break end
for _, v in pairs(fields) do
out[v][k] = ob:match("<" .. v .. ">(.*)</" .. v .. ">")
end
k = k+1
i = j+1
end
-- Update the entity count
out.count = k
return out
end
-- }}}
setmetatable(_M, { __call = function(_, ...) return worker(...) end })