Модуль:ТранспортнаяСхема: различия между версиями
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 с автоматическим перебором вариантов названий | ||
local function loadData(args) | local function loadData(args) | ||
local dataParam = args['данные'] or args[1] | local dataParam = args['данные'] or args[1] | ||
| Строка 23: | Строка 23: | ||
end | end | ||
local | local candidates = {} | ||
if | if mw.ustring.find(dataParam, ':') or mw.ustring.find(dataParam, '%.json$') then | ||
table.insert(candidates, dataParam) | |||
else | |||
table.insert(candidates, 'Шаблон:Интерактивная схема ' .. dataParam .. ' метрополитена/data.json') | |||
table.insert(candidates, 'Шаблон:Интерактивная схема ' .. dataParam .. '/data.json') | |||
table.insert(candidates, 'Шаблон:' .. dataParam .. '/data.json') | |||
table.insert(candidates, dataParam .. '/data.json') | |||
table.insert(candidates, dataParam) | |||
end | end | ||
local success, jsonData = pcall(mw.loadJsonData, dataPageTitle) | for _, dataPageTitle in ipairs(candidates) do | ||
-- Попытка быстрой загрузки встроенным парсером JSON | |||
local success, jsonData = pcall(mw.loadJsonData, dataPageTitle) | |||
if success and jsonData then | |||
return jsonData | |||
end | |||
-- Попытка ручной загрузки текста страницы | |||
local titleObj = mw.title.new(dataPageTitle) | |||
if titleObj and titleObj.exists then | |||
local rawText = titleObj:getContent() | |||
if rawText and rawText ~= '' then | |||
rawText = mw.ustring.gsub(rawText, '<noinclude>.-</noinclude>', '') | |||
rawText = mw.ustring.gsub(rawText, '<!--.-?-->', '') | |||
rawText = mw.text.trim(rawText) | |||
local decodeSuccess, decodedData = pcall(mw.text.jsonDecode, rawText) | |||
if decodeSuccess and decodedData then | |||
return decodedData | |||
else | |||
error('Ошибка в синтаксисе JSON на странице [[' .. dataPageTitle .. ']]!') | |||
end | |||
end | end | ||
end | end | ||
end | end | ||
error('Страница данных [[' .. | error('Страница данных не найдена. Проверены следующие пути:\n* [[' .. table.concat(candidates, ']]\n* [[') .. ']]') | ||
end | end | ||
-- Генерация только | -- Генерация только ImageMap карты | ||
function p.map(frame) | function p.map(frame) | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
| Строка 64: | Строка 74: | ||
local mapText = 'Файл:' .. file .. '|' .. width .. '|center|alt=' .. alt .. '\n' | local mapText = 'Файл:' .. file .. '|' .. width .. '|center|alt=' .. alt .. '\n' | ||
mapText = mapText .. '# Автоматически | mapText = mapText .. '# Автоматически сформированная разметка станций\n' | ||
if jsonData.lines then | if jsonData.lines then | ||
for _, line in ipairs(jsonData.lines) do | for _, line in ipairs(jsonData.lines) do | ||
-- Зона | -- Зона плашки линии (если задан box) | ||
if line.box and line.article then | if line.box and line.article then | ||
mapText = mapText .. 'rect ' .. line.box .. ' [[' .. line.article .. '|' .. (line.name or line.article) .. ']]\n' | mapText = mapText .. 'rect ' .. line.box .. ' [[' .. line.article .. '|' .. (line.name or line.article) .. ']]\n' | ||
end | end | ||
-- Дополнительные | -- Дополнительные полигоны линии | ||
if line.shapes then | if line.shapes then | ||
for _, shape in ipairs(line.shapes) do | for _, shape in ipairs(line.shapes) do | ||
| Строка 92: | Строка 102: | ||
end | end | ||
-- Дополнительные объекты (вокзалы, | -- Дополнительные объекты (вокзалы, ж/д платформы и т.д.) | ||
local extras = {'Вокзалы', 'Ж/д станции', 'Терминалы', 'Аэропорты'} | local extras = {'Вокзалы', 'Ж/д станции', 'Терминалы', 'Аэропорты'} | ||
for _, key in ipairs(extras) do | for _, key in ipairs(extras) do | ||
| Строка 106: | Строка 116: | ||
mapText = mapText .. 'desc none\n' | mapText = mapText .. 'desc none\n' | ||
return frame:preprocess('{{#tag:imagemap|' .. mapText .. '}}') | return frame:preprocess('{{#tag:imagemap|' .. mapText .. '}}') | ||
end | end | ||
return p | return p | ||