Модуль:ТранспортнаяСхема: различия между версиями

Нет описания правки
мНет описания правки
Строка 1: Строка 1:
local p = {}
local p = {}


-- Функция извлечения аргументов из прямого вызова и из шаблона
-- Извлечение аргументов вызова
local function getArgs(frame)
local function getArgs(frame)
     local args = {}
     local args = {}
Строка 16: Строка 16:
end
end


-- Загрузка данных из data.json
-- Умная загрузка 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 dataPageTitle = dataParam
     local candidates = {}
     if not mw.ustring.find(dataParam, ':') then
     if mw.ustring.find(dataParam, ':') or mw.ustring.find(dataParam, '%.json$') then
         dataPageTitle = 'Шаблон:Интерактивная схема ' .. dataParam .. '/data.json'
         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
    if success and jsonData then
        -- Попытка быстрой загрузки встроенным парсером JSON
        return jsonData
        local success, jsonData = pcall(mw.loadJsonData, dataPageTitle)
    end
        if success and jsonData then
   
            return jsonData
    local titleObj = mw.title.new(dataPageTitle)
        end
    if titleObj and titleObj.exists then
       
        local rawText = titleObj:getContent()
        -- Попытка ручной загрузки текста страницы
        if rawText and rawText ~= '' then
        local titleObj = mw.title.new(dataPageTitle)
            rawText = mw.ustring.gsub(rawText, '<noinclude>.-</noinclude>', '')
        if titleObj and titleObj.exists then
            rawText = mw.ustring.gsub(rawText, '<!--.-?-->', '')
            local rawText = titleObj:getContent()
            rawText = mw.text.trim(rawText)
            if rawText and rawText ~= '' then
           
                rawText = mw.ustring.gsub(rawText, '<noinclude>.-</noinclude>', '')
            local decodeSuccess, decodedData = pcall(mw.text.jsonDecode, rawText)
                rawText = mw.ustring.gsub(rawText, '<!--.-?-->', '')
            if decodeSuccess and decodedData then
                rawText = mw.text.trim(rawText)
                return decodedData
               
            else
                local decodeSuccess, decodedData = pcall(mw.text.jsonDecode, rawText)
                error('Ошибка в синтаксисе JSON на странице [[' .. dataPageTitle .. ']]!')
                if decodeSuccess and decodedData then
                    return decodedData
                else
                    error('Ошибка в синтаксисе JSON на странице [[' .. dataPageTitle .. ']]!')
                end
             end
             end
         end
         end
     end
     end
      
      
     error('Страница данных [[' .. dataPageTitle .. ']] не найдена.')
     error('Страница данных не найдена. Проверены следующие пути:\n* [[' .. table.concat(candidates, ']]\n* [[') .. ']]')
end
end


-- Генерация только интерактивной ImageMap карты
-- Генерация только 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 .. '# Автоматически сгенерированная разметка станций\n'
     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)
             -- Зона плашки линии (если задан 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'
      
      
    -- Обработка через встроенный парсер MediaWiki тега <imagemap>
     return frame:preprocess('{{#tag:imagemap|' .. mapText .. '}}')
     return frame:preprocess('{{#tag:imagemap|' .. mapText .. '}}')
end
end


return p
return p