Module:NewsSearch

From TwogPedia
Revision as of 14:40, 12 February 2024 by Couchor (talk | contribs)

Documentation for this module may be created at Module:NewsSearch/doc

local getArgs = require('Module:Arguments').getArgs
local cargo = mw.ext.cargo

local limit = 10

local NewsSearch = {}

function NewsSearch.main(frame)
	local args = getArgs(frame)
	
	if args.games == nil and args.categories == nil and args.tag == nil then 
		-- If initial load, then display nothing
		if args.initial then return
		-- else return tableContainer:wikitext(table.concat(args, ', ')) end
		else return mw.html.create('div'):wikitext('At least one category or game needs to be chosen.') end
	end
	
	if args.more then return NewsSearch.html(args.offset or 0, args) end
	
	
 --   local listContainer = mw.html.create('div'):attr('id', 'list__container')
	-- tableContainer:node(listContainer)
	local html = NewsSearch.html(args.offset or 0, args)
	
	if html == nil or html == '' then
		return '<div>No news found</div>'
	else
	   	return 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
end

function NewsSearch.query(offset, 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
	
	if args.tag then
		args.tag = string.gsub(args.tag, '_', ' ')
		if args.categories or args.games then
			whereStr = whereStr .. ' AND tags HOLDS LIKE "%' .. args.tag .. '%"'
		else
			whereStr = whereStr .. ' tags HOLDS LIKE "%' .. args.tag .. '%"'
		end
	end
	
	local tables = 'News'
	local fields = '_pageName, date, category, game, image, content'
	local cargoArgs = {
		where = whereStr,
		orderBy = 'date DESC',
		limit = limit,
		offset = offset
	}
	local results = cargo.query(tables, fields, cargoArgs)
	
    return results
end

function NewsSearch.html(offset, args)
	local results = NewsSearch.query(offset, args)
	local list = ''
	
	if #results > 0 then
		for i = 1, #results do
			local result = results[i]
			local image = mw.html.create('div'):wikitext('[[File:' .. result.image .. '|300px]]')
			local title = mw.html.create('div'):addClass('news-latest-item-title'):wikitext(mw.ext.displaytitle.get(result._pageName))
			local description = getExcerpt(removeLinks(result.content))
			
			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 formatedDate = os.date("%d %b %Y %H:%M", os.time(dateTimeTable))
			
			local date = mw.html.create('div'):wikitext(formatedDate)
			local text = mw.html.create('div'):addClass('news-latest-item-text'):node(title):node(description):node(date)
			local div = mw.html.create('div'):addClass('news-latest-item'):node(image):node(text):node(mw.html.create('div'):addClass('link-overlay'):wikitext('[[File:Team_placeholder_light.png|1x1px|link=' .. result._pageName .. ']]'))
			list = list .. tostring(div)
		end
	else
		return nil
	end
	return list
end

function getExcerpt(text)
    return text:sub(1, 100)
end

function removeLinks(text)
    local result = text:gsub("%[%[(.-)|.-%]%]", "%1"):gsub("%[%[(.-)%]%]", "%1")
    return result
end

return NewsSearch