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

Материал из Поле цифровой дидактики
Нет описания правки
Нет описания правки
 
(не показано 7 промежуточных версий этого же участника)
Строка 1: Строка 1:
-- Module:RandomPageFromCategory
local p = {}
local p = {}


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


  -- mw.smw.ask принимает таблицу параметров точно как #ask
local function pickOne(t)
  local query = {
    if not t or #t == 0 then
    "[[Category:" .. cat .. "]]",
        return nil
    mainlabel = "title",
    end
    limit = "500"
    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'
    })


  local res = mw.smw.ask(query)
    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
  if not res then
end
     return "mw.smw.ask вернул nil для категории: " .. cat
  end
  if type(res) == "string" then
    return "Ошибка запроса: " .. res
  end
  if #res == 0 then
    return "Пустой результат для категории: " .. cat
  end


  -- случайный элемент
function p.main(frame)
  math.randomseed(os.clock() * 100000)
    local category = frame.args.category or frame.args[1] or "Book"
  local row = res[ math.random(1, #res) ]
    local title, err = p.getRandomTitle(category)


  -- заголовок лежит в поле "title" (наш mainlabel)
    if not title or title == "" then
  local title = row.title or row[1]
        return err or "Не удалось получить название страницы"
  if not title then
    -- показать что реально пришло, для отладки
    local keys = {}
    for k, v in pairs(row) do
      table.insert(keys, tostring(k) .. "=" .. tostring(v))
     end
     end
    return "Нет title. Поля: " .. table.concat(keys, ", ")
  end


  return "[[" .. title .. "]]"
    return 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