Модуль:ExtGraph
Материал из Поле цифровой дидактики
Краткое описание
Модуль ExtGraph загружает данные из внешнего CSV‑файла через расширение ExternalData и выводит их либо как таблицу, либо как граф связей с помощью GraphViz.[web:354][web:324]
Модуль:
- получает CSV по URL в формате
CSV with headerчерез Lua‑доступ к External Data;[web:354][web:352] - в режиме
tableстроит сортируемую wiki‑таблицу с полямиauthor_id,pageid,page_title,category; - в режиме
graphгенерирует описание графа на языке DOT внутри тега<graphviz>, где авторы соединяются со страницами как узлы видаA_x -> P_y.[web:324][web:334]
Модуль полезен для учебных задач по анализу сетей, коллективной деятельности в вики и визуализации отношений между авторами, страницами и категориями.[web:353][web:334]
Использование
Общий вид вызова:
{{#invoke:ExtGraph|main
|url=https://example.org/data.csv
|view=table
}}
Режим таблицы:
{{#invoke:ExtGraph|main
|url=https://example.org/wiki_data.csv
|view=table
}}
Режим графа через GraphViz:
{{#invoke:ExtGraph|main
|url=https://example.org/wiki_data.csv
|view=graph
}}
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>Ошибка загрузки данных:</strong> ' .. table.concat(errors, '<br>')
end
if not data or #data == 0 then
return 'Нет данных для отображения.'
end
local output = {}
-- Режим 1: Таблица
if viewMode == 'table' or viewMode == '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
-- Режим 2: График Graphviz
if viewMode == 'graph' or viewMode == 'both' then
local graphContent = 'digraph G {\n layout = "neato";\n'
for i, row in ipairs(data) do
local author = row.author_id or ''
local page = row.pageid or ''
if author ~= '' and page ~= '' then
-- Авторы - овалы, страницы - прямоугольники
graphContent = graphContent .. string.format(' "%s" [shape=oval, label="Author: %s"];\n', author, author)
graphContent = graphContent .. string.format(' "%s" [shape=box, label="%s"];\n', page, row.page_title or page)
graphContent = graphContent .. string.format(' "%s" -> "%s";\n', author, page)
end
end
graphContent = graphContent .. '}\n'
table.insert(output, string.format('<graphviz>%s</graphviz>', graphContent))
end
return table.concat(output, '\n\n')
end
return p
