Mô đun:Shindo

local p = {}
local getArgs = require("Module:Arguments").getArgs
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 (tbl1 + tbl2 + tbl3) / 3 / 255
end
local function rgbColor(tbl)
	return tbl1 .. (tbl2 and ", " .. tbl2 .. (tbl3 and ", " .. tbl3 or "") or "")
end
local function averageColor(tbl)
	local colors = {}
	for k,v in pairs(tbl) do
		colorsk = v
	end
	local avg = {0, 0, 0}
	for _,color in pairs(colors) do
		avg1 = avg1 + color1
		avg2 = avg2 + color2
		avg3 = avg3 + color3
	end
	avg1 = math.ceil(avg1 / #colors) - avg1 / #colors > 0.5 and math.floor(avg1 / #colors) or math.ceil(avg1 / #colors)
	avg2 = math.ceil(avg2 / #colors) - avg2 / #colors > 0.5 and math.floor(avg2 / #colors) or math.ceil(avg2 / #colors)
	avg3 = math.ceil(avg3 / #colors) - avg3 / #colors > 0.5 and math.floor(avg3 / #colors) or math.ceil(avg3 / #colors)
	return avg
end
local function listIntensitiesFromScale(scale, intensities, labelScale, scale2)
	local out = 
	if yn(labelScale) then
		out = out .. datascale.short .. ' '
	end
	local categoriesAreSame = true
	local category = ""
	for k,v in pairs(intensities) do
		if datascale.ranksv == nil then error(message("invalidIntensity", {v, scale})) end
		out = out .. datascale.ranksv.label
		if k ~= #intensities then
			if #intensities == 2 then
				out = out .. '–'
			else
				out = out .. '/'
			end
		end
		if category == "" and categoriesAreSame then
			category = datascale.ranksv.category or ""
		end
		categoriesAreSame = categoriesAreSame and category ~= "" and (datascale.ranksv.category and datascale.ranksv.category == category or false)
	end
	if categoriesAreSame and category ~= "" and not scale2 then
		out = out .. " (" .. category .. ")"
	end
	return out
end
p._color = function(args)
	local scale = string.lower(args.scale or args1 or error(message("noScaleShortCode")))
	local intensity = string.upper(args.intensity or args2 or error(message("noIntensity")))
	if datascale == nil then error(message("invalidScale", {scale})) end
	if datascale.ranksintensity == nil then error(message("invalidIntensity", {intensity, scale})) end
	local order = datascale.ranksintensity.order
	local color = datascale.colorsorder
	local colorIntensity = getValueOfColor(color)
	return 'background-color:rgb(' .. rgbColor(color) .. '); color:' .. (colorIntensity '
	end
	out = out .. listIntensitiesFromScale(scale, intensities, labelScale, false)
	if yn(doColor) then
		out = out .. 
	end
	if yn(link) then
		out = out .. ""
	end
	return out
end
p._formatTag = function(args)
	local scale = string.lower(args.scale or args1 or error(message("noScaleShortCode")))
	local scale2 = args.scale2 or args3 or nil
	if scale2 ~= nil then scale2 = string.lower(scale2) end
	local link = args.link ~= nil and args.link or true
	local labelScale = args.labelScale ~= nil and args.labelScale or true
	local doColor = args.color ~= nil and args.color or true
	local intensity = string.upper(args.intensity or args2 or error(message("noIntensity")))
	local intensities = mw.text.split(intensity, "/") or { intensity }
	local intensity2 = args.intensity2 or args4 or (scale2 and error(message("noIntensity"))) or nil
	local intensities2 = {}
	if intensity2 ~= nil then
		intensity2 = string.upper(intensity2)
		intensities2 = mw.text.split(intensity2, "/") or { intensity2 }
	end
	if datascale == nil then error(message("invalidScale", {scale})) end
	if scale2 and datascale2 == nil then error(message("invalidScale", {scale2})) end
	local colors = {}
	for k,v in pairs(intensities) do
		local order = datascale.ranksv.order
		colorsk = datascale.colorsorder
	end
	local color = averageColor(colors)
	local colorIntensity = getValueOfColor(color)
	local out = 
	if yn(doColor) then
		out = out .. '"
	if yn(link) then
		out = out ..  .. datascale.name .. "#" .. datascale.id_prefix .. datascale.ranksintensities1.id .. "|"
	end
	if yn(doColor) then
		out = out .. 
	end
	out = out .. listIntensitiesFromScale(scale, intensities, labelScale, scale2)
	if yn(doColor) then
		out = out .. 
	end
	if yn(link) then
		out = out .. ""
	end
	if (scale2) then
		out = out .. " ("
		if yn(link) then
			out = out ..  .. datascale2.name .. "#" .. datascale2.id_prefix .. datascale2.ranksintensities21.id .. "|"
		end
		if yn(doColor) then
			out = out .. 
		end
		out = out .. listIntensitiesFromScale(scale2, intensities2, true, true)
		if yn(doColor) then
			out = out .. 
		end
		if yn(link) then
			out = out .. ""
		end
		out = out .. ")"
	end
	out = out .. 
	return mw.getCurrentFrame():preprocess(out)
end
p._format = function(args)
	if args"format" == "wikitable" then
		return p.formatInWikitable(args)
	else
		return p.formatTag(args)
	end
end
p._getScaleName = function(args)
	local scale = string.lower(args.scale or args1 or error(message("noScaleShortCode")))
	if datascale == nil then error(message("invalidScale", {scale})) end
	local out = 
	if yn(args.link or true) then
		out = out ..  .. datascale.name .. '|'
	end
	out = out .. datascale.name
	if yn(args.link or true) then
		out = out .. 
	end
	return out
end
-- uses binary search to convert a peak ground acceleration to a seismic intensity
function convert(pga, ranks, ranksSorted, left, right)
	left = left ~= nil and left or 0
	right = right ~= nil and right or #ranksSorted
	index = math.floor((left + right) / 2)
	local lower = ranksranksSortedindex + 1.pga
	local upper = ranksSortedindex + 2 and ranksranksSortedindex + 2.pga or math.huge
	if (pga >= upper) then
		return convert(pga, ranks, ranksSorted, index, right)
	elseif (pga ' .. k .. ': ' .. v.name .. )
		local tb = list:tag('table'):addClass("wikitable")
		tb
			:tag("tr")
				:tag("th"):wikitext("Seismic intensity"):done()
				:tag("th"):wikitext("Display"):done()
			:done()
		for l,w in pairs(v.order) do
			tb:tag('tr'):wikitext( .. w .. ' ' .. p.format({k, w, tag = "td"})):done()
		end
		list:done()
	end
	out:allDone()
	return tostring(out)
end
-- make each scale invokable
for k,v in pairs(data) do
	if p"_" .. k ~= nil then error(message("scaleNameInvalid", k)) end
	p"_" .. k = function(args)
		args"scale" = k
		args"intensity" = args"intensity" or args1 or nil
		args"scale2" = args"scale2" or args2 or nil
		args"intensity2" = args"intensity2" or args3 or nil
		if args"format" == "wikitable" then
			return p.formatInWikitable(args)
		else
			return p.formatTag(args)
		end
	end
end
-- make all functions that begin with _ invokable
local q = mw.clone(p)
for k,v in pairs(q) do
	if mw.ustring.sub(k, 1, 1) == "_" then
		pmw.ustring.sub(k, 2, #k) = makeInvokeFunc(k)
	end
end
return p