<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AUpdate</id>
	<title>Module:Update - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AUpdate"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Update&amp;action=history"/>
	<updated>2026-05-01T01:41:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Update&amp;diff=33901&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;--&lt;nowiki&gt;  -- IMPORTS local pt = require(&#039;Module:Paramtest&#039;) local hc = pt.has_content local dt = pt.default_to local top_icons -- Module:Top icons local contains -- Module:Array local ordinal -- Module:Ordinal  -- exposed table local p = {}  --[=[ --   -- HELPER TABLES AND FUNCTIONS --  --]=]  -- replacement before calling encode -- as lua patterns local repl_before = { 	[&#039;%(&#039;] = &#039;&#039;, 	[&#039;%)&#039;] = &#039;&#039;, 	[&#039;%!&#039;] = &#039;&#039;, }  -- replacements after calling encode -- as...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Update&amp;diff=33901&amp;oldid=prev"/>
		<updated>2024-10-15T14:21:08Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--&amp;lt;nowiki&amp;gt;  -- IMPORTS local pt = require(&amp;#039;Module:Paramtest&amp;#039;) local hc = pt.has_content local dt = pt.default_to local top_icons -- &lt;a href=&quot;/w/Module:Top_icons&quot; title=&quot;Module:Top icons&quot;&gt;Module:Top icons&lt;/a&gt; local contains -- &lt;a href=&quot;/w/Module:Array&quot; title=&quot;Module:Array&quot;&gt;Module:Array&lt;/a&gt; local ordinal -- &lt;a href=&quot;/w/Module:Ordinal&quot; title=&quot;Module:Ordinal&quot;&gt;Module:Ordinal&lt;/a&gt;  -- exposed table local p = {}  --[=[ --   -- HELPER TABLES AND FUNCTIONS --  --]=]  -- replacement before calling encode -- as lua patterns local repl_before = { 	[&amp;#039;%(&amp;#039;] = &amp;#039;&amp;#039;, 	[&amp;#039;%)&amp;#039;] = &amp;#039;&amp;#039;, 	[&amp;#039;%!&amp;#039;] = &amp;#039;&amp;#039;, }  -- replacements after calling encode -- as...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- IMPORTS&lt;br /&gt;
local pt = require(&amp;#039;Module:Paramtest&amp;#039;)&lt;br /&gt;
local hc = pt.has_content&lt;br /&gt;
local dt = pt.default_to&lt;br /&gt;
local top_icons -- [[Module:Top icons]]&lt;br /&gt;
local contains -- [[Module:Array]]&lt;br /&gt;
local ordinal -- [[Module:Ordinal]]&lt;br /&gt;
&lt;br /&gt;
-- exposed table&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
--  &lt;br /&gt;
-- HELPER TABLES AND FUNCTIONS&lt;br /&gt;
-- &lt;br /&gt;
--]=]&lt;br /&gt;
&lt;br /&gt;
-- replacement before calling encode&lt;br /&gt;
-- as lua patterns&lt;br /&gt;
local repl_before = {&lt;br /&gt;
	[&amp;#039;%(&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%)&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%!&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- replacements after calling encode&lt;br /&gt;
-- as lua patterns&lt;br /&gt;
local repl_after = {&lt;br /&gt;
	[&amp;#039;%+&amp;#039;] = &amp;#039;-&amp;#039;,&lt;br /&gt;
	[&amp;#039;%%2C&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%%2F&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%%3F&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%%26%%2338%%3B&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%%E2%%80%%93&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%.&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%%26quot%%3B&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%%E2%%80%%99&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%%26%%2339%%3B&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
	[&amp;#039;%%C3%%B6&amp;#039;] = &amp;#039;o&amp;#039;,&lt;br /&gt;
	[&amp;#039;%%3A&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- converting month names to hex for sortkeys&lt;br /&gt;
local hexmonthconv = {&lt;br /&gt;
	January = &amp;#039;1&amp;#039;,&lt;br /&gt;
	February = &amp;#039;2&amp;#039;,&lt;br /&gt;
	March = &amp;#039;3&amp;#039;,&lt;br /&gt;
	April = &amp;#039;4&amp;#039;,&lt;br /&gt;
	May = &amp;#039;5&amp;#039;,&lt;br /&gt;
	June = &amp;#039;6&amp;#039;,&lt;br /&gt;
	July = &amp;#039;7&amp;#039;,&lt;br /&gt;
	August = &amp;#039;8&amp;#039;,&lt;br /&gt;
	September = &amp;#039;9&amp;#039;,&lt;br /&gt;
	October = &amp;#039;A&amp;#039;,&lt;br /&gt;
	November = &amp;#039;B&amp;#039;,&lt;br /&gt;
	December = &amp;#039;C&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- used by year func&lt;br /&gt;
local looporder = {&lt;br /&gt;
	{ &amp;#039;December&amp;#039;, 31 },&lt;br /&gt;
	{ &amp;#039;November&amp;#039;, 30 },&lt;br /&gt;
	{ &amp;#039;October&amp;#039;, 31 },&lt;br /&gt;
	{ &amp;#039;September&amp;#039;, 30 },&lt;br /&gt;
	{ &amp;#039;August&amp;#039;, 31 },&lt;br /&gt;
	{ &amp;#039;July&amp;#039;, 31 },&lt;br /&gt;
	{ &amp;#039;June&amp;#039;, 30},&lt;br /&gt;
	{ &amp;#039;May&amp;#039;, 31 },&lt;br /&gt;
	{ &amp;#039;April&amp;#039;, 30 },&lt;br /&gt;
	{ &amp;#039;March&amp;#039;, 31 },&lt;br /&gt;
	{ &amp;#039;February&amp;#039;, 29 },&lt;br /&gt;
	{ &amp;#039;January&amp;#039;, 31 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- category mapping: {category name, type for use on date pages (eg [[28 November]])&lt;br /&gt;
local category_info = {&lt;br /&gt;
	bts = {&amp;#039;Behind the Scenes updates&amp;#039;, &amp;#039;Behind the Scenes&amp;#039;},&lt;br /&gt;
	community = {&amp;#039;Community updates&amp;#039;, &amp;#039;Community&amp;#039;},&lt;br /&gt;
	devblog = {&amp;#039;Developer Blogs&amp;#039;, &amp;#039;Developer Blog&amp;#039;},&lt;br /&gt;
	event = {&amp;#039;Event updates&amp;#039;, &amp;#039;Event update&amp;#039;},&lt;br /&gt;
	game = {&amp;#039;Game updates&amp;#039;, &amp;#039;Game update&amp;#039;},&lt;br /&gt;
	future = {&amp;#039;Future Updates&amp;#039;, &amp;#039;Future update&amp;#039;},&lt;br /&gt;
	forum = {&amp;#039;forum&amp;#039;},&lt;br /&gt;
	mobile = {&amp;#039;Mobile updates&amp;#039;, &amp;#039;Mobile update&amp;#039;},&lt;br /&gt;
	shop = {&amp;#039;Shop updates&amp;#039;, &amp;#039;Shop update&amp;#039;},&lt;br /&gt;
	support = {&amp;#039;Support updates&amp;#039;, &amp;#039;Support&amp;#039;},&lt;br /&gt;
	technical = {&amp;#039;Technical updates&amp;#039;, &amp;#039;Technical&amp;#039;},&lt;br /&gt;
	website = {&amp;#039;Website updates&amp;#039;, &amp;#039;Website update&amp;#039;},&lt;br /&gt;
	yourfeedback = {&amp;#039;Your Feedback updates&amp;#039;, &amp;#039;Your Feedback&amp;#039;},&lt;br /&gt;
	forum = {&amp;#039;Forum post updates&amp;#039;, &amp;#039;Forum post&amp;#039;},&lt;br /&gt;
	competitions = {&amp;#039;Competition updates&amp;#039;, &amp;#039;Competitions&amp;#039;},&lt;br /&gt;
	[&amp;#039;#default&amp;#039;] = {&amp;#039;Missing update category&amp;#039;, &amp;#039;&amp;#039;},&lt;br /&gt;
}&lt;br /&gt;
-- input mapping: accepted inputs -&amp;gt; keys for above table&lt;br /&gt;
local cat_switch = {&lt;br /&gt;
	bts = &amp;#039;bts&amp;#039;,&lt;br /&gt;
	[&amp;#039;behind the scenes&amp;#039;] = &amp;#039;bts&amp;#039;,&lt;br /&gt;
	comm = &amp;#039;community&amp;#039;,&lt;br /&gt;
	community = &amp;#039;community&amp;#039;,&lt;br /&gt;
	dev = &amp;#039;devblog&amp;#039;,&lt;br /&gt;
	blog = &amp;#039;devblog&amp;#039;,&lt;br /&gt;
	[&amp;#039;dev blog&amp;#039;] = &amp;#039;devblog&amp;#039;,&lt;br /&gt;
	devblog = &amp;#039;devblog&amp;#039;,&lt;br /&gt;
	[&amp;#039;dev blogs&amp;#039;] = &amp;#039;devblog&amp;#039;,&lt;br /&gt;
	event = &amp;#039;event&amp;#039;,&lt;br /&gt;
	events = &amp;#039;event&amp;#039;,&lt;br /&gt;
	game = &amp;#039;game&amp;#039;,&lt;br /&gt;
	feedback= &amp;#039;yourfeedback&amp;#039;,&lt;br /&gt;
	forum = &amp;#039;forum&amp;#039;,&lt;br /&gt;
	future = &amp;#039;future&amp;#039;,&lt;br /&gt;
	mobile = &amp;#039;mobile&amp;#039;,&lt;br /&gt;
	shop = &amp;#039;shop&amp;#039;,&lt;br /&gt;
	cs = &amp;#039;support&amp;#039;,&lt;br /&gt;
	competitions = &amp;#039;competitions&amp;#039;,&lt;br /&gt;
	customer = &amp;#039;support&amp;#039;,&lt;br /&gt;
	[&amp;#039;customer support&amp;#039;] = &amp;#039;support&amp;#039;,&lt;br /&gt;
	support = &amp;#039;support&amp;#039;,&lt;br /&gt;
	tech = &amp;#039;technical&amp;#039;,&lt;br /&gt;
	technical = &amp;#039;technical&amp;#039;,&lt;br /&gt;
	th = &amp;#039;th&amp;#039;,&lt;br /&gt;
	site = &amp;#039;website&amp;#039;,&lt;br /&gt;
	ws = &amp;#039;website&amp;#039;,&lt;br /&gt;
	website = &amp;#039;website&amp;#039;,&lt;br /&gt;
	yourfeedback= &amp;#039;yourfeedback&amp;#039;,&lt;br /&gt;
	[&amp;#039;your feedback&amp;#039;] = &amp;#039;yourfeedback&amp;#039;,&lt;br /&gt;
	[&amp;#039;#default&amp;#039;] = &amp;#039;#default&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- given a supported &amp;#039;category&amp;#039; code, return the name of the category&lt;br /&gt;
function get_update_category(catarg)&lt;br /&gt;
	if hc(catarg) then&lt;br /&gt;
		catarg = string.gsub(string.lower(catarg), &amp;#039; ?updates?&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		if cat_switch[catarg] and category_info[cat_switch[catarg]] then&lt;br /&gt;
			return category_info[cat_switch[catarg]][1]&lt;br /&gt;
		else&lt;br /&gt;
			return category_info[cat_switch[&amp;#039;#default&amp;#039;]][1]&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return category_info[cat_switch[&amp;#039;#default&amp;#039;]][1]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- given d,m,y, return the relevant time-based categories (with sorting)&lt;br /&gt;
function get_time_categories(day, month, year)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local hexmonth, dayzero&lt;br /&gt;
		&lt;br /&gt;
	if not day or not month or not hexmonthconv[month] or not year then&lt;br /&gt;
		table.insert(ret, &amp;#039;[[Category:Missing update date]]&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		dayzero = ((tonumber(day) &amp;lt; 10 and &amp;#039;0&amp;#039;..day) or day)&lt;br /&gt;
		hexmonth = hexmonthconv[month]&lt;br /&gt;
		-- [[Category:28 November updates]], sorted by year (eg 2015)&lt;br /&gt;
		table.insert(ret, string.format(&amp;#039;[[Category:%s %s updates|%s%s%s]]&amp;#039;, day, month, year, hexmonth, dayzero))&lt;br /&gt;
		&lt;br /&gt;
		-- [[Category:2015 updates]], sorted by monthday, months converted to hex, eg B28 (28 November)&lt;br /&gt;
		table.insert(ret, string.format(&amp;#039;[[Category:%s updates|%s%s]]&amp;#039;, year, hexmonth, dayzero))&lt;br /&gt;
	&lt;br /&gt;
		-- [[Category:Updates by date]], sorted year month day&lt;br /&gt;
		table.insert(ret, string.format(&amp;#039;[[Category:Updates by date|%s%s%s]]&amp;#039;, year, hexmonth, dayzero))&lt;br /&gt;
	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local external = {}&lt;br /&gt;
	hexmonthnr = tonumber(hexmonthconv[month], 16)&lt;br /&gt;
	-- Historical or OSRS updates&lt;br /&gt;
	if tonumber(year) &amp;lt; 2008 then&lt;br /&gt;
		table.insert(ret, &amp;#039;[[Category:Historical updates]]&amp;#039;)&lt;br /&gt;
		table.insert(external, &amp;#039;rs&amp;#039;)&lt;br /&gt;
		if tonumber(year) &amp;lt; 2004 or (tonumber(year) == 2004 and (hexmonthnr &amp;lt; 3 or (hexmonthnr == 3 and tonumber(day) &amp;lt;= 29))) then&lt;br /&gt;
			table.insert(external, &amp;#039;rsc&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(ret, &amp;#039;[[Category:Old School RuneScape updates]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if #external then&lt;br /&gt;
		top_icons = require(&amp;#039;Module:Top icons&amp;#039;)._main&lt;br /&gt;
		table.insert(ret, top_icons(external))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- lang for formatting date&lt;br /&gt;
local lang = mw.getContentLanguage()&lt;br /&gt;
-- current title&lt;br /&gt;
local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
-- &lt;br /&gt;
-- TEMPLATES&lt;br /&gt;
-- &lt;br /&gt;
--]=]&lt;br /&gt;
&lt;br /&gt;
-- [[Template:Update]]&lt;br /&gt;
function p.update(frame)&lt;br /&gt;
	local a = frame:getParent().args&lt;br /&gt;
	&lt;br /&gt;
	local div = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;update&amp;#039;)&lt;br /&gt;
		:done()&lt;br /&gt;
		&lt;br /&gt;
	local link&lt;br /&gt;
	local url = a.link or a.url&lt;br /&gt;
	local postDateInfo&lt;br /&gt;
	&lt;br /&gt;
	if hc(url) then&lt;br /&gt;
		if url == &amp;#039;no&amp;#039; then&lt;br /&gt;
			link = &amp;#039;official news post&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			link = &amp;#039;[&amp;#039; .. url .. &amp;#039; official news post]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		link = string.lower(title.baseText)&lt;br /&gt;
		for i,v in pairs(repl_before) do&lt;br /&gt;
			link = string.gsub(link, i, v)&lt;br /&gt;
		end&lt;br /&gt;
		link = mw.uri.encode(link)&lt;br /&gt;
		for i,v in pairs(repl_after) do&lt;br /&gt;
			link = string.gsub(link, i, v)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		link = &amp;#039;[https://secure.runescape.com/m=news/&amp;#039; .. link .. &amp;#039; official news post]&amp;#039;&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local date_link, day, month, year&lt;br /&gt;
	if hc(a.date) then&lt;br /&gt;
		day = lang:formatDate(&amp;#039;j&amp;#039;, a.date)&lt;br /&gt;
		month = lang:formatDate(&amp;#039;F&amp;#039;, a.date)&lt;br /&gt;
		year = lang:formatDate(&amp;#039;Y&amp;#039;, a.date)&lt;br /&gt;
		date_link = &amp;#039;[[&amp;#039; .. day .. &amp;#039; &amp;#039; .. month .. &amp;#039;]] [[&amp;#039; .. year .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		date_link = &amp;#039;(missing date)&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if hc(a.rev) then&lt;br /&gt;
		date_link = date_link .. &amp;#039;, and revised on &amp;#039; .. lang:formatDate(&amp;#039;[[j F]] [[Y]]&amp;#039;, a.rev)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if hc(a.author) then&lt;br /&gt;
		date_link = date_link .. &amp;#039; by &amp;#039; .. a.author&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if url == &amp;#039;no&amp;#039; then&lt;br /&gt;
		postDateInfo = &amp;#039;It was added on &amp;#039; .. date_link .. &amp;#039; but has since been removed.&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		postDateInfo = &amp;#039;It was added on &amp;#039; .. date_link .. &amp;#039;.&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Determine whether message is historical (pre-osrs), osrs.&lt;br /&gt;
	local message = &amp;#039;&amp;#039;&lt;br /&gt;
	local website = &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	if hc(a.time) then&lt;br /&gt;
		--Historical updates&lt;br /&gt;
		if a.time == &amp;#039;historical&amp;#039; then&lt;br /&gt;
			message = &amp;#039; is from before the launch of &amp;lt;i&amp;gt;Old School RuneScape&amp;lt;/i&amp;gt; and is copied verbatim from the &amp;#039;&lt;br /&gt;
			website = &amp;#039;[https://www.runescape.com/community &amp;lt;i&amp;gt;RuneScape&amp;lt;/i&amp;gt; website]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	--OSRS updates	&lt;br /&gt;
	else&lt;br /&gt;
		message = &amp;#039; is copied verbatim from the &amp;#039;&lt;br /&gt;
		website = &amp;#039;[https://oldschool.runescape.com/ &amp;lt;i&amp;gt;Old School RuneScape&amp;lt;/i&amp;gt; website]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	div:wikitext(&amp;#039;This &amp;#039; .. link .. message)&lt;br /&gt;
		:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;plainlinks&amp;#039;)&lt;br /&gt;
			:wikitext(website)&lt;br /&gt;
		:done()&lt;br /&gt;
		:wikitext(&amp;#039;. It is copyrighted by [[Jagex]].&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;br&amp;#039;):done()&lt;br /&gt;
		:wikitext(postDateInfo)&lt;br /&gt;
	:done()&lt;br /&gt;
	&lt;br /&gt;
	local div2 = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	if hc(a.article) then&lt;br /&gt;
		div2 = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;update-redirect&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;tile&amp;#039;)&lt;br /&gt;
			-- css was previously at common.css but now here because it was unused&lt;br /&gt;
			:cssText(&amp;#039;text-align:center;font-weight:bold;font-size:2em;line-height:1.5em;padding:1em;margin-left:auto;margin-right:auto;&amp;#039;)&lt;br /&gt;
			:wikitext(&amp;#039;This is a newspost. For the wiki article, see [[&amp;#039; .. a.article .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
		&lt;br /&gt;
		if hc(a.nuke) then&lt;br /&gt;
			if a.nuke == &amp;#039;yes&amp;#039; then&lt;br /&gt;
				div2:addClass(&amp;#039;nuke&amp;#039;):cssText(&amp;#039;margin-bottom:20%;&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local cat = &amp;#039;&amp;#039;&lt;br /&gt;
	-- cats only in update namespace&lt;br /&gt;
	if title.namespace == 112 then&lt;br /&gt;
		cat = &amp;#039;[[Category:&amp;#039; .. get_update_category(a.category) .. &amp;#039;|&amp;#039; .. title.text .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		cat = cat .. get_time_categories(day, month, year)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ret = &amp;#039;__NOTOC__ __NOEDITSECTION__&amp;#039; .. tostring(div2) .. tostring(div) .. cat&lt;br /&gt;
	&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- [[Template:Patch Notes]] no links available as Patch Note Archive have been removed from Jagex&amp;#039;s website&lt;br /&gt;
function p.patchnotes(frame)&lt;br /&gt;
	local a = frame:getParent().args&lt;br /&gt;
	local cat = &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local div = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;update&amp;#039;)&lt;br /&gt;
		:done()&lt;br /&gt;
		&lt;br /&gt;
	local date_link&lt;br /&gt;
	local day, month, year = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
	if hc(a.date) then&lt;br /&gt;
		day = lang:formatDate(&amp;#039;j&amp;#039;, a.date)&lt;br /&gt;
		month = lang:formatDate(&amp;#039;F&amp;#039;, a.date)&lt;br /&gt;
		year = lang:formatDate(&amp;#039;Y&amp;#039;, a.date)&lt;br /&gt;
		date_link = string.format(&amp;#039;[[%s %s]] [[%s]]&amp;#039;, day, month, year)&lt;br /&gt;
	else&lt;br /&gt;
		date_link = &amp;#039;(missing date)&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if hc(a.rev) then&lt;br /&gt;
		date_link = date_link .. &amp;#039;, and revised on &amp;#039; .. lang:formatDate(&amp;#039;[[j F]] [[Y]]&amp;#039;, a.rev)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	div:wikitext(&amp;#039;These official [[Patch Notes]] are copied verbatim from the Patch Notes Archive which is no longer available. It is copyrighted by [[Jagex]].&amp;#039;)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;br&amp;#039;):done()&lt;br /&gt;
		:wikitext(&amp;#039;These Patch Notes were announced on &amp;#039; .. date_link .. &amp;#039;.&amp;#039;)&lt;br /&gt;
	:done()&lt;br /&gt;
	&lt;br /&gt;
	cat = cat .. &amp;#039;[[Category:Patch Notes|*&amp;#039; .. lang:formatDate(&amp;#039;md&amp;#039;, day .. &amp;#039; &amp;#039; .. month) .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	cat = cat .. get_time_categories(day, month, year)&lt;br /&gt;
	&lt;br /&gt;
	-- not update namespace, remove cat&lt;br /&gt;
	if title.namespace ~= 112 then&lt;br /&gt;
		cat = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ret = frame:getParent():preprocess(string.format(&amp;#039;{{Parentitle override|Update:Patch Notes|(%s %s %s)}}&amp;#039;, day, month, year)) .. &amp;#039;__NOEDITSECTION__&amp;#039; .. tostring(div) .. cat .. &amp;#039;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
-- &lt;br /&gt;
-- CATEGORY FORMATTERS&lt;br /&gt;
-- &lt;br /&gt;
--]=]&lt;br /&gt;
&lt;br /&gt;
-- [[Category:28 November updates]] etc&lt;br /&gt;
function p.date_cat(frame)&lt;br /&gt;
	local f = frame:getParent()&lt;br /&gt;
	local d&lt;br /&gt;
	if hc(f.args[1]) then&lt;br /&gt;
		d = f.args[1]&lt;br /&gt;
	else&lt;br /&gt;
		-- assumes 2016 so that leap years work&lt;br /&gt;
		d = string.gsub(title.text, &amp;#039; ?updates?&amp;#039;, &amp;#039;&amp;#039;) .. &amp;#039; 2016&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ret = &amp;#039;This category contains updates posted on &amp;#039; .. lang:formatDate(&amp;#039;[[j F]]&amp;#039;, d) .. &amp;#039;, sorted chronologically.&amp;#039;&lt;br /&gt;
	-- cats only in category namespace&lt;br /&gt;
	if title.namespace == 14 then&lt;br /&gt;
		--updates by day, sorted by hexmonth,day: B28 (28 November)&lt;br /&gt;
		ret = ret .. &amp;#039;[[Category:Updates by day|&amp;#039; .. hexmonthconv[lang:formatDate(&amp;#039;F&amp;#039;, d)] .. lang:formatDate(&amp;#039;d&amp;#039;, d) .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		--updates by month, sorted by [space]day&lt;br /&gt;
		ret = ret .. &amp;#039;[[Category:&amp;#039; .. lang:formatDate(&amp;#039;F&amp;#039;, d) .. &amp;#039; updates| &amp;#039; .. lang:formatDate(&amp;#039;d&amp;#039;, d) .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- [[Category:2015 updates]] etc&lt;br /&gt;
function p.year_cat(frame)&lt;br /&gt;
	local f = frame:getParent()&lt;br /&gt;
	local d&lt;br /&gt;
	if hc(f.args[1]) then&lt;br /&gt;
		d = f.args[1]&lt;br /&gt;
	else&lt;br /&gt;
		d = string.gsub(title.text, &amp;#039; ?updates?&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ret = &amp;#039;This category contains updates posted in [[&amp;#039; .. d .. &amp;#039;]], sorted chronologically.&amp;#039;&lt;br /&gt;
	-- cats only in category namespace&lt;br /&gt;
	if title.namespace == 14 then&lt;br /&gt;
		--updates by year, sorted by [space]year&lt;br /&gt;
		ret = ret .. &amp;#039;[[Category:Updates by year| &amp;#039; .. d .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
-- &lt;br /&gt;
-- DATE DPL HANDLERS&lt;br /&gt;
-- &lt;br /&gt;
--]=]&lt;br /&gt;
&lt;br /&gt;
function p.datedpl(frame)&lt;br /&gt;
	local a = frame:getParent().args&lt;br /&gt;
	local year&lt;br /&gt;
	local cat&lt;br /&gt;
	local page = a[&amp;#039;%TITLE%&amp;#039;]&lt;br /&gt;
	if hc(a.year) then&lt;br /&gt;
		year = a.year&lt;br /&gt;
	else&lt;br /&gt;
		year = lang:formatDate(&amp;#039;Y&amp;#039;, a.date)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if hc(a.category) then&lt;br /&gt;
		-- if it has category, {{Update}}&lt;br /&gt;
		cat = category_info[cat_switch[string.gsub(string.lower(a.category), &amp;#039; ?updates?&amp;#039;, &amp;#039;&amp;#039;)]][2]&lt;br /&gt;
	else&lt;br /&gt;
		-- missing both probably means {{Patch Notes}}&lt;br /&gt;
		cat = &amp;#039;Patch Notes&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; – %s: [[Update:%s|%s]]&amp;quot;,year,cat,page,page)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
-- &lt;br /&gt;
-- YEAR DPL HANDLERS&lt;br /&gt;
-- &lt;br /&gt;
--]=]&lt;br /&gt;
&lt;br /&gt;
local function sortFunc(a,b)&lt;br /&gt;
	return a[2] &amp;lt; b[2]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function lookup(cat)&lt;br /&gt;
	local r = mw.getCurrentFrame():preprocess(string.format([=[&lt;br /&gt;
{{#dpl:&lt;br /&gt;
|namespace=Update&lt;br /&gt;
|category=%s&lt;br /&gt;
|include={Update}:date,{Patch Notes}:date,{DevBlog}:date&lt;br /&gt;
|format=,¦UD¦%%PAGE%%@D@,,&lt;br /&gt;
|ordermethod=sortkey&lt;br /&gt;
}}&lt;br /&gt;
]=], cat))&lt;br /&gt;
	local ret = { }&lt;br /&gt;
	local keys = {}&lt;br /&gt;
	for v in mw.text.gsplit(r, &amp;#039;|UD|&amp;#039;, true) do&lt;br /&gt;
		if v:find(&amp;#039;@&amp;#039;) then&lt;br /&gt;
			local u,_d = unpack(mw.text.split(v, &amp;#039;@D@&amp;#039;))&lt;br /&gt;
			u = mw.text.trim(u)&lt;br /&gt;
			u = string.sub(u, 8, -1)&lt;br /&gt;
			_d = mw.text.trim(_d)&lt;br /&gt;
			local y,m,d = unpack(mw.text.split(lang:formatDate(&amp;#039;Y-F-j&amp;#039;, _d), &amp;#039;-&amp;#039;, true))&lt;br /&gt;
			y = tonumber(y)&lt;br /&gt;
			d = tonumber(d)&lt;br /&gt;
			if not ret[y] then&lt;br /&gt;
				ret[y] = {}&lt;br /&gt;
			end&lt;br /&gt;
			if not ret[y][m] then&lt;br /&gt;
				ret[y][m] = {}&lt;br /&gt;
			end&lt;br /&gt;
			if not ret[y][m][d] then&lt;br /&gt;
				ret[y][m][d] = {u}&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(ret[y][m][d], u)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.year(frame)&lt;br /&gt;
	return p._year(frame:getParent().args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._year(args)&lt;br /&gt;
	local year = args[1] or mw.title.getCurrentTitle().text&lt;br /&gt;
	local data = lookup(year..&amp;#039; updates&amp;#039;)&lt;br /&gt;
	data = data[tonumber(year)]&lt;br /&gt;
	local gameUpdQ = mw.smw.ask{ &amp;#039;[[Category:&amp;#039; .. year .. &amp;#039; updates]][[Category:Game updates]]&amp;#039;, &amp;#039;?#-&amp;#039;}&lt;br /&gt;
	local gameUpdates = {}&lt;br /&gt;
	if gameUpdQ == nil then&lt;br /&gt;
		return &amp;#039;\n\&amp;#039;\&amp;#039;No updates have been released this year so far. If you believe this is a mistake, leave a message in [[Module talk:Updates|this talk page]].\&amp;#039;\&amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	for _,v in ipairs(gameUpdQ) do&lt;br /&gt;
		table.insert(gameUpdates, v[1])&lt;br /&gt;
	end&lt;br /&gt;
	local ret = {&amp;#039;\&amp;#039;\&amp;#039;\&amp;#039;Note:\&amp;#039;\&amp;#039;\&amp;#039; Titles in bold indicate a [[Game updates|game update]].&amp;#039;}&lt;br /&gt;
	local data_m, data_d&lt;br /&gt;
	&lt;br /&gt;
	contains = require(&amp;#039;Module:Array&amp;#039;).contains&lt;br /&gt;
	ordinal = require(&amp;#039;Module:Ordinal&amp;#039;)._main&lt;br /&gt;
	&lt;br /&gt;
	for _,m in ipairs(looporder) do&lt;br /&gt;
		data_m = data[m[1]]&lt;br /&gt;
		if data_m then&lt;br /&gt;
			table.insert(ret, &amp;#039;\n\n==&amp;#039;..m[1]..&amp;#039;==&amp;#039;)&lt;br /&gt;
			for d = m[2], 1, -1 do&lt;br /&gt;
				data_d = data_m[d]&lt;br /&gt;
				if data_d then&lt;br /&gt;
					table.sort(data_d)&lt;br /&gt;
					local patchDay = false&lt;br /&gt;
					local addedPatch = false&lt;br /&gt;
					local gameUpdDay = false&lt;br /&gt;
					local otherUpdDay = false&lt;br /&gt;
					local patchNote = &amp;#039;Patch Notes (&amp;#039; .. d .. &amp;#039; &amp;#039; .. m[1] .. &amp;#039; &amp;#039; .. year .. &amp;#039;)&amp;#039;&lt;br /&gt;
					local patchLink = string.format(&amp;#039;\&amp;#039;\&amp;#039;([[Update:%s|Patch Notes]])\&amp;#039;\&amp;#039;&amp;#039;, patchNote)&lt;br /&gt;
					if ( contains(data_d, patchNote) ) then patchDay = true end&lt;br /&gt;
					for _,u in ipairs(data_d) do&lt;br /&gt;
						if( contains(gameUpdates, &amp;#039;Update:&amp;#039; .. u) ) then&lt;br /&gt;
							gameUpdDay = true&lt;br /&gt;
						elseif( u ~= patchNote ) then&lt;br /&gt;
							otherUpdDay = true&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					for _,u in ipairs(data_d) do&lt;br /&gt;
						if( contains(gameUpdates, &amp;#039;Update:&amp;#039; .. u) ) then&lt;br /&gt;
							-- bold game updates&lt;br /&gt;
							local updBullet = string.format(&amp;#039;\&amp;#039;\&amp;#039;\&amp;#039;[[Update:%s|%s]]\&amp;#039;\&amp;#039;\&amp;#039;&amp;#039;, u, u)&lt;br /&gt;
							if (patchDay == true and addedPatch == false) then&lt;br /&gt;
								updBullet = updBullet .. &amp;#039; &amp;#039; .. patchLink&lt;br /&gt;
								addedPatch = true&lt;br /&gt;
							end&lt;br /&gt;
							table.insert(ret, string.format(&amp;#039;\n* %s%s – %s&amp;#039;, tostring(d), ordinal(d, {nosup = true, nonum = true}), updBullet))&lt;br /&gt;
						elseif( u ~= patchNote ) then&lt;br /&gt;
							-- add normal updates&lt;br /&gt;
							local updBullet = string.format(&amp;#039;[[Update:%s|%s]]&amp;#039;, u, u)&lt;br /&gt;
							if (patchDay == true and addedPatch == false and gameUpdDay == false) then&lt;br /&gt;
								updBullet = updBullet .. &amp;#039; &amp;#039; .. patchLink&lt;br /&gt;
								addedPatch = true&lt;br /&gt;
							end&lt;br /&gt;
							table.insert(ret, string.format(&amp;#039;\n* %s%s – %s&amp;#039;, tostring(d), ordinal(d, {nosup = true, nonum = true}), updBullet))&lt;br /&gt;
						elseif( u == patchNote and gameUpdDay == false and otherUpdDay == false ) then&lt;br /&gt;
							-- add patches as standalone updates&lt;br /&gt;
							local updBullet = string.format(&amp;#039;\&amp;#039;\&amp;#039;([[Update:%s|Patch Notes]])\&amp;#039;\&amp;#039;&amp;#039;, u)&lt;br /&gt;
							table.insert(ret, string.format(&amp;#039;\n* %s%s – %s&amp;#039;, tostring(d), ordinal(d, {nosup = true, nonum = true}), updBullet))&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return mw.text.trim(table.concat(ret, &amp;#039;&amp;#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--TODO&lt;br /&gt;
--p.updatedpl&lt;br /&gt;
--p.patchnotesdpl&lt;br /&gt;
--etc&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>