« Module:ZoteroAPI » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
| Ligne 1 : | Ligne 1 : | ||
local p = {} | local p = {} | ||
local cachedData = nil -- 🔒 Cache unique pour la durée | local cachedData = nil -- 🔒 Cache unique pour la durée d'exécution de la page | ||
-- Fonction | -- Fonction de récupération de données Zotero par itemKey | ||
function p._fetchZoteroData(frame) | |||
-- Utiliser le cache si disponible | |||
if cachedData then | |||
return cachedData | |||
end | |||
end | -- Obtenir l'itemKey depuis le paramètre | ||
local itemKey = frame and frame.args[1] | |||
-- | |||
-- Si aucun itemKey n'est fourni, retourner nil | |||
if not itemKey or itemKey == "" then | |||
return nil | |||
end | |||
-- Construire l'URL avec l'itemKey spécifique | |||
local url = 'https://api.zotero.org/groups/4893620/items/' .. itemKey .. '?include=data&format=json' | |||
local success, data = pcall(mw.ext.externalData.getExternalData, { | |||
url = url, | |||
format = 'json' | |||
}) | |||
if not success or not data then | |||
return nil | |||
end | |||
-- Correction: on s'assure que `data` est bien une table | |||
local decoded | |||
if type(data) == "string" then | |||
local ok, result = pcall(mw.text.jsonDecode, data) | |||
if not ok or type(result) ~= "table" then | |||
return nil | |||
end | |||
decoded = result | |||
elseif type(data) == "table" then | |||
decoded = data | |||
else | |||
return nil | |||
end | |||
-- Pour l'itemKey, la réponse de l'API est directement l'objet (pas un tableau) | |||
cachedData = decoded.data | |||
return cachedData | |||
end | end | ||
-- Fonctions de débogage | -- Fonctions de débogage | ||
function p.debugResult() | function p.debugResult(frame) | ||
local d = p._fetchZoteroData(frame) | |||
if not d then return "Aucune donnée reçue" end | |||
local out = {} | |||
table.insert(out, "✔ Clé : " .. (d.key or '')) | |||
table.insert(out, "✔ Titre : " .. (d.caseName or '')) | |||
table.insert(out, "✔ Tribunal : " .. (d.court or '')) | |||
table.insert(out, "✔ Date : " .. (d.dateDecided or '')) | |||
table.insert(out, "✔ URL : " .. (d.url or '')) | |||
table.insert(out, "✔ Auteur : " .. (d.firstName or '') .. " " .. (d.lastName or '')) | |||
return table.concat(out, "\n") | |||
end | end | ||
function p.debugRawJson() | function p.debugRawJson(frame) | ||
local d = p._fetchZoteroData(frame) | |||
if not d then | |||
return "Aucune donnée reçue" | |||
end | |||
local function indentJson(json) | |||
local indent = 0 | |||
local formatted = {} | |||
local inString = false | |||
for i = 1, #json do | |||
local c = json:sub(i, i) | |||
if c == '"' and json:sub(i - 1, i - 1) ~= '\\' then | |||
inString = not inString | |||
end | |||
if not inString then | |||
if c == '{' or c == '[' then | |||
table.insert(formatted, c .. '\n' .. string.rep(' ', indent + 1)) | |||
indent = indent + 1 | |||
elseif c == '}' or c == ']' then | |||
indent = indent - 1 | |||
table.insert(formatted, '\n' .. string.rep(' ', indent) .. c) | |||
elseif c == ',' then | |||
table.insert(formatted, ',\n' .. string.rep(' ', indent)) | |||
else | |||
table.insert(formatted, c) | |||
end | |||
else | |||
table.insert(formatted, c) | |||
end | |||
end | |||
return table.concat(formatted) | |||
end | |||
local raw = mw.text.jsonEncode(d) | |||
local pretty = indentJson(raw) | |||
return '<pre>' .. pretty .. '</pre>' | |||
end | end | ||
-- Fonctions accessibles | -- Fonctions accessibles | ||
function p.caseName() | function p.caseName(frame) | ||
local d = p._fetchZoteroData(frame) | |||
return d and d.caseName or '' | |||
end | end | ||
function p.dateDecided() | function p.dateDecided(frame) | ||
local d = p._fetchZoteroData(frame) | |||
return d and d.dateDecided or '' | |||
end | end | ||
function p.docketNumber() | function p.docketNumber(frame) | ||
local d = p._fetchZoteroData(frame) | |||
return d and d.docketNumber or '' | |||
end | end | ||
function p.history() | function p.history(frame) | ||
local d = p._fetchZoteroData(frame) | |||
return d and d.history or '' | |||
end | end | ||
function p.url() | function p.url(frame) | ||
local d = p._fetchZoteroData(frame) | |||
return d and d.url or '' | |||
end | end | ||
function p.court() | function p.court(frame) | ||
local d = p._fetchZoteroData(frame) | |||
return d and d.court or '' | |||
end | end | ||
function p.auteurPrenom() | function p.auteurPrenom(frame) | ||
local d = p._fetchZoteroData(frame) | |||
return d and d.firstName or '' | |||
end | end | ||
function p.auteurNom() | function p.auteurNom(frame) | ||
local d = p._fetchZoteroData(frame) | |||
return d and d.lastName or '' | |||
end | end | ||
-- Affichage de l'URL utilisée (pour vérification) | -- Affichage de l'URL utilisée (pour vérification) | ||
function p.debugUrl() | function p.debugUrl(frame) | ||
local itemKey = frame and frame.args[1] or "" | |||
return 'https://api.zotero.org/groups/4893620/items/' .. itemKey .. '?include=data&format=json' | |||
end | end | ||
return p | return p | ||