Wowpedia
Advertisement
Wowpedia
240,481
pages

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

-- See [[Template:Api]] and [[Module:Elinks-api]]

local module = {}		-- see function module.GetType() below

-- public constants

module.TYPE_FUNCTION = "a"
module.TYPE_CVAR = "c"
module.TYPE_EVENT = "e"
module.TYPE_WIDGET = "o"
module.TYPE_WIDGETMETHOD = "w"
module.TYPE_SCRIPT = "wh"
module.TYPE_VARIABLE = "t"
module.TYPE_MACROCOMMAND = "m"
module.SUBTYPE_MIXIN = "Mixin"
module.SUBTYPE_ENUM = "Enum"
module.SUBTYPE_CONST = "Const"
module.SUBTYPE_STRUCT = "Struct"
module.SUBTYPE_LINK = "Link"
module.SUBTYPE_STRING = "String"
module.SUBTYPE_ID = "ID"

-- private constants

-- lookup for the t= parameter
local apiTypes =
{
	a = module.TYPE_FUNCTION,
	c = module.TYPE_CVAR,
	e = module.TYPE_EVENT,
	o = module.TYPE_WIDGET,
	w = module.TYPE_WIDGETMETHOD,
	wh = module.TYPE_SCRIPT,
	t = module.TYPE_VARIABLE,
	m = module.TYPE_MACROCOMMAND,
}

local apiSubtypes =
{
	Mixin = module.TYPE_VARIABLE,
	Enum = module.TYPE_VARIABLE,
	Const = module.TYPE_VARIABLE,
	Struct = module.TYPE_VARIABLE,
	Link = module.TYPE_VARIABLE,
	String = module.TYPE_VARIABLE,
	ID = module.TYPE_VARIABLE,
}

local apiCategories =
{
	a = "Category:API functions",
	c = "Category:Console variables",
	e = "Category:API events",
	o = "Category:Widgets",
	w = "Category:Widget methods",
	wh = "Category:Widget script handlers",
	t = "Category:API types",
	m = "Category:Macro API",
	Mixin = "Category:Mixins",
	Enum = "Category:Enumerations",
	Const = "Category:Constants",
	Struct = "Category:Structs",
	Link = "Category:Hyperlinks",
	String = "Category:Encoded Strings",
	ID = "Category:Numeric IDs",
}

-- lookup for widget types, to unambiguously detect widget methods
local widgets =
{
	Alpha = true, 
	Animation = true, 
	AnimationGroup = true, 
	ArchaeologyDigSiteFrame = true, 
	Browser = true, 
	Button = true, 
	CheckButton = true, 
	Checkout = true, 
	CinematicModel = true, 
	ColorSelect = true, 
	ControlPoint = true, 
	Cooldown = true, 
	DressUpModel = true, 
	EditBox = true, 
	FogOfWarFrame = true, 
	Font = true, 
	FontInstance = true, 
	FontString = true, 
	Frame = true, 
	GameTooltip = true, 
	ItemButton = true, 
	LayeredRegion = true, 
	Line = true, 
	LineScale = true, 
	LineTranslation = true, 
	MaskTexture = true, 
	MessageFrame = true, 
	Minimap = true, 
	Model = true, 
	ModelScene = true, 
	ModelSceneActor = true, 
	MovieFrame = true, 
	OffScreenFrame = true, 
	Path = true, 
	PlayerModel = true, 
	POIFrame = true, 
	QuestPOIFrame = true, 
	Region = true, 
	Rotation = true, 
	Scale = true, 
	ScenarioPOIFrame = true, 
	ScriptObject = true, 
	ScrollFrame = true, 
	ScrollingMessageFrame = true, 
	SimpleHTML = true, 
	Slider = true, 
	StatusBar = true, 
	TabardModel = true, 
	Texture = true, 
	TextureCoordTranslation = true, 
	Translation = true, 
	UIObject = true, 
	UnitPositionFrame = true, 
	WorldFrame = true, 
}

local function getType(pagename, t)
	pagename = pagename or ""
	t = t or ""
	local retVal =
		apiSubtypes[t]
		or apiTypes[t]
		or pagename:sub(1, 4) == "API " and (pagename:find(" ", 7) and widgets[pagename:sub(5, pagename:find(" ", 7) - 1)] and module.TYPE_WIDGETMETHOD or module.TYPE_FUNCTION) -- API UIObject GetName or API C Something.DoSomething
		or pagename:sub(1, 5) == "CVar " and module.TYPE_CVAR
		or not pagename:find("[^%u%s]") and module.TYPE_EVENT
		or pagename:sub(1, 9) == "UIOBJECT " and module.TYPE_WIDGET
		or pagename:sub(1, 10) == "UIHANDLER " and module.TYPE_SCRIPT
		or pagename:sub(1,6) == "MACRO " and module.TYPE_MACROCOMMAND 
		or pagename:sub(-5, -1) == "Mixin" and module.SUBTYPE_MIXIN			-- subtypes of module.TYPE_VARIABLE
		or pagename:sub( 1, 4) == "Enum" and module.SUBTYPE_ENUM
		or pagename:sub(1, 6) == "Struct" and module.SUBTYPE_STRUCT
		or pagename:sub(1, 6) == "Const " and module.SUBTYPE_CONST
		or pagename:sub(-4, -1) == "Link" and module.SUBTYPE_LINK
		or pagename:sub(-6, -1) == "String" and module.SUBTYPE_STRING
		or pagename:sub(-2, -1) == "ID" and module.SUBTYPE_ID
		or nil
	if (retVal and apiSubtypes[retVal]) then
		-- "t", "mixin"
		return apiSubtypes[retVal], retVal
	end
	-- "a" or nil
	return retVal
end	

-- Returns a key representing the API type, using t= or autodetection, as one of the module.TYPE constants
-- {{#invoke:Api|GetType|{{PAGENAME}}|{{{t|}}}}}
function module.GetType(frame)
	return getType(frame.args[1], frame.args[2])
end

-- Returns the name of a category that a page should belong in
-- Option 1: {{#invoke:Api|GetCategory|{{PAGENAME}}|{{{t|}}}}}
-- Option 2: {{#invoke:Api|GetCategory|{{{t}}}}}
function module.GetCategory(frame)
	local apiType, apiSubtype = getType(frame.args[1], frame.args[2] or frame.args[1])
	return apiSubtype and apiCategories[apiSubtype] or apiType and apiCategories[apiType]
end

-- Returns the sortkey that a page should belong in
-- {{#invoke:Api|GetCategory|{{PAGENAME}}|{{{t|}}}}}
function module.GetSortKey(frame)
	local pagename = frame.args[1] or ""
	local apiType, apiSubtype = getType(pagename, frame.args[2])
	return
		apiType == module.TYPE_FUNCTION and pagename:sub(5)									-- "API "
		or apiType == module.TYPE_CVAR and pagename:sub(6)									-- "CVar "
		or apiType == module.TYPE_WIDGET and pagename:sub(10)								-- "UIOBJECT "
		or apiType == module.TYPE_WIDGETMETHOD and pagename:sub((pagename:find(" ",5) or 0)+1)		-- "API Frame "
		or apiType == module.TYPE_SCRIPT and pagename:sub((pagename:find(" ") or 0)+1)		-- "UIHANDLER "
		or apiType == module.TYPE_MACROCOMMAND and pagename:sub(7)							-- "Macro "
		or apiSubtype == module.SUBTYPE_ENUM and pagename:sub(6)							-- "Enum."
		or apiSubtype == module.SUBTYPE_STRUCT and pagename:sub(8)							-- "Struct "
		or apiSubtype == module.SUBTYPE_CONST and pagename:sub(7)							-- "Const "
		or apiType and pagename
		or apiSubType and pagename
		or " " .. pagename																	-- For articles about the API that are not actually part of the API itself, to appear at the top of the category
end

return module
Advertisement