Modulo:String/sandbox: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
aggiungo base index a arraystring |
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
'puntata' imposta i parametri per una lista puntata
'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 = {}
if not base_args then return str._error('Lista parametri vuota') end
-- carico la lista dei parametri
local index = 1
while true do
local
if
--carico eventuale nome alternativo per il primo parametro
local alt_name = base_args['altpar' .. index] or (index == 1 and base_args['altpar']) or ''
params[index] = Param(par_name, alt_name)
index = index + 1
end
--carico il messaggio
local msg = base_args.msg or ''
if msg == '' then return str._error('Manca il messaggio da riprodurre.') end
elements = {}
-- carico gli altri parametri di formattazione
local Nmax = tonumber(base_args.nmax) or 0
local base_index = tonumber(base_args.baseindex) or 1
local index = tonumber(base_args.Nmin) or base_index
local args = frame:getParent().args
-- estraggo il primo valore
for i, param in ipairs(params) do
if v ~= '' then found = true end
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
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
congiunzione
elseif lista == 'ordinata' then
post = '</LI>\n</OL>'
separatore = '</LI>\n<LI>'
congiunzione = separatore
else
pre = base_args.pre or ''
|