Module:Wikidata/Outils : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
m (A changé le niveau de protection pour « Module:Wikidata/Outils » ([Modifier=Autoriser uniquement les utilisateurs autopatrolled] (infini) [Renommer=Autoriser uniquement les administrateurs] (infini)))
 
(31 révisions intermédiaires par 5 utilisateurs 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 47 : Ligne 83 :
 
end
 
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.alreadyHere(searchset, val)
+
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 54 : 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 63 : Ligne 237 :
 
end
 
end
 
for _, j in pairs(new) do
 
for _, j in pairs(new) do
if not alreadyHere(old, j) then
+
if not p.isHere(old, j) then
table.insert(j, j)
+
table.insert(old, j)
 
end
 
end
 
end
 
end
return j
+
return old
 
end
 
end
  
 
return p
 
return p

Version actuelle datée du 17 mai 2017 à 13:41

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