« Module:Wikidata/Outils » : différence entre les versions
mAucun résumé des modifications |
m A changé le niveau de protection pour « Module:Wikidata/Outils » ([Modifier=Autoriser uniquement les utilisateurs autopatrolled] (infini) [Renommer=Autoriser uniquement les administrateurs] (infini)) |
||
| (29 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 2 : | Ligne 2 : | ||
local p = {} | local p = {} | ||
p.i18n = require "Module:Wikidata/I18n" | 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) | function p.snaktype(snak) | ||
| Ligne 18 : | Ligne 30 : | ||
if p.isValue(snak) then | if p.isValue(snak) then | ||
return 'Q' .. snak.datavalue.value['numeric-id'] | 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 | ||
end | end | ||
| Ligne 36 : | Ligne 54 : | ||
end | end | ||
function p.formatError( key ) | -- function that returns true if the "qid" parameter is the qid | ||
return error(i18n[key] or key) | -- 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 | end | ||
| Ligne 50 : | Ligne 86 : | ||
if type(val) == 'table' then | if type(val) == 'table' then | ||
return val | return val | ||
end | |||
if val == '-' then | |||
return nil | |||
end | |||
if val == '' then | |||
val = nil | |||
end | end | ||
return mw.wikibase.getEntityObject(val) | return mw.wikibase.getEntityObject(val) | ||
end | end | ||
function p. | 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 | for i, j in pairs(searchset) do | ||
if val == j then | if val == j then | ||
| Ligne 60 : | Ligne 109 : | ||
end | end | ||
end | end | ||
return false | 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 | end | ||
| Ligne 69 : | Ligne 237 : | ||
end | end | ||
for _, j in pairs(new) do | for _, j in pairs(new) do | ||
if not p. | if not p.isHere(old, j) then | ||
table.insert( | table.insert(old, j) | ||
end | end | ||
end | end | ||
return | return old | ||
end | end | ||
return p | return p | ||
Dernière version du 17 mai 2017 à 13:41
--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 ""
else
return ""
end
end
function p.addcat(cat, sortkey) if sortkey then return end return 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