Modulo:ParseTemplate

Da Wikisource.
chiamata test
  • __100%__
  • ____

local p={}
local c = require('Modulo:Common')
-- logica: riceve un nome pagina, un nome template e un parametro (numerico o nominale) 
-- e restituisce il valore del parametro

function p.getDato(frame) 
	local nomePagina = frame.args[1]
	local nomeParametro = frame.args[2]
	local nomiTemplates = {'Intestazione', 'Qualità', 'Autore'}
	mw.log('Pagina: ' .. nomePagina)
	for i, name in ipairs(nomiTemplates) do
		local tmpobj = p.parse(nomePagina, name)
		mw.log('Parse result: ' .. c.printElement(tmpobj))
		local valore = tmpobj[nomeParametro]
		mw.log('Template: ' .. name)
		mw.log('Parametro: ' .. nomeParametro)
		mw.log('Valore: ' .. (valore or ''))
		if valore and valore ~= '' then
			return valore
		end
	end
	return nil
end

function p.test(frame) 
	local nomePagina = frame.args[1]
	local nomeTemplate = frame.args[2]
	local nomeParametro = frame.args[3]
	local valoreDefault = frame.args[4]
	mw.log('Parametro: '..nomeParametro)
	local tmpobj = p.parse(nomePagina, nomeTemplate)
	local valore = tmpobj[nomeParametro]
	if valore and valore ~= '' then
		return valore
	else
		return valoreDefault
	end
end

function string.replace(text, old, new)
  local b,e = text:find(old,1,true)
  if b==nil then
     return text
  else
     return text:sub(1,b-1) .. new .. text:sub(e+1)
  end
end

-- logica: riceve un nome pagina e un nome template e restituisce un oggetto parseTemplate tmpobj dove:
-- tmpobj[0] è il nome del template
-- tmpobj[1]....tmpobj[n] sono i valori dei parametri posizionali
-- tmpobj["nomeParametro1"]....tmpobj["nomeParametroN"] sono i valori dei parametri nominali
function p.parse(nomePagina,nomeTemplate)
	local template={}
	local pagina={}
	local elements={}
	local x=""
	
	pagina.title=mw.title.new(nomePagina)
	if not pagina.title then
		return {}
	end
	pagina.text=pagina.title:getContent()
	template.object={}
	if pagina.text==nil then 
		return template.object
	end
	template.text=string.match(pagina.text,"%b{}",string.find(pagina.text,"{{"..nomeTemplate))
	
	if not template.text or template.text == '' then 
		return {}
	end
	
	template.text=string.sub(template.text,3,-3)
	template.coded=template.text
	template.object={}
	-- estrazione dei template interni
	for x in string.gmatch(template.text,"%b{}") do
		--escape delle parentesi tonde
		x = string.gsub(x, '%)', '%%)')
		x = string.gsub(x, '%(', '%%(')
		template.coded=string.gsub(template.coded,x,string.gsub(x,"%|","{{!}}"))
	end
	for x in string.gmatch(template.text,"%b[]") do
		
		template.coded=string.replace(template.coded,x,string.gsub(x,"%|","{{!}}"))
	end
--	return "<pre>"..template.coded.."</pre>"
--	end
--    function x()
	local patternx=""
	for x in string.gmatch(template.text,"%b[]") do
		
		template.coded=string.gsub(template.coded,patternx,string.gsub(x,"%|","{{!}}"))
	end
	elements=mw.text.split(template.coded,"|")
	-- elements contiene i vari parametri in forma di blocchi (elements[1] è  il nome del template)
	local n=0
	local valore=""
	x="<pre>"for i,v in ipairs(elements) do
		valore=string.gsub(v,"{{!}}","|")
		if string.find(valore,"=")==nil then
			template.object[n]=mw.text.trim(valore)
		else
			template.object[mw.text.trim(string.sub(valore,1,string.find(valore,"=")-1))]=mw.text.trim(string.sub(valore,string.find(valore,"=")+1))
		end
	end
	return template.object
end

return p