Moduuli:Fr:Wikidata/Références
Siirry navigaatioon
Siirry hakuun
[ muokkaa ] Tämä moduuli on osa ranskankielisestä Wikipediasta kopioitua Wikidata ja Interface Wikidata -moduulikokonaisuutta (ks. ohjeet ja esimerkit). Listauksen kaikista tähän liittyvistä moduuleista löydät Ranskankielisen Wikipedian Wikidata-moduulit -sivulta.
|
local reference = {}
local wd = require 'Module:Fr:Wikidata'
local refType = mw.loadData 'Module:Fr:Wikidata/Références/Types'
local linguistic = require 'Module:Fr:Linguistique'
local cite = require 'Module:Fr:Biblio'
local langcodes = mw.loadData 'Module:Fr:Dictionnaire Wikidata/Codes langue'
local tools = require 'Module:Fr:Wikidata/Outils'
local entities = require 'Module:Fr:Wikidata/Formatage entité'
local getData = require 'Module:Fr:Wikidata/Récup'
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(entityId, propertyId)
local statements = mw.wikibase.getBestStatements(entityId, propertyId)
for i, statement in pairs(statements) do
statements[i] = tools.getValue(statement.mainsnak)
end
return statements
end
local function getStringStatementValue(entityId, propertyId)
local statements = getStringStatementValues(entityId, propertyId)
if #statements > 0 then
return statements[1]
else
return nil
end
end
local function getDirectItemLang(workentity, property)
local itemlangs = getData.getClaims{entity = workentity, property = property}
if itemlangs ~= nil then
return langcodes[tools.getNumericId(itemlangs[1].mainsnak)]
end
end
local function hasRole(statement, roleId)
return statement.qualifiers and (statement.qualifiers['P518'] and tools.getId(statement.qualifiers['P518'][1]) == roleId or statement.qualifiers['P794'] and tools.getId(statement.qualifiers['P794'][1]) == roleId)
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:Fr: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
function reference.citeitem(entityId, options)
if not entityId then
return nil
end
-- local entity = tools.getEntity(entityId)
local entity = entityId
if not entity then
return 'invalid entity id'
end
if type( options ) ~= 'table' then
options = {}
end
--work entity if it exists
local workEntity = nil
local workClaims = getData.getClaims{entity = entity, property = 'P629'} -- P629 : édition de
if workClaims ~= nil then
workEntity = tools.getMainId(workClaims[1])
end
local journalEntity = nil
local journalClaims = getData.getClaims{entity = entity, property = 'P1433'}
if journalClaims ~= nil then
journalEntity = tools.getMainId(journalClaims[1])
end
local translator = wd.formatStatements{entity = entity, property = 'P655', defaultlink = '-'}
local illustrator = wd.formatStatements{entity = entity, property = 'P110', defaultlink = '-'}
local operator = wd.formatStatements{entity = entity, property = 'P137', defaultlink = '-', link = '-'}
local preface = ''
local postface = ''
local photographe = ''
local authors = {}
local are_director = {}
local responsability = {}
for _, statement in pairs(concatTables(mw.wikibase.getBestStatements(entity, 'P50'), mw.wikibase.getBestStatements(entity, 'P2093'))) do
local author = wd.formatStatement(statement, {defaultlink = '-'})
local position = #authors + 1
if statement.qualifiers and statement.qualifiers['P1545'] then
position = tonumber(statement.qualifiers['P1545'][1].datavalue.value)
end
authors[position] = wd.formatStatement(statement, {defaultlink = '-', link = '-'})
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
table.insert(authors, wd.formatStatement(statement, {link = '-'}))
table.insert(are_director, 'y')
table.insert(responsability, '')
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 = wd.formatStatement(statement, {defaultlink = '-'})
elseif hasRole(statement, 'Q7234272') then --postface
postface = wd.formatStatement(statement, {defaultlink = '-'})
elseif hasRole(statement, 'Q33231') or hasRole(statement, 'Q125191') then --photographe/photographie
photographe = wd.formatStatement(statement, {defaultlink = '-'})
end
end
local isbns = getStringStatementValues(entity, 'P212')
for _, isbn in pairs(getStringStatementValues(entity, 'P957')) do
table.insert(isbns, isbn)
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 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 = '-', link = '-'}
local journal = wd.formatStatements{entity = entity , property = 'P1433', defaultlink = '-'}
-- hasQualifier() missing currently, needs more surgery
local page = getStringStatementValue(entity, 'P304')
local numero = getStringStatementValue(entity, 'P433')
local volume = getStringStatementValue(entity, 'P478')
local publishdate = wd.formatStatements{entity = entity, property = 'P577', linktopic = '-'}
local publishplace = wd.formatStatements{entity = entity, property = 'P291', defaultlink = '-', link = '-'}
--if no publication date and place, look for it in the item stored in P1433, misnamed here as "journalEntity"
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
local pagenum = wd.formatStatements{entity = entity, property = 'P1104'}
local title = wd.formatStatements{entity = entity, property = 'P1476', numval = 1 } or entities.getLabel(entity)
local titlelink = entities.getLink(entity)
local subtitle = wd.formatStatements{entity = entity, property = 'P1680', lang='fi,en,sv,de,fr'}
local url = getStringStatementValue(entity, 'P854') or getStringStatementValue(entity, 'P953') or getStringStatementValue(entity, 'P1065') or getStringStatementValue(entity, 'P2699')
local officialurl = getStringStatementValue(entity, 'P856')
local wikisource = mw.wikibase.getSitelink(entity, 'frwikisource')
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 } or workEntity:getLabel(originalLanguage)
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'}
-- choose relevant cite type
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 tools.is_page_of_qid(entityId) and
(not(workEntity) or not tools.is_page_of_qid(tools.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 = entities.getLink(workEntity)
end
if title and titlelink then
-- fiwikissä ei linkitetä lähteissä teosten wikipedia-artikkeleihin
-- 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
elseif title and (url or officialurl) then
funtype = cite.lienWeb
else -- default: output a very simple display
funtype = cite.lienFailback
end
local parameters = {
['traducteur'] = translator,
['illustrateur'] = illustrator,
['préface'] = preface,
['postface'] = postface,
['photographe'] = photographe,
['titre'] = title,
['sous-titre'] = subtitle,
--['volume'] = volume,
['date'] = publishdate,
['lieu'] = publishplace,
['périodique'] = journal,
--['numéro'] = journalnumber,
["numéro d'édition"] = ednumber,
['éditeur'] = publisher,
['pages totales'] = pagenum,
['lire en ligne'] = url,
['officialurl'] = officialurl,
['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']
}
local mappings = {
['traducteur'] = 'Suomentaja',
['illustrateur'] = 'illustrateur',
['préface'] = 'préface',
['postface'] = 'postface',
['photographe'] ='photographe',
['titre'] = { 'Nimeke', 'Nimike', 'Otsikko'},
['sous-titre'] = 'sous-titre',
--['volume'] = volume,
['date'] = {'Ajankohta', 'Vuosi' },
['lieu'] = 'Julkaisupaikka',
['périodique'] = 'Julkaisu',
--['numéro'] = journalnumber,
["numéro d'édition"] = ednumber,
['éditeur'] = 'Julkaisija',
['pages totales'] = 'pages totales',
['lire en ligne'] = {'Osoite', 'www'},
['officialurl'] = {'Osoite', 'www'},
['wikisource'] = 'wikisource',
['oclc'] = 'oclc',
['bnf'] = 'bnf',
['lccn'] = 'lccn',
['dnb'] = 'dnb',
['doi'] = 'doi',
['pmid'] = 'pmid',
['jstor'] = 'jstor',
['bibcode'] = 'bibcode',
['arxiv'] = 'arxiv',
['pmcid'] = 'pmcid',
['langue'] = 'Kieli',
['langue originale'] = 'langue originale',
['titre original'] = 'titre original',
['page'] = {'Sivu', 'Sivut'},
['numéro'] = 'Numero',
['volume'] = 'Osa',
['plume'] = '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
if options["isbn"]~='-' then
isbns = remove_same_isbn(isbns)
for i, isbn in pairs(isbns) do
parameters['isbn' .. i] = isbn
end
end
if options["issn"]~='-' then
for i, issn in pairs(issns) do
parameters['issn' .. i] = issn
end
end
if options["Tekijä"]~='-' then
-- 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
end
for parameter, value in pairs(options) do
if value == '-' then
parameters[parameter] = ''
else
parameters[parameter] = value
end
end
-- clean fiwiki paramn names
for parameter, value in pairs(mappings) do
local loop={}
if type(value) == 'table' then
loop=value
else
loop={value}
end
for k, v in pairs(loop) do
if options[v] and options[v]=='-' then
parameters[parameter]=''
end
end
end
local val = funtype(parameters)
if val then
return wd.addRefAnchor(wd.addLinkback(val, entity), tools.EntityId(entity))
end
return tools.formatError()
end
-- pour tester
function reference.citeItem(frame)
local args = frame:getParent().args
return reference.citeitem(args[1], 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