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

мНет описания правки
мНет описания правки
Строка 18: Строка 18:
-- Безопасная очистка текста JSON
-- Безопасная очистка текста JSON
local function cleanJsonText(rawText)
local function cleanJsonText(rawText)
    -- Убираем комментарии и noinclude
     rawText = mw.ustring.gsub(rawText, '<noinclude>.-</noinclude>', '')
     rawText = mw.ustring.gsub(rawText, '<noinclude>.-</noinclude>', '')
     rawText = string.gsub(rawText, '<!%-%-.-%-%->', '')
     rawText = string.gsub(rawText, '<!%-%-.-%-%->', '')
   
    -- Замена неразрывных пробелов (UTF-8 C2 A0) через байтовый string.gsub
     rawText = string.gsub(rawText, '\194\160', ' ')
     rawText = string.gsub(rawText, '\194\160', ' ')
     rawText = string.gsub(rawText, '\194\173', '') -- soft hyphen
     rawText = string.gsub(rawText, '\194\173', '')
   
     return mw.text.trim(rawText)
     return mw.text.trim(rawText)
end
end


-- Загрузка данных из data.json
-- Загрузка данных из data.json с проверкой всех пространств имён
local function loadData(args)
local function loadData(args)
     local dataParam = args['данные'] or args[1] or 'Муроморского'
     local dataParam = args['данные'] or args[1] or 'Муроморского'
     dataParam = mw.text.trim(dataParam)
     dataParam = mw.text.trim(dataParam)
   
    -- Очищаем имя от префиксов для создания комбинаций
    local cleanName = mw.ustring.gsub(dataParam, '^[Шш][Аа][Бб][Лл][Оо][Нн]:', '')
    cleanName = mw.ustring.gsub(cleanName, '^[Tt][Ee][Mm][Pp][Ll][Aa][Tt][Ee]:', '')
    cleanName = mw.ustring.gsub(cleanName, '/data%.json$', '')
    cleanName = mw.ustring.gsub(cleanName, '%.json$', '')
    cleanName = mw.ustring.gsub(cleanName, '^[Ии]нтерактивная схема%s*', '')
    cleanName = mw.text.trim(cleanName)
      
      
     local candidates = {}
     local candidates = {}
Строка 44: Строка 48:
     end
     end
      
      
     if mw.ustring.find(dataParam, ':') or mw.ustring.find(dataParam, '%.json$') then
     -- Добавляем исходный путь
        addCandidate(dataParam)
    addCandidate(dataParam)
     else
   
        addCandidate('Шаблон:Интерактивная схема ' .. dataParam .. '/data.json')
    -- Варианты в пространстве Шаблон:
        addCandidate('Шаблон:Интерактивная схема ' .. dataParam .. ' метрополитена/data.json')
    addCandidate('Шаблон:Интерактивная схема ' .. cleanName .. '/data.json')
        addCandidate('Шаблон:' .. dataParam .. '/data.json')
     addCandidate('Шаблон:Интерактивная схема ' .. cleanName .. ' метрополитена/data.json')
        addCandidate('Интерактивная схема ' .. dataParam .. '/data.json')
    addCandidate('Шаблон:' .. cleanName .. '/data.json')
        addCandidate(dataParam .. '/data.json')
    addCandidate('Шаблон:' .. cleanName)
        addCandidate(dataParam)
   
    end
    -- Варианты в основном пространстве (без Шаблон:)
    addCandidate('Интерактивная схема ' .. cleanName .. '/data.json')
    addCandidate('Интерактивная схема ' .. cleanName .. ' метрополитена/data.json')
    addCandidate(cleanName .. '/data.json')
    addCandidate(cleanName)
      
      
     local lastError = nil
    -- Англоязычный алиас
    addCandidate('Template:Интерактивная схема ' .. cleanName .. '/data.json')
 
     local jsonErrors = {}
      
      
     for _, pageTitle in ipairs(candidates) do
     for _, pageTitle in ipairs(candidates) do
         -- 1. Попытка через mw.loadJsonData (если страница с моделью JSON)
         -- 1. Попытка загрузки через mw.loadJsonData
         local ok, data = pcall(mw.loadJsonData, pageTitle)
         local ok, data = pcall(mw.loadJsonData, pageTitle)
         if ok and type(data) == 'table' then
         if ok and type(data) == 'table' then
Строка 64: Строка 75:
         end
         end
          
          
         -- 2. Попытка через чтение сырого текста (если страница создана как wikitext)
         -- 2. Попытка прямого чтения текста страницы
         local titleObj = mw.title.new(pageTitle)
         local titleObj = mw.title.new(pageTitle)
         if titleObj and titleObj.exists then
         if titleObj then
             local rawText = titleObj:getContent()
             local rawText = titleObj:getContent()
             if rawText and rawText ~= '' then
             if rawText and rawText ~= '' then
                 rawText = cleanJsonText(rawText)
                 rawText = cleanJsonText(rawText)
               
                 local decOk, decoded = pcall(mw.text.jsonDecode, rawText)
                 local decOk, decoded = pcall(mw.text.jsonDecode, rawText)
                 if decOk and type(decoded) == 'table' then
                 if decOk and type(decoded) == 'table' then
                     return decoded
                     return decoded
                 else
                 else
                     lastError = 'Ошибка в синтаксисе JSON на странице [[' .. pageTitle .. ']]: ' .. tostring(decoded)
                     table.insert(jsonErrors, '[[' .. pageTitle .. ']] (ошибка синтаксиса: ' .. tostring(decoded) .. ')')
                 end
                 end
             end
             end
Строка 81: Строка 91:
     end
     end
      
      
     if lastError then
     if #jsonErrors > 0 then
         error(lastError)
         error('Найдена страница с ошибкой в синтаксисе JSON:\n* ' .. table.concat(jsonErrors, '\n* '))
     end
     end
      
      
     error('Страница данных не найдена. Проверены пути:\n* [[' .. table.concat(candidates, ']]\n* [[') .. ']]')
     error('Страница данных не найдена ни по одному из путей:\n* [[' .. table.concat(candidates, ']]\n* [[') .. ']]')
end
end