Модуль:ExtGraph

Материал из Поле цифровой дидактики

Для документации этого модуля может быть создана страница Модуль:ExtGraph/doc

local p = {}

function p.main(frame)
    local args = frame.args
    local csvUrl = args.url or 'YOUR_CSV_URL_HERE'
    local view = args.view or 'table'  -- 'table' или 'graph'

    -- Получаем данные из CSV через ExternalData
    local data, errors = mw.ext.externalData.getWebData {
        url = csvUrl,
        format = 'CSV with header'
    }

    if errors then
        return '<strong>Ошибка загрузки данных:</strong> ' .. table.concat(errors, '<br>')
    end

    if not data or #data == 0 then
        return 'Нет данных для отображения.'
    end

    if view == 'graph' then
        -- Генерируем Graphviz digraph
        local graphNodes = {}
        local graphEdges = {}
        
        for _, row in ipairs(data) do
            local aid = row.author_id or ''
            local pid = row.pageid or ''
            if aid ~= '' and pid ~= '' then
                table.insert(graphNodes, string.format('  "%s" [shape=none];', aid))
                table.insert(graphEdges, string.format('  "%s" -> "%s";', aid, pid))
            end
        end

        local graphContent = table.concat(graphNodes, '\n') .. '\n' .. table.concat(graphEdges, '\n')
        return string.format([[<graphviz>
digraph G {
  layout = "neato";
%s
}
</graphviz>]], graphContent)
    else
        -- Оригинальная таблица
        local tableHtml = '{| class="wikitable sortable"\n! author_id !! pageid !! page_title !! category\n'

        for i, row in ipairs(data) do
            tableHtml = tableHtml .. string.format('|-\n| %s || %s || %s || %s\n',
                row.author_id or '',
                row.pageid or '',
                row.page_title or '',
                row.category or ''
            )
        end

        return tableHtml .. '|}\n'
    end
end

return p