Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Documentation for this module may be created at Module:Item/Mod/doc

local mods = require('Module:Item/ModList')
local item = {}

function join_with_connector(list, connector)
	connector = connector or 'and'
    local n = #list
    if n == 0 then
        return ''
    elseif n == 1 then
        return list[1]
    elseif n == 2 then
        return list[1] .. ' ' .. connector ..  ' ' .. list[2]
    elseif n >= 3 then
        local first_part = table.concat(list, ', ', 1, n - 1)
        return first_part .. ', ' .. connector ..  ' ' .. list[n]
    end
end
function starts_with(str, prefix)
	return str:sub(1, #prefix) == prefix
end
function length(obj)
	local count = 0
	for _ in pairs(obj) do 
		count = count + 1 
	end
	return count;
end
function non_empty(value, fallback)
	if value == nil or value == '' then
        return fallback
    else
        return value
    end
end

function parse_args(args)
	local keys = {}
	for k, _ in pairs(args) do
		if type(k) == 'number' then
			table.insert(keys, k)
		end
	end
	return keys
end
function debug_result(var, debug_flag)
   if debug_flag == '1' then 
       return '<pre>' .. var .. '</pre>'
   else
       return mw.getCurrentFrame():preprocess(var)
   end
end


function parse_notes(args)
	local notes = ''
	local categories = {}
	local keys = parse_args(args)
	local current_page = mw.title.getCurrentTitle()

    for i = 2, #keys do
		local argIndex = keys[i]
		local key = args[argIndex]
		local mod = mods[key]

		if mod ~= nil then
			if type(mod) == 'function' then
				mod = mod(args)
			end
            if  mod['hide_mod_category'] ~= true
            and current_page 
            and not starts_with(current_page.text, mod['mod_category'] .. '/') then
			    table.insert(categories, "''[[" .. mod['mod_category'] .. '|'.. mod['label'] .."]]''")
            end
			if mod.notes ~= '' then
                notes = notes .. '|' .. mod.notes
            end
		end
	end
    categories = join_with_connector(categories, args["connector"])
    if categories ~= '' then
		notes =  '|Also grants ' .. categories .. notes
	end

	for i = 1, 2 do
		local note = args['note_' .. i] or ''
		if note ~= '' then
			notes = notes .. '|' .. note
		end
	end
	return notes
end

function item.parse_description(args)
	local parsed_effects = {}
	local categories = {}
	local add_cat = not args['no_cat']
	local keys = parse_args(args)
	local is_mod_broken = false;

	for i = 2, #keys do
		local argIndex = keys[i]
		local key = args[argIndex]
		local mod = mods[key]

		if mod ~= nil then
			if type(mod) == 'function' then
				mod = mod(args)
			end
			if add_cat then
				table.insert(categories, '[[' .. mod.category .. ']]')
			end
			if mod.description ~= '' then
				table.insert(parsed_effects, mod.description)
			end
		else 
			is_mod_broken = true
		end
	end
	
	if is_mod_broken and add_cat then
		table.insert(categories, '[[Category:Broken Mod]]')
	end

	return {
		description = join_with_connector(parsed_effects, args['connector']),
		categories = table.concat(categories)
	}
end

function item.description(frame) 
	local parent = frame:getParent().args
	local title = parent['title'] or mw.title.getCurrentTitle().text or 'unknown'
	local label = parent['label'] or parent[1]
    local parsed_effects =  item.parse_description(parent)
    local base_sentence = "When equipped, the '''" .. mw.text.nowiki(title) .. "'''"
    local full_sentence
    
    if label ~= '' and label ~= nil then
    	sentence_with_label = base_sentence .. " grants the ''" .. mw.text.nowiki(label) .. "'' [[Mods|mod]]"
    	if parsed_effects.description == '' then 
    		full_sentence = sentence_with_label .. '.'
    	elseif label == '-' then
    		full_sentence = base_sentence .. ' allows the player to ' .. parsed_effects.description .. '.'
    	else
    		full_sentence = sentence_with_label .. ', which allows the player to ' .. parsed_effects.description .. '.'
    	end
    else 
    	full_sentence = base_sentence .. " serves a purely cosmetic purpose.[[Category:Cosmetic Clothes]]"
    end
    return full_sentence .. parsed_effects.categories
    
end

function item.table(frame) 
	local parent = frame:getParent().args
	local name = parent['title'] or '%PAGE%'
	local label = parent['label'] or parent[1] or ''
	local notes = parse_notes(parent) 
	
	if label == '-' then
		label = ''
	end

	return '\n{{Mod|' .. name .. '|' .. label  .. notes .. '}}'
end

function item.documentation(frame)
	local doc = {}
	local args = {
		misc = '<span style="background:#FF9999">misc</span>',
		skin = '<span style="background:#FF9999">skin</span>',
		gem_chance = '<span style="background:#FF9999">gem_chance</span>',
		block_chance = '<span style="background:#FF9999">block_chance</span>'
	}
	table.insert(doc, '{|class="article-table" border="0" cellpadding="1" cellspacing="1" width="100%"')
	table.insert(doc, '|-')
	table.insert(doc, '! scope="col" style="width:15%" |Parameter')
	table.insert(doc, '! scope="col" style="width:10%" |Value')
	table.insert(doc, '! scope="col" style="width:75%" |Meaning')
	table.insert(doc, '|-')
	table.insert(doc, '| rowspan=' .. length(mods) .. ' | <span style="background:#FF9999">Mod</span>')
	
	for k, v in pairs(mods) do
		table.insert(doc, "|'''" .. k .. "'''")
    	if type(v) == 'function' then
    		local default_value = v({}).description
    		local value = v(args).description
    		if(default_value == value) then
    			table.insert(doc, '|' .. non_empty(default_value, "''No default value''"))
    		else 
    			table.insert(doc, '|' .. '{{Bullet}} ' .. non_empty(default_value, "''No default value''") .. '<br>{{Bullet}} ' .. value)
    		end
        else
            table.insert(doc, '|' .. v.description)
    	end
    table.insert(doc, '|-')
	end
	table.insert(doc, '|}')
	return debug_result(table.concat(doc, '\n'), frame.args['debug'])
end

return item