Lapvédelem[mi ez?] • [dokumentáció: mutat, szerkeszt] • [tesztek: létrehozás]

Ez a sablon a lapvédelemmel kapcsolatos információkat kérdezi le. Ez minden lap esetén az első előfordulásnál költségesnek számít.

Függvények szerkesztés

  • p._testProtection(típus, szint, lap): Annak ellenőrzése, hogy a lap lap (ennek hiányában az aktuális lap) típus típusú (create, edit, move vagy upload) védelmi szintje szint (autoconfirmed, templateeditor, sysop vagy superprotect) szintű-e. A kimenete egy logikai érték.
    • p.testProtection(): wikiszövegből meghívható változat (1., 2., 3. névtelen paraméter (többféle más paraméternévvel) az előbbiek vagy 1. és 2. helyett param a {{védelem}}(?) paraméterértékeihez + igaz és hamis az igaz/hamis esetén visszaadandó értékhez, alapértelmezetten „true” és semmi)
  • p._figureProtection(lap): A {{védelem}}(?) sablon számára értelmezhető védelemtípus visszaadása (nem védett lapra nil) lap lapra, ennek hiányában az aktuális lapra nézve.
    • p.figureProtection(): wikiszövegből meghívható változat, bemenet nem lehet title objektum

A lap változó értéke wikiszövegből minden esetben a lap címe (vagy üres), Luából meghívva pedig title objektum, a lap címe (string) vagy a lap sorszáma (szám) lehet, egyéb típusú vagy üres stringből álló paraméterek esetén az aktuális lap címét használja.

local p = {}
local getArgs = require('Modul:Arguments').getArgs
local yesno = require('Modul:Yesno')

local protectedActions = {
	create = 'create',
	edit = 'edit',
	move = 'move',
	upload = 'upload'
}
local protectionLevelTypes = {
	autoconfirmed = 'autoconfirmed',
	edittrustedprotected = 'edittrustedprotected',
	templateeditor = 'templateeditor',
	sysop = 'sysop'
}
local protectionTemplateTexts = {
	['részleges'] = { 'edit', 'autoconfirmed' },
	['megerősített'] = { 'edit', 'edittrustedprotected' },
	['műszaki'] = { 'edit', 'templateeditor' },
	['teljes'] = { 'edit', 'sysop' },
	['átnevezés'] = { 'move', '*' },
	['létrehozás'] = { 'create', '*' }
}

local protectionDescriptions = {
	['részleges'] = {
		icon = 'Padlock-silver-medium.svg',
		icontext = 'félig',
		title = 'A %s szerkesztése nem bejelentkezett vagy frissen regisztrált szerkesztők számára jelenleg nem lehetséges',
		text = 'Amennyiben nem tudod, de mégis szeretnéd szerkeszteni a %s, úgy változtatásokat kérhetsz a vitalapján, [[Wikipédia:Adminisztrátorok üzenőfala|kérheted]] a védelem feloldását, vagy [[Speciális:Belépés|bejelentkezhetsz]].',
		replace = { title = {'gen'}, text = {'acc'} }
	},
	['műszaki'] = {
		icon = 'Padlock-pink.svg',
		icontext = 'műszaki',
		title = 'A %s szerkesztése jelenleg csak adminisztrátorok és sablonszerkesztők számára lehetséges',
		text = nil,
		replace = { title = {'gen'} }
	},
	['teljes'] = {
		icon = 'Padlock.svg',
		icontext = 'teljesen',
		title = 'Ez a %s teljesen [[:Kategória:Lapvédelem|védett]]',
		text = 'A %s kapcsolatos észrevételeidet a [[{{TALKPAGENAME}}|vitalapján]] várjuk; a védelem feloldását az [[Wikipédia:Adminisztrátorok üzenőfala|Adminisztrátorok üzenőfalán]] kérheted.',
		replace = { title = {'gen'}, text = {'inst'} }
	},
	['átnevezés'] = {
		icon = 'Padlock-olive.svg',
		icontext = 'átnevezés ellen',
		title = 'Ez a %s jelenleg átnevezés ellen [[:Kategória:Lapvédelem|védett]]',
		text = 'A %s szerkeszthető, de jelenleg nem átnevezhető. Észrevételeidet a [[{{TALKPAGENAME}}|vitalapján]] várjuk.',
		replace = { title = {'gen'}, text = {'gen'} }
	},
	['létrehozás'] = {
		icon = 'Padlock-skyblue.svg',
		icontext = 'létrehozás ellen',
		title = 'A %s létrehozása jelenleg nem [[:Kategória:Lapvédelem|engedélyezett]]',
		text = 'További információkért lásd a [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} törlési naplót]. A védelem feloldását az [[Wikipédia:Adminisztrátorok üzenőfala|Adminisztrátorok üzenőfalán]] kérheted.',
		replace = { title = {'gen'} }
	},
	['határozatlan'] = {
		icon = 'Padlock-red.svg',
		icontext = 'határozatlan időre',
		title = 'A %s határozatlan időre [[:Kategória:Lapvédelem|védett]]',
		text = 'A %s kapcsolatos észrevételeidet a [[{{TALKPAGENAME}}|vitalapján]] várjuk; a védelem feloldását az [[Wikipédia:Adminisztrátorok üzenőfala|Adminisztrátorok üzenőfalán]] kérheted.',
		replace = { title = {'gen'}, text = {'inst'} }
	}
}
local nameSpaceForms = {
	[ 0] = { gen = 'szócikk', acc = 'szócikket', inst = 'szócikkel' },
	[ 6] = { gen = 'fájl', acc = 'fájlt', inst = 'fájllal' },
	[10] = { gen = 'sablon', acc = 'sablont', inst = 'sablonnal' },
	[14] = { gen = 'kategória', acc = 'kategóriát', inst = 'kategóriával' },
	[-1] = { gen = 'lap', acc = 'lapot', inst = 'lappal' },
	[-2] = { gen = 'vitalap', acc = 'vitalapot', inst = 'vitalappal' }
}
local categoryNamespaces = {
	[  0] = 'szócikkek',
	[  2] = 'szerkesztőlapok',
	[  4] = 'Wikipédia-lapok',
	[  6] = 'fájlok',
	[ 10] = 'sablonok',
	[ 14] = 'kategóriák',
	[100] = 'portálok',
	[828] = 'modulok',
	[ -1] = 'lapok',
	[ -2] = 'vitalapok'
}

local function getProtectionTable(title)
	if type(title) == 'table' and type(title.protectionLevels) == 'table' then
		return title.protectionLevels
	elseif (type(title) == 'string' and title ~= '') or type(title) == 'number' then
		return mw.title.new(title).protectionLevels
	else
		return mw.title.getCurrentTitle().protectionLevels
	end
end

local function getCategories(level, expiry)
	local cats = {}
	local function addCat(cat)
		table.insert( cats, mw.ustring.format('[[Kategória:%s]]', cat) )
	end
	local maincat = {}
	if expiry then
		local lang = mw.language.getContentLanguage()
		if tonumber( lang:formatDate('U', expiry) ) < tonumber( lang:formatDate('U') ) then
			addCat('Hibásan használt védelemsablont tartalmazó lapok')
		end
		table.insert(maincat, 'Átmenetileg')
	else
		table.insert(maincat, 'Folyamatosan')
	end
	if level == 'részleges' then
		table.insert(maincat, 'félig védett')
	elseif level == 'műszaki' then
		table.insert(maincat, 'műszaki védettségű')
	elseif level == 'teljes' then
		table.insert(maincat, 'teljesen védett')
	elseif level == 'átnevezés' then
		table.insert(maincat, 'átnevezés ellen védett')
	else
		-- létrehozás, határozatlan: ??
	end
	local title = mw.title.getCurrentTitle()
	if categoryNamespaces[title.namespace] then
		table.insert(maincat, categoryNamespaces[title.namespace])
	else
		if title.isTalkPage then
			table.insert(maincat, categoryNamespaces[-2])
		else
			table.insert(maincat, categoryNamespaces[-1])
		end
	end
	addCat( table.concat(maincat, ' ') )
	return table.concat(cats)
end

function p._icon(level, expiry, options)
	if not level then
		return nil
	end
	local levelData = protectionDescriptions[level]
	if not levelData then
		return nil
	end
	options = options or {}
	local frame = mw.getCurrentFrame()
	options.icon = options.icon or levelData.icon
	local title = mw.title.getCurrentTitle()
	local nsForms = nameSpaceForms[title.namespace]
	if not nsForms then
		if title.isTalkPage then
			nsForms = nameSpaceForms[-2]
		else
			nsForms = nameSpaceForms[-1]
		end
	end
	local function format(str, data)
		for _, v in pairs(data) do
			str = str:gsub('%%s', nsForms[v], 1)
		end
		return str
	end
	local lang = mw.language.getContentLanguage()
	local expiryHumanReadable
	if expiry then
		if not pcall(function() expiry = lang:formatDate('Y-m-d', expiry, true) end) then
			expiry = nil
		end
		expiryHumanReadable = lang:formatDate('Y F j', expiry, true)
	end
	if not options.icontext then
		options.icontext = string.format(format('Ez a %s %s védett', {'gen'}), levelData.icontext)
		if options.small and expiry then
			options.icontext = options.icontext .. mw.ustring.format(' %s-ig', expiryHumanReadable)
		end
	end
	local fileLink = mw.ustring.format(
		'[[Fájl:%s|%s|%s]]',
		options.icon,
		options.small and '20px|link=Wikipédia:Lapvédelem' or '55px',
		options.icontext
	)
	local categories = (not options.demo and getCategories(level, expiry) or '')
	if options.small then
		return frame:extensionTag('indicator', fileLink, {name = 'protected'}) .. categories
	end
	if not options.title then
		options.title = format(levelData.title, levelData.replace.title)
	end
	if not options.text then
		options.text = ''
		if options.dispute then
			options.text = mw.ustring.format(
				"Ez a védelem '''nem''' jelenti az %s támogatását. ",
				level == 'átnevezés'
					and mw.ustring.format('[%s aktuális cím]', tostring( mw.uri.fullUrl( 'Speciális:Rendszernaplók', { type = 'move', page = tostring(title) } ) ) )
					or  mw.ustring.format('[%s aktuális verzió]', tostring( title:fullUrl('action=history') ) )
			)
		end
		options.text = options.text .. mw.ustring.format(
			'További információkért lásd a [[Wikipédia:Lapvédelem|lapvédelmi irányelveket]] és a [%s lapvédelmi naplót].',
			tostring( mw.uri.fullUrl( 'Speciális:Rendszernaplók', { type = 'protect', page = tostring(title) } ) )
		)
		if levelData.text then
			options.text = options.text .. ' ' .. frame:preprocess( format(levelData.text, levelData.replace.text) )
		end
	end
	local text = mw.ustring.format("'''%s'''<br />%s", options.title, options.text)
	local templateArgs = { type = 'lapvédelem', image = fileLink, text = text }
	local template = frame:expandTemplate{ title = 'ambox', args = templateArgs }
	return template .. categories
end

function p.icon(frame)
	local args = getArgs(frame)
	local level = args['típus'] or args['védelem'] or args.level
	local expiry = args['lejárat'] or args['lejár'] or args.expiry
	local options = {
		small = yesno(args.lakat or args.small or false),
		icon = args['kép'] or args.icon or nil,
		icontext = args['icon-text'] or args.icontext or nil,
		title = args['címsor'] or args.title or nil,
		text = args['szöveg'] or args.text or nil,
		dispute = yesno(args.dispute or false),
		demo = yesno(args.minta or args.demo)
	}
	return p._icon(level, expiry, options)
end

function p._testProtection(action, level, title)
	if not protectedActions[action] then
		action = 'edit'
	end
	if not protectionLevelTypes[level] then
		level = 'sysop'
	end
	local protectionLevels = getProtectionTable(title)
	return type(protectionLevels) == 'table'
		and type(protectionLevels[action]) == 'table'
		and protectionLevels[action][1] == level
end

function p.testProtection(frame)
	local args = getArgs(frame)
	local returns = {
		[true] = args.igaz or args['true'] or true,
		[false] = args.hamis or args['false'] or nil
	}
	local action = args['típus'] or args.action or args[1]
	local level = args.szint or args.level or args[2]
	if not (action and level) then
		if protectionTemplateTexts[args.param] then
			action, level = protectionTemplateTexts[args.param][1], protectionTemplateTexts[args.param][2]
		else
			return error('Modul:Lapvédelem: Nincs megadva érvényes tesztelendő paraméter/kombináció')
		end
	end
	local title = args.lap or args['cím'] or args.page or args.title or args[3]
	local test = p._testProtection(action, level, title)
	return returns[test]
end

function p._figureProtection(title)
	local function testProtectionLevel(protectionLevels, action, level)
		if protectionLevels[action] then
			if level == '*' then
				return true
			elseif protectionLevels[action] == level then
				return true
			end
		elseif action == '*' then
			for n, v in pairs(protectionLevels) do
				if v == level then
					return true
				end
			end
		end
		return false
	end
	local protectionLevels = getProtectionTable(title)
	-- use string/nil instead of tables
	for n, v in pairs(protectionLevels) do
		protectionLevels[n] = nil
		for m, w in pairs(v) do
			protectionLevels[n] = w
		end
	end
	local level
	for n, v in pairs(protectionTemplateTexts) do
		if testProtectionLevel(protectionLevels, v[1], v[2]) then
			level = n
			break
		end
	end
	return level
end

function p.figureProtection(frame)
	local args = getArgs(frame)
	local title = args.lap or args['cím'] or args.page or args.title or args[1]
	return p._figureProtection(title)
end

function p._autoTemplate(options)
	local level = p._figureProtection()
	if level then
		return p._icon(level, nil, options)
	else
		return nil
	end
end

function p.autoTemplate(frame)
	local args = getArgs(frame)
	local level = p.figureProtection(args)
	if level then
		args.level = level
		return p.icon(args)
	else
		return nil
	end
end

return p