« 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 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
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
-- Fonction de récupération de données Zotero par itemKey
Ligne 20 : Ligne 27 :
     local url = 'https://api.zotero.org/groups/4893620/items/' .. itemKey .. '?include=data&format=json'
     local url = 'https://api.zotero.org/groups/4893620/items/' .. itemKey .. '?include=data&format=json'
      
      
    -- Afficher l'URL pour déboguer
     -- Récupérer les données via le parser
    mw.log('Fetching URL: ' .. url)
     local jsonData = p._getWebDataViaParser(frame, url)
   
     -- Récupérer les données avec getExternalData
     local success, result
    success, result = pcall(function()
        return mw.ext.externalData.getWebData{url = url}
    end)
   
    if not success then
        mw.log('Error fetching data: ' .. tostring(result))
        return nil
    end
      
      
    if not result or type(result) ~= "table" then
     -- Si pas de données, retourner nil
        mw.log('No data or unexpected type: ' .. type(result))
     if not jsonData or jsonData == "" then
        return nil
    end
   
     -- Pour le débogage
    mw.log('Response type: ' .. type(result))
   
    -- ExternalData peut retourner les données dans un format de table spécifique
    -- Tentons de trouver la donnée JSON dans cette table
    local jsonData
   
    -- Parcourir les résultats pour trouver le contenu JSON
    for k, v in pairs(result) do
        if type(v) == "string" and v:match("^%s*[{[]") then
            -- Cela semble être du JSON
            jsonData = v
            break
        end
    end
   
     if not jsonData then
        -- Si nous ne trouvons pas de JSON, essayons la première valeur
        if result[1] and type(result[1]) == "table" and result[1][1] then
            jsonData = result[1][1]
        end
    end
   
    if not jsonData then
        mw.log('No JSON data found in response')
         return nil
         return nil
     end
     end
      
      
     -- Décoder le JSON
     -- Décoder le JSON
     local decoded
     local success, decoded = pcall(mw.text.jsonDecode, jsonData)
    success, decoded = pcall(mw.text.jsonDecode, jsonData)
      
      
     if not success or not decoded then
     if not success or not decoded then
        mw.log('Failed to decode JSON: ' .. tostring(decoded))
         return nil
         return nil
     end
     end
      
      
     -- Traiter les données décodées
     -- Extraire les données de la réponse
     if decoded.data then
     if decoded.data then
         cachedData = decoded.data
         cachedData = decoded.data
Ligne 86 : Ligne 52 :
end
end


-- Fonction de débogage de base
-- Fonction de débogage pour tester la récupération de données
function p.debugBasic(frame)
function p.debugGetData(frame)
     local itemKey = frame and frame.args[1]
     local itemKey = frame and frame.args[1]
      
      
Ligne 96 : Ligne 62 :
     local url = 'https://api.zotero.org/groups/4893620/items/' .. itemKey .. '?include=data&format=json'
     local url = 'https://api.zotero.org/groups/4893620/items/' .. itemKey .. '?include=data&format=json'
      
      
     -- Tester différentes méthodes
     -- Tester la récupération directe via le parser
     local outputs = {}
     local jsonData = p._getWebDataViaParser(frame, url)
      
      
    -- Méthode 1: getExternalData
     if not jsonData or jsonData == "" then
    local success, result = pcall(function()
         return "Pas de données récupérées via #get_web_data"
        return mw.ext.externalData.getExternalData{url = url, format = 'json'}
    end)
   
    table.insert(outputs, "Méthode 1 (getExternalData):")
     if success then
        table.insert(outputs, "  Type: " .. type(result))
        if type(result) == "table" then
            table.insert(outputs, "  Clés: " .. table.concat(mw.getKeysSortedByValue(result), ", "))
         else
            table.insert(outputs, "  Valeur: " .. tostring(result))
        end
    else
        table.insert(outputs, " Erreur: " .. tostring(result))
     end
     end
      
      
     -- Méthode 2: getWebData
     -- Limiter la taille pour l'affichage
     success, result = pcall(function()
     if #jsonData > 1000 then
         return mw.ext.externalData.getWebData{url = url}
         jsonData = jsonData:sub(1, 1000) .. "... (tronqué)"
    end)
   
    table.insert(outputs, "\nMéthode 2 (getWebData):")
    if success then
        table.insert(outputs, "  Type: " .. type(result))
        if type(result) == "table" then
            table.insert(outputs, "  Clés: " .. table.concat(mw.getKeysSortedByValue(result), ", "))
        else
            table.insert(outputs, "  Valeur: " .. tostring(result))
        end
    else
        table.insert(outputs, " Erreur: " .. tostring(result))
     end
     end
      
      
     return table.concat(outputs, "\n")
     return "Données récupérées (longueur: " .. #jsonData .. "):\n\n" .. jsonData
end
end