Módulo:Missões necessárias

De RuneScape Wiki
Ir para: navegação, pesquisa
Documentação do módulo
Esta documentação é transcluída de Predefinição:Sem documentação/doc. [editar] [atualizar]
Este módulo não possui nenhuma documentação. Por favor, considere adicionar uma documentação em Módulo:Missões necessárias/doc. [editar]
Módulo:Missões necessárias's a função main é invocada por Predefinição:Missões necessárias.
Módulo:Missões necessárias carrega dados de Módulo:Missões necessárias/Data.
Módulo:Missões necessárias é solicitado por Módulo:RecursiveQuestreq.

-- 
-- Part of [[Template:Questreq]]'s implementation
-- For information on how to update this page, please see [[Module talk:Questreq]]
-- <nowiki>
--

local p = {}

-- Load data from quest list
local quests = mw.loadData('Módulo:Missões necessárias/Data')

-- Main function
function p.main(frame)
	local args = frame:getParent().args
	local quest = args[1]
	local limit = tonumber(args[2]) or 9
	local closed = args[3] ~= 'open'
	return p._main(quest,limit,closed)
end

function p._main(quest,limit,closed)
    
    local closedCss = ''
    if closed then
        closedCss = 'mw-collapsed'
    else
        closedCss = 'mw-open'
    end
    
	return mw.html.create('table')
			:addClass('mw-collapsible')
			:addClass(closedCss)
			:addClass('questreq')
			:css('background','none')
		:tag('tr')
			:tag('th')
			:css('text-align','left')
			:wikitext('[[File:Missão.png|21px|link=]] Missões:')
			:done()
		:done()
		:tag('tr')
			:tag('td')
				:css('padding-left','25px')
				:tag('ul')
					:node( list_reqs(quest,1,limit) )
				:done()
			:done()
		:done()
end

--
-- Recursive list function
-- Level determines how deep the indentation is
-- Replaces 'Started:' modifier
-- If the quest just listed was found in the big list and the limit for level is not reached
-- the quest's requirements will be listed as a sublist 1 level deeper
--
function list_reqs(quest,level,limit)
	local req_name, sub_req_list
	if quest then
		local started
		-- Look for the 'Iniciada:' modifier and replace it
		-- If found, set boolean to true
		if quest:find('Iniciada:') then
			quest = quest:gsub('Iniciada:%s*','')
			started = true
		end
		-- Look for quest in the list
		local subreqs = quests[quest]
		if subreqs then
			if started then
				req_name = 'Iniciada ' .. tidy_link(quest)
			else
				req_name = tidy_link(quest)
			end
			-- For every requirement, call this function again
			-- Handled the same, but 1 level deeper
			-- If limit is reached, denote extra requirements exist with ellipses
			if level <= limit then
				if subreqs[1] then
					sub_req_list = mw.html.create('ul')
					for i, q in ipairs(subreqs) do
						local sub_list = list_reqs(q,level+1,limit)
						sub_req_list:node(sub_list)
					end
					sub_req_list:done()
				end
			else
				req_name = req_name .. '…'
			end
		else
		-- If the requirement can't be found in the big list
		-- Paste it as is and skip any attempt to make a sublist
			req_name =  quest
		end
	end

	local ret = mw.html.create('li')
				:wikitext(req_name)

	if sub_req_list then
		ret:node(sub_req_list)
	end

	return ret:done()
end

-- Function to simply get a list of quests needed, as JSON, for further processing
function p.JSON_reqs(quest,level,limit)
	local req_name, sub_req_list
	local ret = {}
	
	if quest then
		local started
		-- Look for the 'Started:' modifier and replace it
		-- If found, set boolean to true
		if quest:find('Iniciada:') then
			quest = quest:gsub('Iniciada:%s*','')
			started = true --currently treated exactly the same as without
		end
		-- Look for quest in the list
		local subreqs = quests[quest]
		if subreqs then
			-- For every requirement, call this function again
			-- Handled the same, but 1 level deeper
			-- If limit is reached, skip
            if subreqs[1] then
                if level <= limit then
					sub_req_list = mw.html.create('ul')
                    for i, q in ipairs(subreqs) do
						local sub_list = p.JSON_reqs(q,level+1,limit)
						
						for k,v in pairs(sub_list) do ret[k] = v end
					end
                else
                    -- terminate recursion
                end
            end
		else
			-- If the requirement can't be found in the big list, don't recurse
		end
		ret[quest] = true
	end

	return ret
end

--
-- Function to tidy quest names into links
-- Any parenthetical (e.g. '(quest)') will be removed from the text, but remain in the link
-- 'Recipe for Disaster/' will be replaced in the RfD subquests, so that only the subquest name appears as text
-- Returns a link
-- The 'Full:' modifier is removed
--
function tidy_link(name)
	if name then
		if name:find('Completa:') then
			name = name:sub(10)
		end
		
		local alt = name
		
        if not name:find('(minimissão)') or name:find('(saga)') then
            alt = name:match('(.*)%(.*%)') or name
        end

		if name:find('A Receita do Desastre%/') then
			alt = name:gsub('A Receita do Desastre%/','')
		end

		name = string.format('[[%s|%s]]',name,alt)
	end
	return name
end

return p