Modulo:Formatnum retrocompatibile

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Questo modulo serve a formattare i numeri nel parametro in input. Il risultato è molto simile alla funzione parser formatnum, che il modulo utilizza internamente, con le seguenti differenze:

  • Se l'argomento è un numero avente solo virgole come separatore, viene lasciato inalterato;
  • Se l'argomento è un numero avente solo spazi ed evenutalmente punti come separatori, converte gli spazi in spazi indivisibili (come separatori delle migliaia);
  • In caso di intervalli numerici (ad es. "123-456"), il trattino non viene convertito in un segno meno (U+2212).

Il modulo va utilizzato solamente nei parametri dei template che si aspettano un numero da formattare, ma a cui molte voci passano un valore non strettamente numerico. Poiché passare argomenti non numerici a formatnum è deprecato, la pagina verrebbe categorizzata in Categoria:Pagine con argomenti di formatnum non numerici. Il modulo cerca di evitarlo, aggiungendo invece delle categorie di tracciamento più specifiche che permettono di capire meglio come viene usato il parametro:


local p = {}

local function add_cat(cat)
	cat = '[[Categoria:' .. cat .. ']]'
	return mw.title.getCurrentTitle().namespace == 0 and cat or ''
end

function p.main(frame)
	local str = frame.args[1]

	if str == '' then
		-- Stringa vuota, ad esempio in caso di parametro opzionale etc.
		return ''
	elseif mw.ustring.match( str, "^%-?[%d.]+$" ) then
		-- Caso semplice, un numero nel formato corretto
		return p._formatnum( str )
	elseif mw.ustring.match( str, "^%-?[%d.,]+,[%d.,]+$" ) then
		-- Numero con virgole, lasciamo inalterato
		return str .. add_cat('Modulo formatnum usato con virgole')
	elseif mw.ustring.match( str, "^%-?%d+ [%d. ]+$" ) then
		-- Numero con spazi, li interpretiamo come separatori delle migliaia
		return p._formatnum( mw.ustring.gsub( str, " ", "" ) ) .. add_cat('Modulo formatnum usato con spazi')
	elseif mw.ustring.match( str, "^%-?[%d.]+ *[-–] *%-?[%d.]+$" ) or mw.ustring.match( str, "^[dD]a %-?[%d.]+ a %-?[%d.]+$" ) then
		-- Intervallo numerico, formattiamo solo i numeri escludendo eventuali trattino e segni meno
		return ( mw.ustring.gsub( str, "[%d.]+", p._formatnum ) ) .. add_cat('Modulo formatnum usato con intervallo')
	elseif mw.ustring.match( str, "^%a+%.? %-?[%d.]+$" ) then
		-- Parola seguita dal numero (ad es. "circa 123"), formattiamo il numero
		return ( mw.ustring.gsub( str, "%-?[%d.]+", p._formatnum ) ) .. add_cat('Modulo formatnum usato con testo prima del numero')
	elseif mw.ustring.match( str, "^%a+ %-?[%d.]+ *[-–] *[%d.]+$" ) then
		-- Parola seguita da intervallo, formattiamo i numeri escludendo il trattino
		return ( mw.ustring.gsub( str, "[%d.]+", p._formatnum ) ) .. add_cat('Modulo formatnum usato con testo e intervallo')
	elseif mw.ustring.match( str, "^%-?[%d.]+ *\127'\"`UNIQ%w*%-+ref%-%w*%-QINU`\"'\127$" ) then
		-- Numero seguito da nota, possiamo applicare il formatnum perché ignora le note
		return p._formatnum( str )
	else
		-- Tutto il resto. Usiamo formatnum direttamente
		return p._formatnum( str ) .. add_cat('Modulo formatnum usato con qualcosa di imprevisto')
	end
end

function p._formatnum( str )
	return mw.getCurrentFrame():preprocess( "{{formatnum:" .. str .. "}}" )
end	

return p