Модуль:ТранспортнаяСхема: различия между версиями
Tringoli (обсуждение | вклад) Нет описания правки |
Tringoli (обсуждение | вклад) мНет описания правки |
||
| Строка 16: | Строка 16: | ||
end | end | ||
-- Загрузка | -- Безопасная очистка текста JSON | ||
local function cleanJsonText(rawText) | |||
-- Убираем комментарии и noinclude | |||
rawText = mw.ustring.gsub(rawText, '<noinclude>.-</noinclude>', '') | |||
rawText = string.gsub(rawText, '<!%-%-.-%-%->', '') | |||
-- Замена неразрывных пробелов (UTF-8 C2 A0) через байтовый string.gsub | |||
rawText = string.gsub(rawText, '\194\160', ' ') | |||
rawText = string.gsub(rawText, '\194\173', '') -- soft hyphen | |||
return mw.text.trim(rawText) | |||
end | |||
-- Загрузка данных из data.json | |||
local function loadData(args) | local function loadData(args) | ||
local dataParam = args['данные'] or args[1] or 'Муроморского' | local dataParam = args['данные'] or args[1] or 'Муроморского' | ||
| Строка 31: | Строка 44: | ||
end | end | ||
if mw.ustring.find(dataParam, ':') or mw.ustring.find(dataParam, '%.json$') then | if mw.ustring.find(dataParam, ':') or mw.ustring.find(dataParam, '%.json$') then | ||
addCandidate(dataParam) | addCandidate(dataParam) | ||
| Строка 46: | Строка 58: | ||
for _, pageTitle in ipairs(candidates) do | for _, pageTitle in ipairs(candidates) do | ||
-- 1. | -- 1. Попытка через mw.loadJsonData (если страница с моделью JSON) | ||
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 | ||
| Строка 52: | Строка 64: | ||
end | end | ||
-- 2. | -- 2. Попытка через чтение сырого текста (если страница создана как wikitext) | ||
local titleObj = mw.title.new(pageTitle) | local titleObj = mw.title.new(pageTitle) | ||
if titleObj and titleObj.exists then | if titleObj and titleObj.exists then | ||
local rawText = titleObj:getContent() | local rawText = titleObj:getContent() | ||
if rawText and rawText ~= '' then | if rawText and rawText ~= '' then | ||
rawText = cleanJsonText(rawText) | |||
rawText = | |||
local decOk, decoded = pcall(mw.text.jsonDecode, rawText) | local decOk, decoded = pcall(mw.text.jsonDecode, rawText) | ||
| Строка 68: | Строка 75: | ||
return decoded | return decoded | ||
else | else | ||
lastError = 'Ошибка | lastError = 'Ошибка в синтаксисе JSON на странице [[' .. pageTitle .. ']]: ' .. tostring(decoded) | ||
end | end | ||
end | end | ||