Модуль:ТранспортнаяСхема: различия между версиями
Tringoli (обсуждение | вклад) мНет описания правки |
Tringoli (обсуждение | вклад) мНет описания правки |
||
| Строка 18: | Строка 18: | ||
-- Безопасная очистка текста JSON | -- Безопасная очистка текста JSON | ||
local function cleanJsonText(rawText) | local function cleanJsonText(rawText) | ||
rawText = mw.ustring.gsub(rawText, '<noinclude>.-</noinclude>', '') | rawText = mw.ustring.gsub(rawText, '<noinclude>.-</noinclude>', '') | ||
rawText = string.gsub(rawText, '<!%-%-.-%-%->', '') | rawText = string.gsub(rawText, '<!%-%-.-%-%->', '') | ||
rawText = string.gsub(rawText, '\194\160', ' ') | rawText = string.gsub(rawText, '\194\160', ' ') | ||
rawText = string.gsub(rawText, '\194\173', '') | 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 | ||
-- Добавляем исходный путь | |||
addCandidate(dataParam) | |||
-- Варианты в пространстве Шаблон: | |||
addCandidate('Шаблон:Интерактивная схема ' .. cleanName .. '/data.json') | |||
addCandidate('Шаблон:Интерактивная схема ' .. cleanName .. ' метрополитена/data.json') | |||
addCandidate('Шаблон:' .. cleanName .. '/data.json') | |||
addCandidate('Шаблон:' .. cleanName) | |||
-- Варианты в основном пространстве (без Шаблон:) | |||
addCandidate('Интерактивная схема ' .. cleanName .. '/data.json') | |||
addCandidate('Интерактивная схема ' .. cleanName .. ' метрополитена/data.json') | |||
addCandidate(cleanName .. '/data.json') | |||
addCandidate(cleanName) | |||
local | -- Англоязычный алиас | ||
addCandidate('Template:Интерактивная схема ' .. cleanName .. '/data.json') | |||
local jsonErrors = {} | |||
for _, pageTitle in ipairs(candidates) do | for _, pageTitle in ipairs(candidates) do | ||
-- 1. Попытка через mw.loadJsonData | -- 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. Попытка | -- 2. Попытка прямого чтения текста страницы | ||
local titleObj = mw.title.new(pageTitle) | local titleObj = mw.title.new(pageTitle) | ||
if titleObj | 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 | ||
table.insert(jsonErrors, '[[' .. pageTitle .. ']] (ошибка синтаксиса: ' .. tostring(decoded) .. ')') | |||
end | end | ||
end | end | ||
| Строка 81: | Строка 91: | ||
end | end | ||
if | if #jsonErrors > 0 then | ||
error( | error('Найдена страница с ошибкой в синтаксисе JSON:\n* ' .. table.concat(jsonErrors, '\n* ')) | ||
end | end | ||
error('Страница данных не найдена | error('Страница данных не найдена ни по одному из путей:\n* [[' .. table.concat(candidates, ']]\n* [[') .. ']]') | ||
end | end | ||