Модуль:ExtGraph: различия между версиями

Материал из Поле цифровой дидактики
Новая страница: «local p = {} function p.main(frame) local args = frame.args local csvUrl = args.url or 'YOUR_CSV_URL_HERE' local viewMode = args.mode or 'table' -- 'table' или 'graph' -- Получаем данные из CSV через ExternalData local data, errors = mw.ext.externalData.getWebData { url = csvUrl, format = 'CSV with header' } if errors then return '<strong>Ошибка загрузки данны...»
 
Нет описания правки
Строка 4: Строка 4:
     local args = frame.args
     local args = frame.args
     local csvUrl = args.url or 'YOUR_CSV_URL_HERE'
     local csvUrl = args.url or 'YOUR_CSV_URL_HERE'
     local viewMode = args.mode or 'table'  -- 'table' или 'graph'
     local view = args.view or 'table'  -- 'table' или 'graph'


     -- Получаем данные из CSV через ExternalData
     -- Получаем данные из CSV через ExternalData
Строка 22: Строка 22:
     local output = {}
     local output = {}


     -- Режим 1: Таблица
     -- Таблица (по умолчанию)
     if viewMode == 'table' or viewMode == 'both' then
     if view == 'table' or view == 'both' then
         local tableHtml = '{| class="wikitable sortable"\n! author_id !! pageid !! page_title !! category\n'
         local tableHtml = '{| class="wikitable sortable"\n! author_id !! pageid !! page_title !! category\n'
         for i, row in ipairs(data) do
         for i, row in ipairs(data) do
Строка 37: Строка 37:
     end
     end


     -- Режим 2: График Graphviz
     -- Граф (второй режим)
     if viewMode == 'graph' or viewMode == 'both' then
     if view == 'graph' or view == 'both' then
         local graphContent = 'digraph G {\n  layout = "neato";\n'
         local graphNodes = {}
        local graphEdges = {}
          
          
         for i, row in ipairs(data) do
         for i, row in ipairs(data) do
             local author = row.author_id or ''
             local aid = row.author_id or ''
             local page = row.pageid or ''
             local pid = row.pageid or ''
             if author ~= '' and page ~= '' then
           
                 -- Авторы - овалы, страницы - прямоугольники
             if aid ~= '' and pid ~= '' then
                 graphContent = graphContent .. string.format(' "%s" [shape=oval, label="Author: %s"];\n', author, author)
                 -- Узлы с shape
                 graphContent = graphContent .. string.format(' "%s" [shape=box, label="%s"];\n', page, row.page_title or page)
                 graphNodes[aid] = 'author_' .. aid .. ' [shape=box,label="' .. aid .. '"]'
                 graphContent = graphContent .. string.format(' "%s" -> "%s";\n', author, page)
                 graphNodes['page_' .. pid] = 'page_' .. pid .. ' [shape=ellipse,label="' .. pid .. '"]'
                  
                -- Ребро
                table.insert(graphEdges, string.format('author_%s -> page_%s', aid, pid))
             end
             end
        end
        local graphContent = 'digraph G {\n  layout = "neato";\n'
       
        -- Узлы
        for _, nodeDef in pairs(graphNodes) do
            graphContent = graphContent .. '  ' .. nodeDef .. ';\n'
        end
       
        -- Рёбра
        for _, edge in ipairs(graphEdges) do
            graphContent = graphContent .. '  ' .. edge .. ';\n'
         end
         end
          
          
         graphContent = graphContent .. '}\n'
         graphContent = graphContent .. '}\n'
         table.insert(output, string.format('<graphviz>%s</graphviz>', graphContent))
         table.insert(output, '<graphviz>' .. graphContent .. '</graphviz>')
     end
     end



Версия от 19:33, 25 февраля 2026

Для документации этого модуля может быть создана страница Модуль: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

    local output = {}

    -- Таблица (по умолчанию)
    if view == 'table' or view == 'both' then
        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
        tableHtml = tableHtml .. '|}\n'
        table.insert(output, tableHtml)
    end

    -- Граф (второй режим)
    if view == 'graph' or view == 'both' then
        local graphNodes = {}
        local graphEdges = {}
        
        for i, row in ipairs(data) do
            local aid = row.author_id or ''
            local pid = row.pageid or ''
            
            if aid ~= '' and pid ~= '' then
                -- Узлы с shape
                graphNodes[aid] = 'author_' .. aid .. ' [shape=box,label="' .. aid .. '"]'
                graphNodes['page_' .. pid] = 'page_' .. pid .. ' [shape=ellipse,label="' .. pid .. '"]'
                
                -- Ребро
                table.insert(graphEdges, string.format('author_%s -> page_%s', aid, pid))
            end
        end

        local graphContent = 'digraph G {\n  layout = "neato";\n'
        
        -- Узлы
        for _, nodeDef in pairs(graphNodes) do
            graphContent = graphContent .. '  ' .. nodeDef .. ';\n'
        end
        
        -- Рёбра
        for _, edge in ipairs(graphEdges) do
            graphContent = graphContent .. '  ' .. edge .. ';\n'
        end
        
        graphContent = graphContent .. '}\n'
        table.insert(output, '<graphviz>' .. graphContent .. '</graphviz>')
    end

    return table.concat(output, '\n\n')
end

return p