Jump to content

Module:Selected current events: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
show dates, in either dmy or mdy format
option to show "More current events" link, or custom wikitext, at the bottom
Line 14: Line 14:
end
end


function makeOutput(allItems, maxItems)
function isAffirmed(val)
if not(val) then return false end
local affirmedWords = ' add added affirm affirmed include included on true yes y '
return string.find(affirmedWords, ' '..string.lower(val)..' ', 1, true ) and true or false
end

function makeOutput(allItems, maxItems, more)
local output = ''
local output = ''
local itemIndex = 1
local itemIndex = 1
Line 21: Line 27:
output = output .. allItems[itemIndex] .. '\n'
output = output .. allItems[itemIndex] .. '\n'
itemIndex = itemIndex + 1
itemIndex = itemIndex + 1
end
if more then
output = output .. more
end
end
return mw.text.trim(output)
return mw.text.trim(output)
Line 120: Line 129:
end
end


return makeOutput(allItems, tonumber(args.max) or 6)
local maxItems = tonumber(args.max) or 6

local more = args.more
if isAffirmed(args.more) then
more = "'''[[Portal:Current events|More current events...]]'''"
end

return makeOutput(allItems, maxItems, more)





Revision as of 04:41, 23 May 2018

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 isAffirmed(val)
	if not(val) then return false end
	local affirmedWords = ' add added affirm affirmed include included on true yes y '
	return string.find(affirmedWords, ' '..string.lower(val)..' ', 1, true ) and true or false
end

function makeOutput(allItems, maxItems, more)
	local output = ''
	local itemIndex = 1
	local maxCount = math.min(#allItems, maxItems)
	while itemIndex <= maxCount do
		output = output .. allItems[itemIndex] .. '\n'
		itemIndex = itemIndex + 1
	end
	if more then
		output = output .. more
	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

	local maxItems = tonumber(args.max) or 6

	local more = args.more
	if isAffirmed(args.more) then
		more = "'''[[Portal:Current events|More current events...]]'''"
	end

	return makeOutput(allItems, maxItems, more)


end

return p