Перейти до вмісту

Модуль:High-use

Матеріал з Вікіпедії — вільної енциклопедії.
{{i}} Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]

Впроваджує {{High-use}}. Використовує значення, що оновлюються ботом, з підсторінок Module:Transclusion_count/data/, коли наявні.

Використання

{{#invoke:High-use|main|1=кількість включень|2=сторінка обговорення або використання запису із +|all-pages=|info=|demo=|form=|expiry=}}

  • кількість включень: Перший параметр є статичним числом кількості включень шаблону або словом «risk» (без лапок), щоб відобразити текст «дуже великій кількості сторінок» замість справжнього значення. Значення цього параметра ігнорується, якщо наявні дані включень для цієї сторінки.
  • сторінка обговорення або використання запису із +: Другий параметр є перевантаженим. Якщо встановлено значення «yes» (без лапок), то кількість включень відобразиться як «## ###+» замість «близько ## ###». Коли використано цей метод запису, то округлення відбувається в меншу сторону замість округлення до найближчого числа відповідною кількістю значущих цифр. Коли вказано будь-яке інше не пусте значення, то буде замінено посилання, що веде на сторінку обговорення шаблону, на значення, яке вказане в параметрі (наприклад, 2=ВП:КТП вставить посилання на ВП:КТП),
  • |all-pages=yes: Також відображатиме відсоток скільки сторінок використовують шаблон від усієї кількості сторінок. Це повинно використовуватися лише для шаблонів з дуже великою кількістю включень, а відсоток відображуватиметься лише, якщо він більший за 1%.
  • |info=додаткова інформація: Коли вказано непусте значення, то вставляється додаткова інформація в текст шаблону, якщо шаблон має більше ніж 20 000 включень або вказано значення «risk» в параметрі 1.
  • |demo=Назва_шаблону: буде використовувати кількість включень для шаблону Шаблон:Назва_шаблону замість визначення назви шаблону зі сторінки, де використано цей модуль. Капіталізація має точно відповідати значенню, що вказано в Спеціальна:Покажчик за початком назви/Module:Transclusion_count/data/.
  • |form=: Коли встановлено значення «editnotice», то повідомлення відображається за використанням {{editnotice}} замість {{ombox}}.
  • |expiry=: Встановлює параметр |expiry= для {{editnotice}}.
  • |system=в системних повідомленнях: якщо його зазначити, то цей модуль виглядатиме як {{Використовується в системі}}.
  • |fetch=: якщо вказано false, то модуль не намагатиметься отримати дані включень з модуля Модуль:Transclusion count.

Інші функції

num
Створює текст і посилання на toolforge з приводу кількості включень.
risk
При виклику цієї функції, якщо передано risk в перший неназваний параметр або є вже більше ніж 100k включень, то вона поверне risk.
text
Повертає текст тіла цього шаблону, зі значенням кількості включень або nil.

{{#invoke:High-use|назва функції}}

require('strict')

local p = {}
local getArgs = require('Module:Arguments').getArgs

local _fetch = require('Module:Transclusion_count')._fetch -- _fetch looks at the 'demo' argument
local yesno = require('Module:Yesno')

local lang_obj = mw.getContentLanguage() -- this here because the language object is used multiple places in the module
local large_count_cutoff = 20000
local approx_num_total_pages = 5300000

local user_subpage_info_page = 'Вікіпедія:Підсторінки#Як створювати користувацькі підсторінки'
local sandbox_module_page = 'Модуль:Пісочниця'
local system_messages_cat = 'Сторінки, що використані в системних повідомленнях та потребують захисту'
local sandbox_word = 'пісочниця'
local testcases_word = 'тести'
local doc_word = 'документація'

local function count_from_args(args)
	if tonumber(args.count) then -- check if function has already been used
		return tonumber(args.count) -- early exit if so
	end
	
	local count
	
	if yesno(args['fetch']) ~= false then
		count = _fetch(args) -- fetch transclusion count
	end
	
	-- use explicitly-provided count when fetch fails
	if count == nil and args[1] ~= nil and args[1] ~= '' then
		-- convert local language number string to a number understandable by Lua
		count = mw.ustring.gsub(args[1], '+$', '')
		count = lang_obj:parseFormattedNumber(args[1])
	end
	
	-- in case someone writes a non-positive number
	if count and count > 0 then
		return count
	end
	
	return nil
end

-- Actions if there is a large (greater than or equal to 100,000) transclusion count
local function risk_boolean(args)
	if args.risk == true or args.risk == false then
		return args.risk
	elseif args[1]  == 'risk' then
		return true
	else
		local count = count_from_args(args)
		if count and count >= large_count_cutoff then
			return true
		end
	end
	return false
end

-- function retained for backwards compatibility
function p._risk(args)
	return risk_boolean(args) and 'risk' or ''
end

-- function retained for backwards compatibility
function p.risk(frame)
	return p._risk(getArgs(frame))
end

-- count and no_percent arguments retained for backwards compatibility
function p._num(args, count, no_percent)
	if count == nil then
		count = count_from_args(args)
	end
	args.count = count
	args.risk = risk_boolean(args)
	
	-- Build output string
	local return_value = ''
	if args.count == nil and args.risk then
		return 'дуже великій кількості сторінок'
	elseif args.count == nil then
		return 'багатьох сторінках'
	else
		-- Use 2 significant figures for smaller numbers and 3 for larger ones
		local sigfig = 2
		if args.count >= large_count_cutoff then
			sigfig = 3
		end
		
		-- Prepare to round to appropriate number of sigfigs
		local f = math.floor(math.log10(args.count)) - sigfig + 1
		
		-- Round and insert 'approximately' or '+' when appropriate
		if yesno(args[2]) == true or (type(args[1]) == 'string' and (mw.ustring.sub(args[1], -1) == '+')) then
			-- Round down
			return_value = string.format('%s+ сторінках', lang_obj:formatNum(math.floor( (args.count / 10^(f)) ) * (10^(f))) )
		else
			-- Round to nearest
			return_value = string.format('близько %s сторінках', lang_obj:formatNum(math.floor( (args.count / 10^(f)) + 0.5) * (10^(f))) )
		end
		
		-- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
		no_percent = yesno(no_percent or args['no-percent'])
		if args.count and args.count >= approx_num_total_pages/100 and not no_percent then
			local num_total_pages = mw.getCurrentFrame():callParserFunction('NUMBEROFPAGES', 'R')
			local total_percent = math.floor( ( ( args.count/num_total_pages ) * 100) + 0.5)
			
			if total_percent >= 1 then
				return_value = string.format('%s або близько %s%% всіх сторінок', return_value, total_percent)
			end
		end	
	end
	
	return return_value
end

-- used by [[Template:Stub documentation]] and other pages
-- count argument retained for backwards compatibility
function p.num(frame, count)
	return p._num(getArgs(frame), count)
end

-- count argument retained for backwards compatibility
function p._text(args, count)
	--[=[
		Only show the information about how this template gets updated
		if someone is actually editing the page and maybe trying to update the count.
	]=]
	local bot_text = (mw.getCurrentFrame():preprocess('{{REVISIONID}}') == '') and ("\n\n----\n'''Повідомлення попереднього перегляду''':" .. ' Лічильник кількості включення оновлюється автоматично ([[Шаблон:Часте використання/документація#Технічні подробиці|див. документацію]]).') or ''
	
	if count == nil then
		count = count_from_args(args)
	end
	args.count = count
	args.risk = risk_boolean(args)
	
	-- trim /doc, /sandbox and /testcases
	local title = args.title or (args.demo and args.demo ~= '' and mw.title.new(args.demo, 'Template')) or mw.title.getCurrentTitle()
	if title.subpageText == doc_word or title.subpageText == sandbox_word or title.subpageText == testcases_word then
		title = title.basePageTitle
	end
	
	-- use /testcases of base template
	local testcases_page = mw.title.new(title.prefixedText .. '/' .. testcases_word)
	-- exists is expensive
	while testcases_page.basePageTitle.isSubpage and not testcases_page.exists do
		testcases_page = mw.title.new(testcases_page.basePageTitle.basePageTitle.prefixedText .. '/' .. testcases_word)
	end
	
	local systemMessages = (args['system'] or '') ~= ''
	
	-- This retrieves the project URL automatically to simplify localization.
	local templateCount = ('на [https://linkcount.toolforge.org/?project=%s&page=%s#transclusions %s]'):format(
		title:fullUrl():gsub('//(.-)/.*', '%1'),
		mw.uri.encode(title.fullText), p._num(args))
	local used_on_text = "'''Цей " .. (title:inNamespace('Module') and 'модуль Lua' or 'шаблон') .. ' використовується '
	if systemMessages then
		used_on_text = used_on_text .. args['system'] ..
			((args.count and args.count > 2000) and ("''', and " .. templateCount) or ("'''"))
	else
		used_on_text = used_on_text .. templateCount .. "'''"
	end
	
	local sandbox_text = ('підсторінках [[%s/пісочниця|/пісочниці]] та [[%s|/тестів]] цього %s, або у ваш%s [[%s]]'):format(
		title.fullText,
		testcases_page.fullText,
		title:inNamespace('Module') and 'модуля' or 'шаблону',
		title:inNamespace('Module') and "ій" or "ому",
		title:inNamespace('Module') and (sandbox_module_page .. '|пісочниці модуля') or (user_subpage_info_page .. '|особистому просторі')
	)
	
	local infoArg = args['info'] ~= '' and args['info']
	if (systemMessages or args.risk) then
		local info = '.'
		if systemMessages then
			info = info .. '<br />Його зміни можуть призвести до миттєвих змін у користувацькому інтерфейсі ' .. mw.site.namespaces.Project.name .. '.'
		end
		if infoArg then
			info = info .. '<br />' .. infoArg
		end
		sandbox_text = info .. '<br /> Для уникнення великомасштабних збоїв' ..
			(args.count and args.count >= large_count_cutoff and ' та непотрібного навантаження на сервер' or '') .. -- should this use args.risk?
			', будь-які зміни спочатку потрібно перевірити на ' .. sandbox_text ..
			'. Потім перевірені зміни можуть бути впроваджені на цій сторінці єдиним редагуванням. '
	else
		sandbox_text = (infoArg and ('.<br />' .. infoArg .. ' Й') or ' і й') ..
			'ого зміни будуть дуже помітними. Будь ласка, перевіряйте будь-які зміни на ' .. sandbox_text
	end
	
--	local discussion_text = systemMessages and 'Будь ласка, обговорюйте будь-які зміни ' or ', та зважайте на обговорення змін ' (реалізація англ. вікі)
	local discussion_text = (systemMessages or args.risk) and 'Будь ласка, обговорюйте будь-які зміни ' or ', та зважайте на обговорення змін '
	if args[2] ~= nil and args[2] ~= '' and yesno(args[2]) == nil then
		discussion_text = string.format('%sна [[%s]]', discussion_text, args[2])
	else
		discussion_text = string.format('%sна [[%s|сторінці обговорення]]', discussion_text, title.talkPageTitle.fullText)
	end
	
	return used_on_text .. sandbox_text .. discussion_text .. ' перед їхнім впровадженням.' .. bot_text
end

-- used by [[Template:R from high-use template]]
-- count argument retained for backwards compatibility
function p.text(frame, count)
	return p._text(getArgs(frame), count)
end

-- nocat argument retained for backwards compatibility
function p._main(args, nocat)
	args.count = count_from_args(args)
	args.risk = risk_boolean(args)
	args.title = (args.demo and args.demo ~= '' and mw.title.new(args.demo, 'Template')) or mw.title.getCurrentTitle()
	
	local image = 'Ambox warning yellow.svg'
	local type_param = 'style'
	local epilogue = ''
	
	if args['system'] and args['system'] ~= '' then
		image = 'Ambox important.svg'
		type_param = 'content'
		if yesno(nocat or args['nocat']) ~= true and not args.title.isRedirect then
			local protection_action = (args.title:inNamespace('File') and 'upload') or 'edit'
			local protection_level = require('Module:Effective protection level')._main(protection_action, args.title.fullText)
			
			if protection_level ~= 'sysop' and protection_level ~= 'interfaceadmin' then
				epilogue = mw.getCurrentFrame():expandTemplate {
					title = 'sandbox other',
					args = {
						[2] = '[[Category:' .. system_messages_cat .. ']]'
					}
				}
			end
		end
	elseif args.risk then
		image = 'Ambox warning orange.svg'
		type_param = 'content'
	end
	
	image = '[[File:' .. image .. '|40px|alt=Увага|link=]]'
	if args['form'] == 'editnotice' then
		return mw.getCurrentFrame():expandTemplate{
				title = 'editnotice',
				args = {
						['image'] = image,
						['text'] = p._text(args),
						['expiry'] = (args['expiry'] or '')
				}
		} .. epilogue
	else
		return require('Module:Message box').main('ombox', {
			type = type_param,
			image = image,
			text = p._text(args),
			expiry = (args['expiry'] or '')
		}) .. epilogue
	end
end

function p.main(frame)
	return p._main(getArgs(frame))
end

return p