Module:ZoteroAPI

De alcolois
Aller à la navigation Aller à la recherche

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