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

Материал из Поле цифровой дидактики
Новая страница: «-- Module:RandomPageFromCategory local p = {} -- Вспомогательная функция: случайный элемент таблицы local function random_item(t) if not t or #t == 0 then return nil end -- math.random(1, #t) даёт целое число от 1 до #t включительно local i = math.random(1, #t) return t[i] end -- Основная функция: вернуть ссылку на случайную ст...»
 
Нет описания правки
Строка 2: Строка 2:
local p = {}
local p = {}


-- Вспомогательная функция: случайный элемент таблицы
local function random_item(t)
  if not t or #t == 0 then
    return nil
  end
  -- math.random(1, #t) даёт целое число от 1 до #t включительно
  local i = math.random(1, #t)
  return t[i]
end
-- Основная функция: вернуть ссылку на случайную страницу из категории
function p.fromCategory(frame)
function p.fromCategory(frame)
  -- 1‑й параметр: имя категории без префикса "Category:"
   local cat = frame.args[1] or "Book"
   local cat = frame.args[1] or "Book"


   -- Запрос SMW: все страницы в указанной категории
   -- mw.smw.ask принимает таблицу параметров точно как #ask
   local query = string.format("[[Category:%s]]|limit=500", cat)
   local query = {
   local res = mw.smw and mw.smw.ask and mw.smw.ask(query) or nil
    "[[Category:" .. cat .. "]]",
    mainlabel = "title",
    limit = "500"
   }


   if not res or #res == 0 then
  local res = mw.smw.ask(query)
     return string.format("Нет страниц в категории \"%s\".", 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(res)
   math.randomseed(os.clock() * 100000)
   local title = row.fulltext or row["fulltext"] or row[1]
   local row = res[ math.random(1, #res) ]


  -- заголовок лежит в поле "title" (наш mainlabel)
  local title = row.title or row[1]
   if not title then
   if not title then
     return "Не удалось получить заголовок страницы."
    -- показать что реально пришло, для отладки
    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 string.format("[[%s]]", title)
end
end


return p
return p

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


-- Module:RandomPageFromCategory
local p = {}

function p.fromCategory(frame)
  local cat = frame.args[1] or "Book"

  -- mw.smw.ask принимает таблицу параметров точно как #ask
  local query = {
    "[[Category:" .. cat .. "]]",
    mainlabel = "title",
    limit = "500"
  }

  local res = mw.smw.ask(query)

  -- отладка: показать что вернул запрос
  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

  -- случайный элемент
  math.randomseed(os.clock() * 100000)
  local row = res[ math.random(1, #res) ]

  -- заголовок лежит в поле "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

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

return p