Модуль: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 -- Основная функция: вернуть ссылку на случайную ст...»
 
Нет описания правки
 
(не показано 8 промежуточных версий этого же участника)
Строка 1: Строка 1:
-- Module:RandomPageFromCategory
local p = {}
local p = {}


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


-- Основная функция: вернуть ссылку на случайную страницу из категории
function p.getRandomTitle(category)
function p.fromCategory(frame)
    if not mw.smw then
  -- 1‑й параметр: имя категории без префикса "Category:"
        return nil, "Ошибка: mw.smw недоступен"
  local cat = frame.args[1] or "Book"
    end
 
    if not category or category == "" then
        category = "Book"
    end
 
    local results = mw.smw.ask({
        string.format('[[Category:%s]]', category),
        '?#-=title',
        'limit=200'
    })
 
    if not results or #results == 0 then
        return nil, "В категории нет страниц: " .. category
    end


  -- Запрос SMW: все страницы в указанной категории
    local item = pickOne(results)
  local query = string.format("[[Category:%s]]|limit=500", cat)
  local res = mw.smw and mw.smw.ask and mw.smw.ask(query) or nil


  if not res or #res == 0 then
    if type(item) == "table" then
     return string.format("Нет страниц в категории \"%s\".", cat)
        return item.title or item[1] or nil, nil
  end
    end
 
     return item, nil
end


  -- Выбираем случайную страницу из результата
function p.main(frame)
  local row = random_item(res)
    local category = frame.args.category or frame.args[1] or "Book"
  local title = row.fulltext or row["fulltext"] or row[1]
    local title, err = p.getRandomTitle(category)


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


  -- Возвращаем обычную вики‑ссылку
    return title
  return string.format("[[%s]]", title)
end
end


return p
return p

Текущая версия от 07:48, 21 мая 2026


local p = {}

math.randomseed(os.time())

local function pickOne(t)
    if not t or #t == 0 then
        return nil
    end
    return t[math.random(#t)]
end

function p.getRandomTitle(category)
    if not mw.smw then
        return nil, "Ошибка: mw.smw недоступен"
    end

    if not category or category == "" then
        category = "Book"
    end

    local results = mw.smw.ask({
        string.format('[[Category:%s]]', category),
        '?#-=title',
        'limit=200'
    })

    if not results or #results == 0 then
        return nil, "В категории нет страниц: " .. category
    end

    local item = pickOne(results)

    if type(item) == "table" then
        return item.title or item[1] or nil, nil
    end

    return item, nil
end

function p.main(frame)
    local category = frame.args.category or frame.args[1] or "Book"
    local title, err = p.getRandomTitle(category)

    if not title or title == "" then
        return err or "Не удалось получить название страницы"
    end

    return title
end

return p