Модуль:Поход
Материал из Много троп
Для документации этого модуля может быть создана страница Модуль:Поход/doc
local p = {}
local difficulties = {
["очень лёгкий"] = "Очень лёгкий",
["лёгкий"] = "Лёгкий",
["немного сложнее"] = "Немного сложнее, чем лёгкий",
["средний"] = "Средний",
["трудный"] = "Трудный",
["очень трудный"] = "Очень трудный",
}
local gear_labels = {
backpack = "Рюкзак",
gaiters = "Гамаши",
thermos = "Термос",
stew = "Тушёнка",
tent = "Палатка",
sleeping_bag = "Спальник",
mat = "подстилка, пенка, каремат",
stove = "Плитка/горелка",
fuel = "Топливо для горелки",
first_aid = "Аптечка",
knife = "Нож",
headlamp = "Налобный фонарь",
extra_batteries = "Запасные батареи",
map = "Карта",
compass = "Компас",
water_bottle = "Фляга/бутылка",
water_filter = "Фильтр/таблетки для воды",
food = "Еда/перекус",
rain_jacket = "Дождевик",
warm_layer = "Тёплая одежда",
gloves = "Перчатки",
hat = "Шапка/кепка",
sunscreen = "Солнцезащитный крем",
sunglasses = "Солнцезащитные очки",
trekking_poles = "Походные палки",
}
local function trim(s) return (s:gsub("^%s*(.-)%s*$", "%1")) end
local function split(sep, s)
local t = {}
if not s or s == "" then return t end
for part in string.gmatch(s, "[^" .. sep .. "]+") do
table.insert(t, trim(part))
end
return t
end
local function normalize_item(raw)
if not raw then return nil end
local item = trim(raw):lower()
if item == "" then return nil end
return gear_labels[item] or raw -- возвращаем метку если есть, иначе оригинал (с сохранением регистра)
end
function p.render(frame)
local args = frame:getParent().args
local title = trim(args.title or "")
local duration = trim(args.duration or "")
local place = trim(args.place or "")
local time = trim(args.time or "")
local difficulty_raw = (args.difficulty or ""):lower()
local difficulty = difficulties[difficulty_raw] or (args.difficulty and args.difficulty ~= "" and args.difficulty) or "Не указано"
local gear_list = {}
-- 1) Поддержка поля gear[]: PageForms обычно передаёт как args["gear[]"] (таблица) или отдельные ключи gear[1], gear[2] и т.д.
-- Проверим разные варианты:
-- Если передали как таблицу args["gear[]"]
if args["gear[]"] then
if type(args["gear[]"]) == "table" then
for _,v in ipairs(args["gear[]"]) do
local n = normalize_item(v)
if n then table.insert(gear_list, n) end
end
else
-- может прийти как строка со разделителями
for _,v in ipairs(split(",|", args["gear[]"])) do
local n = normalize_item(v)
if n then table.insert(gear_list, n) end
end
end
end
-- Если передали как ключи gear1..gearN или gear[1], gear[2] и т.д. — пройдём по всем аргументам и соберём те, чьё имя начинается с "gear"
for k,v in pairs(args) do
if type(k) == "string" then
-- gear, gear1, gear2, gear[1], gear[something]
if string.match(k, "^gear%[?%d*%]?$") or string.match(k, "^gear%d+") then
if v and v ~= "" then
local n = normalize_item(v)
if n then table.insert(gear_list, n) end
end
end
end
end
-- Если есть поле gear как одна строка (csv или pipe-separated)
if args.gear and args.gear ~= "" then
-- если ранее args["gear[]"] уже добавил — не дублируем; иначе парсим
if #gear_list == 0 then
local parts = {}
-- поддерживаем запятую и вертикальную черту как разделители
for _,p in ipairs(split(",|", args.gear)) do
local n = normalize_item(p)
if n then table.insert(gear_list, n) end
end
end
end
-- Убираем дубли, сохраняя порядок
local seen = {}
local uniq = {}
for _,v in ipairs(gear_list) do
if not seen[v] then
table.insert(uniq, v)
seen[v] = true
end
end
local gear_out = "Не указано"
if #uniq > 0 then gear_out = table.concat(uniq, ", ") end
local out = {}
table.insert(out, "== Описание маршрута ==")
if title ~= "" then table.insert(out, "'''Название:''' " .. title) end
if place ~= "" then table.insert(out, "'''Место:''' " .. place) end
if duration ~= "" then table.insert(out, "'''Длительность:''' " .. duration) end
if time ~= "" then table.insert(out, "'''Время выхода:''' " .. time) end
table.insert(out, "'''Сложность:''' " .. difficulty)
table.insert(out, "'''Что взять с собой:''' " .. gear_out)
return table.concat(out, "\n\n")
end
return p