Fortnite Esports Wiki

Power Rankings of Brazil and Oceania are not yet updated to the last season, we are doing our best to update them before the start of the new competitive season. Please be patient.

READ MORE

Fortnite Esports Wiki
Advertisement
Fortnite Esports Wiki

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

-- <nowiki>
local util_args = require('Module:ArgsUtil')
local util_html = require("Module:HtmlUtil")
local util_map = require('Module:MapUtil')
local util_table = require("Module:TableUtil")
local util_text = require("Module:TextUtil")
local util_title = require("Module:TitleUtil")
local util_vars = require("Module:VarsUtil")
local i18n = require("Module:I18nUtil")
local lang = mw.getLanguage('en')
local Sprite = require('Module:Sprite').spriteImage
local LCS = require('Module:LuaClassSystem')
local Entity = LCS.class.abstract()

Entity.imagesizes = {
	default = 25
}

-- the following are mandatory params when subclassed
Entity.objectType = nil
Entity.defaultlength = 'long'
Entity.imagelength = 'link'
Entity.imagesizes = { default = 25 } -- should never be modified only overwritten so it's ok to be outside of init

-- the following are all optional params to be defined when subclassed
Entity.cssClass = nil
Entity.defaultLink = nil
Entity.filePattern = nil
Entity.imageDisplayLength = nil


function Entity:init(str)
	if not str then
		self.is_nil = true
		return
	end
	local lookup = mw.loadData('Module:' .. self.objectType .. 'names')
	local vars = lookup[str and tostring(str):lower() or 'DEFAULT']
	if type(vars) == 'string' then
		vars = lookup[vars]
	end
	if not vars then
		vars = lookup.DEFAULT or {}
		self.unknown = true
	end
	
	self.vars = util_table.shallowClone(vars)
end

function Entity:get(len)
	if self.is_nil then return nil end
	return self.vars[len or self.defaultlength]
end

function Entity:exists()
	return not self.is_nil
end

function Entity:isknown()
	if self.is_nil then return nil end
	return not self.unknown
end

function Entity:__tostring()
	if self.is_nil then return nil end
	if self.vars then
		return self:get(self.defaultlength)
	end
	return 'Attempting to tostring something we cannot'
end

function Entity:name(opts)
	if not opts then opts = {} end
	return self:get(opts.len or self.defaultlength)
end

function Entity:flair(opts)
	if self.is_nil then return nil end
	local span = mw.html.create('span')
		:addClass('markup-object')
		:addClass(self.cssClass)
	span:wikitext(self:image(opts))
	span:tag('span')
		:wikitext(self:name(opts))
	return tostring(span)
end

function Entity:flairlink(opts)
	if self.is_nil then return nil end
	if not opts then opts = {} end
	local span = mw.html.create('span')
		:addClass('markup-object')
		:addClass(self.cssClass)
	span:wikitext(self:image(opts))
		:wikitext(self:name(opts))
	return self:_link(tostring(span), opts)
end

function Entity:image(opts)
	if self.is_nil then return nil end
	if not opts then opts = {} end
	return Sprite{
		self.vars[self.imagelength],
		type = self.objectType,
		
		-- size is needed to calculate position even if nosize is specified
		size = opts.size or self.imagesizes[opts.len or 'default'] or self.imagesizes.default,
		nosize = opts.nosize or self.nosize,
		class = self:getImageClass(opts),
		skiplookup = true,
		display = self.vars[self.imageDisplayLength or self.imagelength],
		fallback = self:getSpriteFallback(opts),
	}
end

function Entity:file(opts)
	if self.is_nil then return end
	if not opts then opts = {} end
	return self:_file(opts, '')
end

function Entity:filelink(opts)
	if self.is_nil then return end
	if not opts then opts = {} end
	return self:_file(opts, opts.link or self:get(self.defaultLink or self.imagelength))
end

function Entity:_file(opts, link, file)
	return ('[[File:%s|link=%s|%spx]]'):format(
		file or self.filePattern:format(self:get(self.imagelength)),
		link,
		opts.size or self.imagesizes[opts.len or 'default'] or self.imagesizes.default
	)
end

function Entity:getSpriteFallback(opts)
	return nil
end

function Entity:getImageClass(opts)
	return nil
end

function Entity:imagelink(opts)
	if not opts then opts = {} end
	return self:_link(self:image(opts), opts)
end

function Entity:link(opts)
	if not opts then opts = {} end
	return self:_link(nil, opts)
end

function Entity:_link(display, opts)
	local link = self:_getLinkTarget(link, opts)
	display = display or self:name(opts)
	return util_text.intLink(link, display)
end

function Entity:_getLinkTarget(link, opts)
	if link then return link end
	if opts.link then return opts.link end
	return util_title.concatSubpage(
		self:get(self.defaultLink or self.defaultlength),
		opts.suffix
	)
end

function Entity:_or(entity)
	if self.is_nil then
		return entity
	end
	return self
end

return Entity
-- </nowiki>
Advertisement