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