Moduuli:Fr:Wikidata/Références

Hei, olet tullut tänne etsimään sanan Moduuli:Fr:Wikidata/Références merkitystä. DICTIOUS-sanakirjasta löydät paitsi kaikki sanan Moduuli:Fr:Wikidata/Références sanakirjamerkitykset, myös sen etymologian, ominaisuudet ja sen, miten Moduuli:Fr:Wikidata/Références sanotaan yksikössä ja monikossa. Kaikki mitä sinun tarvitsee tietää sanasta Moduuli:Fr:Wikidata/Références on tässä. Sanan Moduuli:Fr:Wikidata/Références määritelmä auttaa sinua olemaan täsmällisempi ja oikeampi puhuessasi tai kirjoittaessasi tekstejäsi. Kun tunnet sananModuuli:Fr:Wikidata/Références määritelmän sekä muiden sanojen määritelmät, rikastutat sanavarastoasi ja saat lisää ja parempia kielellisiä resursseja.

Moduulin Fr:Wikidata/Références käyttöohje


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