Module:Update: Skirtumas tarp puslapio versijų

Iš MCSlime.LT.
Pereiti į navigaciją Jump to search
Nėra keitimo santraukos
SNėra keitimo santraukos
 
412 eilutė: 412 eilutė:
    return 'Error: Missing required argument `%TITLE%`.'
    return 'Error: Missing required argument `%TITLE%`.'
end
end
local page = a['%TITLE%']
local year
local year
local cat
local cat
local page = a['%TITLE%']
if hc(a.year) then
if hc(a.year) then
year = a.year
year = a.year
421 eilutė: 423 eilutė:
end
end
-- Get current day and month from system
local current_day = tonumber(lang:formatDate('j'))      -- 12
local current_month = lang:formatDate('F')              -- April
--  Get day and month from the provided date
local entry_day = tonumber(lang:formatDate('j', a.date))
local entry_month = lang:formatDate('F', a.date)
--  Check if day and month match
if not (current_day == entry_day and current_month == entry_month) then
return ''  -- Don't display this entry
end
-- Set category type
if hc(a.category) then
if hc(a.category) then
    -- if it has category, {{Update}}
    local category_key = cat_switch[string.gsub(string.lower(a.category), ' ?updates?', '')]
    local category_key = cat_switch[string.gsub(string.lower(a.category), ' ?updates?', '')]
    if category_key then
    if category_key then
        cat = category_info[category_key][2]
        cat = category_info[category_key][2]
    else
    else
        -- If the category key doesn't exist, default to 'Patch Notes'
        cat = 'Patch Notes'
        cat = 'Patch Notes'
    end
    end
else
else
    -- missing both probably means {{Patch Notes}}
    cat = 'Patch Notes'
    cat = 'Patch Notes'
end
end


return string.format("'''%s''' – %s: [[%s|%s]]", year, cat, page, page)
return string.format("'''%s''' – %s: [[%s|%s]]",year,cat,page,page)
end
end



Dabartinė 13:26, 12 balandžio 2025 versija

Module documentation
This documentation is transcluded from Module:Update/doc. [edit] [history] [purge]
Module:Update's function datedpl is invoked by Šablonas:Date page dpl.
Module:Update requires Module:Array.
Module:Update requires Module:Ordinal.
Module:Update requires Module:Paramtest.
Module:Update requires Module:Top icons.
Module:Update transcludes Template:Parentitle override using frame:preprocess().
Module:Update is invoked by Template:Update.

This template displays an notification stating the update pages copyrighted by MCSlime.LT.

Usage[redaguoti vikitekstą]

This template can be used by entering the following onto a relevant update article.

{{Update|date=|<rev=>|category=|<link=>|<time=>}}

date[redaguoti vikitekstą]

This required parameter accepts the date. It should not be linked and can be in any format accepted by #time.

category[redaguoti vikitekstą]

This required parameter accepts the category of the update. This is generally at the top of the update article on the MCSlime website.

link[redaguoti vikitekstą]

The template will attempt to automatically generate the link to the MCSlime news article. This optional parameter can be used to provide the link to article on the MCSlime.LT website in the case where the template cannot automatically generate it.

rev[redaguoti vikitekstą]

This optional parameter accepts the revision date. MCSlime occasionally adds additional system updates and hot fixes to patch notes that have already been published. The date should not be linked and can be in any format accepted by #time.

time[redaguoti vikitekstą]

This optional parameter is meant for maintenance categorization of historical pre-osrs updates. This should not be used for updates after 10 August 2007

article[redaguoti vikitekstą]

Specify this parameter if the newspost title corresponds (almost) exactly with an article, and specify which article it should refer to. This will add a large notice at the top of the update page informing people that they are reading a transcript of the newspost.

Categories[redaguoti vikitekstą]

  • Behind the Scenes: bts, behind the scenes
  • Community: comm, community
  • Developers' Blog: dev, blog, devblog, dev blog
  • Events: event, events
  • Your Feedback: yourfeedback
  • Future Update: future
  • Mobile: mobile
  • Game Updates: game
  • Patch Notes: patch, patch notes, patch note
  • Shop: shop
  • Support: support
  • Technical: tech, technical
  • Website: site, ws, website

--<nowiki>

-- IMPORTS
local pt = require('Module:Paramtest')
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 = {
	['%('] = '',
	['%)'] = '',
	['%!'] = '',
}

-- replacements after calling encode
-- as lua patterns
local repl_after = {
	['%+'] = '-',
	['%%2C'] = '',
	['%%2F'] = '',
	['%%3F'] = '',
	['%%26%%2338%%3B'] = '',
	['%%E2%%80%%93'] = '',
	['%.'] = '',
	['%%26quot%%3B'] = '',
	['%%E2%%80%%99'] = '',
	['%%26%%2339%%3B'] = '',
	['%%C3%%B6'] = 'o',
	['%%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',
}

-- used by year func
local looporder = {
	{ 'November', 30 },
	{ 'October', 31 },
	{ 'September', 30 },
	{ 'August', 31 },
	{ 'July', 31 },
	{ 'June', 30},
	{ 'May', 31 },
	{ 'April', 30 },
	{ 'March', 31 },
	{ 'February', 29 },
	{ 'January', 31 },
	{ 'December', 31 }
}

-- 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'},
	game = {'Serverio restartas', 'Restartas'},
	future = {'Future Updates', 'Future update'},
	forum = {'forum'},
	mobile = {'Mobile updates', 'Mobile update'},
	shop = {'Shop updates', 'Shop update'},
	support = {'Support updates', 'Support'},
	technical = {'Technical updates', 'Technical'},
	website = {'Website updates', 'Website update'},
	yourfeedback = {'Your Feedback updates', 'Your Feedback'},
	forum = {'Forum post updates', 'Forum post'},
	competitions = {'Competition updates', 'Competitions'},
	['#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',
	devblog = 'devblog',
	['dev blogs'] = 'devblog',
	event = 'event',
	events = 'event',
	game = 'game',
	feedback= 'yourfeedback',
	forum = 'forum',
	future = 'future',
	mobile = 'mobile',
	shop = 'shop',
	cs = 'support',
	competitions = 'competitions',
	customer = 'support',
	['customer support'] = 'support',
	support = 'support',
	tech = 'technical',
	technical = 'technical',
	th = 'th',
	site = 'website',
	ws = 'website',
	website = 'website',
	yourfeedback= 'yourfeedback',
	['your feedback'] = 'yourfeedback',
	['#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)
	-- Historical or OSRS updates
	if tonumber(year) < 2008 then
		table.insert(ret, '[[Category:Historical updates]]')
		table.insert(external, 'rs')
		if tonumber(year) < 2004 or (tonumber(year) == 2004 and (hexmonthnr < 3 or (hexmonthnr == 3 and tonumber(day) <= 29))) then
			table.insert(external, 'rsc')
		end
	else
		table.insert(ret, '[[Category:Updates]]')
	end
	if #external then
		top_icons = require('Module:Top icons')._main
		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('update')
		:done()
		
	local link
	local url = a.link or a.url
	local postDateInfo
	
	if hc(url) then
		if url == 'no' then
			link = 'oficialus'
		else
			link = '[' .. url .. ' oficialus]'
		end
	else
		link = string.lower(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://wiki.mcslime.lt/' .. link .. ' oficialus pranešimas]'
		
	end
	
	local date_link, day, month, year
	if hc(a.date) then
	    day = lang:formatDate('d', a.date)        -- Day with leading zeros
	    month = lang:formatDate('m', a.date)      -- Month with leading zeros
	    year = lang:formatDate('Y', a.date)       -- Four-digit year
	    date_link = string.format('[[%s-%s-%s]]', year, month, day)  -- Format as yyyy-MM-dd
	else
	    date_link = '(nenurodyta)'  -- If no date is provided
	end
	
	if hc(a.rev) then
		date_link = date_link .. ' ir paskutinį kartą atnaujintas ' .. lang:formatDate('[[Y-m-d]]', a.rev)
	end
	
	if hc(a.author) then
		date_link = date_link .. ' by ' .. a.author
	end
	
	if url == 'no' then
		postDateInfo = 'Šis straipsnis buvo sukurtas ' .. date_link .. ', bet vėliau buvo panaikintas.'
	else
		postDateInfo = 'Šis straipsnis buvo sukurtas ' .. date_link .. '.'
	end
	
	-- Determine whether message is historical (pre-osrs), osrs.
	local message = ''
	local website = ''
	
	if hc(a.time) then
		--Historical updates
		if a.time == 'historical' then
			message = ' yra prieš paleidžiant <b>MCSlime</b> projektą '
			website = '[https://www.mcslime.lt/ <i>MCSlime.LT</i>]'
		end
	--OSRS updates	
	else
		message = ' ir priklauso MCSlime.LT projektui'
		website = ''
	end
	
	div:wikitext('Šis straipsnis yra ' .. link .. message)
		:tag('span')
			:addClass('plainlinks')
			:wikitext(website)
		:done()
		:wikitext('. Visos autorinės teisės priklauso [[MCSlime.LT]].')
		:tag('br'):done()
		:wikitext(postDateInfo)
	:done()
	
	local div2 = ''

	if hc(a.article) then
		div2 = mw.html.create('div')
			:addClass('update-redirect')
			:addClass('tile')
			-- css was previously at common.css but now here because it was unused
			:cssText('text-align:center;font-weight:bold;font-size:2em;line-height:1.5em;padding:1em;margin-left:auto;margin-right:auto;')
			: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'):cssText('margin-bottom:20%;')
			end
		end
	end
	
	local cat = ''
	-- cats only in update namespace
	if title.namespace == 112 then
		cat = '[[Category:' .. get_update_category(a.category) .. '|' .. title.text .. ']]'
		cat = cat .. get_time_categories(day, month, year)
	end
	
	local ret = '__NOTOC__ __NOEDITSECTION__' .. tostring(div2) .. tostring(div) .. cat
	
	return ret
end

-- [[Template:Patch Notes]] no links available as Patch Note Archive have been removed from MCSlime.LT's website
function p.patchnotes(frame)
	local a = frame:getParent().args
	local cat = ''
	
	local div = mw.html.create('div')
		:addClass('update')
		:done()
		
	local date_link
	local day, month, year = '', '', ''
	if hc(a.date) then
	    day = lang:formatDate('d', a.date)       -- Day with leading zeros
	    month = lang:formatDate('m', a.date)     -- Month with leading zeros
	    year = lang:formatDate('Y', a.date)      -- Four-digit year
	    date_link = string.format('[[%s-%s-%s]]', year, month, day)  -- Format as yyyy-MM-dd
	else
	    date_link = '(nenurodyta)'  -- If no date is provided
	end
	
	if hc(a.rev) then
		date_link = date_link .. ', ir paskutinį kartą atnaujintas ' .. lang:formatDate('[[Y-m-d]]', a.rev)
	end
	
	div:wikitext('These official [[Patch Notes]] are copied verbatim from the Patch Notes Archive which is no longer available. Visos autorinės teisės priklauso [[MCSlime.LT]].')
		:done()
		:tag('br'):done()
		:wikitext('Pranešimas buvo paskelbtas ' .. date_link .. '.')
	:done()
	
	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 ~= 112 then
		cat = ''
	end
	
	local ret = frame:getParent():preprocess(string.format('{{Parentitle override|Update:Patch Notes|(%s %s %s)}}', day, month, year)) .. '__NOEDITSECTION__' .. tostring(div) .. cat .. '<div style="float:right">__TOC__</div>'
	
	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


--[=[
-- 
-- DATE DPL HANDLERS
-- 
--]=]

function p.datedpl(frame)
	local a = frame:getParent().args
	if not a or not a['%TITLE%'] then
	    return 'Error: Missing required argument `%TITLE%`.'
	end

	local page = a['%TITLE%']
	local year
	local cat
	
	if hc(a.year) then
		year = a.year
	else
		year = lang:formatDate('Y', a.date)
	end
	
	-- Get current day and month from system
	local current_day = tonumber(lang:formatDate('j'))      -- 12
	local current_month = lang:formatDate('F')              -- April
	
	--  Get day and month from the provided date
	local entry_day = tonumber(lang:formatDate('j', a.date))
	local entry_month = lang:formatDate('F', a.date)

	--  Check if day and month match
	if not (current_day == entry_day and current_month == entry_month) then
		return ''  -- Don't display this entry
	end

	-- Set category type
	if hc(a.category) then
	    local category_key = cat_switch[string.gsub(string.lower(a.category), ' ?updates?', '')]
	    if category_key then
	        cat = category_info[category_key][2]
	    else
	        cat = 'Patch Notes'
	    end
	else
	    cat = 'Patch Notes'
	end

	return string.format("'''%s''' – %s: [[%s|%s]]", year, cat, page, page)
end


--[=[
-- 
-- YEAR DPL HANDLERS
-- 
--]=]

local function sortFunc(a,b)
	return a[2] < b[2]
end

local function lookup(cat)
	local r = mw.getCurrentFrame():preprocess(string.format([=[
{{#dpl:
|namespace=Update
|category=%s
|include={Update}:date,{Patch Notes}:date,{DevBlog}:date
|format=,¦UD¦%%PAGE%%@D@,,
|ordermethod=sortkey
}}
]=], cat))
	local ret = { }
	local keys = {}
	for v in mw.text.gsplit(r, '|UD|', true) do
		if v:find('@') then
			local u,_d = unpack(mw.text.split(v, '@D@'))
			u = mw.text.trim(u)
			u = string.sub(u, 8, -1)
			_d = mw.text.trim(_d)
			local y,m,d = unpack(mw.text.split(lang:formatDate('Y-F-j', _d), '-', true))
			y = tonumber(y)
			d = tonumber(d)
			if not ret[y] then
				ret[y] = {}
			end
			if not ret[y][m] then
				ret[y][m] = {}
			end
			if not ret[y][m][d] then
				ret[y][m][d] = {u}
			else
				table.insert(ret[y][m][d], u)
			end
		end
	end
	return ret
end

function p.year(frame)
	return p._year(frame:getParent().args)
end

function p._year(args)
	local year = args[1] or mw.title.getCurrentTitle().text
	local data = lookup(year..' updates')
	data = data[tonumber(year)]
	local gameUpdQ = mw.smw.ask{ '[[Category:' .. year .. ' updates]][[Category:Game updates]]', '?#-'}
	local gameUpdates = {}
	if gameUpdQ == nil then
		return '\n\'\'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]].\'\''
	end
	for _,v in ipairs(gameUpdQ) do
		table.insert(gameUpdates, v[1])
	end
	local ret = {'\'\'\'Note:\'\'\' Titles in bold indicate a [[Game updates|game update]].'}
	local data_m, data_d
	
	contains = require('Module:Array').contains
	ordinal = require('Module:Ordinal')._main
	
	for _,m in ipairs(looporder) do
		data_m = data[m[1]]
		if data_m then
			table.insert(ret, '\n\n=='..m[1]..'==')
			for d = m[2], 1, -1 do
				data_d = data_m[d]
				if data_d then
					table.sort(data_d)
					local patchDay = false
					local addedPatch = false
					local gameUpdDay = false
					local otherUpdDay = false
					local patchNote = 'Patch Notes (' .. d .. ' ' .. m[1] .. ' ' .. year .. ')'
					local patchLink = string.format('\'\'([[Update:%s|Patch Notes]])\'\'', patchNote)
					if ( contains(data_d, patchNote) ) then patchDay = true end
					for _,u in ipairs(data_d) do
						if( contains(gameUpdates, 'Update:' .. u) ) then
							gameUpdDay = true
						elseif( u ~= patchNote ) then
							otherUpdDay = true
						end
					end
					for _,u in ipairs(data_d) do
						if( contains(gameUpdates, 'Update:' .. u) ) then
							-- bold game updates
							local updBullet = string.format('\'\'\'[[Update:%s|%s]]\'\'\'', u, u)
							if (patchDay == true and addedPatch == false) then
								updBullet = updBullet .. ' ' .. patchLink
								addedPatch = true
							end
							table.insert(ret, string.format('\n* %s%s – %s', tostring(d), ordinal(d, {nosup = true, nonum = true}), updBullet))
						elseif( u ~= patchNote ) then
							-- add normal updates
							local updBullet = string.format('[[Update:%s|%s]]', u, u)
							if (patchDay == true and addedPatch == false and gameUpdDay == false) then
								updBullet = updBullet .. ' ' .. patchLink
								addedPatch = true
							end
							table.insert(ret, string.format('\n* %s%s – %s', tostring(d), ordinal(d, {nosup = true, nonum = true}), updBullet))
						elseif( u == patchNote and gameUpdDay == false and otherUpdDay == false ) then
							-- add patches as standalone updates
							local updBullet = string.format('\'\'([[Update:%s|Patch Notes]])\'\'', u)
							table.insert(ret, string.format('\n* %s%s – %s', tostring(d), ordinal(d, {nosup = true, nonum = true}), updBullet))
						end
					end
				end
			end
		end
	end
	return mw.text.trim(table.concat(ret, ''))
end

--TODO
--p.updatedpl
--p.patchnotesdpl
--etc

return p