Module:Lien interlangue

From CryptoWiki

Revision as of 08:34, 2 January 2022 by 5imp5on (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Documentation for this module may be created at Module:Lien interlangue/doc

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