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.

  1. 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:
  2. 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.
  3. 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.
  4. 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.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.