Modulo:Font to span

Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Font to span/man (modifica · cronologia)
Sandbox: Modulo:Font to span/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:Font to span/test (modifica · cronologia · Esegui)
La funzione principale di questo modulo è la conversione dei tag font
, deprecati in HTML 5, in tag span
con opportuno stile. Per utilizzarlo (sempre e comunque in subst) è necessario rintracciare un tag font di apertura e il corrispettivo tag di chiusura con un'espressione regolare e inserire tutto il testo trovato come primo parametro. Ad esempio, è possibile procedere così:
- Utilizzare l'espressione regolare
<font[^>]+>[^<]+<\/font>
per trovare il testo da sostituire. - Sostituirlo con
{{subst:#invoke:Font to span|main|1=$&}}
, dove$&
è l'intero testo trovato; occorre ricordarsi di inserire1=
altrimenti i simboli di uguale contenuti nel tag generano errore.
Il modulo provvede da solo alle operazioni necessarie, convertendo i parametri di dimensione, colore e face del testo. Inoltre, se all'interno dei tag si trova solo un wikilink o un link esterno con titolo, il tag viene spostato dentro al link per mantenere il colore voluto. L'unico caso non supportato è quello in cui i tag contengano soltano un link esterno senza titolo, per i quali sembra non esserci una soluzione semplice. Occorre inoltre fare particolare attenzione al subst, evitando di effettuare la sostituzione all'interno di tag <ref>...</ref>
o <includeonly>...</includeonly>
.
È inoltre possibile utilizzare il modulo per incorporare due tag, siano essi font
o span
(anche misti), situati uno dentro l'altro con lo stesso testo in mezzo. In questo caso, il modulo provvede ad estrarre dai due tag lo stile effettivo da utilizzare, cercandolo rispettivamente in:
- Style del tag internoParametri sparsi nel tag internoStyle del tag esternoParametri sparsi nel tag esterno
Trovati i parametri finali li converte e semplifica come nella modalità principale e restituisce un unico tag con i parametri corretti. Per utilizzare questa funzionalità, è necessaria un'espressione regolare che trovi tutto il testo dall'apertura del tag esterno alla sua chiusura.
Ad esempio, sul testo
<span style="color:green;font-family:Verdana"><font face=Monospace size=2>Testo di prova senza alcun significato messo qui come esempio</font></span>
è necessaria una regex come (<(font|span)[^>]+>)(<(font|span)[^>]+>)[^<]+<\/\4><\/\2>
, con un gruppo catturante sul tag esterno e uno sul tag interno. Come replace occorre chiamare il modulo nel seguente modo: {{subst:#invoke:Font to span|sempl|1=$1|2=$3|3=$&}}
. Il risultato sarà <span style="color:green;font-family:Monospace;font-size:small">Testo di prova senza alcun significato messo qui come esempio</span>
- Nota
- Le dimensioni troppo grandi (+4, 7 e maggiori) vengono convertite in un formato fisso espresso in pixel, anziché variabile come per le altre.
local p={};
function p.main(frame)
str=frame.args[1]
local substype
--substype per eventuale spostamento testo
if string.match(str, "<font[^>]+>%[%[[^%]]+]]<%/font>") then
substype=1; --solo wikilink
elseif string.match(str, "<font[^>]+>%[[^%]]+ [^%]]+]<%/font>") then
substype=2; --solo link esterno CON TITOLO
elseif string.match(str, "<font[^>]+>%[[^%] ]+]<%/font>") then
return str; --solo link esterno SENZA TITOLO: il font colora il numero progressivo dall'esterno, lo span no; non ho trovato un modo per colorarlo con span interno.
end --negli altri casi i risultati sono equivalenti
--riduzione stringa al solo font di apertura
n=string.find(str, ">")
s=string.sub(str,1,n)
--ricava face
face=string.match(s, "face=%a+")
if face==nil then face=string.match(s, 'face="[%a, ]+"') end
if face~=nil then face=string.gsub(string.sub(face, 6), '"', "") end
--ricava size
size=string.match(s, 'size="?[-+]?%d+[px]*"?')
if size~=nil then size=string.gsub(string.sub(size, 6), '"', "") end
--ricava color
color=string.match(s, 'color="?#?%w+"?')
if color~=nil then color=string.gsub(string.sub (color, 7), '"', "") end
--ricava style
style=string.match(s, 'style="[^"]+"')
if style~=nil then style=string.gsub(string.sub (style, 7), '"', "") end
--tabella conversione size
stab = {
['1'] = '10px',
['2'] = '13px',
['3'] = '16px',
['4'] = '18px',
['5'] = '24px',
['6'] = '32px',
['7'] = '48px',
['-2'] = '10px',
['-1'] = '13px',
['+1'] = '18px',
['+2'] = '24px',
['+3'] = '32px',
['+4'] = '48px'
}
--conversione size secondo tabella
if size~=nil then size = stab[size] or size end
--aggiunge cancelletto a colore se in formato hex e sottinteso. Il pattern è molto brutale ma funziona perché non esistono nomi di colore che lo rispettano
if color~=nil and string.match(color, "^[a-f0-9]+$") then color = "#" .. color end
-- elimina parametri duplicati, lascia quello in style
if style~=nil then
if color~=nil and string.match(style, "color:") then color=nil end
if size~=nil and string.match(style, "font%-size:") then size=nil end
if face~=nil and string.match(style, "font%-face:") then face=nil end
end
--Mette insieme lo style
if style==nil then style="" end
if string.match(style, "[%a ]+[^;]$") then style = style .. ";" end
if color~=nil then style=style .. "color:" .. color .. ";" end
if size~=nil then style=style .. "font-size:" .. size .. ";" end
if face~=nil then style=style .. "font-family:" .. face .. ";" end
--Via le virgolette conclusive
style = string.gsub(style, ";+$", "")
--Costruisce lo span e ci inserisce il testo (substype 0)
span='<span style="' .. style .. '">'
text=string.gsub(str, "<%/?font[^>]*>", "")
result= span .. text .. "</span>"
--Spostamento per substype = 1
if substype==1 then
wl=string.sub(str,string.find(str, "%[%["),string.find(str, "]]"))
if string.match(wl, "|") then
--Wikilink con pipe
wl1=string.sub(wl,1,string.find(wl, "|"))
wl2=string.gsub(string.sub(wl,string.find(wl, "|"),string.find(wl, "]")), "[|%]]", "")
result=wl1 .. span .. wl2 .. "</span>]]"
else
--Wikilink senza pipe, lo aggiunge
wl1=string.gsub(wl, "[%]%[]", "")
result="[[" .. wl1 .. "|" .. span .. wl1 .. "</span>]]"
end
elseif substype==2 then
l=string.sub(str,string.find(str, "%["),string.find(str, "]"))
l1=string.sub(l, 1, string.find(l, " "));
l2=string.sub(string.gsub(string.sub(l,string.find(l, " "),string.find(l, "]")), "%]", ""), 2)
result=l1 .. span ..l2 .. "</span>]"
end
return result
end
return p