Moduulin Fr:Wikidata/Références käyttöohje
Tämä sivu on kopio. Tätä ohjetta muokataan muokkaamalla suomenkielisessä Wikipediassa olevaa alkuperäistä versiota jonka muutokset kopioituvat automaattisesti tälle sivulle. 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(entity, propertyId)
local statements = entity:getBestStatements(propertyId)
for i, statement in pairs(statements) do
statements = tools.getValue(statement.mainsnak)
end
return statements
end
local function getStringStatementValue(entity, propertyId)
local statements = getStringStatementValues(entity, propertyId)
if #statements > 0 then
return statements
else
return nil
end
end
local function getDirectItemLang(workentity, property)
local itemlangs = getData.getClaims{entity = workentity, property = property}
if itemlangs ~= nil then
return langcodes.mainsnak)]
end
end
local function hasRole(statement, roleId)
return statement.qualifiers and (statement.qualifiers and tools.getId(statement.qualifiers) == roleId or statement.qualifiers and tools.getId(statement.qualifiers) == 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.orghttps://dictious.com/fi/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)
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.getEntity(tools.getMainId(workClaims))
end
local journalEntity = nil
local journalClaims = getData.getClaims{entity = entity, property = 'P1433'}
if journalClaims ~= nil then
journalEntity = tools.getEntity(tools.getMainId(journalClaims))
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(entity:getBestStatements('P50'), entity:getBestStatements('P2093'))) do
local author = wd.formatStatement(statement, {defaultlink = '-'})
local position = #authors + 1
if statement.qualifiers and statement.qualifiers then
position = tonumber(statement.qualifiers.datavalue.value)
end
authors = wd.formatStatement(statement, {defaultlink = '-', link = '-'})
are_director = ''
--qualifier pour la responsabilité
if statement.qualifiers and statement.qualifiers then
responsability = wd.formatSnak(statement.qualifiers, {defaultlink = '-'})
else
responsability = ''
end
end
for _, statement in pairs(entity:getBestStatements('P98')) do
table.insert(authors, wd.formatStatement(statement, {defaultlink = '-'}))
table.insert(are_director, 'y')
table.insert(responsability, '')
end
for _, statement in pairs(entity:getBestStatements('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 = '-'}
local journal = wd.formatStatements{entity = entity , property = 'P1433', defaultlink = '-'}
--TODO fix local journalnumber = wd.formatStatements{entity = entity, property = 'P433'}
--TODO fix local volume = wd.formatStatements{entity = entity, property = 'P478'}
local publishdate = wd.formatStatements{entity = entity, property = 'P577', linktopic = '-'}
local publishplace = wd.formatStatements{entity = entity, property = 'P291', defaultlink = '-'}
--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'}
local url = getStringStatementValue(entity, 'P854') or getStringStatementValue(entity, 'P953')
local officialurl = getStringStatementValue(entity, 'P856')
local wikisource = entity:getSitelink('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)
end
local page = getStringStatementValue(entity, 'P304')
local numero = getStringStatementValue(entity, 'P433')
local volume = getStringStatementValue(entity, 'P478')
-- 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 = ']'
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 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 then -- article
funtype = cite.article
else -- default: output a very simple display
local parameters = authors
if operator then
parameters = {operator}
end
if title and options then
table.insert(parameters, '<i> .. " " .. title .. ']</i>')
elseif not title and options then
table.insert(parameters, options)
elseif title and officialurl then
table.insert(parameters, '<i></i>')
elseif not title and officialurl then
table.insert(parameters, officialurl)
elseif title then
table.insert(parameters, '<i>' .. title .. '</i>')
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 options then
table.insert(parameters, 'p.' .. options)
end
if options then
table.insert(parameters, 'katsottu ' .. options)
end
if doi then
table.insert(parameters, "<small style='line-height:1em;'>(DOI )</small>")
end
return linguistic.conj(parameters, 'comma')
end
local parameters = {
= translator,
= illustrator,
= preface,
= postface,
= photographe,
= title,
= subtitle,
-- = volume,
= publishdate,
= publishplace,
= journal,
-- = journalnumber,
= ednumber,
= publisher,
= pagenum,
= url,
= wikisource,
= oclc,
= bnf,
= lccn,
= dnb,
= doi,
= pmid,
= jstor,
= bibcode,
= arxiv,
= pmcid,
= language,
= originalLanguage,
= originalTitle,
= page,
= numero,
= volume,
= options
}
isbns = remove_same_isbn(isbns)
for i, isbn in pairs(isbns) do
parameters = isbn
end
for i, issn in pairs(issns) do
parameters = issn
end
-- try to find if there is an author set in options
local setAuthors = true
for i=1, 15 do
if options or options or options then
setAuthors = false
end
end
if setAuthors then
for i, author in pairs(authors) do
parameters = author
parameters = are_director
parameters = responsability
end
end
for parameter, value in pairs(options) do
if value == '-' then
parameters = ''
else
parameters = value
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, 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