Модуль:Категории качественных

Материал из Occultica

Для документации этого модуля может быть создана страница Модуль:Категории качественных/doc

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

local NS_CAT = mw.site.namespaces[14].name
local untyped = ': не распределённые по тематике'
local wrong = ' с неверным указанием тематики'
local alphabet = 'по алфавиту'
local no_wikidata = 'без отметки статуса в Викиданных'
 
local function concat_category_name(prefix, target)
	local res = NS_CAT .. ':' .. prefix
	if target then
		if mw.ustring.len(target) > 0 then
			return res .. ' ' .. target
		else
			return res .. wrong
		end
	else
		return res .. untyped
	end
end

local function get_submodule(args)
	local submodule_name = args['тип']
	if submodule_name == nil then
		error('Укажите тип (см. доступные [[Special:PrefixIndex/Module:Категории качественных/|здесь]])')
	end
	return require('Модуль:Категории качественных/' .. submodule_name)
end

function p.demo(frame)
	local args = getArgs(frame)
	local tt = require('Module:TableTools')
	local submodule = get_submodule(args)
	local t = mw.html.create('table'):addClass('standard')
	local tr = t:tag('tr')
	tr:tag('th'):wikitext('Название параметра')
	tr:tag('th'):wikitext('Соответствующая категория')
	local prefix = submodule.prefix
	function make_row(desc, cat)
		tr = t:tag('tr')
		tr:tag('td'):wikitext(desc)
		tr:tag('td'):wikitext('[[:' .. concat_category_name(prefix, cat) ..']]')
	end
	for k, v in tt.sortedPairs(submodule.types) do
		make_row(k, v)
	end
	make_row('Неверный параметр', '')
	make_row('Без параметров')
	return tostring(t)
end

local append = table.insert
local function join(x)
	return mw.text.listToText(x, '\n', '\n')
end

function p.cats(frame)
	local args = getArgs(frame)
	local yesno = require('Module:Yesno')
	local submodule = get_submodule(args)
	local function cat(v)
		local target = v and (submodule.types[mw.getContentLanguage():ucfirst(v)] or '')
		local catname = concat_category_name(submodule.prefix, target)
		if target == '' then 
			-- неправильное значение в качестве ключа сортировки для облегчения разбора
			local ret = '[[' .. catname .. '|' .. v .. ']]'
			if frame:preprocess('{{REVISIONID}}') == '' then
				return ret .. '<div class="hatnote" style="color:red"><strong>Предупреждение:</strong> Шаблон использует неизвестный параметр <code>' .. v .. '</code>. Список корректных параметров указан в [[' .. submodule.wrapper .. '|документации]] (это сообщение видно только при предпросмотре страницы).</div>'
			else
				return ret
			end
		else
			return '[[' .. catname .. ']]'
		end
	end
	local function cat_simple(v)
		return '[[' .. concat_category_name(submodule.prefix, v) .. ']]'
	end
	local ret = {}
	append(ret, cat_simple(alphabet))
	append(ret, cat(args[1]))
	if args[2] then
		append(ret, cat(args[2]))
		if args[3] then
			append(ret, cat(args[3]))
		end
	end
	if args['demo'] or args['демо'] then --для документации
		return frame:extensionTag('pre', join(ret))
	else
		local checkBadge = require('Module:Wikidata/littleutils').checkBadgeImpl
		if not checkBadge(submodule.badge) then
			append(ret, cat_simple(no_wikidata))
		end
		return join(ret)
	end
end

return p