Module:Selected current events
Appearance
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
Usage
{{#invoke:Selected current events|main}}
Arguments come from the parent template {{Transclude selected current events}}; see documentation there for details.
See also
function cleanupArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
cleanArgs[key] = val
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
function makeOutput(allItems, maxItems)
local output = ''
local itemIndex = 1
local maxCount = math.min(#allItems, maxItems)
while itemIndex <= maxCount do
output = output .. allItems[itemIndex] .. '\n'
itemIndex = itemIndex + 1
end
return mw.text.trim(output)
end
-- Get current events for a "YYYY Month D" date. Returns a table of list items.
function getCurrentEvents(date, mdyDates, keepPatterns, skipPatterns)
local title = mw.title.new("Portal:Current events/" .. date)
local raw = title:getContent()
local lines = mw.text.split( raw , '\n')
local items = {}
local formattedDate
if mdyDates then
formattedDate = string.gsub(date, "(.*) (.*) (.*)", "%2 %3, %1 – ")
else
formattedDate = string.gsub(date, "(.*) (.*) (.*)", "%3 %2 %1 – ")
end
for i, v in ipairs(lines) do
local keep = false
local skip = false
if string.sub( v, 0, 2 ) == '**' then
local text = mw.ustring.gsub(v, "%[%[(.-)%]%]","%1") -- remove wikilink brackets for better pattern matching
text = mw.ustring.gsub(text, "%|"," ") -- remove pipes that would have been in piped links
text = mw.ustring.gsub(text, "%[.-%]"," ") -- remove external links
for ii, keepPatt in pairs(keepPatterns) do
if not keep and mw.ustring.find(text, keepPatt) then
keep = true
end
end
if #skipPatterns > 0 then
for iii, skipPatt in pairs(skipPatterns) do
if not skip and mw.ustring.find(text, skipPatt) then
skip = true
end
end
end
end
if keep and not skip then
local item = mw.ustring.gsub(v, "%*+","*"..formattedDate)
table.insert(items, item)
end
end
return items
end
function getItems(maxDays, mdyDates, patterns, skipPatterns)
local allItems = {}
local lang = mw.language.new('en')
local daysAgo = 0
while daysAgo < maxDays do
local day = lang:formatDate('Y F j', 'now - '..daysAgo..' days')
local dailyItems = getCurrentEvents(day, mdyDates, patterns, skipPatterns)
for i, item in ipairs(dailyItems) do
table.insert(allItems, item)
end
daysAgo = daysAgo + 1
end
return allItems
end
function getPatterns(args, prefix)
local patterns = {}
local ii = 1
while args[prefix and prefix..ii or ii] do
patterns[ii] = args[prefix and prefix..ii or ii]
ii = ii + 1
end
return patterns
end
local p = {}
p.main = function(frame)
local parent = frame.getParent(frame)
local parentArgs = parent.args
local args = cleanupArgs(parentArgs)
if args['not'] and not args['not1'] then
args['not1'] = args['not']
end
local patterns = getPatterns(args)
if #patterns < 1 then
return error("Search pattern not set")
end
local skipPatterns = getPatterns(args, 'not')
local days = tonumber(args.days) or 30
local mdyDates = args.dates and string.lower(args.dates) == 'mdy'
local allItems = getItems(days, mdyDates, patterns, skipPatterns)
if #allItems < 1 then
return args.none or 'No recent news'
end
return makeOutput(allItems, tonumber(args.max) or 6)
end
return p