Modulo:String/sandbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Moroboshi (discussione | contributi)
aggiungo base index a arraystring
Moroboshi (discussione | contributi)
Nessun oggetto della modifica
Riga 413:
posizione in cui inserire l'indice
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, ecc...)
Riga 421:
pre: eventuale stringa che precede l'unione delle stringhe
post: 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:
'puntata' imposta i parametri per una lista puntata
solo un elemento (in questo caso separatore/congiunzione/pre/post sono ignorati)
'ordinata' imposta i aprametri per una lista ordinata
'infobox' imposta l'unione come una lista, eccetto che nel caso ci sia
solo un elemento
Se lista è valorizzata separatore/congiunzione/pre/post sono ignorati, salvo il caso di 'infobox' e la
lista contenga solo un elemento.
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)
Line 433 ⟶ 438:
 
]]
function str.arraytostring(frame)
 
 
-- =================================================================
-- Classe per gestire i parametri
-- =================================================================
local Param = {}
Param.__index = Param
 
function Param.new(par_name, alt_name)
if not mw.ustring.find(par_name, '#') then par_name = par_name .. '#' end;
return setmetatable({
name = par_name,
base_name = mw.ustring.gsub(par_name, ' ?#', '', 1),
alt = alt_name or ''
}, Param)
end
 
function Param:get_other_value(args, index)
return args[mw.ustring.gsub(self.name, '#', tostring(index), 1)] or ''
end
 
function Param:get_first_value(args, index)
return args[mw.ustring.gsub(self.name, '#', tostring(index), 1)] or args[self.base_name] or args[self.alt_name] or ''
end
 
 
setmetatable(Param, { __call = function(_, ...) return Param.new(...) end })
-- =================================================================
-- fine dichiarazione classe per parametro
-- =================================================================
 
-- =================================================================
-- Classe per gestire i messaggio
-- =================================================================
local Message = {}
Message.__index = Message
 
function Message.new(msg)
-- converto parentesi graffe che sono state precedute da "\"
msg = mw.ustring.gsub(msg, '\\{', '{')
msg = mw.ustring.gsub(msg, '\\}', '}')
return setmetatable({
msg = msg,
values = {},
}, Message)
end
 
function Message:reset_values()
self.values = {}
end
 
function Message:add_value(value)
self.values[#self.values+1] = value
end
 
function Message:text()
local raw_message = mw.message.newRawMessage(self.msg, self.values)
return raw_message:text()
end
 
setmetatable(Message, { __call = function(_, ...) return Message.new(...) end })
-- =================================================================
-- fine dichiarazione classe per messaggio
-- =================================================================
 
 
local base_args = frame.args
local params = {}
local base_params = {}
if not base_args then return str._error('Lista parametri vuota') end
-- carico la lista dei parametri
local index = 1
while true do
local parameterpar_name = base_args['par' .. index] or (index == 1 and base_args['par']) or ''
if parameterpar_name == '' then break end;
--carico eventuale nome alternativo per il primo parametro
if not mw.ustring.find(parameter, '#') then
local alt_name = base_args['altpar' .. index] or (index == 1 and base_args['altpar']) or ''
return str._error('Non precisato segnaposto per indice in parametro "par' .. index .. '"')
params[index] = Param(par_name, alt_name)
end
params[#params+1] = parameter
base_params[#base_params+1] = mw.ustring.gsub(parameter, ' ?#', '', 1)
index = index + 1
end
--carico il messaggio e converto parentesi graffe che sono state precedute da "\"
local msg = base_args.msg or ''
if msg == '' then return str._error('Manca il messaggio da riprodurre.') end
msglocal message = mw.ustring.gsubMessage(msg, '\\{', '{')
elements = {}
msg = mw.ustring.gsub(msg, '\\}', '}')
-- carico gli altri parametri di formattazione
local Nmax = tonumber(base_args.nmax) or 0
-- elaboro i parametri effettivi
local args = frame:getParent().args
elements = { }
local base_index = tonumber(base_args.baseindex) or 1
local index = tonumber(base_args.Nmin) or base_index
local args = frame:getParent().args
while true do
-- estraggo il primo valore
if Nmax >0 and index > Nmax then break end
local valuesfound = {}false
for i, param in ipairs(params) do
local found = false
forlocal iv = 1param:get_first_value(args, #params doindex)
if v ~= '' then found = true end
local v = args[mw.ustring.gsub(params[i], '#', tostring(index), 1)] or (index == base_index and args[base_params[i]]) or ''
values[#values+1] = message:add_value(v)
end
if found then
elements[#elements+1] = message:text()
index = index + 1
end
-- elaboro i successivi valori
while found do
if Nmax > 0 and index > Nmax then break end
message:reset_values()
found = false
for i, param in ipairs(params) do
local v = param:get_other_value(args, index)
if v ~= '' then found = true end
message:add_value(v)
end
if not found then break end
elementelements[#elements+1] = mw.message.newRawMessage:text(msg, values)
elements[#elements+1] = element:text()
index = index + 1
end
Line 480 ⟶ 557:
local pre, post, separatore, congiunzione = '', '', '', ''
local lista = base_args.lista or ''
if lista == 'puntata' or (lista =='infobox' and #elements >1) then
ifpre #elements= '<UL> 1 then <LI>'
prepost = '<UL/LI>\n<LI/UL>'
postseparatore = '</LI>\n</ULLI>'
congiunzione = separatore = '</LI>\n<LI>'
elseif lista == 'ordinata' then
congiunzione = separatore
endpre = '<OL><LI>'
post = '</LI>\n</OL>'
separatore = '</LI>\n<LI>'
congiunzione = separatore
else
pre = base_args.pre or ''