Modulo:Interprogetto

La documentazione per questo modulo può essere creata in Modulo:Interprogetto/man

local c = require('Modulo:Common')
local fmtLink = '* [[%s|%s]]'
local fmtBox = '[[File:%s|link=:%s:|Collabora a %s]] %s'
local contentLang = mw.language.getContentLanguage()

-- elemento su Wikidata
local item = mw.wikibase.getEntityObject()

-- collegamento a Wikipedia in italiano
function wikipedia()
	local lang = nil
	local fallbackChain = {
		{'en', 'enwiki'},
		{'fr', 'frwiki'},
		{'de', 'dewiki'},
		{'es', 'eswiki'},
		{'pt', 'ptwiki'},
		{'ru', 'ruwiki'},
		{'el', 'elwiki'},
		{'nl', 'nlwiki'},
		{'rm', 'rmwiki'},
		{'ca', 'cawiki'},
		{'eml', 'emlwiki'},
		{'fur', 'furwiki'},
		{'lij', 'lijwiki'},
		{'lmo', 'lmowiki'},
		{'nap', 'napwiki'},
		{'pms', 'pmswiki'},
		{'roa-tara', 'roa_tarawiki'},
		{'sc', 'scwiki'},
		{'scn', 'scnwiki'},
		{'vec', 'vecwiki'}
	}
	local sl = c.sitelink('itwiki')
	if sl == nil and c.isNSAutore() then
		for _, site in pairs(fallbackChain) do
			if c.sitelink(site[2]) then
				lang = site[1]
				sl = c.sitelink(site[2])
				break
			end
		end
	end
	return {sl, lang}
end

local cachedProj = {}

--la lista dei progetti a cui linkare nel caso generale (escluso Autore)
local projectListGeneral = {
	{[{'oldwikisource'}]      = {'oldwikisource', 'Wikisource'}},
	{[{'w', 'WikiPedia'}]     = {'w',             'Wikipedia',     'Wikipedia-logo.svg|18px', "'''Wikipedia''' ha una voce di approfondimento%s su '''[[:w:%s|%s]]'''", wikipedia}},
	{[{'q', 'WikiQuote'}]     = {'q',             'Wikiquote',     'Wikiquote-logo.svg|18px', "'''Wikiquote''' contiene citazioni%s di o su '''[[:q:%s|%s]]'''", c.wikiquote}},
	{[{'n', 'WikiNews'}]      = {'n',             'Wikinotizie',   'Wikinews-logo.svg|25px', "'''Wikinotizie''' contiene notizie di attualità%s su '''[[:n:%s|%s]]'''", c.wikinews}},
	{[{'voy', 'WikiVoyage'}]  = {'voy',           'Wikivoyage',    'Wikivoyage-Logo-v3-icon.svg|18px', "'''Wikivoyage''' contiene informazioni turistiche%s su '''[[:voy:%s|%s]]'''", c.wikivoyage}},
	{[{'commons', 'Commons'}] = {'c',             'Commons',       'Commons-logo.svg|18px', "'''Commons''' contiene file multimediali%s su '''[[c:Category:%s|%s]]'''", c.commonscat}},
	{[{'b', 'WikiBooks'}]     = {'b',             'Wikibooks',     'Wikibooks-logo.svg|22px', "'''Wikibooks''' contiene testi o manuali%s su '''[[:b:%s|%s]]'''", c.wikibooks}},
	{[{'wikispecies'}]        = {'species',       'Wikispecies',   'WikiSpecies notext.svg|21px', "'''Wikispecies''' contiene informazioni%s su '''[[species:%s|%s]]'''", c.wikispecies}},
	{[{'m', 'Meta'}]          = {'m',             'Meta-Wiki',     'Wikimedia-logo.svg|18px', "'''Meta-Wiki''' contiene informazioni%s su '''[[m:%s|%s]]'''"}},
	{[{'wikt', 'WikTionary'}] = {'wikt',          'Wikizionario',  'Wiktionary small.svg|18px', "'''Wikizionario''' contiene il lemma%s «[[wikt:%s|'''%s''']]»", c.wiktionary}},
	{[{'v', 'WikiVersity'}]   = {'v',             'Wikiversità',   'Wikiversity-logo.svg|18px', "'''Wikiversità''' contiene lezioni%s su '''[[:v:%s|%s]]'''", c.wikiversity}}
}

--la lista dei progetti a cui linkare nel solo caso del namespace Autore
local projectsListAutore = {
	{[{'oldwikisource'}]      = {'oldwikisource', 'Wikisource'}},
	{[{'wAutore'}]            = {'w',             'Wikipedia',       'Wikipedia-logo.svg|18px', "Voce enciclopedica%s su '''[[:w:%s|Wikipedia]]'''", wikipedia}},
	{[{'qAutore'}]            = {'q',             'Wikiquote',       'Wikiquote-logo.svg|18px', "Citazioni%s su '''[[:q:%s|Wikiquote]]'''", c.wikiquote}},
	{[{'nAutore'}]            = {'n',             'Wikinotizie',     'Wikinews-logo.svg|18px',  "Notizie di attualità%s su '''[[:n:%s|Wikinotizie]]'''", c.wikinews}},
	{[{'CommonsAutore'}]      = {'c',             'Commons',         'Commons-logo.svg|18px',   "Immagini e/o file multimediali%s su '''[[c:%s|Commons]]'''", c.commons}},
	{[{'commonsAutoreCat'}]   = {'c',             'Commons',         'Commons-logo.svg|18px',   "Immagini e/o file multimediali%s su '''[[c:Category:%s|Commons]]'''", c.commonscat}},
	{[{'wikispecies'}]        = {'species',       'Wikispecies',     'WikiSpecies notext.svg|21px', "'''Wikispecies''' contiene informazioni%s su '''[[species:%s|%s]]'''", c.wikispecies}},
    {[{'vAutore'}]            = {'v',             'Wikiversità',     'Wikiversity-logo.svg|18px', "È presente una lezione%s su '''[[:v:%s|Wikiversità]]'''", c.wikiversity}}
}

--ritorna la lista dei progetti a seconda del namespace
function getProjectList()
	if c.isNSAutore() then return projectsListAutore
	else return projectListGeneral end
end

for _, proj in ipairs(getProjectList()) do
	for keys, val in pairs(proj) do
		for _, key in ipairs(keys) do
			cachedProj[key] = true
		end
	end
end

local function createLink(arg1, arg2)
	return string.format(fmtLink, arg1 or '', arg2 or '')
end

local function createBox(val, lang, params)
	if lang and mw.language.isKnownLanguageTag(lang) then
		params[1] = lang..':'..params[1]
		lang = string.format(' in %s', mw.language.fetchLanguageName(lang, contentLang:getCode()))
	else
		lang = ''
	end
	return string.format(fmtBox, val[3], val[1], val[2], string.format(val[4], lang, unpack(params)))
end

local p = {}

function p.box(frame)
	local oldArgs = frame:getParent().args
	local args = {}
	local addBoxes = (oldArgs[1] == nil or mw.text.trim(oldArgs[1]) ~= 'nolink')
	local label
	if oldArgs.etichetta and mw.text.trim(oldArgs.etichetta) ~= '' then
		label = oldArgs.etichetta
	else
		label = mw.title.getCurrentTitle().text
	end
	for key, val in pairs(oldArgs) do
		if val and mw.text.trim(val) ~= '' then
			if type(key) == 'number' then
				if cachedProj[val] and (oldArgs[val] == nil or mw.text.trim(oldArgs[val]) == '') then
					args[val] = {label, oldArgs[val..'_lang']}
				end
			else
				args[key] = {val, oldArgs[key..'_lang']}
			end
		end
	end
	local links = {}
	local boxes = {}
	addedCommons = false
	for _, proj in ipairs(getProjectList()) do
		for keys, projConfig in pairs(proj) do
			for _, key in ipairs(keys) do
				local value
				if args[key] then
					value = args[key]
				elseif #projConfig > 4 then
					value = projConfig[5]()
				end
				if value and (type(value) ~= 'table' or #value > 0) then
					if type(value) ~= 'table' then
						value = {value}
					end
					if projConfig[1] ~= 'c' or not addedCommons then
						table.insert(links, createLink(projConfig[1] .. ':' .. value[1], projConfig[2]))
						if addBoxes and #projConfig > 3 then
							table.insert(boxes, createBox(projConfig, value[2], {value[1], label}))
						end
						
						if projConfig[1] == 'c' then
							addedCommons = true;
						end
					end
					break
				end
			end
		end
	end

	local res = ''
	if #links > 0 then
		local interProject = mw.html.create('div')
			:attr('id', 'interProject')
			:css({
				['display'] = 'none',
				['clear'] = 'both',
				['border-top'] = '2px dotted #AAAAAA',
				['margin-top'] = '2em'
			})
			:tag('div')
			:attr('title', 'Collegamenti verso gli altri progetti Wikimedia')
			:wikitext('\n' .. table.concat(links, '\n') .. '\n')
			:allDone()
		res = res .. tostring(interProject)
	end

	if #boxes > 0 then
		local boxesContainer = mw.html.create('div')
			:addClass('noprint ws-noexport')
			:wikitext('\n' .. table.concat(boxes, '\n\n') .. '\n')
			:allDone()
		res = res .. tostring(boxesContainer)
	end

	return res
end

return p