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

De Wikiromandie.org
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
 
(2 versions intermédiaires par le même utilisateur non affichées)
Ligne 2 : Ligne 2 :


function p.render(frame)
function p.render(frame)
     local sparql = frame.args.sparql
     local sparql = frame.args.sparql or ""
     local title   = frame.args.title
     local title = frame.args.title or ""


     if not sparql or sparql == "" then
     if sparql == "" then
         return "⚠️ No SPARQL query provided."
         return "⚠️ No SPARQL query provided."
     end
     end


    -- ✅ Correct HTTP module for MediaWiki Lua
     local function htmlEncode(s)
     local http = require("http") -- Only works if the Http extension is enabled
        return s:gsub('&', '&')
 
                :gsub('"', '"')
    -- Better: use mw.ext.externalData if available
                 :gsub('<', '&lt;')
    -- Best on Wikimedia wikis: use the built-in method below
                 :gsub('>', '&gt;')
    local url = "https://query.wikidata.org/sparql?format=json&query="
        .. mw.uri.encode(sparql)
 
    -- ✅ Use mw.ext.LuaHttp if installed
    local ok, result = pcall(function()
        return mw.ext.LuaHttp.request({
            url = url,
            method = "GET",
            headers = {
                 ["Accept"] = "application/json",
                 ["User-Agent"] = "MediaWiki Lua Module/1.0"
            }
        })
    end)
 
    if not ok or not result or result.code ~= 200 then
        return "⚠️ HTTP request failed. Check that LuaHttp extension is installed."
     end
     end


     local data = mw.text.jsonDecode(result.body)
     return '<div class="wikidata-sparql-table"'
    local vars = data.head.vars
         .. ' data-sparql="' .. htmlEncode(sparql) .. '"'
    local rows = data.results.bindings
         .. ' data-title=".. htmlEncode(title) .. '">'
 
         .. '</div>'
    local html = {}
 
    if title and title ~= "" then
        table.insert(html, "=== " .. title .. " ===")
    end
 
    table.insert(html, '{| class="wikitable sortable"')
 
    -- Header row
    table.insert(html, "|-")
    for _, var in ipairs(vars) do
         table.insert(html, "! " .. var)
    end
 
    -- Data rows
    for _, row in ipairs(rows) do
        table.insert(html, "|-")
         for _, var in ipairs(vars) do
            local cell = (row[var] and row[var].value) or ""
            -- ✅ Render entity URIs as wiki links
            cell = cell:gsub("http://www%.wikidata%.org/entity/(Q%d+)", "[[wikidata:%1|%1]]")
            table.insert(html, "| " .. cell)
         end
    end
 
    table.insert(html, "|}")
 
    return table.concat(html, "\n")
end
end


return p
return p

Dernière version du 12 avril 2026 à 15:58

La documentation pour ce module peut être créée à Module:WikidataTable/doc

local p = {}

function p.render(frame)
    local sparql = frame.args.sparql or ""
    local title  = frame.args.title  or ""

    if sparql == "" then
        return "⚠️ No SPARQL query provided."
    end

    local function htmlEncode(s)
        return s:gsub('&', '&amp;')
                :gsub('"', '&quot;')
                :gsub('<', '&lt;')
                :gsub('>', '&gt;')
    end

    return '<div class="wikidata-sparql-table"'
        .. ' data-sparql="' .. htmlEncode(sparql) .. '"'
        .. ' data-title="'  .. htmlEncode(title)  .. '">'
        .. '</div>'
end

return p