« Module:ZoteroItem » : différence entre les versions

De alcolois
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 1 : Ligne 1 :
local p = {}
local p = {}


function p.getItem(frame)
-- Fonction utilitaire pour récupérer les données JSON Zotero
    local key = frame.args[1]
local function fetchZoteroData(itemKey)
    if not key or key == "" then
if not itemKey or itemKey == "" then return nil end
        return "Erreur : itemKey requis"
local url = string.format(
    end
"https://api.zotero.org/groups/4893620/items/%s?format=json&include=data",
itemKey
)
local data, errors = mw.ext.externalData.getExternalData{
url = url,
format = "JSON",
data = { json = "__json" }
}
if errors or not data or not data.json then
return nil
end
return data.json
end


    local groupId = "4893620"
-- Fonction générique pour retourner un champ simple
    local url = string.format(
local function getField(frame, path)
        "https://api.zotero.org/groups/%s/items/%s?format=json&include=data",
local itemKey = frame.args[1]
        groupId,
local data = fetchZoteroData(itemKey)
        key
if not data then return "" end
    )
local current = data
for _, key in ipairs(path) do
if type(current) ~= "table" or current[key] == nil then
return ""
end
current = current[key]
end
return mw.text.nowiki(tostring(current))
end


    local data, errors = mw.ext.externalData.getExternalData{
-- Fonctions individuelles
        url = url,
        format = "JSON",
        data = { json = "__json" }
    }


    if errors then
function p.key(frame)
        return "Erreur ExternalData : " .. table.concat(errors, "; ")
return getField(frame, { "key" })
    elseif not data or not data.json then
end
        return "Erreur : aucune donnée retournée"
    end


    local d = data.json.data
function p.alternateLink(frame)
    if not d then
return getField(frame, { "links", "alternate", "href" })
        return "Erreur : champ 'data' manquant dans le JSON"
end
    end


    local escape = mw.text.nowiki  -- alias utile
function p.caseName(frame)
return getField(frame, { "data", "caseName" })
end


    local out = {}
function p.abstractNote(frame)
    table.insert(out, "<strong>Titre :</strong> " .. escape(d.title or d.caseName or "(sans titre)"))
return getField(frame, { "data", "abstractNote" })
end


    if d.creators then
function p.court(frame)
        local authors = {}
return getField(frame, { "data", "court" })
        for _, c in ipairs(d.creators) do
end
            table.insert(authors, escape((c.firstName or "") .. " " .. (c.lastName or "")))
        end
        table.insert(out, "<br><strong>Auteurs :</strong> " .. table.concat(authors, ", "))
    end


    if d.dateDecided then
function p.dateDecided(frame)
        table.insert(out, "<br><strong>Date :</strong> " .. escape(d.dateDecided))
return getField(frame, { "data", "dateDecided" })
    end
end


    if d.abstractNote then
function p.docketNumber(frame)
        table.insert(out, "<br><strong>Résumé :</strong> " .. escape(d.abstractNote))
return getField(frame, { "data", "docketNumber" })
    end
end


    if d.url then
function p.reporter(frame)
        table.insert(out, '<br><strong>Lien :</strong> <a href="' .. escape(d.url) .. '" target="_blank">Voir</a>')
return getField(frame, { "data", "reporter" })
    end
end


    return table.concat(out)
function p.reporterVolume(frame)
return getField(frame, { "data", "reporterVolume" })
end
 
function p.firstPage(frame)
return getField(frame, { "data", "firstPage" })
end
 
function p.history(frame)
return getField(frame, { "data", "history" })
end
 
function p.language(frame)
return getField(frame, { "data", "language" })
end
 
function p.shortTitle(frame)
return getField(frame, { "data", "shortTitle" })
end
 
function p.url(frame)
return getField(frame, { "data", "url" })
end
 
function p.accessDate(frame)
return getField(frame, { "data", "accessDate" })
end
 
function p.rights(frame)
return getField(frame, { "data", "rights" })
end
 
function p.extra(frame)
return getField(frame, { "data", "extra" })
end
 
function p.dateAdded(frame)
return getField(frame, { "data", "dateAdded" })
end
 
function p.dateModified(frame)
return getField(frame, { "data", "dateModified" })
end
 
-- Créateurs (formaté en liste de noms complets)
function p.creators(frame)
local itemKey = frame.args[1]
local data = fetchZoteroData(itemKey)
if not data or not data.data or not data.data.creators then return "" end
local authors = {}
for _, c in ipairs(data.data.creators) do
local name = c.name or ((c.firstName or "") .. " " .. (c.lastName or ""))
if name ~= "" then
table.insert(authors, mw.text.nowiki(name))
end
end
return table.concat(authors, ", ")
end
 
-- Tags
function p.tags(frame)
local itemKey = frame.args[1]
local data = fetchZoteroData(itemKey)
if not data or not data.data or not data.data.tags then return "" end
local tags = {}
for _, t in ipairs(data.data.tags) do
if t.tag then
table.insert(tags, mw.text.nowiki(t.tag))
end
end
return table.concat(tags, ", ")
end
 
-- Collections
function p.collections(frame)
local itemKey = frame.args[1]
local data = fetchZoteroData(itemKey)
if not data or not data.data or not data.data.collections then return "" end
if #data.data.collections == 0 then return "" end
local out = {}
for _, id in ipairs(data.data.collections) do
table.insert(out, mw.text.nowiki(id))
end
return table.concat(out, ", ")
end
 
-- Relations
function p.relations(frame)
local itemKey = frame.args[1]
local data = fetchZoteroData(itemKey)
if not data or not data.data or not data.data.relations then return "" end
local rel = data.data.relations
local out = {}
for k, v in pairs(rel) do
table.insert(out, mw.text.nowiki(k .. ": " .. v))
end
return table.concat(out, ", ")
end
end


return p
return p

Version du 12 juin 2025 à 17:51

La documentation pour ce module peut être créée à Module:ZoteroItem/doc

local p = {}

-- Fonction utilitaire pour récupérer les données JSON Zotero
local function fetchZoteroData(itemKey)
	if not itemKey or itemKey == "" then return nil end
	local url = string.format(
		"https://api.zotero.org/groups/4893620/items/%s?format=json&include=data",
		itemKey
	)
	local data, errors = mw.ext.externalData.getExternalData{
		url = url,
		format = "JSON",
		data = { json = "__json" }
	}
	if errors or not data or not data.json then
		return nil
	end
	return data.json
end

-- Fonction générique pour retourner un champ simple
local function getField(frame, path)
	local itemKey = frame.args[1]
	local data = fetchZoteroData(itemKey)
	if not data then return "" end
	local current = data
	for _, key in ipairs(path) do
		if type(current) ~= "table" or current[key] == nil then
			return ""
		end
		current = current[key]
	end
	return mw.text.nowiki(tostring(current))
end

-- Fonctions individuelles

function p.key(frame)
	return getField(frame, { "key" })
end

function p.alternateLink(frame)
	return getField(frame, { "links", "alternate", "href" })
end

function p.caseName(frame)
	return getField(frame, { "data", "caseName" })
end

function p.abstractNote(frame)
	return getField(frame, { "data", "abstractNote" })
end

function p.court(frame)
	return getField(frame, { "data", "court" })
end

function p.dateDecided(frame)
	return getField(frame, { "data", "dateDecided" })
end

function p.docketNumber(frame)
	return getField(frame, { "data", "docketNumber" })
end

function p.reporter(frame)
	return getField(frame, { "data", "reporter" })
end

function p.reporterVolume(frame)
	return getField(frame, { "data", "reporterVolume" })
end

function p.firstPage(frame)
	return getField(frame, { "data", "firstPage" })
end

function p.history(frame)
	return getField(frame, { "data", "history" })
end

function p.language(frame)
	return getField(frame, { "data", "language" })
end

function p.shortTitle(frame)
	return getField(frame, { "data", "shortTitle" })
end

function p.url(frame)
	return getField(frame, { "data", "url" })
end

function p.accessDate(frame)
	return getField(frame, { "data", "accessDate" })
end

function p.rights(frame)
	return getField(frame, { "data", "rights" })
end

function p.extra(frame)
	return getField(frame, { "data", "extra" })
end

function p.dateAdded(frame)
	return getField(frame, { "data", "dateAdded" })
end

function p.dateModified(frame)
	return getField(frame, { "data", "dateModified" })
end

-- Créateurs (formaté en liste de noms complets)
function p.creators(frame)
	local itemKey = frame.args[1]
	local data = fetchZoteroData(itemKey)
	if not data or not data.data or not data.data.creators then return "" end
	local authors = {}
	for _, c in ipairs(data.data.creators) do
		local name = c.name or ((c.firstName or "") .. " " .. (c.lastName or ""))
		if name ~= "" then
			table.insert(authors, mw.text.nowiki(name))
		end
	end
	return table.concat(authors, ", ")
end

-- Tags
function p.tags(frame)
	local itemKey = frame.args[1]
	local data = fetchZoteroData(itemKey)
	if not data or not data.data or not data.data.tags then return "" end
	local tags = {}
	for _, t in ipairs(data.data.tags) do
		if t.tag then
			table.insert(tags, mw.text.nowiki(t.tag))
		end
	end
	return table.concat(tags, ", ")
end

-- Collections
function p.collections(frame)
	local itemKey = frame.args[1]
	local data = fetchZoteroData(itemKey)
	if not data or not data.data or not data.data.collections then return "" end
	if #data.data.collections == 0 then return "" end
	local out = {}
	for _, id in ipairs(data.data.collections) do
		table.insert(out, mw.text.nowiki(id))
	end
	return table.concat(out, ", ")
end

-- Relations
function p.relations(frame)
	local itemKey = frame.args[1]
	local data = fetchZoteroData(itemKey)
	if not data or not data.data or not data.data.relations then return "" end
	local rel = data.data.relations
	local out = {}
	for k, v in pairs(rel) do
		table.insert(out, mw.text.nowiki(k .. ": " .. v))
	end
	return table.concat(out, ", ")
end

return p