وحدة:تغييرات ذات علاقة

local p={}

function getParam(frame)
    -- This is a longwinded way to return all the args (first choice) or parent.args (second choice) in an array.
    local parent, pargs, args
    local param={}
    parent = frame['parent']
    if (parent) then
        pargs = parent['args']
    end
    if (pargs) then
        for k,v in pairs(args) do
            param[k] = v
        end
    end
    args = frame['args']
    if (args) then
        for k,v in pairs(args) do
            param[k] = v
        end
    end
    return param
end

function getIndexpage(page)
	-- get the contents of either the current page (inadvisable...) or a specified page
	-- returns either a title object or an error string, and a boolean true for successful completion
	local indexpage
    if (page) then
        indexpage = mw.title.new(page)
        if (not(indexpage)) then
            return '<span style="color:red">[[Module:Related changes]] error: failed to access page: [[' + tostring(page) + ']]</span>',false
        end
    else
        indexpage = mw.title.getCurrentTitle()
        if (not(indexpage)) then
            return '<span style="color:red">[[Module:Related changes]] bug: failed to access getCurrentTitle!</span>',false
        end
    end
    return indexpage, true
end

function getLinks(frame,indexpage)
	local index = indexpage:getContent() or "" -- indexpage should exist, so no further checking for errors, just return blank
	local nextLink = mw.ustring.gmatch(index,"%[%[([^%]|]+)[^%]]-%]%]")
	local linklist = {}
	for link in nextLink do
		local linkval = frame:callParserFunction('REVISIONTIMESTAMP', link)
		if (mw.ustring.len(linkval) > 8) then -- don't even index pages that don't get meaningful results
            linklist[tostring(link)] = linkval .. '|' .. frame:callParserFunction('REVISIONUSER', link)
        end
    end
    return linklist
end

function display(linklist, options)
	if (not(options)) then
		options = 'd-'
	end
	local sorttype = mw.ustring.match(options,'([%l%u])')
    local sortdir = mw.ustring.match(options,'([%+%-])')
	if (sorttype == 'n') then
		sorttype = 'name'
		if (sortdir == '-') then
			sortdir = 'descending'
		else
			sortdir = 'ascending'
	    end
    else
	    sorttype = 'date'
	    if (sortdir == '+') then
			sortdir = 'ascending'
		else
			sortdir = 'descending'
	    end
	end
	local outsort, outarray = {}, {'{| class="wikitable sortable"\n!Name\n!Last edited\n!Last editor'}
	for k,v in pairs(linklist) do
		if sorttype == 'name' then
    	    table.insert(outsort, k..'|'..v)
    	else
    		table.insert(outsort, v..'|'..k)
        end
	end
	table.sort(outsort)
	for i = 1,#outsort do
		local n, d, u, split
		split = mw.text.split(outsort[i],'|',true)
		if sorttype == 'name' then
		    n, d, u= split[3], split[1], split[2]
        else
    	    d, u, n = split[1], split[2], split[3]
    	end
    	if ((mw.ustring.sub(n, 1, 5) == 'File:') or (mw.ustring.sub(n, 1, 6) == 'Image:')) then
    		n = ':' .. n
    	end
		table.insert(outarray,'\n|-\n|[['..(n or '[[Module:Related changes]] bug: missing name') .. ']]\n|' .. (d or '[[Module:Related changes]] bug: missing date') .. '\n|[[User:' .. u .. ']]')
	end
	table.insert(outarray,'\n|}')
	return table.concat(outarray)
end

function filter(linklist, action)
	-- pass
end

function p.main(frame)

    local param = getParam(frame) -- get all parameters in param tabel; args override parent.args
    local indexpage = getIndexpage(param.page)
    local linklist = getLinks(frame,indexpage)
    for operation = 1, #param do
    	filter(linklist, param[operation])
    end
    if param.nowiki then
    	return frame:preprocess('<nowiki>'..display(linklist)..'</nowiki>')
    else
    	return display(linklist,param.options)
    end
end

return p