Jump to content

Module:Title monthname/sandbox: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
m BrownHairedGirl moved page Module:Title month to Module:Title monthname/sandbox without leaving a redirect: move all the development stuff to the sandbox, so that the actual live module has a cleaner history
sync from first live version
 
Line 1: Line 1:
--[[
--[[ v1.00
Split the title into words then test each of them against the list of months
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.
v08 -- supports parameter match=
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
]]
]]


Line 72: Line 77:


if (matchnum < 0) then
if (matchnum < 0) then
-- return "done search<br />matchnum = " .. matchnum .."<br />nMatches = " .. nMatches
matchnum = matchnum + 1 -- so that -1 is the last match etc
matchnum = matchnum + 1 -- so that -1 is the last match etc
if ((matchnum + nMatches) >= 1) then
if ((matchnum + nMatches) >= 1) then
return myMatches[matchnum + nMatches]
return myMatches[matchnum + nMatches]
end
end
end
--]]
end
-- if we get here, we have not found a match at the position specified by "matchnum"
return nomatch
return nomatch
end
end
Line 93: Line 97:
end
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
if (args['match'] ~= nil) then
matchnum = tonumber(args['match'])
matchnum = tonumber(args['match'])
Line 100: Line 111:
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
thispagename = nil
if (args['page'] ~= nil) then
if ((args['page'] ~= nil) and (args['page'] ~= "")) then
-- we have a non-empty "page" parameter, so we use it
thispagename = args['page']
thispagename = args['page']
else
else
Line 108: Line 123:
thispagename = thispage.text;
thispagename = thispage.text;
end
end
-- now check the pagename to try to find a month ananme
result = checkPagename(thispagename)
result = checkPagename(thispagename)
if (result == "") then
if (result == "") then

Latest revision as of 18:43, 16 July 2020

--[[ 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
		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
		matchnum = matchnum + 1 -- so that -1 is the last match etc
		if ((matchnum + nMatches) >= 1) then
			return myMatches[matchnum + 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