Permanently protected module
From Wikipedia, the free encyclopedia


--[[ v1.00

     Split the page title into words then test each of them against

     the list of months.

     Optionally, an alternative page name may be supplied as a parameter.

     Return the first word which matches a months name ...

     unless the "match=" parameter specifies a diffreent match.

     If there is no match, then return an empty string ... unles

     the "nomatch" parameter specifies something different

]]



local getArgs = require('Module:Arguments').getArgs

local p = {}



-- config

local nomatch = ""

local matchnum = 1



local monthList = {

	'January',

	'February',

	'March',

	'April',

	'May',

	'June',

	'July',

	'August',

	'September',

	'October',

	'November',

	'December'

}



-- splits a string into "words"

-- a "word" is a set of characters delineated at each end by one 

--    or more whitespace characters or punctaution charaters

function splitIntoWords(str)

	result = {}

	index = 1

	s = mw.ustring.gsub(str, "^[%s%p]+", "") -- strip leading whitespace or punctuation

	for s2 in mw.ustring.gmatch(s, "[^%s%p]+[%s%p]*") do

		s3 = mw.ustring.gsub(s2, "[%s%p]+$", "") -- strip trailing separators

		resultindex = s3

		index = index + 1

	end

return result

end



-- returns the first word is the pagename which matches the name of a month

-- ... or an empty string if there is no match

function checkPagename(pn)

	-- split the pagename into sparate words

	titleWords = splitIntoWords(pn)

	

	nMatches = 0

	myMatches ={}

	

	-- check each words in turn, to see if it matches a month

	for w, thisWord in ipairs(titleWords) do

		-- check agaist each month

		-- if there is a match, then return that monthname

		for i, thisMonth in ipairs(monthList) do

			if (thisMonth == thisWord) then

				nMatches = nMatches + 1

				myMatchesnMatches = thisMonth

			end

		end

	end



	if (nMatches == 0) then

		-- none of the title words matches a whole month

		return nomatch

	end

	

	if ((matchnum >= 1) and (matchnum <= nMatches)) then

		return myMatchesmatchnum

	end



	if (matchnum < 0) then

		matchnum = matchnum + 1 -- so that -1 is the last match etc

		if ((matchnum + nMatches) >= 1) then

			return myMatchesmatchnum + nMatches

		end

	end

	

	-- if we get here, we have not found a match at the position specified by "matchnum"

	return nomatch

end



function p.main(frame)

	local args = getArgs(frame)

	return p._main(args)

end



function p._main(args)

	if (args'nomatch' ~= nil) then

		nomatch = args'nomatch'

	end

	

	-- by default, we return the first match

	-- but the optional "C" paarmeter sets the "matchnum" variable, which

	-- * for a positive matchnum "n", returns the nth match if it exists

	-- * for a positive matchnum "n", returns (if it exists) the nth match

	--   counting backwards from the end.

	--   So "match=-1" returns the last match

	--   and "match=-3" returns the 3rd-last match

	if (args'match' ~= nil) then

		matchnum = tonumber(args'match'])

		if ((matchnum == nil) or (matchnum == 0)) then

			matchnum = 1

		end

	end

	

	-- by default, we use the current page

	-- but if the "page=" parameters is supplied, we use that

	-- so we try the parameter first

	thispagename = nil

	if ((args'page' ~= nil) and (args'page' ~= "")) then

		-- we have a non-empty "page" parameter, so we use it

		thispagename = args'page'

	else

		-- get the page title

		thispage = mw.title.getCurrentTitle()

		thispagename = thispage.text;

	end

	

	-- now check the pagename to try to find a month ananme

	result = checkPagename(thispagename)

	if (result == "") then

		return nomatch

	end

	return result

end



return p