Modulo:String/sandbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Moroboshi (discussione | contributi)
fix
Moroboshi (discussione | contributi)
test arrayto string versione plain
Riga 402:
return mw.ustring.rep( frame.args[1] or '', repetitions )
end
 
-- =================================================================
-- 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] or ''
end
 
 
setmetatable(Param, { __call = function(_, ...) return Param.new(...) end })
-- =================================================================
-- fine dichiarazione classe per parametro
-- =================================================================
 
-- =================================================================
-- Classe per gestire il 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, '\\}', '}')
local frame = mw.getCurrentFrame():getParent() or mw.getCurrentFrame()
 
return setmetatable({
msg = msg,
values = {},
frame = frame,
}, Message)
end
 
function Message:reset_values()
self.values = {}
end
 
function Message:add_value(value)
self.values[#self.values+1] = value
end
 
function Message:text()
return self.frame:preprocess(mw.message.newRawMessage(self.msg, self.values):plain())
end
 
setmetatable(Message, { __call = function(_, ...) return Message.new(...) end })
-- =================================================================
-- fine dichiarazione classe per messaggio
-- =================================================================
 
 
 
--[[
Line 425 ⟶ 492:
'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.
Line 438 ⟶ 505:
 
]]
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] or ''
end
 
 
setmetatable(Param, { __call = function(_, ...) return Param.new(...) end })
-- =================================================================
-- fine dichiarazione classe per parametro
-- =================================================================
 
-- =================================================================
-- Classe per gestire i messaggi
-- =================================================================
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, '\\}', '}')
 
-- break msg in msg_table, odd position are fixed string, even position are a parameter number to be substitued
local msg_table = {}
local last_position = 1
while true do
sep_start, sep_end, par_number = mw.ustring.find(msg, '%$(%d+)', last_position) -- find the next '$n' in the string
if sep_start~=nil then -- separator found
if sep_start == 1 then
table.insert(msg_table, '') -- il $n è subito a inizio stringa, salvo la string vuota al primo posto
else
table.insert(msg_table, mw.ustring.sub(msg, last_position, sep_start-1))
end
table.insert(msg_table, tonumber(par_number))
last_position=sep_end + 1 -- save next position to start
else
table.insert(msg_table, mw.ustring.sub(msg, last_position) or '') -- Save what's left in msg_tabele
break
end
end
return setmetatable({
msg_table = msg_table,
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 t = {}
for i = 1, #self.msg_table, 2 do
table.insert(t, self.msg_table[i])
table.insert(t, self.values[self.msg_table[i+1]] or '')
end
local msg = table.concat(t)
return frame:preprocess(msg)
end
 
setmetatable(Message, { __call = function(_, ...) return Message.new(...) end })
-- =================================================================
-- fine dichiarazione classe per messaggio
-- =================================================================
 
 
local base_args = frame.args
Line 542 ⟶ 520:
index = index + 1
end
--carico il messaggio
local msg = base_args.msg or '$1'
--if msg == '' then return str._error('Manca il messaggio da riprodurre.') end
local message = Message(msg)
elements = {}
Line 551 ⟶ 530:
local index = tonumber(base_args.Nmin) or base_index
local args = frame:getParent().args
-- estraggo il primo valore
local found = false
for i, param in ipairs(params) do
Line 558 ⟶ 537:
message:add_value(v)
end
if found then
elements[#elements+1] = message:text()
index = index + 1