Модуль:ТранспортнаяСхема: различия между версиями
Внешний вид
Tringoli (обсуждение | вклад) мНет описания правки |
Tringoli (обсуждение | вклад) мНет описания правки |
||
| Строка 1: | Строка 1: | ||
local p = {} | local p = {} | ||
-- Извлечение | -- Извлечение параметров вызова | ||
local function getArgs(frame) | local function getArgs(frame) | ||
local args = {} | local args = {} | ||
| Строка 16: | Строка 16: | ||
end | end | ||
-- Загрузка JSON данных | -- Загрузка JSON базы данных | ||
local function loadData( | local function loadData(dataParam) | ||
if not dataParam or dataParam == '' then | if not dataParam or dataParam == '' then | ||
error('Не | error('Не указана страница данных JSON') | ||
end | end | ||
local candidates = { | local candidates = { | ||
dataParam, | |||
'Шаблон:Интерактивная схема ' .. dataParam .. ' метрополитена/data.json', | |||
'Шаблон:Интерактивная схема ' .. dataParam .. '/data.json', | |||
'Шаблон:' .. dataParam .. '/data.json', | |||
dataParam .. '/data.json' | |||
} | |||
for _, | for _, page in ipairs(candidates) do | ||
local success, | local success, json = pcall(mw.loadJsonData, page) | ||
if success and | if success and json then return json end | ||
local titleObj = mw.title.new( | local titleObj = mw.title.new(page) | ||
if titleObj and titleObj.exists then | if titleObj and titleObj.exists then | ||
local raw = titleObj:getContent() | local raw = titleObj:getContent() | ||
| Строка 43: | Строка 40: | ||
raw = mw.ustring.gsub(raw, '<noinclude>.-</noinclude>', '') | raw = mw.ustring.gsub(raw, '<noinclude>.-</noinclude>', '') | ||
raw = mw.ustring.gsub(raw, '<!--.-?-->', '') | raw = mw.ustring.gsub(raw, '<!--.-?-->', '') | ||
local ok, | local ok, dec = pcall(mw.text.jsonDecode, mw.text.trim(raw)) | ||
if ok and | if ok and dec then return dec end | ||
end | end | ||
end | end | ||
end | end | ||
error('Страница данных не найдена: ' .. | error('Страница данных не найдена. Проверено: ' .. table.concat(candidates, ', ')) | ||
end | end | ||
-- | -- Генерация нативной кликабельной интерактивной карты | ||
function p. | function p.map(frame) | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
local data = loadData( | local dataName = args['данные'] or args[1] or 'Муроморского' | ||
local data = loadData(dataName) | |||
local | local file = args['файл'] or args['изображение'] or data.file or 'Схема_Муроморского_метрополитена.png' | ||
local | local width = args['ширина'] or data.width or '850px' | ||
local | local alt = args['alt'] or args['название'] or data.title or 'Интерактивная карта скоростного транспорта' | ||
local defaultRadius = args['радиус'] or data.defaultRadius or '16' | |||
local | local mapText = 'Файл:' .. file .. '|' .. width .. '|center|alt=' .. alt .. '\n' | ||
mapText = mapText .. '# Координаты станций и линий из базы данных JSON\n' | |||
if data.lines then | if data.lines then | ||
for | for _, line in ipairs(data.lines) do | ||
-- Зона плашки линии в легенде | |||
if line.box and line.article then | |||
mapText = mapText .. 'rect ' .. line.box .. ' [[' .. line.article .. '|' .. (line.displayName or line.name or line.article) .. ']]\n' | |||
end | |||
-- Кастомные векторные зоны/полигоны линий (если заданы) | |||
if line.shapes then | |||
for _, shape in ipairs(line.shapes) do | |||
mapText = mapText .. shape .. '\n' | |||
end | |||
end | |||
-- | -- Станции линии | ||
if line.stations then | if line.stations then | ||
for _, st in ipairs(line.stations) do | for _, st in ipairs(line.stations) do | ||
local | if st.coords and st.article then | ||
local r = st.radius or defaultRadius | |||
local name = st.name or st.article | |||
mapText = mapText .. 'circle ' .. st.coords .. ' ' .. r .. ' [[' .. st.article .. '|' .. name .. ']]\n' | |||
end | end | ||
end | end | ||
end | end | ||
end | |||
end | |||
-- Дополнительные объекты (вокзалы, пересадочные узлы) | |||
local extras = {'Вокзалы', 'Ж/д станции', 'Терминалы', 'Аэропорты'} | |||
for _, group in ipairs(extras) do | |||
if data[group] then | |||
for _, item in ipairs(data[group]) do | |||
if item[1] and item[2] then | |||
mapText = mapText .. 'circle ' .. item[2] .. ' ' .. defaultRadius .. ' ' .. item[1] .. '\n' | |||
end | end | ||
end | end | ||
end | end | ||
end | end | ||
mapText = mapText .. 'desc none\n' | |||
return | |||
-- Рендер через движок MediaWiki | |||
return frame:preprocess('{{#tag:imagemap|' .. mapText .. '}}') | |||
end | end | ||
return p | return p | ||
Версия от 16:02, 22 августа 2026
Для документации этого модуля может быть создана страница Модуль:ТранспортнаяСхема/doc
local p = {}
-- Извлечение параметров вызова
local function getArgs(frame)
local args = {}
if frame.getParent then
local parent = frame:getParent()
if parent and parent.args then
for k, v in pairs(parent.args) do args[k] = v end
end
end
if frame.args then
for k, v in pairs(frame.args) do args[k] = v end
end
return args
end
-- Загрузка JSON базы данных
local function loadData(dataParam)
if not dataParam or dataParam == '' then
error('Не указана страница данных JSON')
end
local candidates = {
dataParam,
'Шаблон:Интерактивная схема ' .. dataParam .. ' метрополитена/data.json',
'Шаблон:Интерактивная схема ' .. dataParam .. '/data.json',
'Шаблон:' .. dataParam .. '/data.json',
dataParam .. '/data.json'
}
for _, page in ipairs(candidates) do
local success, json = pcall(mw.loadJsonData, page)
if success and json then return json end
local titleObj = mw.title.new(page)
if titleObj and titleObj.exists then
local raw = titleObj:getContent()
if raw and raw ~= '' then
raw = mw.ustring.gsub(raw, '<noinclude>.-</noinclude>', '')
raw = mw.ustring.gsub(raw, '<!--.-?-->', '')
local ok, dec = pcall(mw.text.jsonDecode, mw.text.trim(raw))
if ok and dec then return dec end
end
end
end
error('Страница данных не найдена. Проверено: ' .. table.concat(candidates, ', '))
end
-- Генерация нативной кликабельной интерактивной карты
function p.map(frame)
local args = getArgs(frame)
local dataName = args['данные'] or args[1] or 'Муроморского'
local data = loadData(dataName)
local file = args['файл'] or args['изображение'] or data.file or 'Схема_Муроморского_метрополитена.png'
local width = args['ширина'] or data.width or '850px'
local alt = args['alt'] or args['название'] or data.title or 'Интерактивная карта скоростного транспорта'
local defaultRadius = args['радиус'] or data.defaultRadius or '16'
local mapText = 'Файл:' .. file .. '|' .. width .. '|center|alt=' .. alt .. '\n'
mapText = mapText .. '# Координаты станций и линий из базы данных JSON\n'
if data.lines then
for _, line in ipairs(data.lines) do
-- Зона плашки линии в легенде
if line.box and line.article then
mapText = mapText .. 'rect ' .. line.box .. ' [[' .. line.article .. '|' .. (line.displayName or line.name or line.article) .. ']]\n'
end
-- Кастомные векторные зоны/полигоны линий (если заданы)
if line.shapes then
for _, shape in ipairs(line.shapes) do
mapText = mapText .. shape .. '\n'
end
end
-- Станции линии
if line.stations then
for _, st in ipairs(line.stations) do
if st.coords and st.article then
local r = st.radius or defaultRadius
local name = st.name or st.article
mapText = mapText .. 'circle ' .. st.coords .. ' ' .. r .. ' [[' .. st.article .. '|' .. name .. ']]\n'
end
end
end
end
end
-- Дополнительные объекты (вокзалы, пересадочные узлы)
local extras = {'Вокзалы', 'Ж/д станции', 'Терминалы', 'Аэропорты'}
for _, group in ipairs(extras) do
if data[group] then
for _, item in ipairs(data[group]) do
if item[1] and item[2] then
mapText = mapText .. 'circle ' .. item[2] .. ' ' .. defaultRadius .. ' ' .. item[1] .. '\n'
end
end
end
end
mapText = mapText .. 'desc none\n'
-- Рендер через движок MediaWiki
return frame:preprocess('{{#tag:imagemap|' .. mapText .. '}}')
end
return p