Modulo:Avviso/sandbox

Da Wikivoyage.

La documentazione per questo modulo può essere creata in Modulo:Avviso/sandbox/man

--[[
	Source script:	https://it.wikivoyage.org/wiki/Modulo:Avviso
	Maintainer:		Andyrom75, Nastoshka
		v.1.0.0 -- Andyrom75 (novembre 2021)
		v.2.0.0 -- Nastoshka (gennaio 2024)
]]

-- --------------------------- Funzioni ausiliarie ---------------------------------------------

-- Meta funzione per impostare un valore di default per una tabella Lua
-- nel caso si tentasse l'accesso ad un parametro non esistente
-- Vedi: https://www.lua.org/pil/13.4.3.html
function setDefault (t, d)
  local mt = {__index = function () return d end}
  setmetatable(t, mt)
end

-- --------------------------- Costanti ---------------------------------------------

-- immagine per il banner di avviso
local IMAGE_PATHS = {
    importante = '[[File:Stop hand nuvola.svg|40px|link=]]',
    contenuto = '[[File:Emblem-important.svg|40px|link=]]',
    stile = '[[File:Broom icon.svg|40px|link=]]',
    statico = '[[File:Gnome globe current event.svg|40px|link=]]',
    struttura = '[[File:Merge-split-transwiki default.svg|40px|link=]]',
    avviso = '[[File:Info non-talk.png|40px|link=]]',
    disambigua = '[[File:Info non-talk.png|40px|link=]]',
    protezione = '[[File:Padlock.svg|40px|link=]]',
    disclaimer = '[[File:Nuvola_apps_important.svg|40px|link=]]',
    trasparente = '[[File:No image.svg|link=]]',
    -- vetrina = '[[File:Crystal Clear action bookmark silver and gold doubt.svg|40px|link=]]',
    default = '[[File:Info non-talk.png|40px|link=]]'
}
setDefault(IMAGE_PATHS, IMAGE_PATHS.default)

-- determina il css da usare e in alcuni casi categorizza (dipendentemente dal namespace)
local WARNING_TYPE = {
    importante = 'avviso-importante',
    contenuto = 'avviso-contenuto',
    stile = 'avviso-stile',
    statico = 'avviso-statico',
    struttura = 'avviso-struttura',
    avviso = 'avviso-informazioni',
    disambigua = 'avviso-disambigua hatnote',
    protezione = 'avviso-generico',
    disclaimer = 'avviso-disclaimer',
    default = 'avviso-informazioni'
}
setDefault(WARNING_TYPE, WARNING_TYPE.default)

local IMAGE_BOX_SIZE_DEFAULT = '52px'



-- --------------------------- Funzioni principali ---------------------------------------------

-- Stabilisci l'icona da usare a lato del testo
-- Se un'immagine è stata passata come parametro, prendi quella
-- altrimenti usa il tipo come fallback (se il tipo non esiste nell'array / table, usa il default) 
local function getWarningImage(args)

    -- Immagine volantariamente disattivata
    local isImageDisabled = function() return args['2'] == 'nessuna' or args.immagine == 'nessuna' end
    if isImageDisabled() then
    	return ' '
    end
	
	local imagebox_width = args.imageboxsize or IMAGE_BOX_SIZE_DEFAULT    
	-- Immagine passata come parametro 
    local isPassedImageAvailable = function() return not (args['2'] == nil or args['2'] == '') or not (args.immagine == nil or args.immagine == '') end
    
	if isPassedImageAvailable() then
        local passed_image = args['2'] or args.immagine
        return '<div style="width:' .. imagebox_width .. ';">' .. passed_image .. '</div>'
	end


    -- fallback (usa il tipo, o in alternativa il valore di default)
        return '<div style="width:' .. imagebox_width .. ';">' .. IMAGE_PATHS[args.tipo] .. '</div>'
end

local function get_right_image(args)
    local right_image = args['immagine a destra'] or false
    
    if not right_image then
        return ''
    end

    return '<div class="avviso-immaginedestra">'
        .. '<div style="width:' .. (args.imageboxsize or IMAGE_BOX_SIZE_DEFAULT) .. ';"> ' .. right_image .. ' </div>'
        .. '</div>'
end

local function getWarningText(args)
    local text = args['1'] or args.testo or ''
    return tostring(text)
end

local function getCategoryTag(args)
    local title_obj = mw.title.getCurrentTitle()

    local namespace =  title_obj.namespace
    local page_title = title_obj.text

    local should_be_categorized = args.tipo == 'avviso' or args.tipo == 'importante'

    if namespace == 8 then -- MediaWiki namespace
        return '[[Categoria:Messaggi di sistema con avviso|' .. page_title .. ']]'
    end

    if namespace == 0 and should_be_categorized then -- Main namespace, tipo avviso o importante
        return '[[Categoria:Articoli con avviso]]'
    end

    return '' -- Non categorizzare
end

-- --------------------------- Main logic ---------------------------------------------
local function generateWarningBox(frame)
    local args = frame.args

    -- raccogliamo i pezzi del puzzle
    local style = args.stile or ''
    local warningType = WARNING_TYPE[args.tipo]
    local warningImage = getWarningImage(args)
    local warningRightImage = get_right_image(args)
    local warningText = getWarningText(args)
    local categoryTag = getCategoryTag(args)

    -- e mettiamo insieme il tutto ;)
    local htmlOutput = {
        '<div style="' .. style .. '" class="plainlinks noprint avviso ambox ' .. warningType .. '">',
        '<div class="avviso-immagine mbox-image">',
        warningImage,
        '</div>',
        '<div class="avviso-testo mbox-text-span" style="' .. (args['stile testo'] or '') .. '">',
        warningText,
        '</div>',
        warningRightImage,
        '</div>',
        categoryTag
    }
    -- mw.log('htmlOutput: ' .. table.concat(htmlOutput)) -- DEBUG
    return table.concat(htmlOutput)
end

-- --------------------------- Interfaccia del modulo ---------------------------------------------

local p = {} -- package to be exported

-- per la differenza tra frame e frame:getParent() vedi
-- - https://en.wikipedia.org/wiki/Help:Lua_for_beginners#Parent_frame
-- - https://it.wikivoyage.org/wiki/Modulo:Arguments/man
function p.avvisoTemplate(frame)
    return generateWarningBox(frame:getParent()) -- se invocato attraverso un template
end

function p.avviso(frame)
    return generateWarningBox(frame) -- se invocato direttamente in un template
end

return p