Module:Sandbox/User:Agent-008

Revision as of 01:40, 7 January 2018 by imported>Agent-008
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Documentation for this module may be created at Module:Sandbox/User:Agent-008/doc

-- Google Code-in 2017, Introduction to Lua in Wikipedia
-- [Lua task #03] Create your own Lua module on English Wikipedia

local p = {} -- p stands for package

function p.hello( frame )
    return "Hello, world!"
end

p.Hi = function(frame)
	strName = frame.args.name or "Jimbo"
	return "Hello from Lua to my friend " .. strName .. ".<br>"
end

p.temperature = function(frame)
	if frame.args.celsius then cel = frame.args.celsius else cel = 0 end
	fah = cel * 9 / 5 + 32
	msg = cel .. " degrees Celsius is " .. fah .. " degrees Fahrenheit."
	if tonumber(cel) > 9 then msg = msg .. " It is warm." else msg = msg .. " It is cold." end
	return msg
end

p.times = function(frame)
	local num = tonumber( frame.args.num ) or 2
	local out = num .. " times table<br>"
	for i = 1, 12 do
		out = out .. num .. " times " .. i .. " equals " .. i * num .. "<br>"
	end
	return out
end

p.mum = function(frame)
	local family = {"Dad", "Mum", "Uncle Stan", "Aunty Elsie", "Brian", "Agent 007", "Agent 008", "World"}
	local msg = ""
	for i=1,#family do
		msg = msg .. "Hello " .. family[i] .. "<br>"
	end
	return msg
end

p.langnames = function( frame )
	local langs = mw.language.fetchLanguageNames()
	local langlist = ""
	local count = 0
	for key, value in pairs( langs ) do
		langlist = langlist .. key .. " - " .. value .. "<br>"
		count = count + 1
	end
	return langlist .. "<br>= " .. count .. " languages"
end

p.pageinfo = function(frame)
	if frame.args.title and #(frame.args.title) ~= 0 then
		local titleStr = frame.args.title
		local title = mw.title.new(titleStr)
		local exists = title.id ~= 0
		local isRedirect = title.isRedirect
		return titleStr .. (exists and " exists " or " does not exist ") .. "and is " .. (isRedirect and "a redirect" or "not a redirect") .. "<br>"
	else
		return "does not exist and is not a redirect<br>"
	end
end

local processEmptyString = function(s)
	return s ~= nil and s or ""
end

local removeEndSpaces
removeEndSpaces = function(s)
	if not s or #s == 0 then--we know that it is not a space
		return s
	elseif #s == 1 then
		return s == " " and "" or s
	else
		if string.sub(s,1,1) == " " then return removeEndSpaces(string.sub(s,2,-1))--successively remove spaces from the beginning
		elseif string.sub(s,-1,-1) == " " then return removeEndSpaces(string.sub(s,1,-2))--successively remove spaces from the end
		else return s--s has no spaces left at its beginning or its end
		end
	end
end

local shouldPutSpaces = function(s)
	return string.find(removeEndSpaces(s)," ") or string.find(removeEndSpaces(s),'%D')
end

local formattedR = function(tab)--the table of arguments which format the r (i.e. label, show, cap)
	if tab.label then
		return removeEndSpaces(tab.label) .. " "
	else
		correctCaseR = (tab.cap and (removeEndSpaces(tab.cap) == "yes" or removeEndSpaces(tab.cap) == "y")) and "R" or "r"
		if tab.show then
			sh = removeEndSpaces(tab.show)
			if sh == "word" then
				return correctCaseR .. "eigned "
			elseif sh == "colon" then
				return correctCaseR .. "eign: "
			elseif sh == "none" then
				return correctCaseR .. ". "
			elseif (sh == "link" or sh == "lk") then
				return "[[Reign|" .. correctCaseR .. "]]. "
			elseif sh == "lword" then
				return "[[Reign|" .. correctCaseR .. "eigned" .. "]] "
			elseif sh == "lcolon" then
				return "[[Reign|" .. correctCaseR .. "eign" .. "]] "
			else--default case - none of the above
				return "<abbr title=\"reign\">" .. correctCaseR .. "</abbr>. "
			end
		else
			return "<abbr title=\"reign\">" .. correctCaseR .. "</abbr>. "
		end
	end
end

local formattedDash = function(tab)--the table of arguments which format the dash (i.e. the dates which go before and after. The dates do not have their eras yet.)
	return (shouldPutSpaces(tab[1]) or shouldPutSpaces(tab[2])) and " – " or "–"
end

p.reign = function(frame)
	preString = (frame.args["pre-date"] and #(frame.args["pre-date"]) > 0) and (frame.args["pre-date"] .. ", ") or ""
	midString = (frame.args["mid-date"] and #(frame.args["mid-date"]) > 0) and (", " .. frame.args["mid-date"] .. ", ") or ", "
	postString = (frame.args["post-date"] and #(frame.args["post-date"]) > 0) and (", " .. frame.args["post-date"]) or ""
	s1 = processEmptyString(removeEndSpaces(frame.args[1]))
	s2 = processEmptyString(removeEndSpaces(frame.args[2]))
	if not frame.args[3] then
		if (s1 and #removeEndSpaces(s1) > 0) or (s2 and #removeEndSpaces(s2) > 0) then
			if (s1 and #removeEndSpaces(s1) > 0) and (s2 and #removeEndSpaces(s2) > 0) then--both arguments are passed
				return formattedR({label=frame.args.label,show=frame.args.show,cap=frame.args.cap}) .. preString .. s1 .. formattedDash({s1,s2}) .. s2 .. postString .. (frame.args.era and (" " .. removeEndSpaces(frame.args.era)) or "")
			else
				if (s1 and #removeEndSpaces(s1) > 0) then--only argument 1 is passed
					return formattedR({label=frame.args.label,show=frame.args.show,cap=frame.args.cap}) .. preString .. s1 .. (shouldPutSpaces(s1) and " – " or "–") .. postString .. (frame.args.era and (" " .. removeEndSpaces(frame.args.era)) or "")
				else--only argument 2 is passed
					return formattedR({label=frame.args.label,show=frame.args.show,cap=frame.args.cap}) .. preString .. "?" .. (shouldPutSpaces(s2) and " – " or "–") .. s2 .. postString .. (frame.args.era and (" " .. removeEndSpaces(frame.args.era)) or "")
				end
			end
		elseif frame.args.single then
			return formattedR({label=frame.args.label,show=frame.args.show,cap=frame.args.cap}) .. preString .. processEmptyString(frame.args.single) .. postString .. (frame.args.era and (" " .. removeEndSpaces(frame.args.era)) or "")
		else--no arguments are passed
			return "reign must have at least 1 date argument"
		end
	else
		s3 = processEmptyString(removeEndSpaces(frame.args[3]))--note that in order for s3 and s4 to work, both must be present, as well as both of s1 and s2.
		s4 = processEmptyString(removeEndSpaces(frame.args[4]))--otherwise, it is impossible to figure out which reigns are ranges and which are single years.
		return formattedR({label=frame.args.label,show=frame.args.show,cap=frame.args.cap}) .. preString .. s1 .. formattedDash({s1,s2}) .. s2 .. (frame.args.era and (" " .. removeEndSpaces(frame.args.era)) or "") .. midString .. s3 .. formattedDash({s3,s4}) .. s4 .. postString .. (frame.args.era and (" " .. removeEndSpaces(frame.args.era)) or "")
	end
end

return p