Модуль:Импортёр шаблона-карточки
Данный модуль помогает создавать импортёры шаблонов-карточек. Заготовка для копирования<includeonly>{{subst:#invoke:Импортёр шаблона-карточки|main | НАЗВАНИЕ = ''название используемой карточки'' | *имя \ Имя \ name \ Name | ... }}</includeonly><noinclude>{{doc-inline}} {{OnLua|Импортёр шаблона-карточки}} {{Импортёр шаблона-карточки|''название используемой карточки''}} {{doc-end}} [[Категория:Шаблоны-карточки:''категория'']] </noinclude> ИспользованиеПеречислите параметры стандартным образом на каждой строке, начинающейся с прямой черты Дополните через бэкслэш Для подстановки значений указывайте их после | *оригинал имени \~ {{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
|