Module:ZoteroAPI
La documentation pour ce module peut être créée à Module:ZoteroAPI/doc
local p = {}
local cachedData = nil -- 🔒 Cache unique pour la durée d’exécution de la page
-- Fonction utilitaire : extrait le titre de recherche
local function getQueryTitle()
local fullTitle = mw.title.getCurrentTitle().text
local base = fullTitle:match("^(.-),%s?%d") or fullTitle
base = mw.ustring.gsub(base, "’", "'")
local encoded = mw.uri.encode(base, nil):gsub("+", "%%20")
return encoded
end
-- Fonction de récupération de données Zotero
function p._fetchZoteroData()
if cachedData then
return cachedData
end
local query = getQueryTitle()
local url = 'https://api.zotero.org/groups/4893620/items?q=' .. query .. '&qmode=titleCreatorYear&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 ici : 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
if type(decoded[1]) == "table" then
cachedData = decoded[1]
return cachedData
end
return nil
end
-- Fonctions de débogage
function p.debugResult()
local d = p._fetchZoteroData()
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
function p.debugRawJson()
local d = p._fetchZoteroData()
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
-- Fonctions accessibles
function p.caseName()
local d = p._fetchZoteroData()
return d and d.caseName or ''
end
function p.dateDecided()
local d = p._fetchZoteroData()
return d and d.dateDecided or ''
end
function p.docketNumber()
local d = p._fetchZoteroData()
return d and d.docketNumber or ''
end
function p.history()
local d = p._fetchZoteroData()
return d and d.history or ''
end
function p.url()
local d = p._fetchZoteroData()
return d and d.url or ''
end
function p.court()
local d = p._fetchZoteroData()
return d and d.court or ''
end
function p.auteurPrenom()
local d = p._fetchZoteroData()
return d and d.firstName or ''
end
function p.auteurNom()
local d = p._fetchZoteroData()
return d and d.lastName or ''
end
-- Affichage de l'URL utilisée (pour vérification)
function p.debugUrl()
local query = getQueryTitle()
return 'https://api.zotero.org/groups/4893620/items?q=' .. query .. '&qmode=titleCreatorYear&include=data&format=json'
end
return p