mNo edit summary Tag: Reverted |
mNo edit summary Tag: Manual revert |
||
Line 37: | Line 37: | ||
for i = 1, #categories do | for i = 1, #categories do | ||
if i ~= 1 then whereStr = whereStr .. ' OR ' end | if i ~= 1 then whereStr = whereStr .. ' OR ' end | ||
whereStr = whereStr .. ' category HOLDS "' .. categories[i] .. '"' | whereStr = whereStr .. ' category HOLDS WITHIN "' .. categories[i] .. '"' | ||
end | end | ||
whereStr = whereStr .. ')' | whereStr = whereStr .. ')' | ||
Line 52: | Line 52: | ||
for i = 1, #games do | for i = 1, #games do | ||
if i ~= 1 then whereStr = whereStr .. ' OR ' end | if i ~= 1 then whereStr = whereStr .. ' OR ' end | ||
whereStr = whereStr .. ' game HOLDS "' .. games[i] .. '"' | whereStr = whereStr .. ' game HOLDS WITHIN "' .. games[i] .. '"' | ||
end | end | ||
whereStr = whereStr .. ')' | whereStr = whereStr .. ')' |
Revision as of 18:17, 18 October 2023
Documentation for this module may be created at Module:NewsSearch/doc
local getArgs = require('Module:Arguments').getArgs
local cargo = mw.ext.cargo
local limit = 25
local NewsSearch = {}
function NewsSearch.main(frame)
local args = getArgs(frame)
if args.games == nil and args.categories == nil then return tableContainer:wikitext('At least one category or game needs to be chosen') end
if args.more then return NewsSearch.html(args.page or 1, args) end
local tableContainer = mw.html.create('div')
local listContainer = mw.html.create('div'):attr('id', 'list__container')
tableContainer:node(listContainer)
local html = NewsSearch.html(args.page or 1, args)
if html == nil or html == '' then
return listContainer:wikitext('No news found')
else
listContainer:node(html)
local loadMore = frame:callParserFunction{ name = '#widget', args = { 'Pagination', id = 'list__container', template = 'NewsSearch', arg = mw.text.jsonEncode({categories = args.categories}) } }
tableContainer:node(loadMore)
end
return tableContainer
end
function NewsSearch.query(page, args)
local whereStr = ''
if args.categories then
local categories = mw.text.split(args.categories, ',')
whereStr = whereStr .. '('
for i = 1, #categories do
if i ~= 1 then whereStr = whereStr .. ' OR ' end
whereStr = whereStr .. ' category HOLDS WITHIN "' .. categories[i] .. '"'
end
whereStr = whereStr .. ')'
end
if args.games then
if args.categories then
whereStr = whereStr .. ' AND ('
else
whereStr = whereStr .. '('
end
local games = mw.text.split(args.games, ',')
for i = 1, #games do
if i ~= 1 then whereStr = whereStr .. ' OR ' end
whereStr = whereStr .. ' game HOLDS WITHIN "' .. games[i] .. '"'
end
whereStr = whereStr .. ')'
end
local tables = 'News'
local fields = '_pageName, date, category, game'
local cargoArgs = {
where = whereStr,
orderBy = 'date DESC',
limit = limit,
offset = (page - 1) * limit
}
local results = cargo.query(tables, fields, cargoArgs)
return results
end
function NewsSearch.html(page, args)
local results = NewsSearch.query(page, args)
local list = ''
if #results > 0 then
for i = 1, #results do
local result = results[i]
local dateString = mw.ustring.gsub(result.date, "%s(AM|PM)$", "")
-- Use os.date to convert the string to a table of date and time components
local dateTimeTable = os.date("*t", os.time({year=string.sub(dateString, 1, 4), month=string.sub(dateString, 6, 7), day=string.sub(dateString, 9, 10), hour=tonumber(string.sub(dateString, 12, 13)) + ((string.sub(dateString, 22, 22) == "PM") and 12 or 0), min=string.sub(dateString, 15, 16), sec=string.sub(dateString, 18, 19)}))
-- Use os.date again to format the date and time components into a desired format
local formattedDate = os.date("%d %b %Y %H:%M", os.time(dateTimeTable))
local news = mw.html.create('div'):wikitext(formattedDate .. ' - [[' .. result._pageName .. ']]')
list = list .. tostring(news)
end
else
return nil
end
return list
end
return NewsSearch