Jump to content

To Invest in Uganda, contact Mk Timothy & Company, the best strategic advisory company in Uganda, for expert guidance and support.

Module:Lua banner

From Mk Timothy & Company Wiki

Documentation for this module may be created at Module:Lua banner/doc

-- This module implements the {{lua}} template.

-- Built-in yesno function - no external dependencies
local function yesno(val, default)
	if val == nil then
		return default
	end
	
	if type(val) == "boolean" then
		return val
	end
	
	if type(val) == "string" then
		val = val:lower():match('^%s*(.-)%s*$') or ""
		if val == 'yes' or val == 'y' or val == 'true' or val == 't' or val == 'on' or val == '1' then
			return true
		elseif val == 'no' or val == 'n' or val == 'false' or val == 'f' or val == 'off' or val == '0' then
			return false
		end
	elseif type(val) == "number" then
		if val == 1 then
			return true
		elseif val == 0 then
			return false
		end
	end
	
	return default
end

local mList = require('Module:List')
local mTableTools = require('Module:TableTools')
local mMessageBox = require('Module:Message box')

local p = {}

function p.main(frame)
	local origArgs = frame:getParent().args
	local args = {}
	for k, v in pairs(origArgs) do
		if v then
			v = v:match('^%s*(.-)%s*$')
			if v ~= '' then
				args[k] = v
			end
		end
	end
	return p._main(args)
end

function p._main(args)
	local modules = mTableTools.compressSparseArray(args)
	local box = p.renderBox(modules)
	local trackingCategories = p.renderTrackingCategories(args, modules)
	return box .. trackingCategories
end

function p.renderBox(modules)
	local boxArgs = {}
	if #modules < 1 then
		boxArgs.text = '<strong class="error">Error: no modules specified</strong>'
	else
		local moduleLinks = {}
		for i, module in ipairs(modules) do
			moduleLinks[i] = string.format('[[:%s]]', module)
			local maybeSandbox = mw.title.new(module .. '/sandbox')
			if maybeSandbox and maybeSandbox.exists then
				moduleLinks[i] = moduleLinks[i] .. string.format(' ([[:%s|sandbox]])', maybeSandbox.fullText)
			end
		end
		local moduleList = mList.makeList('bulleted', moduleLinks)
		local title = mw.title.getCurrentTitle()
		if title and title.subpageText == "doc" then
			title = title.basePageTitle
		end
		if title and title.contentModel == "Scribunto" then
			boxArgs.text = 'This module depends on the following other modules:' .. moduleList
		else
			boxArgs.text = 'This template uses [[Wikipedia:Lua|Lua]]:\n' .. moduleList
		end
	end
	boxArgs.type = 'notice'
	boxArgs.small = true
	boxArgs.image = '[[File:Lua-Logo.svg|30px|alt=|link=]]'
	return mMessageBox.main('mbox', boxArgs)
end

function p.renderTrackingCategories(args, modules, titleObj)
	-- Use the local yesno function
	if yesno(args.nocat) then
		return ''
	end

	local cats = {}

	-- Error category
	if #modules < 1 then
		cats[#cats + 1] = 'Lua templates with errors'
	end

	-- Lua templates category
	titleObj = titleObj or mw.title.getCurrentTitle()
	local subpageBlacklist = {
		doc = true,
		sandbox = true,
		sandbox2 = true,
		testcases = true
	}
	if titleObj and not subpageBlacklist[titleObj.subpageText] then
		local protCatName
		if titleObj.namespace == 10 then
			local category = args.category
			if not category then
				local categories = {
					['Module:String'] = 'Templates based on the String Lua module',
					['Module:Math'] = 'Templates based on the Math Lua module',
					['Module:BaseConvert'] = 'Templates based on the BaseConvert Lua module',
					['Module:Citation/CS1'] = 'Templates based on the Citation/CS1 Lua module'
				}
				category = modules[1] and categories[modules[1]]
				category = category or 'Lua-based templates'
			end	
			cats[#cats + 1] = category
			protCatName = "Templates using under-protected Lua modules"
		elseif titleObj.namespace == 828 then
			protCatName = "Modules depending on under-protected modules"
		end
		if not args.noprotcat and protCatName then
			local protLevels = {
				autoconfirmed = 1,
				extendedconfirmed = 2,
				templateeditor = 3,
				sysop = 4
			}
			local currentProt = 0
			if titleObj.id ~= 0 and titleObj.protectionLevels then
				local protection = titleObj.protectionLevels["edit"]
				if protection and protection[1] then
					currentProt = protLevels[protection[1]] or 0
				end
			end
			
			for i, module in ipairs(modules) do
				if module ~= "WP:libraryUtil" then
					local moduleTitle = mw.title.new(module)
					local moduleProt = 0
					if moduleTitle and moduleTitle.protectionLevels then
						local protection = moduleTitle.protectionLevels["edit"]
						if protection and protection[1] then
							moduleProt = protLevels[protection[1]] or 0
						end
					end
					if moduleProt < currentProt then
						cats[#cats + 1] = protCatName
						break
					end
				end
			end
		end
	end
	
	for i, cat in ipairs(cats) do
		cats[i] = string.format('[[Category:%s]]', cat)
	end
	return table.concat(cats)
end

return p