Module:Update
Template loop detected: Module:Update/doc
--<nowiki>
-- IMPORTS
local pt = require('Module:Paramtest')
local hc = pt.has_content
local dt = pt.default_to
-- exposed table
local p = {}
--[=[
--
-- HELPER TABLES AND FUNCTIONS
--
--]=]
-- replacement before calling encode
-- as lua patterns
local repl_before = {
['%&%#32%;'] = '-',
['%('] = '',
['%)'] = '',
['%!'] = '',
['%&'] = '',
["%'"] = '',
['%#'] = '',
['%|'] = '',
['%"'] = '',
['%$'] = '',
['%£'] = '',
['%%'] = '',
['%+'] = '',
['”'] = '',
['’'] = '',
['…'] = '',
['ñ'] = 'n',
['ö'] = 'o',
}
-- replacements after calling encode
-- as lua patterns
local repl_after = {
['%+'] = '-',
['%%2C'] = '',
['%%2F'] = '',
['%%3F'] = '',
['%%26%%2338%%3B'] = '',
['%%E2%%80%%93'] = '',
['%.'] = '',
['%%26quot%%3B'] = '',
['%%26%%2339%%3B'] = '',
['%%3A'] = '',
}
-- converting month names to hex for sortkeys
local hexmonthconv = {
January = '1',
February = '2',
March = '3',
April = '4',
May = '5',
June = '6',
July = '7',
August = '8',
September = '9',
October = 'A',
November = 'B',
December = 'C',
}
-- category mapping: {category name, type for use on date pages (eg [[28 November]])
local category_info = {
bts = {'Behind the Scenes updates', 'Behind the Scenes'},
community = {'Community updates', 'Community'},
devblog = {'Developer Blogs', 'Developer Blog'},
event = {'Event updates', 'Event update'},
feedback = {'Feedback updates', 'Feedback'},
future = {'Future updates', 'Future update'},
game = {'Game updates', 'Game update'},
shop = {'Shop updates', 'Shop update'},
sof = {'Squeal of Fortune updates', 'Squeal of Fortune'},
sgs = {'Solomon\'s Store updates', 'Solomon\'s Store'},
support = {'Support updates', 'Support'},
technical = {'Technical updates', 'Technical'},
th = {'Treasure Hunter updates', 'Treasure Hunter'},
website = {'Website updates', 'Website update'},
competitions = {'Competition updates', 'Competitions'},
mobile = {'Mobile updates', 'Mobile'},
['#default'] = {'Missing update category', ''},
}
-- input mapping: accepted inputs -> keys for above table
local cat_switch = {
bts = 'bts',
['behind the scenes'] = 'bts',
comm = 'community',
community = 'community',
dev = 'devblog',
blog = 'devblog',
['dev blog'] = 'devblog',
['dev blogs'] = 'devblog',
devblog = 'devblog',
event = 'event',
events = 'event',
fb = 'feedback',
feedback = 'feedback',
yourfeedback = 'feedback',
['your feedback'] = 'feedback',
future = 'future',
game = 'game',
shop = 'shop',
ss = 'sgs',
sgs = 'sgs',
solomon = 'sgs',
['solomon\'s store'] = 'sgs',
sof = 'sof',
squeal = 'sof',
cs = 'support',
customer = 'support',
['customer support'] = 'support',
support = 'support',
tech = 'technical',
technical = 'technical',
th = 'th',
treasure = 'th',
['treasure hunter'] = 'th',
site = 'website',
ws = 'website',
website = 'website',
competitions = 'competitions',
mobile = 'mobile',
['#default'] = '#default'
}
-- given a supported 'category' code, return the name of the category
function get_update_category(catarg)
if hc(catarg) then
catarg = string.gsub(string.lower(catarg), ' ?updates?', '')
if cat_switch[catarg] and category_info[cat_switch[catarg]] then
return category_info[cat_switch[catarg]][1]
else
return category_info[cat_switch['#default']][1]
end
else
return category_info[cat_switch['#default']][1]
end
end
-- given d,m,y, return the relevant time-based categories (with sorting)
function get_time_categories(day, month, year)
local ret = {}
local hexmonth, dayzero
if not day or not month or not hexmonthconv[month] or not year then
table.insert(ret, '[[Category:Missing update date]]')
else
dayzero = ((tonumber(day) < 10 and '0'..day) or day)
hexmonth = hexmonthconv[month]
-- [[Category:28 November updates]], sorted by year (eg 2015)
table.insert(ret, string.format('[[Category:%s %s updates|%s%s%s]]', day, month, year, hexmonth, dayzero))
-- [[Category:2015 updates]], sorted by monthday, months converted to hex, eg B28 (28 November)
table.insert(ret, string.format('[[Category:%s updates|%s%s]]', year, hexmonth, dayzero))
-- [[Category:Updates by date]], sorted year month day
table.insert(ret, string.format('[[Category:Updates by date|%s%s%s]]', year, hexmonth, dayzero))
end
local external = {}
hexmonthnr = tonumber(hexmonthconv[month], 16)
if tonumber(year) < 2004 or (tonumber(year) == 2004 and (hexmonthnr < 3 or (hexmonthnr == 3 and tonumber(day) <= 29))) then
table.insert(external, 'rsc')
end
if tonumber(year) < 2007 or (tonumber(year) == 2007 and (hexmonthnr < 8 or (hexmonthnr == 8 and tonumber(day) <= 10))) then
table.insert(external, 'os')
end
if #external then
table.insert(ret, top_icons(external))
end
return table.concat(ret)
end
-- lang for formatting date
local lang = mw.getContentLanguage()
-- current title
local title = mw.title.getCurrentTitle()
--[=[
--
-- TEMPLATES
--
--]=]
-- [[Template:Update]]
function p.update(frame)
local a = frame:getParent().args
local div = mw.html.create('div')
:addClass('official update')
:done()
local link
local postTitle = dt(a.title, title.baseText)
if hc(a.link) then
if a.link == 'no' then
link = 'official news post'
else
link = '[' .. a.link .. ' official news post]'
end
else
link = string.lower(postTitle)
for i,v in pairs(repl_before) do
link = string.gsub(link, i, v)
end
link = mw.uri.encode(link)
for i,v in pairs(repl_after) do
link = string.gsub(link, i, v)
end
link = '[https://secure.runescape.com/m=news/' .. link .. ' official news post]'
end
local date_link, day, month, year
if hc(a.date) then
day = lang:formatDate('j', a.date)
month = lang:formatDate('F', a.date)
year = lang:formatDate('Y', a.date)
date_link = '[[' .. day .. ' ' .. month .. ']] [[' .. year .. ']]'
else
date_link = '(missing date)'
end
if hc(a.rev) then
date_link = date_link .. ', and revised on ' .. lang:formatDate('[[j F]] [[Y]]', a.rev)
end
if hc(a.author) then
date_link = date_link .. ' by ' .. a.author
end
div:wikitext('This ' .. link .. ' is copied verbatim from the ')
:tag('span')
:addClass('plainlinks')
:wikitext('[https://www.runescape.com/community \'\'RuneScape\'\' website]')
:done()
:wikitext('. It is copyrighted by [[Jagex]].')
:tag('br'):done()
:wikitext('It was added on ' .. date_link .. '.')
:done()
local div2 = ''
if hc(a.article) then
div2 = mw.html.create('div')
:addClass('update-redirect')
:wikitext('This is a newspost. For the wiki article, see [[' .. a.article .. ']]')
:done()
if hc(a.nuke) then
if a.nuke == 'yes' then
div2:addClass('nuke')
:done()
end
end
end
local cat = ''
-- cats only in update namespace
if title.namespace == 100 then
cat = '[[Category:' .. get_update_category(a.category) .. '|' .. postTitle .. ']]'
cat = cat .. get_time_categories(day, month, year)
end
if hc(a.title) then
local parenthesisedFullDate = ''
local parenthesisedMonthYear = ''
if (hc(a.date) and day and month and year) then
parenthesisedFullDate = string.format('(%s %s %s)', day, month, year)
parenthesisedMonthYear = string.format('(%s %s)', month, year)
end
local pipeEscapedTitle = string.gsub(a.title, '|', '{{!}}')
if (hc(parenthesisedFullDate) and (string.format('%s %s', a.title, parenthesisedFullDate) == title.baseText)) then
titleOverride = string.format('{{Parentitle override|%s|%s}}', pipeEscapedTitle, parenthesisedFullDate)
elseif (hc(parenthesisedMonthYear) and (string.format('%s %s', a.title, parenthesisedMonthYear) == title.baseText)) then
titleOverride = string.format('{{Parentitle override|%s|%s}}', pipeEscapedTitle, parenthesisedMonthYear)
else
titleOverride = string.format('{{DISPLAYTITLE:%s}}', pipeEscapedTitle)
end
frame:getParent():preprocess(titleOverride)
end
local toc = ' __NOTOC__'
if hc(a.toc) then
local toclimit = tostring( tonumber(a.toclimit) or '1' )
toc = frame:expandTemplate{ title = 'ToC', args = { 'right', limit = toclimit } }
end
local ret = '__NOEDITSECTION__' .. tostring(div2) .. tostring(div) .. toc .. cat .. '<div class="boldlinks">'
return ret
end
-- [[Template:Patch Notes]]
function p.patchnotes(frame)
local function qfclink(qfc)
return 'http://services.runescape.com/m=forum/forums.ws?' .. string.gsub(qfc, '%-', ',')
end
local a = frame:getParent().args
local cat = ''
local div = mw.html.create('div')
:addClass('official patchnote')
:done()
local link
if hc(a.qfc) then
if a.qfc == 'no' then
link = ' a forum thread'
elseif a.qfc == 'none' then
link = ''
else
link = '[' .. qfclink(a.qfc) .. ' this forum thread]'
end
else
link = '(QFC missing)'
cat = cat .. '[[Category:Missing patch notes QFC]]'
end
local newspostlink
if hc(a.link) then
newspostlink = '['..a.link..' this news post]'
end
local date_link
local day, month, year = '', '', ''
if hc(a.date) then
day = lang:formatDate('j', a.date)
month = lang:formatDate('F', a.date)
year = lang:formatDate('Y', a.date)
date_link = string.format('[[%s %s]] [[%s]]', day, month, year)
else
date_link = '(missing date)'
end
if hc(a.author) then
date_link = date_link .. ' by ' .. a.author
end
if hc(a.rev) then
date_link = date_link .. ', and revised on ' .. lang:formatDate('[[j F]] [[Y]]', a.rev)
end
if hc(link) and hc(newspostlink) then
div:wikitext('These official [[Patch Notes]] are copied verbatim from ' .. link .. ' of the ')
:tag('span')
:addClass('plainlinks')
:wikitext('[http://services.runescape.com/m=forum/forums.ws \'\'RuneScape\'\' forums]')
:done()
:wikitext(' or alternatively from ' .. newspostlink .. ' of the ')
:tag('span')
:addClass('plainlinks')
:wikitext('[https://secure.runescape.com/m=news/ \'\'RuneScape\'\' news posts]')
:done()
:wikitext('. It is copyrighted by [[Jagex]].')
:tag('br'):done()
:wikitext('These Patch Notes were announced on ' .. date_link .. '.')
:done()
elseif hc(link) then
div:wikitext('These official [[Patch Notes]] are copied verbatim from ' .. link .. ' of the ')
:tag('span')
:addClass('plainlinks')
:wikitext('[http://services.runescape.com/m=forum/forums.ws \'\'RuneScape\'\' forums]')
:done()
:wikitext('. It is copyrighted by [[Jagex]].')
:tag('br'):done()
:wikitext('These Patch Notes were announced on ' .. date_link .. '.')
:done()
elseif hc(newspostlink) then
div:wikitext('These official [[Patch Notes]] are copied verbatim from ' .. newspostlink .. ' of the ')
:tag('span')
:addClass('plainlinks')
:wikitext('[https://secure.runescape.com/m=news/ \'\'RuneScape\'\' news posts]')
:done()
:wikitext('. It is copyrighted by [[Jagex]].')
:tag('br'):done()
:wikitext('These Patch Notes were announced on ' .. date_link .. '.')
:done()
else
div:wikitext('These official [[Patch Notes]] are copied verbatim from (missing link). It is copyrighted by [[Jagex]].')
:tag('br'):done()
:wikitext('These Patch Notes were announced on ' .. date_link .. '.')
:done()
cat = cat .. '[[Category:Missing patch notes link]]'
end
cat = cat .. '[[Category:Patch Notes|*' .. lang:formatDate('md', day .. ' ' .. month) .. ']]'
cat = cat .. get_time_categories(day, month, year)
-- not update namespace, remove cat
if title.namespace ~= 100 then
cat = ''
end
if hc(a.titleOverride) then
if a.titleOverride ~= 'no' then
frame:getParent():preprocess(string.format('{{DISPLAYTITLE:%s}}', string.gsub(a.titleOverride, '|', '{{!}}')))
end
else
frame:getParent():preprocess(string.format('{{Parentitle override|Patch Notes|(%s %s %s)}}', day, month, year))
end
local toc = '<div style="float:right;margin-left:1em;">__TOC__</div>'
if hc(a.notoc) then
toc = '__NOTOC__'
end
local ret = '__NOEDITSECTION__' .. tostring(div) .. cat .. toc
return ret
end
-- [[Template:DevBlog]]
function p.devblog(frame)
local a = frame:getParent().args
local blogtitle = dt(a.title, title.baseTitle)
local cat = ''
local div = mw.html.create('div')
:addClass('official devblog')
:done()
local link
if hc(a.link) then
if a.link == 'no' then
link = "''RuneScape'' website"
else
link = '[' .. a.link .. " ''RuneScape'' website]"
end
else
link = title.baseText
for i,v in pairs(repl_before) do
link = string.gsub(link, i, v)
end
link = mw.uri.encode(link)
for i,v in pairs(repl_after) do
link = string.gsub(link, i, v)
end
link = '[https://secure.runescape.com/m=rswiki/en/DevBlog:' .. link .. " ''RuneScape'' website]"
end
local date_link, day, month, year
if hc(a.date) then
day = lang:formatDate('j', a.date)
month = lang:formatDate('F', a.date)
year = lang:formatDate('Y', a.date)
date_link = '[[' .. day .. ' ' .. month .. ']] [[' .. year .. ']]'
else
date_link = '(missing date)'
end
local authorstr = ''
if hc(a.author) then
authorstr = "'''" .. a.author .. "'''"
else
authorstr = '(missing author)'
cat = cat .. '[[Category:Missing devblog author]]'
end
div:wikitext('This [[Developer Blogs|Developer Blog]] is copied verbatim from the ')
:tag('span')
:addClass('plainlinks')
:wikitext(link)
:done()
:wikitext('. It is copyrighted by [[Jagex]].')
:tag('br'):done()
:wikitext('It is written by ' .. authorstr .. ' and is dated ' .. date_link .. '.')
:done()
local div2 = mw.html.create('div')
:css({
['font-size'] = '150%',
background = 'transparent none repeat scroll 0 0',
['border-bottom'] = '1px solid #aaa',
['font-weight'] = 'normal',
['margin-bottom'] = '15px',
['padding-bottom'] = '0.17em',
['padding-top'] = '0.5em',
['text-align'] = 'center',
})
:wikitext(blogtitle)
:done()
-- cats only in update namespace
if title.namespace == 100 then
cat = '[[Category:Developer Blogs|' .. blogtitle .. ']]'
cat = cat .. get_time_categories(day, month, year)
else
cat = ''
end
local ret = '__NOTOC__ __NOEDITSECTION__' .. tostring(div) .. cat .. tostring(div2)
return ret
end
--[=[
--
-- CATEGORY FORMATTERS
--
--]=]
-- [[Category:28 November updates]] etc
function p.date_cat(frame)
local f = frame:getParent()
local d
if hc(f.args[1]) then
d = f.args[1]
else
-- assumes 2016 so that leap years work
d = string.gsub(title.text, ' ?updates?', '') .. ' 2016'
end
local ret = 'This category contains updates posted on ' .. lang:formatDate('[[j F]]', d) .. ', sorted chronologically.'
-- cats only in category namespace
if title.namespace == 14 then
--updates by day, sorted by hexmonth,day: B28 (28 November)
ret = ret .. '[[Category:Updates by day|' .. hexmonthconv[lang:formatDate('F', d)] .. lang:formatDate('d', d) .. ']]'
--updates by month, sorted by [space]day
ret = ret .. '[[Category:' .. lang:formatDate('F', d) .. ' updates| ' .. lang:formatDate('d', d) .. ']]'
end
return ret
end
-- [[Category:2015 updates]] etc
function p.year_cat(frame)
local f = frame:getParent()
local d
if hc(f.args[1]) then
d = f.args[1]
else
d = string.gsub(title.text, ' ?updates?', '')
end
local ret = 'This category contains updates posted in [[' .. d .. ']], sorted chronologically.'
-- cats only in category namespace
if title.namespace == 14 then
--updates by year, sorted by [space]year
ret = ret .. '[[Category:Updates by year| ' .. d .. ']]'
end
return ret
end
--[=[
--
-- DPL HANDLERS
--
--]=]
function p.datedpl(frame)
local a = frame:getParent().args
local year
local cat
local page = a['%TITLE%']
if hc(a.year) then
year = a.year
else
year = lang:formatDate('Y', a.date)
end
if hc(a.category) then
-- if it has category, {{Update}}
cat = category_info[cat_switch[string.gsub(string.lower(a.category), ' ?updates?', '')]][2]
elseif hc(a.qfc) then
-- if it has qfc, {{Patch Notes}}
cat = 'Patch Notes'
else
-- missing both probably means {{Antique update}}
cat = 'Antique update'
end
return string.format("'''%s''' – %s: [[Update:%s|%s]]",year,cat,page,page)
end
--TODO
--p.updatedpl
--p.patchnotesdpl
--etc
return p
--</nowiki>