Modul:NavHeader

Aus Steel Beasts Wiki
Version vom 3. September 2023, 08:02 Uhr von Dr.Thodt (Diskussion | Beiträge) (1 Version importiert)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Die Dokumentation für dieses Modul kann unter Modul:NavHeader/Doku erstellt werden

local NavHeader = {}

local metatable = {}
local methodtable = {}

metatable.__index = methodtable

--- Parse an argument to the recognized format
--- @param arg table|string|nil
--- @return table
local function parseArg( arg )
    if arg == nil then
        return nil
    end

    if type( arg ) == 'table' then
        return {
            [ 'link' ] = tostring( arg[ 1 ] ),
            [ 'text' ] = tostring( arg[ 2 ] ),
            [ 'external' ] = arg[ 3 ] or false
        }
    end

    return {
        [ 'link' ] = tostring( arg ),
        [ 'text' ] = nil,
        [ 'external' ] = false,
    }
end

--- Make a link from data
--- @param dataTable table
--- @return string
local function makeLink( dataTable, isPrev )
    if dataTable == nil then
        return ''
    end

    if dataTable.link == nil then
        error( 'Link must be set' )
    end

    local left = '[['
    local right = ']]'

    if dataTable.external ~= false then
        left = '['
        right = ']'
    end

    local text = ''
    if dataTable.text ~= nil then
        if dataTable.external ~= false then
            text = ' ' .. text
        else
            text = '|' .. text
        end
    end

    local out = left .. mw.text.trim( dataTable.link, '%[%]' ) .. text .. right
    
    local hasArrow = mw.ustring.find( out, '«', 0, true ) or mw.ustring.find( out, '»', 0, true )
    
    if not hasArrow then
    	if isPrev == true then
    		out = '« ' .. out
    	elseif isPrev == false then
    		out = out .. ' »'
    	end
	end

	return out
end


--- Makes the html table
--- @return string
function methodtable.make( self )
    local div = mw.html.create( 'div' )
            :attr( 'class', 'nav-header' )
            :tag( 'span' )
                :wikitext( makeLink( self.prevLink, true ) )
            :done()
            :tag( 'span' )
                :wikitext( makeLink( self.mainLink ) )
            :done()
            :tag( 'span' )
                :wikitext( makeLink( self.nextLink, false ) )
            :done()

    return tostring( div )
end


--- New Instance
--- @return table NavHeader
function NavHeader.new( self, prev, main, next )
    local instance = {
        prevLink = parseArg( prev ),
        mainLink = parseArg( main ),
        nextLink = parseArg( next )
    }

    setmetatable( instance, metatable )

    return instance
end

--- Entry for module calls
---
--- @return string
function NavHeader.fromArgs( frame )
    local args = require( 'Module:Arguments' ).getArgs( frame )

    local instance = NavHeader:new(
        args[ 1 ] or args[ 'prev' ] or args[ 'Zurück' ],
        args[ 2 ] or args[ 'main' ] or args[ 'Übersicht' ],
        args[ 3 ] or args[ 'next' ] or args[ 'Weiter' ]
    )

    return instance:make()
end

return NavHeader