Aller au contenu

Module:Lien interwiki

Cette page fait l’objet d’une mesure de semi-protection étendue.
Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 30 décembre 2021 à 05:52 et modifiée en dernier par Od1n (discuter | contributions) (plus verbeux, mais permet de bien montrer que le code gère aussi le cas où le titre fourni n'est pas un titre valide). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[voir] [modifier] [historique] [purger]

Ce module est utilisé par le modèle {{Lien}}.

Utilisation

Fonctions exportables :

  • main(frame) – pour le modèle {{Lien}}.

Modules externes et autres éléments dont ce module a besoin pour fonctionner :

local p = {}

function p.main( frame )

	-- http://lua-users.org/wiki/StringTrim
	local function trim( s )
		return s:match( '^()%s*$' ) and '' or s:match( '^%s*(.*%S)' )
	end

	local function lien( interwiki, target, text )
		if target:sub( 1, 1 ) == ':' then
			target = target:sub( 2 )
		end
		if interwiki then
			target = interwiki .. ':' .. target
		end
		if text then
			return '[[:' .. target .. '|' .. text .. ']]'
		else
			return '[[:' .. target .. ']]'
		end
	end

	local validArgs = {
		fr     = true,
		[1]    = true,
		lang   = true,
		langue = true,
		trad   = true,
		texte  = true,
		nocat  = true,
	}

	local parentArgs = frame:getParent().args
	local hasInvalidArgs = false
	local args = {}

	for k, v in pairs( parentArgs ) do
		-- détecte la présence de paramètres non reconnus
		if not validArgs[ k ] then
			hasInvalidArgs = true
		end

		-- effectue un trim sur les paramètres non nommés,
		-- et exclut les paramètres dont la valeur est vide
		if type( k ) == 'number' then
			v = trim( v )
		end
		if v ~= '' then
			args[ k ] = v
		end
	end

	local cible_fr = args[ 'fr' ] or args[ 1 ] or args[ 'trad' ]
	local cible_trad = args[ 'trad' ] or args[ 'fr' ] or args[ 1 ]

	local categorise = ( args[ 'nocat' ] ~= 'oui' )

	if not cible_fr then
		return frame:expandTemplate{ title = 'Fix', args = {
			[1]              = '[[' .. ( args[ 'texte' ] and '|' .. args[ 'texte' ] or '' ) .. ']]',
			['message']      = 'modèle à corriger',
			['message_lien'] = 'Catégorie:Page contenant un appel à traduction d\'un article non spécifié',
			['infobulle']    = 'Cet appel à traduction est à corriger car aucun titre de page n\'est spécifié.',
			['catégorie']    = ( categorise and 'Page contenant un appel à traduction d\'un article non spécifié' or nil )
		} }
	end

	local result = lien( nil, cible_fr, args[ 'texte' ] )

	local pageExiste
	local objetPage = mw.title.new( cible_fr )
	if objetPage then
		-- pcall permettant de masquer les erreurs « too many expensive function calls »
		local success = pcall( function ()
			pageExiste = objetPage.exists
		end )
		if not success then
			pageExiste = false
		end
	else
		pageExiste = false -- titre de page invalide
	end

	if pageExiste then
		if categorise then
			result = result .. p._temoin( cible_fr )
		end

		return result
	else
		local lang = args[ 'langue' ] or args[ 'lang' ] or 'en'

		local function makeSpan( libelle )
			local title = 'Article ' .. libelle .. '\194\160: «\194\160' .. cible_trad .. '\194\160»'

			return '<span class="indicateur-langue" title="' .. title:gsub( '"', '&quot;' ) .. '">(' .. lang .. ')</span>'
		end

		if lang == 'd' then
			result = result .. '&nbsp;' .. lien( 'd', cible_trad, makeSpan( 'sur Wikidata' ) )
		else
			local langs = {
				de = 'allemand',
				en = 'anglais',
				es = 'espagnol',
				it = 'italien',
				ja = 'japonais',
				pl = 'polonais',
				pt = 'portugais',
				ru = 'russe',
				zh = 'chinois',
			}

			local nomLangue = langs[ lang ]
			if not nomLangue then
				nomLangue = require( 'Module:Langue' ).nomLangue( lang )
				if nomLangue:find( 'class="error"', nil, true ) then
					nomLangue = nil
				end
			end

			if nomLangue then
				result = result .. '&nbsp;' .. lien( lang, cible_trad, makeSpan( 'en ' .. nomLangue ) )
			else
				result = result .. '&nbsp;' .. lien( lang, cible_trad, makeSpan( 'dans une autre langue' ) )
					.. '<span class="error">Erreur : langue non reconnue par le modèle Lien : « ' .. lang .. ' ».</span>'

				if categorise then
					result = result .. '[[Catégorie:Article contenant un appel à traduction avec un code langue inconnu|+]]'
				end
			end
		end

		if categorise then
			result = result .. p._categorisation( lang )
		end

		if hasInvalidArgs then
			result = result .. '[[Catégorie:Modèle Lien avec un paramètre inconnu]]'
		end

		return result
	end
end

function p._temoin( cible_fr )
	local categorie

	local ns = mw.title.getCurrentTitle().namespace
	-- (principal), Portail, Référence
	if ns == 0 or ns == 100 or ns == 104 then
		categorie = '[[Catégorie:Page utilisant Lien pour un article existant]]'
	-- Modèle
	elseif ns == 10 then
		categorie = '[[Catégorie:Page utilisant Lien pour un article existant|*]]'
	-- Discussion, Wikipédia, Projet
	elseif ns == 1 or ns == 4 or ns == 102 then
		categorie = '[[Catégorie:Page de discussion utilisant Lien pour un article existant]]'
	else
		categorie = ''
	end

	return categorie .. '<span class="ExistingLink" style="display:none">' .. cible_fr .. '</span>'
end

function p._categorisation( lang )
	local ns = mw.title.getCurrentTitle().namespace
	-- (principal), Modèle
	if ns == 0 or ns == 10 then
		local data = mw.loadData( 'Module:Lien interlangue/data catégorisation' )
		return ( data[ lang ] or '[[Catégorie:Article contenant un appel à traduction avec un code langue inconnu|' .. lang .. ']]' )
	else
		return ''
	end
end

return p