Difference between revisions of "Module:Api"

From Wowpedia
Jump to: navigation, search
(Eliminating false positives such as P.B.I.T being labelled an event.)
Tag: WoW API docs
(Articles about the API, which are not actually API members themselves, will now appear at the start of each category.)
(One intermediate revision by the same user not shown)
Line 12: Line 12:
 
module.TYPE_SCRIPT = "wh"
 
module.TYPE_SCRIPT = "wh"
 
module.TYPE_VARIABLE = "t"
 
module.TYPE_VARIABLE = "t"
  +
module.TYPE_MACROCOMMAND = "m"
 
module.SUBTYPE_MIXIN = "Mixin"
 
module.SUBTYPE_MIXIN = "Mixin"
 
module.SUBTYPE_ENUM = "Enum"
 
module.SUBTYPE_ENUM = "Enum"
Line 32: Line 33:
 
wh = module.TYPE_SCRIPT,
 
wh = module.TYPE_SCRIPT,
 
t = module.TYPE_VARIABLE,
 
t = module.TYPE_VARIABLE,
  +
m = module.TYPE_MACROCOMMAND,
 
}
 
}
   
Line 54: Line 56:
 
wh = "Category:Widget script handlers",
 
wh = "Category:Widget script handlers",
 
t = "Category:API types",
 
t = "Category:API types",
  +
m = "Category:Macro API",
 
Mixin = "Category:Mixins",
 
Mixin = "Category:Mixins",
 
Enum = "Category:Enumerations",
 
Enum = "Category:Enumerations",
Line 133: Line 136:
 
or pagename:sub(1, 9) == "UIOBJECT " and module.TYPE_WIDGET
 
or pagename:sub(1, 9) == "UIOBJECT " and module.TYPE_WIDGET
 
or pagename:sub(1, 10) == "UIHANDLER " and module.TYPE_SCRIPT
 
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(-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, 4) == "Enum" and module.SUBTYPE_ENUM
Line 174: Line 178:
 
or apiType == module.TYPE_WIDGETMETHOD and pagename:sub((pagename:find(" ",5) or 0)+1) -- "API Frame "
 
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_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_ENUM and pagename:sub(6) -- "Enum."
 
or apiSubtype == module.SUBTYPE_STRUCT and pagename:sub(8) -- "Struct "
 
or apiSubtype == module.SUBTYPE_STRUCT and pagename:sub(8) -- "Struct "
 
or apiSubtype == module.SUBTYPE_CONST and pagename:sub(7) -- "Const "
 
or apiSubtype == module.SUBTYPE_CONST and pagename:sub(7) -- "Const "
or pagename
+
or apiType 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
 
end
   

Revision as of 18:08, 18 April 2021

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 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