Modulo:Box interwiki
Modulo:Box interwiki/man – modifica
Questo modulo implementa le funzionalità di alcuni dei template per i box con collegamenti interwiki contenuti nella Categoria:Template Wikimedia.
L'unica funzione esportata è getBox
. Nel resto del testo, ogni volta che ci si riferisce ad un #invoke
al modulo, è sottintesa la chiamata di questa funzione.
Il modulo:Box interwiki/Man generico per template derivati fornisce dei manuali standardizzati per i template derivati.
Gestione dei parametri
[modifica]Parametri di #invoke
[modifica]Per i box che linkano una sola pagina, il modulo ha bisogno solo di questi parametri. I box che linkano più pagine, invece, richiedono anche i parametri posizionali nella chiamata al template derivato; vedi alla sezione Parametri dei template derivati.
parametro | o/f [t 1] | x [t 2] | default [t 3] | descrizione | |
---|---|---|---|---|---|
pagina |
o | — | pagina da linkare con un wikilink
| ||
progetto |
o | — | nome del progetto per il wikilink alla Pagina principale del progetto p.e. Wikipedia | ||
prefisso |
o | — | prefisso per i wikilink al progetto
p.e. per Wikipedia è w vedi | ||
immagine |
o | — | file del logo del progetto | ||
etichetta-pagina |
f | x | pagina |
testo da visualizzare nel wikilink alla pagina
vedi | |
lingua |
f | it | codice linguistico del progetto | ||
progetto-multilingue |
f | — | da valorizzare con un testo qualsiasi quando si tratta di un progetto multilingue
influenza l'uso che il modulo fa dei parametri dei template derivati | ||
dimensione-immagine |
f | x55px | dimensione da impostare se con il valore di default le dimensioni del logo del progetto risultano sbilanciate rispetto a quelle degli altri progetti | ||
una-pagina |
f | una pagina | testo che sostituisce "una pagina" in pre-pagina
p.e. "una voce" per Wikipedia | ||
pre-progetto |
f | — | testo da inserire prima del wikilink al progetto | ||
pre-pagina |
f | ha una pagina su | sostituzione completa del testo tra il wikilink al progetto e quello alla pagina, nel caso di box con una sola pagina linkata | ||
pre-pagina-multi |
f | ha le pagine: | sostituzione completa del testo tra il wikilink al progetto e quello alla prima pagina, nel caso di box con più pagine linkate | ||
multi-pagina-come |
f | x | pagine | modalita di lettura dei parametri posizionali da {{{ 1 + parametri-riservati }}} in su
i valori ammessi sono :
lingua-pagina e lingua-pagina-etichetta sono incompatibili con | |
parametri-riservati |
f | 2 | numero di parametri posizionali riservati al template derivato
il modulo ricava gli eventuali link aggiuntivi a partire dal primo successivo |
- Note
- ↑ obbligatorio / facoltativo
- ↑
Per i parametri segnati con una x, il valore impostato in
#invoke
può essere sovrascritto impostando lo stesso parametro nella chiamata al template derivato. - ↑ Il tratto — indica l'assenza di un valore di default.
Esempi
[modifica]Il testo tra grafe indica i parametri valorizzati.
Base
[modifica]Per mostrare esattamente il risultato dei parametri, i wikilink sono mostrati come wikicode, grazie al fatto che la presenza delle grafe ne fa fallire il rendering.
In un template utilizzabile almeno il parametro pagina
è valorizzato tramite uno dei parametri del template stesso.
{{#invoke: Box interwiki | getBox
| pagina = {pagina}
| progetto = {progetto}
| prefisso = {prefisso}
| immagine = Arma ignota.jpg
}}
[[{prefisso}:Pagina principale|{progetto}]] ha una pagina su [[{prefisso}:{pagina}|{pagina}]].
[[Categoria:Pagine con box interwiki verso {progetto}|Modulo:Box interwiki]]
Messaggio d'errore in caso di parametri obbligatori mancanti
[modifica]Errore nell'#invoke al Modulo:Box interwiki.
I seguenti parametri devono essere sempre valorizzati :
- pagina
- progetto
- prefisso
- immagine
Base + lingua
[modifica]Per mostrare esattamente il risultato dei parametri, i wikilink sono mostrati come wikicode, grazie al fatto che la presenza delle grafe ne fa fallire il rendering.
Quando è indicato un codice lingua corretto, "lingua" in "in lingua ha una pagina su" viene sostituito dal nome della lingua per esteso.
[[{prefisso}:{lingua}:Main Page|{progetto}]] in ha una pagina su [[{prefisso}:{lingua}:{pagina}|{pagina}]].
[[Categoria:Pagine con box interwiki verso {progetto}|Modulo:Box interwiki]]
una-pagina
+ etichetta-pagina
[modifica]Progetto ha {una-pagina} su {etichetta-pagina}.
pre-progetto
+ pre-pagina
[modifica]Parametri dei template derivati
[modifica]parametri-riservati
I template derivati dal modulo (ovvero che contengono un #invoke
allo stesso) possono adoperare qualsiasi parametro con nome, per valorizzare i parametri di #invoke
o per qualsiasi altro uso interno al template.
Una particolare gestione avviene invece per i parametri posizionali.
I primi parametri posizionali (nel numero indicato da parametri-riservati
) sono a libera disposizione del template. In diversi template {{{ 1 }}}
valorizza pagina
e {{{ 2 }}}
valorizza lingua
.
I parametri posizionali da {{{ 1 + parametri-riservati }}}
in su, se presenti, sono gestiti dal modulo e, una loro eventuale gestione anche nel template deve essere compatibile con quella effettuata dal modulo. In particolare, la valorizzazione del parametro {{{ 1 + parametri-riservati }}}
chiede al modulo la creazione di un box con link a più pagine.
L'interpretazione dei parametri posizionali dipende dal valore di multi-pagina-come
. Vedi nella tabella alla sezione Parametri di #invoke.
Una stringa vuota in una posizione corrispondente a una etichetta indica di non usare un testo sostitutivo per il link, ma il nome della pagina indicato dal parametro precedente.
Una stringa vuota in una posizione corrispondente a una lingua indica di usare la stessa lingua del link precedente.
Categorie impostate dal modulo
[modifica]Il modulo inserisce automaticamente alcune categorie, sia quando è richiamato tramite template che quando direttamente con un #invoke
.
In tutte le pagine
[modifica]- Nelle pagine del namespace principale che visualizzano un box :
- Nelle pagine di namespace diversi da quello principale che visualizzano un box :
Dove _Progetto_ viene sostituito dal testo del parametro progetto
. Queste categorie, raccolte sotto la categoria madre Categoria:Pagine con box interwiki e impostate come __HIODDENCAT__
, permettono di far manutenzione e tener d'occhio quantità e distribuzione dei box che linkano verso altri progetti.
- Nelle pagine in cui il modulo genera un errore :
Testo da inserire nelle pagine delle categorie :
__HIDDENCAT__
{{ServizioVuota}}
[[Categoria:Pagine con box interwiki]]
Nelle pagine dei template derivati
[modifica]- Nelle pagine dei template che richiamano il modulo, purché il box vi sia visualizzato :
Se, per qualsiasi motivo, il template non visualizza il box nella propria pagina ( per esempio perché la chiamata di #invoke
è sotto una condizione non verificata quando i parametri non sono valorizzati ), si può ottenere la categorizzazione del template tramite un box nel manuale del template.
Test nella console di debug
[modifica]Il seguente codice può essere inserito nella console di debug ( disponibile durante l'editing del modulo ) per testare l'output di una chiamata all'ipotetico template derivato definito dai valori nel secondo args = { ... }
, mentre i valori nel primo args = { ... }
simulano i parametri nella chiamata al template derivato.
I primi due valori nel primo args = { ... }
sono ininfluenti, solo i valori dal terzo in poi vengono letti dal modulo. L'eventuale uso che il template farà dei primi due valori, andrà simulato inserendo direttamente i valori risultanti nei parametri del secondo args = { ... }
, che simula la chiamata a #invoke
.
= p.getBox(
mw.getCurrentFrame()
:newChild{ args = {
'', '' -- , '', ''
} }
:newChild{ args = {
pagina = 'page',
progetto = 'project',
prefisso = 'pref',
immagine = 'image.svg',
[ 'etichetta-pagina' ] = nil,
lingua = nil,
[ 'progetto-multilingue' ] = nil,
[ 'dimensione-immagine' ] = nil,
[ 'una-pagina' ] = nil,
[ 'pre-progetto' ] = nil,
[ 'pre-pagina' ] = nil,
[ 'pre-pagina-multi' ] = nil,
[ 'multi-pagina-come' ] = nil,
[ 'parametri-riservati' ] = nil
} }
)
Il seguente codice permette di visualizzare il risultato della chiamata di un template già esistente basato sul modulo.
ATTENZIONE: questo secondo codice, a differenza del precedente, utilizza l'ultima versione salvata del modulo, non quella contenuta nella casella di modifica.
= mw.getCurrentFrame()
:expandTemplate{
title = 'Wikipedia', -- nome del template
args = { 'An article' } -- parametri passati al template
}
--[[
ATTENZIONE: il codice contiene riferimenti al nome del modulo
WARNING: module's code contains references to module's name
******
**
** == Modulo:Box interwiki ==
**
** Questo modulo implementa le funzionalità
** di alcuni dei template per i box con collegamenti interwiki
** contenuti nella Categoria:Template_Wikimedia
**
** This module implements the functionality
** of some templates for interwiki link boxes
** contained in Category:Template_Wikimedia
**
********
]]
local p = {}
-- #invoke parameters
local pagina, etichettaPagina, lingua
local progetto, prefisso, progettoMultilingue
local immagine, dimImmagine
local unaPagina, preProgetto, prePagina
local prePaginaMulti, multiPageMode, templateBoundArgs
-- other variables
local currentFrame, parentFrameArgs, multiLink
local defaultLang = 'it'
-- utility functions
local function isParameterSet( par )
return
par ~= nil
and
mw.text.trim( par ) ~= ''
end
local function getValueOrDefault( parameterName, default, fromTemplate )
-- if fromTemplate, the value provided by the template call
-- will supersede the one set by #invoke
local value =
fromTemplate
and parentFrameArgs[ parameterName ]
or currentFrame.args[ parameterName ]
value = value and mw.text.trim( value )
if default and not isParameterSet( value )
then return default
else return value
end
end
-- text-chunks builder functions
local function errorIfMissingPars()
if (
not isParameterSet( pagina )
or not isParameterSet( progetto )
or not isParameterSet( prefisso )
or not isParameterSet( immagine )
)
then return [=[
<div class="error" margin:2em;>
Errore nell'#invoke al [[Modulo:Box interwiki]].
I seguenti parametri devono essere sempre valorizzati :
* pagina
* progetto
* prefisso
* immagine
</div>
[[Categoria:Pagine con errori in box interwiki|_]]
]=]
else return nil
end
end
local function mainDivTag()
return [[
<div
style="
clear: right;
float: right;
width: 22em;
border: solid #aaa 1px;
padding: .4em;
margin: 0 0 .5em 1em;
font-size: 90%;
text-align: left;
background: #f9f9f9;
"
>
]]
end
local function imageEmbed()
return
'[[File:'
.. immagine
.. '|' .. dimImmagine
.. '|left'
.. '|logo ' .. progetto
.. ']]\n'
end
local function projectWikilink()
-- link to project's Wikipedia article
-- if links can be in multiple languages
if multiLink
and string.find( multiPageMode, 'lingua' )
then return
"'''[["
.. 'w'
.. ':'
.. progetto
.. '|'
.. progetto
.. "]]'''"
end
-- else link to project's Main page
local mainPageEn = 'Main Page'
local mainPageIt = 'Pagina principale'
local mainPage = (
isParameterSet( progettoMultilingue )
and mainPageEn
or mainPageIt
)
if lingua ~= defaultLang
then return
"'''[["
.. prefisso
.. ':'
.. lingua
.. ':'
.. mainPageEn
.. '|'
.. progetto
.. "]]'''"
.. ' in '
.. mw.language.fetchLanguageName( lingua, 'it' )
else return
"'''[["
.. prefisso
.. ':'
.. mainPage
.. '|'
.. progetto
.. "]]'''"
end
end
local function beforePage()
if multiLink
then
return ' ' .. prePaginaMulti .. ' '
else
if isParameterSet( prePagina ) then
return ' ' .. prePagina .. ' '
else
return ' ha ' .. unaPagina .. ' su '
end
end
end
local function pageWikilink( prefix, lang, page, pageLabel, showLang )
local label = (
isParameterSet( pageLabel )
and pageLabel
or page
)
if showLang and lang ~= defaultLang
then label = lang .. ':' .. label
end
if isParameterSet( lang ) and lang ~= defaultLang
then return
"'''[["
.. prefix
.. ':'
.. lang
.. ':'
.. page
.. '|'
.. label
.. "]]'''"
else return
"'''[["
.. prefix
.. ':'
.. page
.. '|'
.. label
.. "]]'''"
end
end
local function otherPagesWikilinks()
if not multiLink then
return ''
end
local otherWikilinks = ''
local separator = " '''·''' "
local function addWikilink( prefix, lang, page, pageLabel, showLang )
otherWikilinks = otherWikilinks
.. separator
.. pageWikilink( prefix, lang, page, pageLabel, showLang )
end
local lang = lingua
local page, pageLabel
local firstOfTwo = ( templateBoundArgs + 1 ) % 2
local firstOfThree = ( templateBoundArgs + 1 ) % 3
local secondOfThree = ( templateBoundArgs + 2 ) % 3
local lastPos
if multiPageMode == 'pagine' then
for pos, pageTitle in ipairs( parentFrameArgs ) do
if pos > templateBoundArgs then
pageTitle = mw.text.trim( pageTitle )
addWikilink( prefisso, lingua, pageTitle )
end
end
elseif multiPageMode == 'pagina-etichetta' then
for pos, item in ipairs( parentFrameArgs ) do
item = mw.text.trim( item )
lastPos = pos
if pos > templateBoundArgs then
if pos % 2 == firstOfTwo then
page = item
else
pageLabel = item
addWikilink( prefisso, lingua, page, pageLabel )
end
end
end
if lastPos % 2 == firstOfTwo then
addWikilink( prefisso, lingua, page )
end
elseif multiPageMode == 'lingua-pagina' then
for pos, item in ipairs( parentFrameArgs ) do
item = mw.text.trim( item )
if pos > templateBoundArgs then
if pos % 2 == firstOfTwo then
lang = isParameterSet( item ) and item or lang
else
page = item
addWikilink( prefisso, lang, page, nil, true )
end
end
end
elseif multiPageMode == 'lingua-pagina-etichetta' then
for pos, item in ipairs( parentFrameArgs ) do
item = mw.text.trim( item )
lastPos = pos
if pos > templateBoundArgs then
if pos % 3 == firstOfThree then
lang = isParameterSet( item ) and item or lang
elseif pos % 3 == secondOfThree then
page = item
else
pageLabel = item
addWikilink( prefisso, lang, page, pageLabel, true )
end
end
end
if lastPos % 3 == secondOfThree then
addWikilink( prefisso, lang, page, page, true )
end
end
return otherWikilinks
end
local function pageCategories()
local currentTitle, pageNamespace, pageType
local pageCategory, piping
local templateCategory = ''
currentTitle = mw.title.getCurrentTitle()
pageNamespace = currentTitle.namespace
if pageNamespace == 0
then
pageType = 'Articoli'
piping = ''
else
pageType = 'Pagine'
piping = '|' .. currentTitle.prefixedText
end
pageCategory =
'[[Categoria:'
.. pageType
.. ' con box interwiki verso '
.. progetto
.. piping
.. ']]'
if pageNamespace == 10
then
if mw.ustring.match(
currentTitle:getContent() or '', -- or '' is for new pages previews
'{{%s*#invoke:%s*[bB]ox[ _]interwiki%s*|%s*getBox[%s|]',
0
)
then
templateCategory = [=[
[[Categoria:Template Wikimedia]]
[[Categoria:Template basati su Modulo:Box interwiki]]
]=]
end
end
return
'\n'
.. pageCategory
.. templateCategory
end
-- function for #invoke
function p.getBox( frame )
currentFrame = frame
parentFrameArgs = frame:getParent().args
-- mandatory #invoke parameters
pagina = getValueOrDefault( 'pagina' )
progetto = getValueOrDefault( 'progetto' )
prefisso = getValueOrDefault( 'prefisso' )
immagine = getValueOrDefault( 'immagine' )
-- returns an error message if any mandatory parameter is missing
local error = errorIfMissingPars()
if error
then return error
end
-- optional #invoke parameters
etichettaPagina = getValueOrDefault( 'etichetta-pagina' , nil , true )
lingua = getValueOrDefault( 'lingua' , defaultLang )
progettoMultilingue = getValueOrDefault( 'progetto-multilingue' , nil )
dimImmagine = getValueOrDefault( 'dimensione-immagine' , 'x55px' )
unaPagina = getValueOrDefault( 'una-pagina' , 'una pagina' )
preProgetto = getValueOrDefault( 'pre-progetto' , '' )
prePagina = getValueOrDefault( 'pre-pagina' , nil )
prePaginaMulti = getValueOrDefault( 'pre-pagina-multi' , ' ha le pagine: ' )
multiPageMode = getValueOrDefault( 'multi-pagina-come' , 'pagine' , true )
templateBoundArgs = getValueOrDefault( 'parametri-riservati' , 2 )
-- parameters' fixes
templateBoundArgs = tonumber( templateBoundArgs )
if progettoMultilingue
then
if multiPageMode == 'lingua-pagina' then
multiPageMode = 'pagine'
elseif multiPageMode == 'lingua-pagina-etichetta' then
multiPageMode = 'pagina-etichetta'
end
end
if preProgetto ~= ''
then preProgetto = preProgetto .. ' '
end
multiLink = parentFrameArgs[ 1 + templateBoundArgs ] ~= nil
-- returning wikitext
return
mainDivTag() -- <div ...>
.. imageEmbed()
.. preProgetto
.. projectWikilink()
.. beforePage()
.. pageWikilink( prefisso, lingua, pagina, etichettaPagina )
.. otherPagesWikilinks()
.. '.\n</div>'
.. pageCategories()
end
return p