Module:Wikidata/Références
[voir] [modifier] [historique] [purger]
Ce module est utilisé par {{Bibliographie}}.
Utilisation
Fonctions exportables :
citeitem(id, page, dateconsult)
– formate au format Wikitexte, en utilisant les modèles de citation standard si possible, la référence.
Test :
{{Bibliographie|Q21470144}}
(en) Paul E. Black, « Polylogarithmic », Dictionary of Algorithms and Data Structures, NIST, (lire en ligne).{{Bibliographie|Q4791}}
William Trevor, The Story of Lucy Gault (œuvre littéraire), Viking Press, .{{Bibliographie|Q15228}}
J. R. R. Tolkien, The Lord of the Rings (suite romanesque), George Allen & Unwin, Royaume de Grande-Bretagne, .{{Bibliographie|Q331651}}
J. R. R. Tolkien, Christopher Tolkien, The Children of Húrin (œuvre littéraire), HarperCollins et Houghton Mifflin Harcourt, .{{Bibliographie|Q502633}}
J. R. R. Tolkien, Christopher Tolkien, The Return of the Shadow (œuvre écrite), HarperCollins, Londres, .{{Bibliographie|Q11927173|page= 122}}
(en) William Mickey Haynes (dir.), CRC Handbook of Chemistry and Physics, Boca Raton, CRC Press, , 92e éd. (ISBN 978-1-4398-5511-9), p. 122.{{Bibliographie|Q21192407}}
Kathinka Dittrich van Weringh (préface) et Frédéric Blin (dir.), Les bibliothèques en Europe : Organisation, projets, perspectives, Paris, Cercle de la Librairie, , 340 p. (ISBN 978-2-7654-1368-4, ISSN 0184-0886, BNF 43560909).{{Bibliographie|Q58623966}}
« Vitrine du logiciel », Théoric, Rennes, Éditions Soracom (d), no 3, , p. 54-55 (ISSN 0762-6711, OCLC 474139660, BNF 34392888).{{Bibliographie|Q19170030}}
Robert Mowat, Études philologiques sur les inscriptions gallo-romaines de Rennes, Paris et Rennes, , 27 p. (BNF 30990597, lire sur Wikisource).- Avec un titre en html fournit (en qualificatif du titre) :
{{Bibliographie|Q98579483}}
(en) Lance Grande, « A revision of the fossil genus †Diplomystus, with comments on the interrelationships of clupeomorph fishes », American Museum Novitates, New York, Musée américain d'histoire naturelle, no 2728, , p. 1-34 (ISSN 0003-0082 et 1937-352X, OCLC 47720325, lire en ligne). - Avec le volume, numéro et pages en qualificatifs du journal:
{{Bibliographie|Q56389430}}
(en) Charles H. Bennett, Gilles Brassard et Jean-Marc Robert, « Privacy Amplification by Public Discussion », SIAM Journal on Computing, SIAM, vol. 17, no 2, , p. 210-229 (ISSN 0097-5397 et 1095-7111, DOI 10.1137/0217014). - Papier de conférence:
{{Bibliographie|Q113621581}}
(en) Carlos Parada, Francisco Fontes, Carlos Marques, Vitor Cunha et Cristina Leitão, « Multi-Access Edge Computing : A 5G Technology », dans 2018 European Conference on Networks and Communications (EuCNC), (ISBN 978-1-5386-1478-5, DOI 10.1109/EUCNC.2018.8442492), p. 277-281. - Avec un sous-titre en qualificatif du titre:
{{Bibliographie|Q21035513}}
Antoine Schnapper (dir.), musée du Louvre (dir.) et château de Versailles (dir.), Jacques-Louis David, 1748-1825 : catalogue de l'exposition Louvre Versailles 1989, Paris, RMNGP, , 655 p. (ISBN 2-7118-2326-1, BNF 35525750). - Article de blog:
(en) Alessandro Ghedini, « The Road to QUIC », The Cloudflare Blog, (lire en ligne).
(en) Alessandro Ghedini, « The Road to QUIC », The Cloudflare Blog, (lire en ligne).
Sandbox:
{{Bibliographie|Q15397819}}
troisième bac à sable de Wikidata (entité interne de Wikidata).
Exemples
La documentation de ce module est générée par le modèle {{Documentation module}}.
Elle est incluse depuis sa sous-page de documentation. Veuillez placer les catégories sur cette page-là.
Les éditeurs peuvent travailler dans le bac à sable (modifier).
Voir les statistiques d'appel depuis le wikicode sur l'outil wstat et les appels depuis d'autres modules.
local reference = {}
local wd = require 'Module:Wikidata'
local refType = mw.loadData 'Module:Wikidata/Références/Types'
local cite = require 'Module:Biblio'
local langcodes = mw.loadData 'Module:Dictionnaire Wikidata/Codes langue'
local function concatTables(t1,t2)
local results = {}
for _,e in pairs(t1) do
table.insert(results, e)
end
for _,e in pairs(t2) do
table.insert(results, e)
end
return results
end
local function getStringStatementValues(entity, propertyId)
local statements = mw.wikibase.getBestStatements(entity, propertyId)
for i, statement in pairs(statements) do
statements[i] = statement.mainsnak.datavalue.value
end
return statements
end
local function getStringStatementValue(entity, propertyId)
local statements = getStringStatementValues(entity, propertyId)
if #statements > 0 then
return statements[1]
else
return nil
end
end
local function getDirectItemLang(workentity, property)
local itemlangs = wd.getClaims{entity = workentity, property = property}
if itemlangs ~= nil then
local codes = {}
for i = 1, #itemlangs do
codes[#codes + 1] = langcodes[wd.getNumericId(itemlangs[i].mainsnak)]
end
return table.concat(codes, ", ")
end
end
local function hasRole(statement, roleId)
return statement.qualifiers and statement.qualifiers['P518'] and wd.getId(statement.qualifiers['P518'][1]) == roleId
end
local currentPageTitle = mw.title.getCurrentTitle().prefixedText
local function buildAuthorLink(statement)
local author_label = nil
local author_link = nil
-- getting the label directly from its value to support "author name string" (P2093)
if statement.mainsnak.snaktype == 'value' and statement.mainsnak.datatype == 'string' then
author_label = statement.mainsnak.datavalue.value
elseif statement.qualifiers and statement.qualifiers['P1932'] and statement.qualifiers['P1932'][1].snaktype == 'value' then
-- we use "stated in" (P1932) to retrieve the proper author label
author_label = statement.qualifiers['P1932'][1].datavalue.value
end
-- we extract the link and the label of the author if it is an entity
if statement.mainsnak.snaktype == 'value' and statement.mainsnak.datatype == 'wikibase-item' then
local author_id = statement.mainsnak.datavalue.value.id
if author_label == nil then
-- fallback on author's item label, if it exists
author_label = mw.wikibase.getLabel(author_id)
end
author_link = mw.wikibase.getSitelink(author_id)
end
if author_link ~= nil and author_link ~= currentPageTitle then
return '[[' ..author_link .. '|' .. author_label .. ']]'
else
return author_label
end
end
local function remove_same_isbn(isbns)
-- input a table of isbns
-- return a table of ibns without duplicate
-- asked in https://fr.wikipedia.org/wiki/Discussion_mod%C3%A8le:Bibliographie#ISBN-10_et_ISBN-13
local References = require( 'Module:Biblio/Références' )
local result = {}
for _, isbn1 in ipairs(isbns) do
local same = false
for index_isbn2, isbn2 in ipairs(result) do
if References.same_isbn(isbn1, isbn2) then
if isbn2:gsub( '[ -]', '' ):len() == 13 then
table.remove(result, index_isbn2)
table.insert(result, isbn1)
end
same = true
break
end
end
if not same then
table.insert(result, isbn1)
end
end
return result
end
local function labelformatP1813(e)
-- input: an entity
-- returns a formatted string using the "short name" (P1813) if one is declared
return wd.formatStatements{entity = e, property = 'P1813', defaultlink= '-', numval=1} or wd.getLabel(e)
end
local function abbr(texte, signification)
return '<abbr class="abbr" title="' .. signification .. '">' .. texte .. '</abbr>'
end
function reference.citeitem(entityId, options)
if not entityId then
return nil
end
local entity = entityId
if type( options ) ~= 'table' then
options = {}
end
--work entity if it exists
local workEntity = nil
local workClaims = wd.getClaims{entity = entity, property = 'P629'} -- P629 : édition de
if workClaims ~= nil then
workEntity = wd.getMainId(workClaims[1])
end
local journalEntity = nil
local journalClaims = wd.getClaims{entity = entity, property = 'P1433'}
if journalClaims ~= nil then
journalEntity = wd.getMainId(journalClaims[1])
end
local translator = wd.formatStatements{entity = entity, property = 'P655', defaultlink = '-'}
local illustrator = wd.formatStatements{entity = entity, property = 'P110', defaultlink = '-'}
local preface = wd.formatStatements{entity = entity, property = 'P2679', defaultlink = '-'}
local postface = wd.formatStatements{entity = entity, property = 'P2680', defaultlink = '-'}
local photographe = ''
local authors = {}
local authors_id = {}
local are_director = {}
local responsability = {}
local author_statements = concatTables(mw.wikibase.getBestStatements(entity, 'P50'), mw.wikibase.getBestStatements(entity, 'P2093'))
if next(author_statements) == nil and workEntity ~= nil then --Fallback to work
author_statements = concatTables(
mw.wikibase.getBestStatements(workEntity, 'P50'),
mw.wikibase.getBestStatements(workEntity, 'P2093')
)
end
for _, statement in pairs(author_statements) do
local position = #authors + 1
if statement.qualifiers and statement.qualifiers['P1545'] then
position = tonumber(statement.qualifiers['P1545'][1].datavalue.value)
end
if statement.mainsnak.snaktype == 'value' and statement.mainsnak.datatype == 'wikibase-item' then
authors_id[position] = statement.mainsnak.datavalue.value.id
end
authors[position] = buildAuthorLink(statement)
are_director[position] = ''
--qualifier pour la responsabilité
if statement.qualifiers and statement.qualifiers['P518'] then
responsability[position] = wd.formatSnak(statement.qualifiers['P518'][1], {defaultlink = '-'})
else
responsability[position] = ''
end
end
for _, statement in pairs(mw.wikibase.getBestStatements(entity, 'P98')) do
local isduplicate = false
for id_key, id in pairs(authors_id) do
if statement.mainsnak.snaktype == 'value' and statement.mainsnak.datatype == 'wikibase-item' and id == statement.mainsnak.datavalue.value.id then
are_director[id_key] = 'y'
isduplicate = true
break
end
end
if not isduplicate then
table.insert(authors, buildAuthorLink(statement))
table.insert(are_director, 'y')
table.insert(responsability, '')
end
end
for _, statement in pairs(mw.wikibase.getBestStatements(entity, 'P767')) do
if hasRole(statement, 'Q670787') or hasRole(statement, 'Q19839393') then --préface/préfacier
preface = buildAuthorLink(statement)
elseif hasRole(statement, 'Q7234272') then --postface
postface = buildAuthorLink(statement)
elseif hasRole(statement, 'Q33231') or hasRole(statement, 'Q125191') then --photographe/photographie
photographe = buildAuthorLink(statement)
end
end
local isbns = getStringStatementValues(entity, 'P212')
for _, isbn in pairs(getStringStatementValues(entity, 'P957')) do
table.insert(isbns, isbn)
end
if journalEntity then
for _, isbnpublishedin in pairs(getStringStatementValues(journalEntity, 'P212')) do
table.insert(isbns, isbnpublishedin)
end
for _, isbnpublishedin in pairs(getStringStatementValues(journalEntity, 'P957')) do
table.insert(isbns, isbnpublishedin)
end
end
local issns = {}
if journalEntity then
issns = getStringStatementValues(journalEntity, 'P236')
end
if #issns == 0 then
issns = getStringStatementValues(entity, 'P236')
end
local oclc = getStringStatementValue(entity, 'P243')
local bnf = getStringStatementValue(entity, 'P268')
local gallica = getStringStatementValue(entity, 'P4258')
local lccn = getStringStatementValue(entity, 'P1144')
local dnb = getStringStatementValue(entity, 'P1292')
local doi = getStringStatementValue(entity, 'P356')
local pmid = getStringStatementValue(entity, 'P698')
local jstor = getStringStatementValue(entity, 'P888')
local bibcode = getStringStatementValue(entity, 'P1300')
local arxiv = getStringStatementValue(entity, 'P818')
local pmcid = getStringStatementValue(entity, 'P932')
local ednumber = wd.formatStatements{entity = entity, property = 'P393'}
local publisher = wd.formatStatements{entity = entity, property = 'P123', defaultlink = '-', labelformat = labelformatP1813 }
local journal = wd.formatStatements{entity = entity , property = 'P1433', defaultlink = '-'}
local numero = ''
if journalClaims and wd.hasQualifier(journalClaims[1], 'P433') then
numero = wd.getFormattedQualifiers(journalClaims[1], 'P433')
else
numero = getStringStatementValue(entity, 'P433')
end
local volume = ''
if journalClaims and wd.hasQualifier(journalClaims[1], 'P478') then
volume = wd.getFormattedQualifiers(journalClaims[1], 'P478')
else
volume = getStringStatementValue(entity, 'P478')
end
local chapter = ''
if journalClaims and wd.hasQualifier(journalClaims[1], 'P792') then
chapter = wd.getFormattedQualifiers(journalClaims[1], 'P792')
else
chapter = getStringStatementValue(entity, 'P792')
end
local page = ''
if journalClaims and wd.hasQualifier(journalClaims[1], 'P304') then
page = wd.getFormattedQualifiers(journalClaims[1], 'P304')
else
page = getStringStatementValue(entity, 'P304')
end
local publishdate = wd.formatStatements{entity = entity, property = 'P577', linktopic = '-'}
local publishplace = wd.formatStatements{entity = entity, property = 'P291', defaultlink = '-'}
--si pas d'éditeur (publisher), lieu ou date de publication, oclc ou bnf : on le cherche dans l'item renseigné sous P1433 (publié dans), appelé ici "journalEntity"
if (not publisher) and journalEntity then
publisher = wd.formatStatements{entity = journalEntity, property = "P123", defaultlink = "P577", labelformat = labelformatP1813}
end
if (not publishdate) and journalEntity then
publishdate = wd.formatStatements{entity = journalEntity, property = "P577", linktopic = "P577"}
end
if (not publishplace) and journalEntity then
publishplace = wd.formatStatements{entity = journalEntity, property = "P291", defaultlink = "P577"}
end
if (not oclc) and journalEntity then
oclc = wd.formatStatements{entity = journalEntity, property = "P243", defaultlink = "P577"}
end
if (not bnf) and journalEntity then
bnf = wd.formatStatements{entity = journalEntity, property = "P268", defaultlink = "P577"}
end
local pagenum = wd.formatStatements{entity = entity, property = 'P1104'}
local title
local titlestatement = wd.getClaims{entity = entity, property = 'P1476', numval = 1}
if titlestatement then
title = wd.getFormattedQualifiers(titlestatement[1], 'P6833') -- htmltitle
end
title = title or wd.formatStatements{entity = entity, property = 'P1476', numval = 1 } or wd.getLabel(entity)
local titlelink = wd.siteLink(entity)
local subtitle = titlestatement and wd.getFormattedQualifiers(titlestatement[1], 'P1680') or wd.formatStatements{entity = entity, property = 'P1680'}
local url = getStringStatementValue(entity, 'P2699') or getStringStatementValue(entity, 'P854') or getStringStatementValue(entity, 'P953') or (gallica and "https://gallica.bnf.fr/ark:/12148/" .. gallica)
-- à faire : transmettre l'"url de la référence" dans les options comme url prioritaire
local wikisource = mw.wikibase.getSitelink(entity, 'frwikisource')
if wikisource ~= nil and url ~= nil and url:find('%.wikisource%.org') then
url = nil -- we make sure to not have two links to Wikisource
end
local language = getDirectItemLang(entity, 'P407')
if not language and journalEntity then
language = getDirectItemLang(journalEntity, 'P407')
end
local originalLanguage = getDirectItemLang(entity, 'P364') --TODO: be clever? or getDirectItemLang(workEntity, 'P407') or getDirectItemLang(workEntity, 'P364')
if not language or language == originalLanguage then
originalLanguage = nil -- We are actually not sure if it has been translated from this language
end
local originalTitle = nil
if workEntity and originalLanguage then
originalTitle = wd.formatStatements{entity = workEntity, property = 'P1476', numval = 1 }
if not originalTitle then
originalTitle = mw.wikibase.getLabelByLang(workEntity, originalLanguage)
originalTitle = "<span lang='" .. originalLanguage .. "'>'"..originalTitle.."</span>"
end
end
local citation = wd.formatStatements{entity = entity, property = 'P1683'}
-- choix ddu type de citation adapté
local entitytype = wd.formatStatements{property = 'P31', entity = entity, numval = 1, displayformat = 'raw'}
local funtype
-- calcul du rendu du titre de l'ouvrage, éventuellement avec un lien vers l'article de l'ouvrage
-- pas de lien à générer si on est sur la page de l'ouvrage ou si l'élément cité est une édition de cet ouvrage
if not ( wd.isPageOfQId(entityId) or
workEntity and wd.isPageOfQId(wd.entityId(workEntity)) )
then
if not titlelink and workEntity then
-- si pas de lien, on peut essayer de voir si c'est l'édition de quelque chose d'autre
titlelink = wd.siteLink(workEntity)
end
if title and titlelink then
title = '[[' .. titlelink .. '|' .. title .. ']]'
end
end
-- calcul du modèle à utiliser pour rendre l'élémént
if (entitytype == 'Q3331189') then --book edition
funtype = cite.ouvrage
-- TODO : gérer l'édition et l'élément de l'oeuvre.
elseif refType.isOuvrage[entitytype] then -- ouvrage sans édition connue ?
-- TODO : gérer le cas ou un ouvrage est cité mais que Wikidata en connait des éditions.
-- TODO : refuser ce genre d'items ?
funtype = cite.ouvrage
elseif refType.isArticle[entitytype] then -- article
funtype = cite.article
elseif refType.isChapitre[entitytype] then -- chapitre
funtype = cite.chapitre
else -- par défaut : un rendu simple
local biblioCommun = require 'Module:Biblio/Commun'
local linguistic = require 'Module:Linguistique'
local parameters = authors
if title then
local titleblock = '<i>' .. title .. '</i>' -- à faire : mise en italique ou pas selon la nature de l'objet
if entitytype and wd.getLabel(entitytype) then
titleblock = titleblock .. ' (' .. wd.getLabel(entitytype) .. ')'
end
table.insert(parameters, titleblock)
end
if publisher then
table.insert(parameters, publisher)
end
if publishplace then
table.insert(parameters, publishplace)
end
if publishdate then
table.insert(parameters, publishdate)
end
if url then
table.insert(parameters, mw.getCurrentFrame():expandTemplate{title="lire en ligne",args={url=url}})
end
if options['page'] then
table.insert(parameters, biblioCommun.formatePassage(options['page']))
end
if options['accessdate'] then
table.insert(parameters, 'consulté le ' .. options['accessdate'])
end
parameters[#parameters] = parameters[#parameters] .. '.'
parameters[#parameters] = wd.addLinkBack(parameters[#parameters], entity)
return linguistic.conj(parameters, 'comma')
end
local parameters = {
['traducteur'] = translator,
['illustrateur'] = illustrator,
['préface'] = preface,
['postface'] = postface,
['photographe'] = photographe,
['titre'] = title,
['sous-titre'] = subtitle,
['date'] = publishdate,
['lieu'] = publishplace,
['périodique'] = journal,
["numéro d'édition"] = ednumber,
['éditeur'] = publisher,
['pages totales'] = pagenum,
['lire en ligne'] = url,
['wikisource'] = wikisource,
['oclc'] = oclc,
['bnf'] = bnf,
['lccn'] = lccn,
['dnb'] = dnb,
['doi'] = doi,
['pmid'] = pmid,
['jstor'] = jstor,
['bibcode'] = bibcode,
['arxiv'] = arxiv,
['pmcid'] = pmcid,
['langue'] = language,
['langue originale'] = originalLanguage,
['titre original'] = originalTitle,
['page'] = page,
['numéro'] = numero,
['volume'] = volume,
['citation'] = citation,
['plume'] = options['plume']
}
if refType.isChapitre[entitytype] and journalClaims then -- chapitre
parameters['titre'] = journal
parameters['sous-titre'] = '' -- TODO
parameters['lien titre'] = '' -- TODO
parameters['auteurs ouvrage'] = '' --TODO
parameters['numéro chapitre'] = chapter
parameters['titre chapitre'] = title
parameters['sous-titre chapitre'] = subtitle
parameters['traduction titre chapitre'] = '' -- TODO
end
isbns = remove_same_isbn(isbns)
for i, isbn in pairs(isbns) do
parameters['isbn' .. i] = isbn
end
for i, issn in pairs(issns) do
parameters['issn' .. i] = issn
end
-- try to find if there is an author set in options
local setAuthors = true
for i=1, 15 do
if options['auteur' .. i] or options['directeur' .. i] or options['responsabilité' .. i] then
setAuthors = false
end
end
if setAuthors then
for i, author in pairs(authors) do
parameters['auteur' .. i] = author
parameters['directeur' .. i] = are_director[i]
parameters['responsabilité' .. i] = responsability[i]
end
end
for parameter, value in pairs(options) do
if value == '-' then
parameters[parameter] = ''
else
parameters[parameter] = value
end
end
local val = funtype(parameters)
if val then
val = val .. '.'
return wd.addRefAnchor(wd.addLinkBack(val, entity), wd.entityId(entity))
end
return wd.formatError()
end
-- cette fonction est utilisée par [[Modèle:Bibliographie]]
function reference.citeItem(frame)
local args = frame:getParent().args
local entityId = mw.text.trim(args[1] or '')
if entityId == '' then
error('Un identifiant d\'entité Wikidata doit être renseigné')
-- il y a quelques utilisations du modèle sans paramètre, l'erreur Lua permet de les détecter
-- une fois ces utilisations corrigées, on pourra remplacer par une erreur classique :
--return '<span class="error">Un identifiant d\'entité Wikidata doit être renseigné.</span>'
end
if not mw.wikibase.entityExists(entityId) then
error('L\'entité Wikidata ' .. entityId .. ' n\'existe pas')
-- plus élégant (pas d'erreur Lua), mais aurait besoin d'une catégorisation
-- (car il est possible que l'entité soit supprimée plus tard) :
--return '<span class="error">L\'entité Wikidata ' .. mw.text.nowiki(entityId) .. ' n\'existe pas.</span>'
end
return reference.citeitem(entityId, args)
end
--used to test the duplicate isbn functions, use in the console like this
-- p.test()
reference.test = function()
test_same_isbn()
test_remove_same_isbn()
end
return reference