<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://secrets.warcraftwatch.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AAPI_info%2Fmain%2Fwidget</id>
	<title>Module:API info/main/widget - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://secrets.warcraftwatch.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AAPI_info%2Fmain%2Fwidget"/>
	<link rel="alternate" type="text/html" href="https://secrets.warcraftwatch.com/w/index.php?title=Module:API_info/main/widget&amp;action=history"/>
	<updated>2026-05-07T00:52:35Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://secrets.warcraftwatch.com/w/index.php?title=Module:API_info/main/widget&amp;diff=7129&amp;oldid=prev</id>
		<title>imported&gt;Ketho at 05:45, 21 July 2025</title>
		<link rel="alternate" type="text/html" href="https://secrets.warcraftwatch.com/w/index.php?title=Module:API_info/main/widget&amp;diff=7129&amp;oldid=prev"/>
		<updated>2025-07-21T05:45:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local infobox_module = require(&amp;quot;Module:API_info/util/infobox&amp;quot;)&lt;br /&gt;
local widget_data = mw.loadData(&amp;quot;Module:API_info/main/widget/data&amp;quot;)&lt;br /&gt;
local group_data_module = require(&amp;quot;Module:API_info/util/group data&amp;quot;)&lt;br /&gt;
local github_search_url = require(&amp;quot;Module:API_info/util/github_search&amp;quot;).main()&lt;br /&gt;
local properties_module = require(&amp;quot;Module:API_info/properties&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
-- local INFOBOX_STYLE = &amp;#039;&amp;lt;div class=&amp;quot;nomobile&amp;quot; style=&amp;quot;float:right; clear:right;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
local INFOBOX_STYLE = &amp;#039;\n%s&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cannot use # operator on mw.loadData tables&lt;br /&gt;
local function GetTableSize(tbl)&lt;br /&gt;
	local size = 0&lt;br /&gt;
	for _ in pairs(tbl) do&lt;br /&gt;
		size = size + 1&lt;br /&gt;
	end&lt;br /&gt;
	return size&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function GetFullName(widget, method)&lt;br /&gt;
	return string.format(&amp;quot;%s:%s&amp;quot;, widget, method)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function FormatWowprogLink(widget, method)&lt;br /&gt;
	return string.format(&amp;quot;widgets/%s/%s.html&amp;quot;, widget, method)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local links = {&lt;br /&gt;
	{&lt;br /&gt;
		icon = &amp;quot;Inv_mushroom_11.png&amp;quot;, iconsize = 20,&lt;br /&gt;
		text = &amp;quot;FrameXML&amp;quot;,&lt;br /&gt;
		link = function(info)&lt;br /&gt;
			if info.apiType == &amp;quot;widget&amp;quot; then&lt;br /&gt;
				if widget_data.blizzard.widget[info.widget] then&lt;br /&gt;
					return string.format(&amp;quot;https://github.com/search?q=repo:Gethe/wow-ui-source+%s&amp;amp;type=code&amp;quot;, info.widget)&lt;br /&gt;
				end&lt;br /&gt;
			elseif info.apiType == &amp;quot;method&amp;quot; or info.apiType == &amp;quot;script&amp;quot; then&lt;br /&gt;
				 return string.format(&amp;quot;https://github.com/search?q=repo:Gethe/wow-ui-source+%s&amp;amp;type=code&amp;quot;, info.method or info.script)&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		icon = &amp;quot;GitHub_Octocat.png&amp;quot;, iconsize = 20,&lt;br /&gt;
		text = &amp;quot;GitHub&amp;quot;,&lt;br /&gt;
		link = function(info)&lt;br /&gt;
			if info.apiType == &amp;quot;method&amp;quot; then&lt;br /&gt;
				local search_str = string.format(&amp;quot;:%s\\(&amp;quot;, info.method)&lt;br /&gt;
				return string.format(github_search_url, search_str)&lt;br /&gt;
			elseif info.apiType == &amp;quot;script&amp;quot; then&lt;br /&gt;
				return string.format(github_search_url, info.script)&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		icon = &amp;quot;Blizz.gif&amp;quot;, iconsize = 20,&lt;br /&gt;
		text = &amp;quot;Blizzard Docs&amp;quot;,&lt;br /&gt;
		link = function(info)&lt;br /&gt;
			if info.apiType == &amp;quot;widget&amp;quot; then&lt;br /&gt;
				if widget_data.blizzard.widget[info.widget] then&lt;br /&gt;
					return string.format(&amp;quot;https://github.com/Gethe/wow-ui-source/blob/live/Interface/AddOns/Blizzard_APIDocumentationGenerated/%s&amp;quot;, widget_data.blizzard.widget[info.widget])&lt;br /&gt;
				end&lt;br /&gt;
			elseif (info.apiType == &amp;quot;method&amp;quot; and not info.widget:find(&amp;quot;GameTooltip&amp;quot;)) or info.apiType == &amp;quot;script&amp;quot; then&lt;br /&gt;
				return string.format(&amp;quot;https://github.com/search?q=repo:Gethe/wow-ui-source+\\%%22%s\\%%22+path:/^Interface\\/AddOns\\/Blizzard_APIDocumentationGenerated\\//&amp;amp;type=code&amp;quot;, info.method or info.script)&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		icon = &amp;quot;Wowprogramming.png&amp;quot;, iconsize = 20,&lt;br /&gt;
		text = &amp;quot;Wowprogramming&amp;quot;,&lt;br /&gt;
		link = function(info)&lt;br /&gt;
			local wowprog = widget_data.wowprog[info.apiType]&lt;br /&gt;
			local key&lt;br /&gt;
			if info.apiType == &amp;quot;widget&amp;quot; then&lt;br /&gt;
				key = wowprog[info.widget]&lt;br /&gt;
			elseif info.apiType == &amp;quot;method&amp;quot; then&lt;br /&gt;
				local fullName = info.widget..&amp;quot;:&amp;quot;..info.method&lt;br /&gt;
				key = wowprog[fullName]&lt;br /&gt;
				if not key and widget_data.wowprog_html[fullName] then&lt;br /&gt;
					key = FormatWowprogLink(info.widget, info.method)&lt;br /&gt;
				end&lt;br /&gt;
			elseif info.apiType == &amp;quot;script&amp;quot; and wowprog[info.script] then&lt;br /&gt;
				key = wowprog[info.script]&lt;br /&gt;
			end&lt;br /&gt;
			if key then&lt;br /&gt;
				return string.format(&amp;quot;https://wowprogramming.com/docs/%s&amp;quot;, key)&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function FormatIcon(item)&lt;br /&gt;
	item.iconsize = item.iconsize or 20&lt;br /&gt;
	local fs = &amp;quot;[[File:%s|%dpx|link=%s]]&amp;quot;&lt;br /&gt;
	return fs:format(item.icon, item.iconsize, item.url)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function GetElinkIcons(data)&lt;br /&gt;
	local t = {}&lt;br /&gt;
	for _, item in pairs(data) do&lt;br /&gt;
		table.insert(t, FormatIcon(item))&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(t, &amp;quot; &amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function FormatCodeOrLink(name)&lt;br /&gt;
	local firstChar = name:sub(1, 1)&lt;br /&gt;
	local text&lt;br /&gt;
	if firstChar == &amp;quot;#&amp;quot; then&lt;br /&gt;
		name = name:sub(2)&lt;br /&gt;
		text = name:gsub(&amp;quot; &amp;quot;, &amp;quot;:&amp;quot;)&lt;br /&gt;
	elseif name:find(&amp;quot;UIHANDLER &amp;quot;) then&lt;br /&gt;
		local widget = name:match(&amp;quot;UIHANDLER (%w+)&amp;quot;)&lt;br /&gt;
		text = string.format(&amp;quot;[[UIHANDLER %s|%s]]&amp;quot;, widget, widget)&lt;br /&gt;
	else&lt;br /&gt;
		local widget, method = name:match(&amp;quot;(%w+) (%w+)&amp;quot;)&lt;br /&gt;
		text = string.format(&amp;quot;[[API %s|%s:%s]]&amp;quot;, name, widget, method)&lt;br /&gt;
	end&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function GetLinks(info)&lt;br /&gt;
	if type(info) ~= &amp;quot;table&amp;quot; then -- hack&lt;br /&gt;
		local t = {}&lt;br /&gt;
		if info:find(&amp;quot;UIHANDLER&amp;quot;) then&lt;br /&gt;
			t = {apiType = &amp;quot;script&amp;quot;, script = info:match(&amp;quot;UIHANDLER (%w+)&amp;quot;)}&lt;br /&gt;
		else&lt;br /&gt;
			local widget, method = info:match(&amp;quot;(%w+) (%w+)&amp;quot;)&lt;br /&gt;
			t = {apiType = &amp;quot;method&amp;quot;, widget = widget, method = method}&lt;br /&gt;
		end&lt;br /&gt;
		info = t&lt;br /&gt;
	end&lt;br /&gt;
	local t = {}&lt;br /&gt;
	for _, v in pairs(links) do&lt;br /&gt;
		local url = v.link(info)&lt;br /&gt;
		if url then&lt;br /&gt;
			table.insert(t, {&lt;br /&gt;
				id = v.id,&lt;br /&gt;
				icon = v.icon,&lt;br /&gt;
				iconsize = v.iconsize,&lt;br /&gt;
				text = v.text,&lt;br /&gt;
				url = url,&lt;br /&gt;
			})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local m = {}&lt;br /&gt;
&lt;br /&gt;
function m:GetInfobox(info)&lt;br /&gt;
	local source = {&lt;br /&gt;
		&amp;quot;! Links&amp;quot;,&lt;br /&gt;
		GetLinks(info),&lt;br /&gt;
	}&lt;br /&gt;
	if next(source[2]) then&lt;br /&gt;
		return infobox_module:main(source)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function GetGroupInfoboxItem(t, group, info)&lt;br /&gt;
	for _, prefixName in pairs(group) do&lt;br /&gt;
		local name = group_data_module:GetNonPrefixName(prefixName)&lt;br /&gt;
		table.insert(t, &amp;quot;\n|-\n| &amp;quot;)&lt;br /&gt;
		local icons = GetElinkIcons(GetLinks(name))&lt;br /&gt;
		table.insert(t, string.format(&amp;quot;%s || &amp;quot;, icons or &amp;quot;&amp;quot;))&lt;br /&gt;
		local api_text = FormatCodeOrLink(prefixName)&lt;br /&gt;
		if name == info.strippedName and GetTableSize(group) &amp;gt; 2 then&lt;br /&gt;
			api_text = string.format(&amp;#039;&amp;lt;font color=&amp;quot;#dda0dd&amp;quot;&amp;gt;%s&amp;lt;/font&amp;gt;&amp;#039;, api_text)&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(t, string.format(&amp;quot;&amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; || &amp;quot;, api_text))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function m:GetGroupInfobox(info)&lt;br /&gt;
	local key&lt;br /&gt;
	if info.apiType == &amp;quot;method&amp;quot; then&lt;br /&gt;
		key = info.widget..&amp;quot; &amp;quot;..info.method&lt;br /&gt;
	elseif info.apiType == &amp;quot;script&amp;quot; then&lt;br /&gt;
		key = &amp;quot;UIHANDLER &amp;quot;..info.script&lt;br /&gt;
	end&lt;br /&gt;
	local group = group_data_module.data[key]&lt;br /&gt;
	local t = {}&lt;br /&gt;
	table.insert(t, &amp;#039;{| class=&amp;quot;darktable&amp;quot; cellpadding=2&amp;#039;)&lt;br /&gt;
	GetGroupInfoboxItem(t, group, info)&lt;br /&gt;
	table.insert(t, &amp;quot;\n|}&amp;quot;)&lt;br /&gt;
	return table.concat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function GetPropertiesInfobox(info)&lt;br /&gt;
	local t&lt;br /&gt;
	if properties_module.data[info.strippedName] then&lt;br /&gt;
		local t = {}&lt;br /&gt;
		table.insert(t, &amp;quot;! Properties&amp;quot;)&lt;br /&gt;
		for _, v in pairs(properties_module.data[info.strippedName]) do&lt;br /&gt;
			table.insert(t, string.format(&amp;#039;| &amp;lt;div style=&amp;quot;font-family:monospace&amp;quot; class=&amp;quot;text-blizz&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;, v))&lt;br /&gt;
		end&lt;br /&gt;
		return infobox_module:main(t)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function m.main(f)&lt;br /&gt;
	local apiType = f.args.t&lt;br /&gt;
	local pageName = f.args.name&lt;br /&gt;
	local info = {&lt;br /&gt;
		apiType = apiType,&lt;br /&gt;
		strippedName = pageName:gsub(&amp;quot;API &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local properties_infobox = GetPropertiesInfobox(info) or &amp;quot;&amp;quot;&lt;br /&gt;
	local group_infobox&lt;br /&gt;
	if apiType == &amp;quot;widget&amp;quot; then&lt;br /&gt;
		info.widget = pageName:match(&amp;quot;UIOBJECT (%w+)&amp;quot;)&lt;br /&gt;
		info.valid = true&lt;br /&gt;
	elseif apiType == &amp;quot;method&amp;quot; then&lt;br /&gt;
		info.widget, info.method = pageName:match(&amp;quot;API (%w+) (%w+)&amp;quot;)&lt;br /&gt;
		if not info.widget and not info.method then return end&lt;br /&gt;
		info.valid = true&lt;br /&gt;
		if group_data_module.data[info.widget..&amp;quot; &amp;quot;..info.method] then&lt;br /&gt;
			group_infobox = INFOBOX_STYLE:format(m:GetGroupInfobox(info))&lt;br /&gt;
		end&lt;br /&gt;
	elseif apiType == &amp;quot;script&amp;quot; and pageName:find(&amp;quot;UIHANDLER&amp;quot;) then&lt;br /&gt;
		info.script = pageName:match(&amp;quot;UIHANDLER (%w+)&amp;quot;)&lt;br /&gt;
		info.valid = true&lt;br /&gt;
		if group_data_module.data[&amp;quot;UIHANDLER &amp;quot;..info.script] then&lt;br /&gt;
			group_infobox = INFOBOX_STYLE:format(m:GetGroupInfobox(info))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return (info.valid and (properties_infobox..(group_infobox or m:GetInfobox(info))) or &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return m&lt;/div&gt;</summary>
		<author><name>imported&gt;Ketho</name></author>
	</entry>
</feed>