Modulo:String/sandbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Moroboshi (discussione | contributi)
typo
Moroboshi (discussione | contributi)
modifico arraytostring con la sintassi più estesa
Riga 404:
 
--[[
Funzione per unire una listao più liste di valori in una stringa.
 
Uso:
{{#invoke:String|arraytostring|nomevarpar1=xxx|formatopar2=xxx....|separatoreparn=xxxx|msg=msg|separator=|congiunzione=|prefazione=|postfazione=|lista=}}
 
Parametri:
nomevarpar1...parn: ili nomenomi base delledei variabiliparametri da unireinserire nel messsaggio, devedevono contenere il carattere '#' che precisa la
posizione in cui inserire l'indice
-- msg: il messaggio (cioè la riga unitaria) in cui eventuali caratteri '{', '}' dovranno essere
formato: eventuale trasformazione da applicare al valore delle variabili, la stringa "%0" precisa
preceduti da '\', mentre doveuna inserire"|" ildovrà valoreessere inserita con il dellatemplate variabile{{!}}.
-- I valori da sostituire sono da inserire come $n ($1 sarà sostituito dal
-- valore di par1, $2 dal valore di par2, ecc...)
separatore: La stringa da inserire tra ogni valore
congiunzione: La stringa da inserire invece di separatore tra l'ultimo e il penultimo valore. Se
non precisato viene usato il valore di separatore
prefazione: eventuale stringa che precede l'unione delle stringhe
postfazione: eventuale stringa che segue l'unione delle stringhe
lista: se valorizzata a 'infobox' imposta l'unione come una lista, eccetto che nel caso ci sia
solo un elemento (in questo caso separatore/congiunzione/prefazione/postfazione sono ignorati)
Nmin = indice iniziale da cui partire a scandire i parametri (di default pari a 1)
Nmax = indice massimo a cui arrivare con i parametri (se non precisato illimitato)
 
-- Esempi di chiamata:
{{#invoke:string:arraytostring|par1=var#|separatore=,|congiunzione=#32;e#32;}}
-- {{#invoke:string:value_listarraytostring|par1=disegnatore #|par2=disegnatore # nota|msg = $1 <small>$2</small>|lista=infobox }}
-- {{#invoke:string:value_listarraytostring|par1=editore #|par2=etichetta #|par3=editore # nota| msg=$1 \{\{#if:$2{{!}}$2 <small>$3</small>\}\}|lista=infobox }}
 
Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli
spazi iniziali e finali. Questo probabilmente non è il comportamento desiderato nel caso di
separatore e congiunzione. Quindi conviene generalmente passare questi come parametri posizionali.
]]
function str.arraytostring(frame)
local new_args = str._getParameters( frame.args, {'nomevar', 'formato', 'separatore',
'congiunzione', 'Nmin', 'Nmax'} );
local nomevar = new_args['nomevar'] or ""
if not mw.ustring.find(nomevar, '#') then
return str._error( 'Non precisato segnaposto per indice' );
end
local formato = new_args['formato']
if not formato or formato=="" then formato="%0" end
local separatore = new_args['separatore'] or ""
local congiunzione = new_args['congiunzione'] or separatore
local vars = {}
local index = tonumber(new_args.Nmin) or 1
local Nmax = tonumber(new_args.Nmax)
local pframe = frame:getParent()
while true do
local value = pframe.args[mw.ustring.gsub(nomevar, '#', tostring(index))]
if not value and index == 1 then
value = pframe.args[mw.ustring.gsub(nomevar, '#', "")]
end
if not value then break end
vars[#vars+1] = mw.ustring.gsub(value, '.*', formato, 1)
index = index + 1
if Nmax and (index > Nmax) then break end
end
return mw.text.listToText(vars, separatore, congiunzione)
end
 
-- Generazione di liste di oggetti usate in campi di infobox come template:Personaggio
-- Uso:
-- {{#invoke:String|infobox_list|par1=xxx|par2=xxx....|parn=xxxx|msg=msg}}
--Parametri:
--par1...parn: i nomi dei parametri da inserire nel messsaggio
--msg: il messaggio (cioè la riga unitaria) in cui eventuali caratteri '{', '}' dovranno essere
-- preceduti da '\', mentre una "|" dovrà essere inserita con il template {{!}}.
-- I valori da sostituire sono da inserire come $n ($1 sarà sostituito dal
-- valore di par1, $2 dal valore di par2)
-- nmax: numero massimo di righe (0 o non definito = illimitate)
-- Esempi di chiamata:
-- {{#invoke:string:value_list|par1=disegnatore #|par2=disegnatore # nota|msg = $1 <small>$2</small> }}
-- {{#invoke:string:value_list|par1=editore #|par2=etichetta #|par3=editore # nota| msg=$1 \{\{#if:$2{{!}}$2 <small>$3</small>\}\} }}
 
function str.infobox_list(frame)
local base_args = frame.args
local params = {}
Line 481 ⟶ 449:
index = index + 1
end
--carico il messaggio e converto parentesi graffe e | che sono statistate precedutiprecedute da "\"
msg = base_args.msg or ''
if msg == '' then return str._error('Manca il messaggio da riprodurre.') end
msg = mw.ustring.gsub(msg, '\\{', '{')
msg = mw.ustring.gsub(msg, '\\}', '}')
-- numerocarico massimogli altri parametri di righeformattazione
local nmaxNmax = tonumber(base_args.nmax) or 0
-- elaboro i parametri effettivi
local args = frame:getParent().args
rowselements = {'<ul>\n<li>' }
local index = tonumber(base_args.Nmin) or 1
while true do
if nmaxNmax >0 and index > nmaxNmax then break end
local values = {}
local found = false
Line 502 ⟶ 470:
end
if not found then break end
rowelement = mw.message.newRawMessage(msg, values)
rowselements[#rowselements+1] = rowelement:text()
index = index + 1
end
if #rowselements == 10 then return table.concat(args, '\n') end
-- carico separatori, congiunzione, prefazione e postazione
if #rows == 2 then return rows[2] end
local prefazione, postfazione, separatore, congiunzione = '', '', '', ''
rows[#rows+1] = '</ul>'
local lista = base_args.lista or ''
return table.concat(rows, '</li>\n<li>')
if lista == 'infobox' then
if not#elements value and index ==> 1 then
prefazione = '<UL><LI>'
postazione = '</LI>\n</UL>'
separatore = '</LI>\n<LI>'
congiunzione = separatore
end
endelse
prefazione = base_args.prefazione or ''
postfazione = base_args.postfazione or ''
local separatore = new_args['base_args.separatore'] or ""''
local congiunzione = new_args['base_args.congiunzione'] or separatore
end
return prefisso .. mw.text.listToText(varselements, separatore, congiunzione) .. postfisso
end