Действия

Модуль

Модуль:Поход

Материал из Много троп

Версия от 00:51, 20 июня 2026; Mnogotrop (обсуждение | вклад) (Новая страница: «local p = {} local difficulties = { ["очень лёгкий"] = "Очень лёгкий", ["лёгкий"] = "Лёгкий", ["немного сложнее"] = "Немного сложнее, чем лёгкий", ["средний"] = "Средний", ["трудный"] = "Трудный", ["очень трудный"] = "Очень трудный", } local gear_labels = { backpack = "Рюкзак", gaiters = "Гамаши",...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Для документации этого модуля может быть создана страница Модуль:Поход/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