Jump to content

Module:Title monthname/sandbox

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by BrownHairedGirl (talk | contribs) at 18:18, 16 July 2020 (tweak). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
--[[ 
     Split the title into words then test each of them against the list of months
     v08 -- supports parameter match=
]]

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
		result[index] = 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
				myMatches[nMatches] = 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 myMatches[matchnum]
	end

	if (matchnum < 0) then
-- return "done search<br />matchnum = " .. matchnum .."<br />nMatches = " .. nMatches
		matchnum = matchnum + 1 -- so that -1 is the last match etc
		if ((matchnum + nMatches) >= 1) then
			return myMatches[matchnum + nMatches]
		end
--]]
end
	
	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
	
	if (args['match'] ~= nil) then
		matchnum = tonumber(args['match'])
		if ((matchnum == nil) or (matchnum == 0)) then
			matchnum = 1
		end
	end
	
	thispagename = nil
	if (args['page'] ~= nil) then
		thispagename = args['page']
	else
		-- get the page title
		thispage = mw.title.getCurrentTitle()
		thispagename = thispage.text;
	end
	result = checkPagename(thispagename)
	if (result == "") then
		return nomatch
	end
	return result
end

return p