Модуль:RandomPageFromCategory

Материал из Поле цифровой дидактики

-- Module:RandomPageFromCategory
local p = {}

-- Вспомогательная: случайный элемент массива
local function random_item(t)
  if not t or #t == 0 then
    return nil
  end
  local i = math.random(1, #t)
  return t[i]
end

-- Вернуть ссылку на случайную страницу из категории
function p.fromCategory(frame)
  -- имя категории без префикса "Category:"
  local cat = frame.args[1] or "Book"

  -- подстрахуемся: сбросить сид, чтобы random менялся
  math.randomseed(os.time())

  -- Вызов MediaWiki API module (если включён)
  local api = mw.ext and mw.ext.ApiFrame and mw.ext.ApiFrame.new
  if not api then
    return "Lua: модуль API недоступен на этой вики."
  end

  -- Базовый запрос к api.php?action=query&list=categorymembers
  local req = api{
    action  = "query",
    list    = "categorymembers",
    cmtitle = "Category:" .. cat,
    cmlimit = "500",
    cmnamespace = "0"  -- только статьи; можно убрать/изменить при желании
  }

  local data = req and req.query and req.query.categorymembers
  if not data or #data == 0 then
    return 'Нет страниц в категории "' .. cat .. '".'
  end

  local row = random_item(data)
  if not row or not row.title then
    return "Не удалось получить заголовок страницы."
  end

  return "[[" .. row.title .. "]]"
end

return p