Module:Wikidata/Outils
De Wicri Incubateur
< Module:Wikidata
Révision datée du 28 décembre 2020 à 10:45 par imported>Jacques Ducloy (1 révision importée)
La documentation pour ce module peut être créée à Module:Wikidata/Outils/doc
--Fonctions élémentaires de gestion des snaks Wikidata
local p = {}
p.i18n = require "Module:Wikidata/I18n"
local defaultlang = mw.getContentLanguage():getCode()
function p.translate(str, rep1, rep2)
str = p.i18n[str] or str
if rep1 then
str = str:gsub('$1', rep1)
end
if rep2 then
str = str:gsub('$2', rep2)
end
return str
end
function p.snaktype(snak)
return snak.snaktype
end
function p.isSpecial(snak)
return (snak.snaktype ~= 'value')
end
function p.isValue(snak)
return (snak.snaktype == 'value')
end
function p.getId(snak)
if p.isValue(snak) then
return 'Q' .. snak.datavalue.value['numeric-id']
end
end
function p.getNumericId(snak)
if p.isValue(snak) then
return snak.datavalue.value['numeric-id']
end
end
function p.getMainId(claim)
return p.getId(claim.mainsnak)
end
function p.EntityId(entity)
if type(entity) == 'string' then
return entity
end
return entity.id
end
function p.getValue(snak)
return snak.datavalue.value
end
-- function that returns true if the "qid" parameter is the qid
-- of the item that is linked to the calling page
function p.is_page_of_qid(qid)
local entity_on_its_page = false
local self_entity = mw.wikibase.getEntity()
if self_entity ~= nil and qid == p.EntityId(self_entity) then
entity_on_its_page = true
end
return entity_on_its_page
end
function p.formatError( key , category, debug)
if debug then
return error(p.i18n[key] or key)
end
if category then
return "[[Category:" .. category .. "|" .. (key or "") .. "]]"
else
return "[[Catégorie:Page avec un problème de codage Wikidata|" .. (key or "") .. "]]"
end
end
function p.addcat(cat, sortkey)
if sortkey then
return '[[Category:' .. cat .. '|' .. (sortkey or '') .. ']]'
end
return '[[Category:' .. cat .. ']]'
end
function p.getEntity( val )
if type(val) == 'table' then
return val
end
if val == '-' then
return nil
end
if val == '' then
val = nil
end
return mw.wikibase.getEntityObject(val)
end
function p.splitStr(val) -- transforme en table les chaînes venant du Wikitexte qui utilisent des virgules de séparatin
if type(val) == 'string' then
val = mw.text.split(val, ",")
end
return val
end
function p.isHere(searchset, val)
for i, j in pairs(searchset) do
if val == j then
return true
end
end
return false
end
function p.alreadyHere(searchset, val) -- obsolète
return p.isHere(searchset, val)
end
function p.getEntityPagename(entity)
if (not entity) then
return nil -- ou option de gestion des erreurs ?
end
local name ="d:"
if entity["type"] == "property" then
name = "d:Property:"
end
return name .. entity.id
end
function p.getEntityPagename(entity)
if (not entity) then
return nil -- ou option de gestion des erreurs ?
end
local name ="d:"
if entity["type"] == "property" then
name = "d:Property:"
end
return name .. entity.id
end
local function wikidataLink(entity)
local name =':d:'
if type(entity) == 'string' then
if entity:match("P[0-9+]") then
entity = "Property:" .. entity
end
return name .. entity
elseif type(entity) == 'table' then
if entity["type"] == "property" then
name = ":d:Property:"
end
return name .. entity.id
elseif type(entity) == nil then
return formatError('entity-not-found')
end
end
function p.siteLink(entity, project, lang)
-- returns 3 values: a sitelink (with the relevant prefix) a project name and a language
lang = lang or defaultlang
if (type(project) ~= 'string') then
project = 'wiki'
end
project = project:lower()
if project == 'wikipedia' then
project = 'wiki'
end
if type(entity) == 'string' and (project == 'wiki') and ( (not lang or lang == defaultlang) ) then -- évite de charger l'élément entier
return mw.wikibase.sitelink(entity), 'wiki', defaultlang
end
if project == 'wikidata' then
return wikidataLink(entity), 'wikidata'
end
local projects = {
-- nom = {préfixe sur Wikidata, préfix pour les liens sur Wikipédia, ajouter préfixe de langue}
wiki = {'wiki', nil, true}, -- wikipedia
commons = {'commonswiki', 'commons', false},
commonswiki = {'commonswiki', 'commons', false},
wikiquote = {'wikiquote', 'q', true},
wikivoyage = {'wikivoyage', 'voy', true},
wikibooks = {'wikibooks', 'b', true},
wikinews = {'wikinews', 'n', true},
wikiversity = {'wikiversity', 'v', true},
wikisource = {'wikisource', 's', true},
-- meta
-- mediawiki
}
entity = p.getEntity(entity)
if not entity then
return nil
end
local projectdata = projects[project:lower()]
if not projectdata then -- sinon, on peut avoir des liens du type "enwiki" plutôt que "en" et lang = "wikipedia'
for k, v in pairs(projects) do
if project:match( k .. '$' )
and mw.language.isKnownLanguageTag(project:sub(1, #project-#k))
then
lang = project:sub(1, #project-#k)
projectdata = k
break
end
end
if not mw.language.isKnownLanguageTag(lang) then
return p.formatError('invalid project code: ' .. (project or '?'))
end
end
if not projectdata then
return p.formatError('invalid project code: ' .. (project or '?'))
end
local linkcode = projectdata[1]
local prefix = projectdata[2]
local multiversion = projectdata[3]
if multiversion then
linkcode = lang .. linkcode
end
local link = entity:getSitelink(linkcode)
if not link then
return nil
end
if prefix then
link = prefix .. ':' .. link
end
if multiversion then
link = ':' .. lang .. ':' .. link
end
return link, project, lang
end
-- add new values to a list, avoiding duplicates
function p.addnewvalues(old, new)
if not new then
return old
end
for _, j in pairs(new) do
if not p.isHere(old, j) then
table.insert(old, j)
end
end
return old
end
return p