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

De alcolois
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 2 : Ligne 2 :
local cachedData = nil  -- 🔒 Cache unique pour la durée d'exécution de la page
local cachedData = nil  -- 🔒 Cache unique pour la durée d'exécution de la page


-- Fonction d'aide pour appeler #get_web_data via preprocess
-- Fonction de récupération de données via un proxy local
function p._getWebDataViaParser(frame, url)
    local webDataCall = '{{#get_web_data:url=' .. url .. '|format=json}}'
    local result = frame:preprocess(webDataCall)
    return result
end
 
-- Fonction de récupération de données Zotero par itemKey
function p._fetchZoteroData(frame)
function p._fetchZoteroData(frame)
     -- Utiliser le cache si disponible
     -- Utiliser le cache si disponible
Ligne 24 : Ligne 17 :
     end
     end
      
      
     -- Construire l'URL avec l'itemKey spécifique
     -- Récupérer les données depuis une page locale de notre wiki
     local url = 'https://api.zotero.org/groups/4893620/items/' .. itemKey .. '?include=data&format=json'
     local proxyPage = "MediaWiki:ZoteroData/" .. itemKey
    local proxyContent = mw.title.new(proxyPage).content
      
      
    -- Récupérer les données via le parser
     if not proxyContent or proxyContent == "" then
    local jsonData = p._getWebDataViaParser(frame, url)
   
    -- Si pas de données, retourner nil
     if not jsonData or jsonData == "" then
         return nil
         return nil
     end
     end
      
      
     -- Décoder le JSON
     -- Décoder le JSON stocké dans la page proxy
     local success, decoded = pcall(mw.text.jsonDecode, jsonData)
     local success, decoded = pcall(mw.text.jsonDecode, proxyContent)
      
      
     if not success or not decoded then
     if not success or not decoded then
Ligne 42 : Ligne 32 :
     end
     end
      
      
     -- Extraire les données de la réponse
     -- Stocker dans le cache
     if decoded.data then
    cachedData = decoded
         cachedData = decoded.data
    return cachedData
     else
end
         cachedData = decoded
 
-- Fonction pour créer une page proxy (à utiliser par les administrateurs)
function p.createProxyPage(frame)
    local itemKey = frame.args[1]
    local jsonData = frame.args[2]
   
     if not itemKey or not jsonData then
         return "Erreur: itemKey et jsonData sont requis"
    end
   
    -- Vérifier que le JSON est valide
    local success, _ = pcall(mw.text.jsonDecode, jsonData)
     if not success then
         return "Erreur: JSON invalide"
     end
     end
      
      
     return cachedData
    -- Afficher le contenu à copier dans une page MediaWiki:ZoteroData/<itemKey>
     return "Pour créer la page proxy, copiez le JSON suivant dans la page [[MediaWiki:ZoteroData/" ..
          itemKey .. "]]:\n\n<pre>" .. jsonData .. "</pre>"
end
end


-- Fonction de débogage pour tester la récupération de données
-- Fonction de débogage pour vérifier si une page proxy existe
function p.debugGetData(frame)
function p.checkProxyPage(frame)
     local itemKey = frame and frame.args[1]
     local itemKey = frame and frame.args[1]
      
      
Ligne 60 : Ligne 65 :
     end
     end
      
      
     local url = 'https://api.zotero.org/groups/4893620/items/' .. itemKey .. '?include=data&format=json'
     local proxyPage = "MediaWiki:ZoteroData/" .. itemKey
   
     local pageTitle = mw.title.new(proxyPage)
    -- Tester la récupération directe via le parser
     local jsonData = p._getWebDataViaParser(frame, url)
      
      
     if not jsonData or jsonData == "" then
     if not pageTitle.exists then
         return "Pas de données récupérées via #get_web_data"
         return "La page proxy " .. proxyPage .. " n'existe pas"
     end
     end
      
      
     -- Limiter la taille pour l'affichage
     return "La page proxy " .. proxyPage .. " existe et contient " ..  
    if #jsonData > 1000 then
          #pageTitle.content .. " caractères"
        jsonData = jsonData:sub(1, 1000) .. "... (tronqué)"
    end
   
    return "Données récupérées (longueur: " .. #jsonData .. "):\n\n" .. jsonData
end
end


-- Fonctions de débogage
-- Les autres fonctions restent identiques
function p.debugResult(frame)
function p.debugResult(frame)
     local d = p._fetchZoteroData(frame)
     local d = p._fetchZoteroData(frame)
Ligne 89 : Ligne 88 :
     table.insert(out, "✔ Auteur : " .. (d.firstName or '') .. " " .. (d.lastName or ''))
     table.insert(out, "✔ Auteur : " .. (d.firstName or '') .. " " .. (d.lastName or ''))
     return table.concat(out, "\n")
     return table.concat(out, "\n")
end
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


Ligne 167 : Ligne 129 :
     local d = p._fetchZoteroData(frame)
     local d = p._fetchZoteroData(frame)
     return d and d.lastName or ''
     return d and d.lastName or ''
end
-- Affichage de l'URL utilisée (pour vérification)
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

Version du 12 juin 2025 à 16:25

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 de récupération de données via un proxy local
function p._fetchZoteroData(frame)
    -- Utiliser le cache si disponible
    if cachedData then
        return cachedData
    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
    
    -- Récupérer les données depuis une page locale de notre wiki
    local proxyPage = "MediaWiki:ZoteroData/" .. itemKey
    local proxyContent = mw.title.new(proxyPage).content
    
    if not proxyContent or proxyContent == "" then
        return nil
    end
    
    -- Décoder le JSON stocké dans la page proxy
    local success, decoded = pcall(mw.text.jsonDecode, proxyContent)
    
    if not success or not decoded then
        return nil
    end
    
    -- Stocker dans le cache
    cachedData = decoded
    return cachedData
end

-- Fonction pour créer une page proxy (à utiliser par les administrateurs)
function p.createProxyPage(frame)
    local itemKey = frame.args[1]
    local jsonData = frame.args[2]
    
    if not itemKey or not jsonData then
        return "Erreur: itemKey et jsonData sont requis"
    end
    
    -- Vérifier que le JSON est valide
    local success, _ = pcall(mw.text.jsonDecode, jsonData)
    if not success then
        return "Erreur: JSON invalide"
    end
    
    -- Afficher le contenu à copier dans une page MediaWiki:ZoteroData/<itemKey>
    return "Pour créer la page proxy, copiez le JSON suivant dans la page [[MediaWiki:ZoteroData/" .. 
           itemKey .. "]]:\n\n<pre>" .. jsonData .. "</pre>"
end

-- Fonction de débogage pour vérifier si une page proxy existe
function p.checkProxyPage(frame)
    local itemKey = frame and frame.args[1]
    
    if not itemKey or itemKey == "" then
        return "Aucun itemKey fourni"
    end
    
    local proxyPage = "MediaWiki:ZoteroData/" .. itemKey
    local pageTitle = mw.title.new(proxyPage)
    
    if not pageTitle.exists then
        return "La page proxy " .. proxyPage .. " n'existe pas"
    end
    
    return "La page proxy " .. proxyPage .. " existe et contient " .. 
           #pageTitle.content .. " caractères"
end

-- Les autres fonctions restent identiques
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

-- Fonctions accessibles
function p.caseName(frame)
    local d = p._fetchZoteroData(frame)
    return d and d.caseName or ''
end

function p.dateDecided(frame)
    local d = p._fetchZoteroData(frame)
    return d and d.dateDecided or ''
end

function p.docketNumber(frame)
    local d = p._fetchZoteroData(frame)
    return d and d.docketNumber or ''
end

function p.history(frame)
    local d = p._fetchZoteroData(frame)
    return d and d.history or ''
end

function p.url(frame)
    local d = p._fetchZoteroData(frame)
    return d and d.url or ''
end

function p.court(frame)
    local d = p._fetchZoteroData(frame)
    return d and d.court or ''
end

function p.auteurPrenom(frame)
    local d = p._fetchZoteroData(frame)
    return d and d.firstName or ''
end

function p.auteurNom(frame)
    local d = p._fetchZoteroData(frame)
    return d and d.lastName or ''
end

return p