You might like to use the following LUA script so that the BBC News and Guardian World News feeds are sorted to show the most recent entry at the top of the list in your FeedReader skin. I've cut out the 'bulleting' of new items so that you won't have to make any changes to the FeedReader.ini file.
Code: Select all
PROPERTIES = {
FeedMeasureName = '';
MultipleFeeds = 0;
VariablePrefix = '';
MinItems = 0;
FinishAction = '';
}
-- When Rainmeter supports escape characters for bangs, use this function to escape quotes.
function ParseSpecialCharacters(sString)
sString = string.gsub(sString, ' ', ' ')
sString = string.gsub(sString, '\"', '')
return sString
end
function Initialize()
sFeedMeasureName = PROPERTIES.FeedMeasureName
iMultipleFeeds = tonumber(PROPERTIES.MultipleFeeds)
sVariablePrefix = PROPERTIES.VariablePrefix
iMinItems = tonumber(PROPERTIES.MinItems)
sFinishAction = PROPERTIES.FinishAction
tFeeds = {}
tTitles = {}
tLinks = {}
tDates = {}
tmText = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
tmNum = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}
end
function Update()
-----------------------------------------------------------------------
-- INPUT FEEDS
if iMultipleFeeds == 1 then
iNumberOfFeeds = tonumber(SKIN:GetVariable(sVariablePrefix..'NumberOfFeeds'))
for i = 1, iNumberOfFeeds do
tFeeds[i] = SKIN:GetVariable(sVariablePrefix..'FeedMeasureName'..i)
end
iCurrentFeed = tonumber(SKIN:GetVariable(sVariablePrefix..'CurrentFeed'))
msRaw = SKIN:GetMeasure(tFeeds[iCurrentFeed])
else
msRaw = SKIN:GetMeasure(sFeedMeasureName)
end
sRaw = msRaw:GetStringValue()
-----------------------------------------------------------------------
-- DETERMINE FEED FORMAT AND CONTENTS
sPatternFeedTitle = '.-<title.->(.-)</title>'
sPatternItemTitle = '.-<title.->(.-)</title>'
if string.match(sRaw, 'xmlns:gCal') then
sRawCounted, iNumberOfItems = string.gsub(sRaw, '<entry', "")
sPatternFeedLink = '.-<link.-rel=.-alternate.-href=\'(.-)\''
sPatternItem = '<entry.-</entry>'
sPatternItemLink = '.-<link.-href=\'(.-)\''
sPatternItemDate = '.-When: (.-)<'
elseif string.match(sRaw, '<subtitle>rememberthemilk.com</subtitle>') then
sRawCounted, iNumberOfItems = string.gsub(sRaw, '<entry', "")
sPatternFeedLink = '.-<link.-rel=.-alternate.-href="(.-)"'
sPatternItem = '<entry.-</entry>'
sPatternItemLink = '.-<link.-href="(.-)"'
sPatternItemDate = '<span class="rtm_due_value">(.-)</span>'
elseif string.match(sRaw, '<rss.-version=".-".->') then
sRawCounted, iNumberOfItems = string.gsub(sRaw, '<item', "")
sPatternFeedLink = '.-<link.->(.-)</link>'
sPatternItem = '<item.-</item>'
sPatternItemLink = '.-<link.->(.-)</link>'
sPatternItemDesc = '.-<description.->(.-)</description>'
sPatternItemDate = '.-<pubDate.->(.-)</pubDate>'
else
sRawCounted, iNumberOfItems = string.gsub(sRaw, '<entry', "")
sPatternFeedLink = '.-<link.-href="(.-)"'
sPatternItem = '<entry.-</entry>'
sPatternItemLink = '.-<link.-href="(.-)"'
sPatternItemDesc = '.-<summary.->(.-)</summary>'
sPatternItemDate = '.-<updated.->(.-)</updated>'
end
-----------------------------------------------------------------------
-- ERRORS
sFeedTitle, sFeedLink = string.match(sRaw, sPatternFeedTitle..sPatternFeedLink)
if not sFeedTitle then
FeedError('Error', '', 'Connection or matching error.')
return 'Error: matching.'
end
sFeedTitle = ParseSpecialCharacters(sFeedTitle)
sFeedLink = ParseSpecialCharacters(sFeedLink)
if iNumberOfItems == 0 then
SKIN:Bang('!SetVariable "'..sVariablePrefix..'NumberOfItems" "0"')
SKIN:Bang('!SetVariable "'..sVariablePrefix..'FeedTitle" "'..sFeedTitle..'"')
SKIN:Bang('!SetVariable "'..sVariablePrefix..'FeedLink" "'..sFeedLink..'"')
FeedError(sFeedTitle, '', 'Empty.')
return 'Error: empty feed.'
end
-----------------------------------------------------------------------
-- CREATE DATABASE
local tItems = {}
iInit = 0
for i = 1, iNumberOfItems do
iItemStart, iItemEnd = string.find(sRaw, sPatternItem, iInit)
sItem = string.sub(sRaw, iItemStart, iItemEnd)
tTitles[i] = string.match(sItem, sPatternItemTitle)
tTitles[i] = ParseSpecialCharacters(tTitles[i])
tLinks[i] = string.match(sItem, sPatternItemLink)
tLinks[i] = ParseSpecialCharacters(tLinks[i])
tDates[i] = string.match(sItem, sPatternItemDate)
tDates[i] = ParseSpecialCharacters(tDates[i])
for j = 1, 12 do tDates[i] = string.gsub(tDates[i], tmText[j] , tmNum[j] ) end
tDates[i] = string.sub(tDates[i], 12, 15)..string.sub(tDates[i], 9, 10)..string.sub(tDates[i],6, 7)..string.sub(tDates[i],17, 18)..string.sub(tDates[i],20,21)..string.sub(tDates[i],23,24)
iInit = iItemEnd + 1
table.insert(tItems, { iTitle = tTitles[i], iLinks = tLinks[i], iPub = tDates[i] } )
end
-----------------------------------------------------------------------
-- SORT DATABASE BY PUB DATE -- needed for BBC and Guardian feeds
tPubDate_idx = {}
for k, v in pairs(tItems) do
tPubDate_idx[ v.iPub ] = k
end
tPubDate_Array = {}
for k, v in pairs(tPubDate_idx) do
table.insert(tPubDate_Array, k)
end
table.sort(tPubDate_Array, function(a,b) return a > b end)
-----------------------------------------------------------------------
-- OUTPUT
SKIN:Bang('!SetVariable "'..sVariablePrefix..'NumberOfItems" "'..iNumberOfItems..'"')
SKIN:Bang('!SetOption "'..sVariablePrefix..'FeedTitle" "Text" "'..sFeedTitle..'"')
SKIN:Bang('!SetOption "'..sVariablePrefix..'FeedTitle" "LeftMouseUpAction" "'..sFeedLink..'"')
SKIN:Bang('!SetOption "'..sVariablePrefix..'FeedTitle" "ToolTipText" "'..sFeedLink..'"')
for i, v in ipairs(tPubDate_Array) do
iRecnum = tPubDate_idx[v]
Record = tItems[iRecnum]
SKIN:Bang('!SetOption "'..sVariablePrefix..'FeedItem'..i..'" "Text" "'..Record.iTitle..'"')
SKIN:Bang('!SetOption "'..sVariablePrefix..'FeedItem'..i..'" "LeftMouseUpAction" "'..Record.iLinks..'"')
SKIN:Bang('!SetOption "'..sVariablePrefix..'FeedItem'..i..'" "ToolTipText" "'..Record.iLinks..'"')
end
-----------------------------------------------------------------------
-- FINISH ACTION
if sFinishAction ~= '' then
SKIN:Bang(sFinishAction)
end
return 'Success'
end
---------------------------------------------------------------------
-- SWITCHERS
function TimedUpdate(a)
tPastUpdate[a] = tPresentUpdate[a]
Update()
end
function SwitchToNext()
iCurrentFeed = iCurrentFeed % iNumberOfFeeds + 1
SKIN:Bang('!SetVariable "'..sVariablePrefix..'CurrentFeed" "'..iCurrentFeed..'"')
Update()
end
function SwitchToPrevious()
iCurrentFeed = iCurrentFeed - 1 + (iCurrentFeed == 1 and iNumberOfFeeds or 0)
SKIN:Bang('!SetVariable "'..sVariablePrefix..'CurrentFeed" "'..iCurrentFeed..'"')
Update()
end
function FeedError(sErrorName, sErrorLink, sErrorDesc)
SKIN:Bang('!SetOption "'..sVariablePrefix..'FeedTitle" "Text" "'..sErrorName..'"')
SKIN:Bang('!SetOption "'..sVariablePrefix..'FeedTitle" "LeftMouseUpAction" "'..sErrorLink..'"')
SKIN:Bang('!SetOption "'..sVariablePrefix..'FeedTitle" "ToolTipText" "'..sErrorLink..'"')
SKIN:Bang('!SetOption "'..sVariablePrefix..'FeedItem1" "Text" "'..sErrorDesc..'"')
end