Модуль:Lua banner

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

Модуль реалізує роботу шаблону {{lua}}.

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

Докладні інструкції щодо використання у шаблонах див. у документаціі шаблону {{lua}}.

Використання у модулях Lua

Щоб скористатися модулем з іншого модуля Lua, насамперед треба його загрузити.

local mLuaBanner = require('Module:Lua banner')

Потім згенерувати бічну рамку за допомогою функції _main.

mLuaBanner._main(args)

Змінна args повинна бути таблицею із аргументами, що передаються модулю. Аргументи модуля та їх вплив на поведінку модуля див. у документації шаблону {{lua}}.

-- Цей модуль забезпечує роботу шаблону {{lua}}.

local yesno = require('Модуль:Yesno')
local mList = require('Модуль:List')
local mTableTools = require('Модуль:TableTools')
local mMessageBox = require('Модуль:Message box')

local p = {}

function p.main(frame)
	local origArgs = frame:getParent().args
	local args = {}
	for k, v in pairs(origArgs) do
		v = v:match('^%s*(.-)%s*$')
		if v ~= '' then
			args[k] = v
		end
	end
	return p._main(args)
end

function p._main(args)
	local modules = mTableTools.compressSparseArray(args)
	local box, is_module = p.renderBox(modules)								
	local trackingCategories = p.renderTrackingCategories(args, modules, "", is_module)
	return box .. trackingCategories
end

function p.renderBox(modules)
	local boxArgs = {}
	local is_module = true														-- містить значення чи це є модулем, стандартне значення true
	if #modules < 1 then
		boxArgs.text = '<strong class="error">Помилка: не вказано модулі</strong>'
	else
		local moduleLinks = {}
		for i, module in ipairs(modules) do
			local new_module, is_module = p.format_module(module)               --отримує нову назву модуля і булеве значення чи це є модулем
			if is_module then													-- якщо це модуль
				moduleLinks[i] = string.format('[[:%s]]', new_module)			--то вікіфікуємо
				local maybeSandbox = mw.title.new(new_module .. '/пісочниця')       --створюємо назву з суфіксом пісочниця
				if maybeSandbox and maybeSandbox.exists then					--перевіряємо чи існує така сторінка
					moduleLinks[i] = moduleLinks[i] .. string.format(' ([[:%s|пісочниця]])', maybeSandbox.fullText) -- якщо так, то додаємо в дужках пісочницю
				end
			else																-- якщо ні
				moduleLinks[i] = new_module										-- то передаємо назву помилки без вікіфікації
				is_module = false												-- та вказуємо, що це не модуль для додавання категорії в подальшому
			end	
		end
		local moduleList = mList.makeList('bulleted', moduleLinks)
		local title = mw.title.getCurrentTitle()								--отримуємо назву поточної сторінки
		if title.subpageText == "документація" then								--якщо це документація
			title = title.basePageTitle											--то передаємо назву основної сторінки
		end
		if title.contentModel == "Scribunto" then								
			boxArgs.text = 'Цей модуль залежить від наступних модулів:' .. moduleList -- якщо модуль
		else
			boxArgs.text = 'Цей шаблон використовує [[Lua]]:\n' .. moduleList	--якщо шаблон
		end
	end
	boxArgs.type = 'notice'
	boxArgs.small = true
	boxArgs.image = '[[Файл:Lua-logo-nolabel.svg|30px|alt=Лого Lua|link=Вікіпедія:Lua]]'
	return mMessageBox.main('mbox', boxArgs), is_module
end

--Функція для перевірки, що поданий модуль є модулем, та його оформлення
function p.format_module(module)
	local prefix, name = mw.ustring.match(module, "^(%a+)%s*:%s*(%a+[/:.-%s&nbsp;%a%d]*)$")		-- витягуємо префікс і назву з тексту параметра, якщо вони наявні
	if prefix and name then														-- якщо успіншо вдалося витягнути
		if prefix == "Модуль" or prefix == "Module" then						--перевіряємо чи префікс є модулем
			return prefix .. ':' .. name, true									-- якщо так, то об'єднуємо префікс і назву в одне ціле (бо поданий модуль може місти пробіли до і після двокрапки) та встановлюємо значення true, що це модуль
		end	
		
		return '<strong class="error">Помилка: вказано неправильний префікс «' .. prefix .. '»</strong>', false -- в іншому випадку формуємо помилку та встановлюємо значення false, що це не модуль
	end
	
	return 'Модуль:' .. module, true											-- якщо не успіншо вдалося витягнути дані, то вважаємо, що подали одразу назву модуля. TODO: може потрібно реалізувати перевірку на те, чи існує модуль з такою назвою.
end	

function p.renderTrackingCategories(args, modules, titleObj, is_module)
	if yesno(args.nocat) then
		return ''
	end
	
	local cats = {}
	
	-- Категорія для помилок
	if #modules < 1 or not is_module then
		cats[#cats + 1] = 'Шаблони Lua з помилками'
	end
	
	-- категорія Lua-шаблонів
	titleObj = titleObj or mw.title.getCurrentTitle()
	local subpageBlacklist = {
		doc = true,
		sandbox = true,
		sandbox2 = true,
		testcases = true,
		['документація'] = true,
		['Документація'] = true,
		['пісочниця'] = true,
		['тести'] = true,
		['чернетка'] = true
	}
	if not subpageBlacklist[titleObj.subpageText] then
		local protCatName
		if titleObj.namespace == 10 then
			local category = args.category
			if not category then
				local categories = {
					['Модуль:String'] = 'Шаблони, засновані на модулі String',
					['Module:String'] = 'Шаблони, засновані на модулі String',
					['Модуль:Math'] = 'Шаблони, засновані на модулі Math',
					['Module:Math'] = 'Шаблони, засновані на модулі Math',
					['Модуль:BaseConvert'] = 'Шаблони, засновані на модулі BaseConvert',
					['Module:BaseConvert'] = 'Шаблони, засновані на модулі BaseConvert',
					['Модуль:Citation'] = 'Шаблони, засновані на модулі Citation',
					['Module:Citation'] = 'Шаблони, засновані на модулі Citation',
					['Модуль:Wikidata'] = 'Шаблони, які використовують Вікідані',
					['Module:Wikidata'] = 'Шаблони, які використовують Вікідані'
				}
				categories['Модуль:Citation/CS1'] = categories['Модуль:Citation']
				category = modules[1] and categories[modules[1]]
				category = category or 'Шаблони, які використовують модулі Lua'
			end
			cats[#cats + 1] = category
			protCatName = "Шаблони, які використовують недостатньо захищені модулі Lua"
		elseif titleObj.namespace == 828 then
			protCatName = "Модулі, які залежать від недостатньо захищених модулів"
		end
		if not args.noprotcat and protCatName then
			local protLevels = {
				autoconfirmed = 1,
				sysop = 2
			}
			local currentProt
			if titleObj.id ~= 0 then
				-- id is 0 (page does not exist) if am previewing before creating a template.
				currentProt = titleObj.protectionLevels["edit"][1]
			end
			if currentProt == nil then currentProt = 0 else currentProt = protLevels[currentProt] end
			for i, module in ipairs(modules) do
				if module ~= "WP:libraryUtil" then
					local moduleTitle = mw.title.new(module)
					local moduleProt = moduleTitle and moduleTitle.protectionLevels["edit"][1]
					if moduleProt == nil then moduleProt = 0 else moduleProt = protLevels[moduleProt] end
					if moduleProt < currentProt then
						cats[#cats + 1] = protCatName
						break
					end
				end
			end
		end
	end
	
	for i, cat in ipairs(cats) do
		cats[i] = string.format('[[Категорія:%s]]', cat)
	end
	return table.concat(cats)
end

return p