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

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

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

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

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

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

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

Перечислите параметры через бэкслэш (\), начиная с того, который необходимо использовать после подстановки. Если параметр нужно оставить, даже если значение пусто, пометьте его звёздочкой (*). Если необходима сложная логика работы параметры, используйте тильду (~) после бэкслэша; например

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

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

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

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

local p = {} -- p stands for package

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

-- печатает 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 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)
				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 = ''
				
					for _, arr_elem in pairs(arr) do
						arr_elem = mw.text.trim(arr_elem)
						-- параметры, пачинающиеся с ~, содержат что-то вроде {{{smth|}}}, а не smth
						if arr_elem:sub(1,1) == '~' then
							value = value .. mw.text.trim(mw.ustring.sub(arr_elem, 2))
						else
							param = mw.text.trim(arr_elem)
							if template_args[param] then
								value = value .. mw.text.trim(template_args[param])
							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

	print_data (data, name_max_len)
	return res .. '}}'
end

return p