Moduuli:EdellinenSeuraava

Tämän moduulin ohjeistuksen voi tehdä sivulle Moduuli:EdellinenSeuraava/ohje

local export = {}



local function getIndexTitle(bookName)
    return "EdellinenSeuraava/data/" .. bookName
end


--- Lataa annetun sivun sivuluettelon.
--
-- @param titleObj: ladattavan moduulin titleobjekti
-- @return:     ladattu moduuli tai nil
local function getIndex(title)
    local titleObj = mw.title.makeTitle("Moduuli", getIndexTitle(title))

    if titleObj.exists then
        return require(titleObj.prefixedText)
    end

    error("Hakemistoa ei löydy: " .. titleObj.prefixedText)
end


local function traverse(tbl, leafFunc, enterPartFunc)
    local ret

    for i, v in ipairs(tbl) do
        if type(v) == "table" and v.osa ~= nil then
            assert(type(v.sivut) == "table", "Osalla ei ole sivuja")
            enterPartFunc(v.osa)
            ret = traverse(v.sivut, leafFunc, enterPartFunc)

        elseif type(v) == "table" and v.osa == nil then
            ret = leafFunc(v[1], v[2])

        else
            assert(type(v) == "string", "Virheellinen tyyppi: " .. type(v))

            ret = leafFunc(v, nil)
        end

        if ret ~= nil then
            return ret
        end
    end

    return nil
end


local function getStageImg(val)
    if val == nil then
        return ""
    end
    val = math.floor((val + 12.5) / 25) * 25
    return string.format("[[Kuva:%02d%%.svg|24px|%02d%% valmis]]", val, val)
end

local function makeHeader(args) 
	local frame = mw.getCurrentFrame()
    return frame:extensionTag{
		name = "indicator",
		content = getStageImg(args.stage),
		args = {
			name = "stage"
		}
    } .. frame:expandTemplate{
        title = 'Edellinen-seuraava',
        args = {
            [1] = args.prevText,
            ['kohde1'] = args.prevLink,
            [2] = args.nextText,
            ['kohde2'] = args.nextLink,
            ['muokkauslinkki'] = args.editLink,
            ['virheilmoitus'] = args.errorMsg,
        }
    }	
	
end


function export.getTitleInfo(titleObj)
    if not titleObj.isSubpage then
        error("ei alasivu")
    end

    local rootTitle = titleObj.rootText
    local subpageTitle = mw.ustring.gsub(titleObj.fullText, "^" .. rootTitle .. "/", "")
    local indexTable = getIndex(rootTitle)

    local match = false
    local prev
    local info = {
        cur = nil,
        prev = nil,
        next = nil,
    }
    local part

    local function enterPart(title)
        part = title
    end

    local function findPrevNext(title, stage)
        if title == subpageTitle then
            info.prev = prev
            info.cur = {
                title = title,
                stage = stage,
                part = part
            }
            match = true
        elseif match then
            info.next = {
                title = title,
                stage = stage,
                part = part
            }
            return true
        end
        prev = {
            title = title,
            stage = stage,
            part = part
        }
        return nil
    end

    traverse(indexTable, findPrevNext, enterPart)

    if not match then
        local indexTitle = getIndexTitle(rootTitle)
        error("Sivua ”" .. subpageTitle .. "” ei löydy hakemistosta ”Moduuli:" .. indexTitle .. "”")
    end

    return info
end


function export.edSeur(frame)
    local titleObj = mw.title.getCurrentTitle()

    local status, info = pcall(export.getTitleInfo, titleObj)

    if not status then
    	return makeHeader{
			--stage = info.cur.stage,
			errorMsg = info,
			editLink = 'Moduuli:' .. getIndexTitle(titleObj.rootText),
		}
    end	

	if not info then
    	return makeHeader{
			--stage = info.cur.stage,
			errorMsg = "Sivua ei löytynyt hakemistosta " .. titleObj.fullText,
			editLink = 'Moduuli:' .. getIndexTitle(titleObj.rootText),
		}
    end
    
    local cur = info.cur.title
    local prev = (info.prev and info.prev.title) or ""
    local next = (info.next and info.next.title) or ""
    local prevPath = titleObj.rootText .. "/" .. prev
    local nextPath = titleObj.rootText .. "/" .. next

	return makeHeader{
		stage = info.cur.stage,
		prevLink = prevPath,
		prevText = prev,
		nextLink = nextPath,
		nextText = next,
		editLink = 'Moduuli:' .. getIndexTitle(titleObj.rootText),
	}

end


function export.edellinen(frame)
    local titleObj = mw.title.getCurrentTitle()
    local info = export.getTitleInfo(titleObj)

    return info.prev.title
end

function export.seuraava(frame)
    local titleObj = mw.title.getCurrentTitle()
    local info = export.getTitleInfo(titleObj)

    return info.next.title
end



return export