Модуль:RandomPageFromCategory: различия между версиями

Материал из Поле цифровой дидактики
Нет описания правки
Нет описания правки
Строка 2: Строка 2:
local p = {}
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)
function p.fromCategory(frame)
  -- имя категории без префикса "Category:"
   local cat = frame.args[1] or "Book"
   local cat = frame.args[1] or "Book"


   -- mw.smw.ask принимает таблицу параметров точно как #ask
   -- подстрахуемся: сбросить сид, чтобы random менялся
   local query = {
  math.randomseed(os.time())
     "[[Category:" .. cat .. "]]",
 
     mainlabel = "title",
  -- Вызов MediaWiki API module (если включён)
     limit = "500"
  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 res = mw.smw.ask(query)
   local data = req and req.query and req.query.categorymembers
 
   if not data or #data == 0 then
  -- отладка: показать что вернул запрос
     return 'Нет страниц в категории "' .. cat .. '".'
   if not res then
     return "mw.smw.ask вернул nil для категории: " .. cat
  end
  if type(res) == "string" then
    return "Ошибка запроса: " .. res
  end
  if #res == 0 then
    return "Пустой результат для категории: " .. cat
   end
   end


  -- случайный элемент
   local row = random_item(data)
  math.randomseed(os.clock() * 100000)
   if not row or not row.title then
   local row = res[ math.random(1, #res) ]
     return "Не удалось получить заголовок страницы."
 
   -- заголовок лежит в поле "title" (наш mainlabel)
  local title = row.title or row[1]
  if not title then
    -- показать что реально пришло, для отладки
    local keys = {}
    for k, v in pairs(row) do
      table.insert(keys, tostring(k) .. "=" .. tostring(v))
    end
     return "Нет title. Поля: " .. table.concat(keys, ", ")
   end
   end


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


return p
return p

Версия от 08:44, 23 апреля 2026


-- 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