local p = {}
local yesno = require('Module:Yesno')
local medal = 'медаль'
local order = 'орден'
local insignia = 'знак отличия'
local badge = 'почётный знак'
local badge2 = 'почетный знак'
local title = 'звание' --почётное
local rank = 'звание' --воинское
local prize = 'премия'
local exampleTitle = '== Пример использования ==\n'
local namePlaceholder = 'Имя и фамилия'
local textPrefix = 'Шаблон предназначен для обозначения людей'
local typesTitle = '== Таблица шаблонов ==\n'
local _type = 'тип'
local note = 'примечание'
local function expand(frame, tname, targs)
return frame:expandTemplate({title = tname, args = targs})
end
local parameters = {
['имя'] = {['учёный'] = 'Имя', ['учёный'] = 'Имя', default = 'имя'},
['награды'] = {['ученый'] = 'Награды и премии', ['учёный'] = 'Награды и премии', ['персона'] = 'награды и премии', ['спортсмен'] = 'медали', default = 'награды' },
['звание'] = {default = 'звание'}
}
local function get_param_name(tname, pname)
if not parameters[pname] then
return pname
end
return parameters[pname][tname:lower()] or parameters[pname].default or pname
end
local function instead_of_link(link)
return ' Размещается вместо ссылки [[' .. link .. ']]'
end
local function in_param(frame, tname, pname)
return ' в частности, в графе ' .. expand(frame, 'para', {[1]=pname}) .. ' шаблона ' .. expand(frame, 'tl', {[1]=tname}) .. '.\n\n'
end
function repeat_whitespace(n)
local r = ''
for i = 1, n do
r = r .. ' '
end
return r
end
local function template_res_and_pre(frame, pageName, tname, paramName, paramTarget)
local templateResult = expand(frame, tname, {[paramTarget] = expand(frame, pageName), [paramName] = namePlaceholder})
local nameLen = mw.ustring.len(paramName)
local targetLen = mw.ustring.len(paramTarget)
local maxLen = math.max(nameLen, targetLen)
local pre = '<pre>\n{{' .. tname .. '\n|' .. paramName .. repeat_whitespace(3 + maxLen - nameLen) .. '= ' .. namePlaceholder .. '\n|' .. paramTarget .. repeat_whitespace(3 + maxLen - targetLen) .. '= {{' .. pageName .. '}}\n}}</pre>'
return templateResult .. '\n\n' .. pre
end
local function cat_link(cat)
return '[[:К:' .. cat .. '|' .. cat .. ']]'
end
local function format_categories(categories)
local cats = {}
for s in mw.ustring.gmatch(categories, '[^/]+') do
table.insert(cats, cat_link(s))
end
if #cats == 0 then
return ''
end
local ret = 'Шаблон автоматически добавляет статью в категори'
if #cats > 1 then
ret = ret ..'и'
else
ret = ret .. 'ю'
end
ret = ret .. ' ' .. mw.text.listToText(cats) .. '.'
return ret
end
local function quotate_default(st, quotes)
if quotes == nil or yesno(quotes) then
return '«' .. st .. '»'
end
return st
end
local function get_param_num(args, prefix)
local num = 0
while args[prefix .. tostring(num+1)] ~= nil do
num = num + 1
end
return num
end
local function types_table(frame, pageName, args)
local t = mw.html.create('table'):addClass('wide center')
local headers = t:tag('tr')
headers:tag('th'):wikitext('Код шаблона<br />(для копирования)')
headers:tag('th'):wikitext('Шаблоном отображается')
headers:tag('th'):wikitext('Примечание к отображаемому шаблоном')
local varCount = get_param_num(args, _type)
local defaultStr = t:tag('tr')
defaultStr:tag('td'):addClass('nowrap'):wikitext('{{' .. pageName .. '}}')
defaultStr:tag('td'):wikitext(expand(frame, pageName, {}))
defaultStr:tag('td'):wikitext(args[note .. '0'])
for i = 1, varCount do
local varStr = t:tag('tr')
local istr = tostring(i)
local var = args[_type .. istr]
varStr:tag('td'):addClass('nowrap'):wikitext('{{' .. pageName .. '|тип=' .. var .. '}}')
varStr:tag('td'):wikitext(expand(frame, pageName, {[_type]=var}))
varStr:tag('td'):wikitext(args[note .. istr])
end
return typesTitle .. tostring(t) .. '\n'
end
function p.award(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame)
local pageName = mw.title.getCurrentTitle().text
local tname = args['шаблон'] or 'Военный деятель'
local res = textPrefix
local awardType = args['тип'] or medal
local awardTypeText = ''
if awardType == order then
awardTypeText = ', награждённых орденом'
elseif awardType == medal then
awardTypeText = ', награждённых медалью'
elseif awardType == insignia then
awardTypeText = ', награждённых знаком отличия'
elseif awardType == badge or awardType == badge2 then
awardTypeText = ', награждённых почётным знаком'
elseif awardType == title then
awardTypeText = ' удостоенных звания'
elseif awardTypeText == prize then
awardTypeText = ' — лауреатов премии'
end
res = res .. awardTypeText
if not yesno(args['без названия']) then
local quotes = args['кавычки']
local titleString = args[1] or args['название'] or pageName
res = res .. ' ' .. quotate_default(titleString , quotes)
end
res = res .. '.'
local link = args[2] or args['ссылка'] or pageName
res = res .. instead_of_link(link) .. ';'
local paramAward = get_param_name(tname, 'награды')
res = res .. in_param(frame, tname, paramAward)
local categories = args['категория'] or args['категории']
if categories then
res = res .. format_categories(categories) .. '\n'
end
res = res .. exampleTitle
local paramName = get_param_name(tname, 'имя')
res = res .. template_res_and_pre(frame, pageName, tname, paramName, paramAward)
res = res .. '<br clear="all" />'
return res
end
function p.rank(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame)
local pageName = mw.title.getCurrentTitle().text
local rankNameDefault = mw.text.trim(mw.ustring.sub(pageName, (mw.ustring.find(pageName, ',', 1, true) or 0) +1))
local tname = args['шаблон'] or 'Военный деятель'
local res = textPrefix
local special = yesno(args['специальное'])
res = res .. ', носящих '
if special then
res = 'специальное '
end
local rankType = args['тип'] or 'звание'
res = res .. rankType .. ' '
local rankName = args[1] or args['звание'] or rankNameDefault
local quotes = args['кавычки']
res = res .. quotate_default(rankName, quotes) .. '.'
local link = args[2] or args['ссылка'] or mw.ustring.lower(rankNameDefault)
res = res .. instead_of_link(link) .. ';'
local paramRank = get_param_name(tname, 'звание')
res = res .. in_param(frame, tname, paramRank)
local categories = args['категория'] or args['категории']
if categories then
res = res .. format_categories(categories) .. '\n'
end
if get_param_num(args, _type) > 0 then
res = res .. types_table(frame, pageName, args)
end
res = res .. exampleTitle
local paramName = get_param_name(tname, 'имя')
res = res .. template_res_and_pre(frame, pageName, tname, paramName, paramRank)
res = res .. '<br clear="all" />'
return res
end
return p