Jump to content

Module:Shindo

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Awesome Aasim (talk | contribs) at 19:53, 11 April 2024. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local p = {}
local data = mw.loadData("Module:Shindo/data")
local messages = mw.loadData("Module:Shindo/messages")
local makeInvokeFunc = require("Module:MakeInvokeFunc")(p)
local message = require("Module:Message")(messages)
local yn = require("Module:Yesno")

local function getValueOfColor(tbl)
	return (tbl[1] + tbl[2] + tbl[3]) / 3 / 255
end

local function rgbColor(tbl)
	return tbl[1] .. (tbl[2] and ", " .. tbl[2] .. (tbl[3] and ", " .. tbl[3] or "") or "")
end

local function listIntensitiesFromScale(scale, intensities)
	local out = ''
	out = out .. data[scale].short .. ' '
	for k,v in intensities do
		if data[scale].ranks[v] == nil then error(message("invalidIntensity", {v, scale})) end
		out = out .. data[scale].ranks[v].label
		if k ~= #intensities then
			if #intensities == 2 then
				out = out .. '–'
			else
				out = out .. '/'
			end
		end
	end
	return out
end

p._color = function(args)
	local scale = string.lower(args.scale or args[1] or error(message("noScaleShortCode")))
	local intensity = string.upper(args.intensity or args[2] or error(message("noIntensity")))
	if data[scale] == nil then error(message("invalidScale", {scale})) end
	if data[scale].ranks[intensity] == nil then error(message("invalidIntensity", {intensity, scale})) end
	local order = data[scale].ranks[intensity].order
	local color = data[scale].colors[order]
	local colorIntensity = getValueOfColor(color)
	return 'background-color:rgb(' .. rgbColor(data[scale].colors[order]) .. '); color:' .. (colorIntensity < 0.5 and "white" or "black") .. ";"
end

p.color = makeInvokeFunc("_color")

p._formatInWikitable = function(args)
	local scale = string.lower(args.scale or error(message("noScaleShortCode")))
	local link = args.link ~= nil and args.link or true
	local doColor = args.color ~= nil and args.color or true
	local intensity = string.upper(args.intensity or args[1] or error(message("noIntensity")))
	if data[scale] == nil then error(message("invalidScale", {scale})) end
	if data[scale].ranks[intensity] == nil then error(message("invalidIntensity", {intensity, scale})) end
	local order = data[scale].ranks[intensity].order
	local color = data[scale].colors[order]
	local colorIntensity = getValueOfColor(color)
end

p._format = function(args)
	local scale = string.lower(args.scale or error(message("noScaleShortCode")))
	local scale2 = args.scale2 or args[2] or nil
	if scale2 ~= nil then scale2 = string.lower(scale2) end
	local link = args.link ~= nil and args.link or true
	local doColor = args.color ~= nil and args.color or true
	local intensity = string.upper(args.intensity or args[1] or error(message("noIntensity")))
	local intensities = mw.text.split(intensity, "/") or { intensity }
	local intensity2 = args.intensity2 or args[3] or (scale2 and error(message("noIntensity"))) or nil
	if intensity2 ~= nil then intensity2 = string.upper(intensity2) end
	local intensities2 = mw.text.split(intensity, "/") or { intensity2 }
	if data[scale] == nil then error(message("invalidScale", {scale})) end
	if scale2 and data[scale2] == nil then error(message("invalidScale", {scale2})) end
	if intensity2 and data[scale2].ranks[intensity2] == nil then error(message("invalidIntensity", {intensity2, scale2})) end
	local order = data[scale].ranks[intensities[0]].order
	local order2 = (scale2 ~= nil and intensity2 ~= nil) and data[scale2].ranks[intensities2[0]].order or nil
	local color = data[scale].colors[order]
	local colorIntensity = getValueOfColor(color)
	local out = ''
	if yn(doColor) then
		out = out .. '<' .. (args.tag or "div") .. ' style="background-color:rgba(' .. rgbColor(color) .. '); padding:4px; color:' .. (colorIntensity < 0.5 and "white" or "black") ..  '; '
	elseif args.style then
		out = out .. '<' .. (args.tag or "div") .. ' style="'
	end
	if args.style then
		out = out .. args.style
	end
	out = out .. '">'
	if yn(link) then
		out = out .. '[[' .. data[scale].name .. "#" .. data[scale].id_prefix .. data[scale].ranks[intensity].id .. "|"
	end
	if yn(doColor) then
		out = out .. '<span style=\"color:' .. (colorIntensity < 0.5 and "white" or "black") .. ';">'
	end
	out = out .. listIntensitiesFromScale(scale, intensities) .. ((data[scale].ranks[intensities[0]].category and not scale2) and " (''" .. data[scale].ranks[intensities[0]].category .. "'')" or "")
	if yn(doColor) then
		out = out .. '</span>'
	end
	if yn(link) then
		out = out .. "]]"
	end
	if (scale2) then
		out = out .. " ("
		if yn(link) then
			out = out .. '[[' .. data[scale2].name .. "#" .. data[scale2].id_prefix .. data[scale2].ranks[intensity2].id .. "|"
		end
		if yn(doColor) then
			out = out .. '<span style=\"color:' .. (colorIntensity < 0.5 and "white" or "black") .. ';">'
		end
		out = out .. listIntensitiesFromScale(scale, intensities)
		if yn(doColor) then
			out = out .. '</span>'
		end
		if yn(link) then
			out = out .. "]]"
		end
		out = out .. ")"
	end
	if yn(doColor) then
		out = out .. '</'  .. (args.tag or "div") .. '>'
	end
	return mw.getCurrentFrame():preprocess(out)
end

p.format = makeInvokeFunc("_format")

return p