Модуль:Импортёр шаблона-карточки

Документация

Данный модуль помогает создавать импортёры шаблонов-карточек.

Заготовка для копирования

<includeonly>{{subst:#invoke:Импортёр шаблона-карточки|main
| НАЗВАНИЕ = ''название используемой карточки''
| *имя \ Имя \ name \ Name
| ...
}}</includeonly><noinclude>{{doc-inline}}
{{OnLua|Импортёр шаблона-карточки}}
{{Импортёр шаблона-карточки|''название используемой карточки''}}
{{doc-end}}

[[Категория:Шаблоны-карточки:''категория'']]
</noinclude>

Использование

Перечислите параметры стандартным образом на каждой строке, начинающейся с прямой черты | name. Если параметр нужно оставить, даже если значение пусто, пометьте его звёздочкой | *name.

Дополните через бэкслэш \, алиасы параметров или другие варианты на замену | *name \ alias1 \ alias2.

Для подстановки значений указывайте их после \~  в виде | name \ alias \~ Text, например:

| *оригинал имени \~ {{lang-en|{{{Имя на языке оригинала|{{{имя в оригинале|}}}}}}}}

Если необходима сложная логика работы подстановки значений, то также используйте тильду после бэкслэша, например:

| олимпиада \ олимпийские игры \~ {{{{{|safesubst:}}}#switch: {{{olimpics}}}| summer = летняя | winter = зимняя}}

Параметры-комментарии, начинающиеся с решётки (#), используются для разделения на группы с разным выравниванием, например:

| # название группы

Пример использования: Шаблон:Футбольный клуб/импортёр.

local p = {} -- p stands for package

-- следующие переменные глобально объявлять неправильно, но при передаче в функцию они не меняются
local res = '' -- вместо потока вывода
local data = {} -- массив вида {название параметра, его значение}
local name_max_len = 0 -- максимальная длина названия параметра в массиве data
local processed_params = {} -- для отслеживания уже обработанных параметров

-- печатает data в res, оформляя шириной name_max_len
function print_data ( )
	for _, v in pairs(data) do
		name = v[1]
		value = v[2]
		res = res .. '| ' .. name .. string.rep(' ', name_max_len-mw.ustring.len(name)) .. ' = ' .. value .. '\n'
	end
end

-- Добавляет универсальный параметр, если он не был обработан ранее
function add_auto_param(name, template_args)
	if not processed_params[name] and template_args[name] then
		if mw.ustring.len(name) > name_max_len then
			name_max_len = mw.ustring.len(name)
		end
		table.insert(data, {name, template_args[name]})
	end
end

function p.main( frame )
	importer_args = frame.args -- параметры импортёра (например, 1="имя \ name \~ {{#switch...}}")
	template_args = frame:getParent().args -- параметры конкретного включения (например, "имя=...")

	if importer_args['НАЗВАНИЕ'] then
		res = '{{' .. importer_args['НАЗВАНИЕ'] .. '\n' -- поле вывода
	else
		res = '{{УКАЖИТЕ НАЗВАНИЕ КАРТОЧКИ' .. '\n' -- ошибка
	end

	-- итерация по нумерованным параметрам карточки - вида *имя \ Имя \~ {{#switch...}}, например
	for k, str in pairs(importer_args) do
		if type(k) == 'number' then
			str = mw.text.trim(str)
			-- если строка начинается с <, то это комментарий с названием новой группы
			if str:sub(1,1) == '#' then
				print_data ()
				data = {}
				name_max_len = 0
				comment = mw.text.trim(mw.ustring.sub(str, 2))
				res = res .. '<!-- ' .. comment .. ' -->\n'
			else
				-- если строка начинается со *, то параметр обязательно присутствует, даже пустым
				if str:sub(1,1) == '*' then
					is_required = true
					str = mw.ustring.sub(str, 2)
				else
					is_required = false
				end
	
				-- итерация по фрагментам строки: например, smth, или ~ {{{smth|}}}
				arr = mw.text.split(str, '\\', true)
				if mw.text.trim(arr[1]) then -- непустое имя параметра
					name = mw.text.trim(arr[1])
					value = ''
					has_replacement = false
				
					for _, arr_elem in pairs(arr) do
						arr_elem = mw.text.trim(arr_elem)
						-- параметры, пачинающиеся с ~, содержат что-то вроде {{{smth|}}}, а не smth
						if arr_elem:sub(1,1) == '~' then
							has_replacement = true
							value = mw.text.trim(mw.ustring.sub(arr_elem, 2))
						else
							param = mw.text.trim(arr_elem)
							if template_args[param] and not has_replacement then
								value = value .. mw.text.trim(template_args[param])
								processed_params[param] = true  -- Отмечаем параметр как обработанный
							end
						end
					end
					
					-- "| параметр = <пусто>" выводится, только если строка начиналась со *
					if mw.ustring.len(value) > 0 or is_required then
						table.insert(data, {name, value})
						if mw.ustring.len(name) > name_max_len then
							name_max_len = mw.ustring.len(name)
						end
					end
				end
			end
		end
	end

	-- Добавляем автоматические параметры в конец, если они не были обработаны
	add_auto_param('from', template_args)
	add_auto_param('nocat', template_args)

	print_data()
	return res .. '}}'
end

return p