Moduuli:Fr:Wikidata/Formatage entité


local p = {}
local defaultlang = mw.getContentLanguage():getCode()
local tools = require 'Module:Fr:Wikidata/Outils'
-- local getClaims = require "Module:Fr:Wikidata/Récup".getClaims -- chargé uniquement si nécessaire
local i18n = tools.i18n

local formatError = tools.formatError

function p.getLabel(entity, lang, labelformat)
	local label, lang = p.getLabelWithLang(entity, lang, labelformat)
	return label
end
function p.getLabelWithLang(entity, lang, labelformat)
	if (not entity) then
		return nil -- ou option de gestion des erreurs ?
	end

	lang = lang or defaultlang

	if type(labelformat) == 'function' then
		return labelformat(entity), 'unknown'
	end
	
	if (type(entity) == 'string') and (lang == defaultlang) then -- le plus économique
		local str, thislang = mw.wikibase.getLabelWithLang(entity)
		if str then -- mw.wikibase.label() ne fonctionne pas avec les redirect https://phabricator.wikimedia.org/T157868
			return str, thislang
		end
	end

	if type(entity) == 'string' then
		entity = mw.wikibase.getEntityObject(entity)
	end
	
	if entity and entity.labels and entity.labels[lang] then
		return entity.labels[lang].value, 'guessed'
	end
end

function p.formatEntity( entity, params )

	if (not entity) then
		return nil --formatError('entity-not-found')
	end
	local id = entity
	if type(id) == 'table' then
		id = id.id
	end

	params = params or {}
	local lang = params.lang or defaultlang
	local speciallabels = params.speciallabels
	local displayformat = params.displayformat
	local labelformat = params.labelformat
	local defaultlabel = params.defaultlabel or id
	local linktype = params.link
	local defaultlinktype = params.defaultlink
	local defaultlinkquery = params.defaultlinkquery



	if speciallabels and speciallabels[id] then --speciallabels override the standard label + link combination
		return speciallabels[id]
	end
	if params.displayformat == 'raw' then
		return id
	end
	
	if params.displayformat == 'none' then
		return ""
	end

	local link, label, curlang
	local str = '' -- l'intégralité du text à retourner	
	local wqsbacklink_start = ''
	local wqsbacklink_end = ''	
	if params.displayformat == 'wqsbacklink' then
		wqsbacklink_start = '<span class="wqsbacklink" data-wqswikidatavalue="' .. id ..'">';
		wqsbacklink_end = '</span>'; 
	end

	label, curlang = p.getLabelWithLang(entity, lang, labelformat)
	local link	= tools.siteLink(entity, linktype, lang)
	
	-- détermination du fait qu'on soit ou non en train de rendre l'élément sur la page de son article
	local rendering_entity_on_its_page = tools.is_page_of_qid(id)
		
	if (not link) and defaultlinkquery then
		defaultlinkquery.excludespecial = true
		defaultlinkquery.entity = entity
		local getClaims = require("Module:Fr:Wikidata/Récup").getClaims
		local claims = getClaims(defaultlinkquery)
		if claims then
			for i, j in pairs(claims) do
				local id = tools.getMainId(j)
				link = tools.siteLink(id, linktype, lang)
				if link then
					if defaultlinktype == "querylabel" then
						local newlabel, newcurlang = p.getLabelWithLang(id, lang, labelformat)
						if newlabel then
							label=newlabel
							curlang=newcurlang
						end
					end
					break
				end
			end
		end	
	end

	if (linktype == '-') or rendering_entity_on_its_page then
		if (label ~= nil) then 
			return wqsbacklink_start .. str .. label .. wqsbacklink_end
		else 
			return str
		end
	end

	if not label then
		if ((defaultlabel == '-') or (params.displayformat == 'notranslations')) then 
			return nil
		end
		link = tools.siteLink(id, 'wikidata')
		return wqsbacklink_start .. str .. '[[' .. link .. '|' .. id .. ']]' .. tools.addcat(i18n['to translate']) .. wqsbacklink_end
	-- si pas de libellé, on met un lien vers Wikidata pour qu'on comprenne à quoi ça fait référence
	end

	local label_lang_not_ok_link=""

-- Toimintalogiikka on, että 
-- * mikäli label on millään testlanguagecodes -kielillä eri 
-- * JA dispalyformat on jotain muta kuin "dotranslations"
-- niin tulosta teksti "käännä suomeksi" ja lisää seurantaluokka
-- ja JOS displayformat on "notranslations", niin ei tulosteta mitään.

	if (lang ~= curlang and params.displayformat~="dotranslations") then
		label_lang_not_ok_link='<small>&nbsp;([[:d:' .. id .. '|<span class = "indicateur-langue title = "' ..  tools.translate('see-wikidata') .. '">käännä suomeksi</span>]])</small>'

        local labeltest="failed"
		local testlangcodes={"sv",  "de", "fr", "se", "no", "nb", "et"}
		for i, testlangcode in ipairs(testlangcodes) do
			local testlabel
            testlabel=mw.wikibase.getLabelByLang(id, testlangcode)
		  	if testlabel and testlabel~="" then
                if label~=testlabel then
				    labeltest="failed"
		  		    break
                else
                    labeltest="ok"
                end	
		  	end
		end
		if labeltest=="ok" then
            label_lang_not_ok_link = ""
			-- Do nothing
		elseif (params.displayformat == 'notranslations') then
			return ""
		else
			str = str .. tools.addcat(i18n['to translate fuzzy']) 
		end
	end

	if (not link) and (defaultlinktype == "red") then
		return wqsbacklink_start .. str .. '[[' .. label ..']]' .. label_lang_not_ok_link .. wqsbacklink_end
	end

	if link then 
		return wqsbacklink_start .. str .. '[[' .. link .. '|' .. label .. ']]' .. label_lang_not_ok_link .. wqsbacklink_end
	end

	-- on est pas sur l'article de l'entité, et on a pas de lien de site
	
	if (defaultlinktype ~= '-') then
		local linktype
		local sidelink, site, langcode
		if defaultlinktype then
			sidelink, site, langcode = tools.siteLink(entity, linktype, lang)
		else
			sidelink, site, langcode = tools.siteLink(entity, 'wiki', 'en')
		end
		if not sidelink then
			sidelink, site = tools.siteLink(entity, 'wikidata')
		end
		
		local icon, class, title = site, nil, nil -- le texte affiché du lien
		if site == 'wiki' then
			icon, class, title = langcode, "indicateur-langue", tools.translate('see-another-language', mw.language.fetchLanguageName(langcode, defaultlang))	
		elseif site == 'wikidata' then
			icon, class, title = 'd',  "indicateur-langue", tools.translate('see-wikidata')	
		else
			title = tools.translate('see-another-project', site)
		end
		local val = '[[' .. sidelink .. '|' .. '<span class = "' .. (class or '').. '" title = "' .. (title or '') .. '">' .. icon .. '</span>]]'
		return wqsbacklink_start .. str  .. label .. '<small>&nbsp;(' .. val .. ')</small>' .. label_lang_not_ok_link .. wqsbacklink_end
	end 
	return wqsbacklink_start .. str .. label .. label_lang_not_ok_link .. wqsbacklink_end
end

-- Fonction dépréciée
function p.getLink(entity, linktype, lang)
	return tools.siteLink(entity, linktype, lang)
end

return p