Modul:Benutzer:ireas
Die Dokumentation für dieses Modul kann unter Modul:Benutzer:ireas/Doku erstellt werden
-- Navi 2015-08-02 by ireas
-- Generates a multilevel navigation.
-- * get: returns the navigation for the current page
-- the data that is used to generate the template -- should be included from
-- a data page
local data = {
base = "Wikipedia:Wiki Loves Monuments 2015/Deutschland",
template = "Benutzer:Ireas/test/navi",
pages = {
-- "WLM 2015"
{
"WLM 2015",
page = "",
pages = { "Preise", "Jury" },
},
-- "Orga"
{
"Orga",
page = "/Organisation",
pages = {
"Zeitplan",
{
"Kick-off in Wiesbaden",
page = "/Kick-off Wiesbaden"
},
{
"Netzwerk-Treffen in Weimar",
page = "/WLM-Netzwerk-Treffen in Weimar"
},
},
},
},
}
-- Returns 'y' if `value` evaluates to `true` and an empty string otherwise.
local function booleanToYesEmpty(value)
return (value) and 'y' or ''
end
-- Computes the ‘nstitle’ (local namespace and title) of the given `page`
-- (a string or a table containing the configured information),
local function getNstitle(base, page)
if type(page) == "string" then
-- if page is a string, it’s the name of the supage
return base .. '/' .. page
else
-- page is a table --> [1] is the title, [page] is the page name
local pageTitle = page.page
if pageTitle and pageTitle ~= '' then
if pageTitle:sub(1, 1) == "/" then
-- it’s a sub-page of the base
return base .. pageTitle
else
-- it’s a regular page name
return pageTitle
end
else
-- page is empty --> base name
return base
end
end
end
-- Returns the title for the given `page` to use in the navigation.
local function getNaviTitle(page)
return (type(page) == "string") and page or page[1]
end
-- Tries to find a page with the given `nstitle` (local namespace and title) in
-- the given list of `pages` and returns the position of the entry (or `nil` if
-- it cannot be found). The position is a table of indizes. `base` is the base
-- name of the pages in the navigation. This function is called recursively, and
-- `current` is the current position (optional for the first call).
local function findPosition(nstitle, base, pages, current)
local position = current or {}
-- Loop through the current list of pages and try to find a matching
-- entry.
for i = 1, #pages do
if getNstitle(base, pages[i]) == nstitle then
-- We found our page!
position[#position + 1] = i
return position
end
end
-- No direct match, so try go to the next level
for i = 1, #pages do
local subpages = pages[i].pages
if subpages then
local subpagePosition = position
subpagePosition[#subpagePosition + 1] = i
subpagePosition = findPosition(nstitle, base, subpages,
subpagePosition)
if subpagePosition then
-- If we found the entry, return the position. Otherwise
-- continue.
return subpagePosition
end
end
end
-- The page was neither found on this level nor on any sublevel
return nil
end
-- Creates the wikitext for the navigation based on the configured data
-- (the given `base` page and the current `pages` to look at) and the given
-- `position` of the current entry. `frame` is used to include templates. This
-- function is called recursively, and `level` is the current recursion level
-- starting at 1. `template` is the item template included for every navi item.
-- `parentSelected` is `true` if the parent of this level was selected or
-- if this is the first level.
local function buildNavi(frame, template, base, pages, position, level,
parentSelected)
local text = ""
for i = 1, #pages do
-- print this page
local page = pages[i]
local selected = (parentSelected and level <= #position and
position[level] == i)
local hasChildren = (selected and page.pages)
local nstitle = getNstitle(base, page)
local naviTitle = getNaviTitle(page)
local args = {
page = nstitle,
title = naviTitle,
hasChildren = booleanToYesEmpty(hasChildren),
selected = booleanToYesEmpty(selected),
level = level,
}
text = text .. frame:expandTemplate({ title = template, args = args})
text = text .. '\n'
-- print the subpages if this item is selected and there are children
if selected and page.pages then
local subpages = page.pages
local subpagePosition = position
subpagePosition[#subpagePosition + 1] = i
text = text .. buildNavi(frame, template, base, subpages,
subpagePosition, level + 1, selected)
end
end
return text
end
-- Reads the data in `data`, tries to identify the position of the given
-- `title` and returns the appropriate wiki code. `frame` is used to
-- evaluate templates.
local function getNavi(title, frame)
local nstitle = title.nsText .. ':' .. title.text
local position = findPosition(nstitle, data.base, data.pages)
if position then
return buildNavi(frame, data.template, data.base, data.pages, position,
1, true)
else
return "Es existiert kein Navieintrag für die Seite " .. nstitle
end
end
local p = {}
function p.get(frame)
local title = mw.title.getCurrentTitle()
-- if "debugns" and "debugtitle" are set: use custom page for debugging
if frame.args.debugns and frame.args.debugtitle then
title = mw.title.makeTitle(frame.args.debugns, frame.args.debugtitle)
end
return getNavi(title, frame)
end
return p
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.