Документация
--hello, World
local getArgs = require('Module:Arguments').getArgs
local p = {}
local specialCase = {}
local givenNoName = {}
local givenNoArgs = {}
--Список допустимых частей имени и их порядок по умолчанию для общего случая
local possiblePartsOfName = {
'имя',
'среднее имя',
'средние имена',
'отчество',
'фамилия',
'вторая фамилия',
}
--Таблица частных случаев, когда аргументы заданы, но нужна особая формулировка или трактовка аргументов
local specialCases = {
-- ['испанское'] = 'spanish',
['азербайджанское'] = 'azerbaijani',
['казахское'] = 'kazakh'
}
--Таблица случаев, когда задана только национальная характеристика.
local noNamesGiven = {
['азербайджанское'] = 'azerbaijani',
['казахское'] = 'kazakh'
}
--Таблица случаев, когда аргументы не заданы
local noArgsGiven = {
['Q227'] = {'azerbaijan', 1920},
['Q15180Q227'] = {'azerbaijan', 1920}
}
local function makeInvokeFunc(funcName)
return function (frame)
local args = getArgs(frame)
return p[funcName](args)
end
end
p.func1 = makeInvokeFunc('_func1')
function p._func1(args)
end
p.func2 = makeInvokeFunc('_func2')
function p._func2(args)
return choose (args)..debugging()
end
--ЭТО РАСПРНДЕЛЯЮЩАЯ ФУНКЦИЯ.
--Если части имени заданы и случай не входит в число особых, она вызывает фунцию generalCase. Если случай особый, перечисленный в таблице specialCases, то вызывается соответствующая функция. Если части имени не заданы, то из Викиданых запрашиваются код страны и дата рождения и на основании их по таблице noNameGiven может быть вызвана функция группы givenNoName.
function choose (args)
local numArgs, numParts = 0, 0
local givenNation = args [1] or ''
local names = {}
for i, k in pairs (args) do numArgs = numArgs + 1 end
for i, part in ipairs (possiblePartsOfName) do
if (args [part]) then numParts = numParts + 1 ; names [part] = args [part] end
end
if (givenNation ~= '' and (numArgs >= 2) and specialCases [givenNation]) then
return specialCase [specialCases [givenNation]] (args) or ''
elseif (numParts > 0) then
return generalCase (names, givenNation)
elseif (givenNation ~= '' and (numArgs < 2) and noNameGiven[givenNation]) then
return givenNoName [noNameGiven[givenNation]] () or ''
elseif (numArgs == 0) then
local countryCode, birth = '', 0
local entity = mw.wikibase.getEntity ()
if (entity and entity.claims and entity.claims.P27) then
for j, k in ipairs (entity.claims.P27) do
if (k.mainsnak and k.mainsnak.datavalue and k.mainsnak.datavalue.value and k.mainsnak.datavalue.value.id) then
countryCode =countryCode .. k.mainsnak.datavalue.value.id
end
end
if (entity.claims.P569 and entity.claims.P569 [1] and entity.claims.P569 [1].mainsnak and entity.claims.P569 [1].mainsnak.datavalue and entity.claims.P569 [1].mainsnak.datavalue.value and entity.claims.P569 [1].mainsnak.datavalue.value['time']) then
birth = tonumber(mw.ustring.match(entity.claims.P569 [1].mainsnak.datavalue.value['time'] ,'[%d]+')) or 0
end
end
if(countryCode ~= '' and birth ~= 0 and noArgsGiven[countryCode] and noArgsGiven[countryCode][1] and noArgsGiven[countryCode][2] and (noArgsGiven[countryCode][2] < birth)) then
return givenNoArgs[noArgsGiven[countryCode][1]]() or ''
else
return ''
end
else
return ''
end
end
--ЭТО ФУНКЦИЯ ДЛЯ ОБЩЕГО СЛУЧАЯ
function generalCase (names, givenNation)
local name = {}
local j = 0
for i, part in ipairs (possiblePartsOfName) do
if (names[part]) then
j = j + 1; name[j] = names[part] .. ' — ' .. part
if ( part == 'имя') then name[j] = names[part] .. ' — личное имя' end
if (part == 'фамилия' and names['вторая фамилия']) then name[j] = names[part] .. ' — первая (основная) фамилия' end
end
end
if (#name == 2 and names['имя'] and names ['фамилия']) then local temp = name[1]; name[1] = name[2]; name[2] = temp end
local n = ''
j = 0
while j < #name do
j = j + 1
if (j > 1) then n = n .. ', ' end
if (j == #name and j > 1 and j <= 3 ) then n = n .. 'а 'end
n = n .. name[j]
end
if (n ~= '') then return 'Здесь '.. n .. ' этого человека'.. seeMoreAbout(givenNation) .. '.'end
return ''
end
function specialCase.lithuanian (args)
if (args[2] and args[3]) then return 'Здесь ' .. args[2] .. ' — женская форма фамилии ' .. args[3] .. '; см [[Литовское имя]]' end
if (args[2]) then return 'Здесь ' .. getNameFromTitleBeforeComma () .. ' — женская форма фамилии ' .. args[2] .. '; см [[Литовское имя]]' else return '' end end
function specialCase.azerbaijani (args)
if (not args['отчество'] and args[2]) then args['отчество'] = args[2] end
return generalCase (args, args[1])
end
function specialCase.kazakh (args)
if (not args['отчество'] and args[2]) then args['отчество'] = args[2] end
return generalCase (args, args[1])
end
--ФУНКЦИИ ДЛЯ СЛУЧАЕВ, КОГДА ЗАДАНА ТОЛЬКО НАЦИОНАЛЬНАЯ ХАРАКТЕРИСТИКА
function givenNoName.kazakhstan () --Казахское
local pat, text
local ac = getNameFromTitleAfterComma ()
pat = mw.ustring.match (ac,'^[А-ЯЁ][а-яё][а-яё]+ ([А-ЯЁ][а-яё][а-яё]+улы)$') or mw.ustring.match (ac,'^[А-ЯЁ][а-яё][а-яё]+ ([А-ЯЁ][а-яё][а-яё]+кызы)$')
if (pat) then text = generalCase ({['отчество'] = pat}, 'казахское') end
return text or ''
end
function givenNoName.azerbaijani () --Азербайджанское
local pat, text
local bc = getNameFromTitleBeforeComma ()
local ac = getNameFromTitleAfterComma ()
if (mw.ustring.match (bc,'^[А-ЯЁ][а-яё][а-яё]+[ое]ва?$') or mw.ustring.match (bc,'^[А-ЯЁ][а-яё][а-яё]+л[ыи]$')or mw.ustring.match (bc,'^[А-ЯЁ][а-яё][а-яё]+заде$')) then
pat = mw.ustring.match (ac,'^[А-ЯЁ][а-яё][а-яё]+ ([А-ЯЁ][а-яё][а-яё]+ огл[ыу])$') or mw.ustring.match (ac,'^[А-ЯЁ][а-яё][а-яё]+ ([А-ЯЁ][а-яё][а-яё]+ кызы)$')
if (not pat and mw.ustring.match (ac, '^[А-ЯЁ][а-яё][а-яё]+$') )then
local fn = getFullNameFromText ()
pat = mw.ustring.match (fn, '^'..ac..' ([А-ЯЁ][а-яё][а-яё]+ огл[ыу]) '..bc..'$') or mw.ustring.match (fn, '^'..ac..' ([А-ЯЁ][а-яё][а-яё]+ кызы) '..bc..'$') or ''
end
end
if (pat) then text = generalCase ({['отчество'] = pat}, 'азербайджанское') end
return text or ''
end
--ФУНКЦИИ ДЛЯ СЛУЧАЕВ, КОГДА АРГУМЕНТЫ НЕ ЗАДАНЫ
function givenNoArgs.azerbaijan () --Азербайджан
local pat, text
local bc = getNameFromTitleBeforeComma ()
local ac = getNameFromTitleAfterComma ()
local fn = getFullNameFromText ()
if (mw.ustring.match (bc,'^[А-ЯЁ][а-яё][а-яё]+[ое]ва?$') or mw.ustring.match (bc,'^[А-ЯЁ][а-яё][а-яё]+л[ыи]$')or mw.ustring.match (bc,'^[А-ЯЁ][а-яё][а-яё]+заде$')) then
pat = mw.ustring.match (ac,'^[А-ЯЁ][а-яё][а-яё]+ ([А-ЯЁ][а-яё][а-яё]+ огл[ыу])$') or mw.ustring.match (ac,'^[А-ЯЁ][а-яё][а-яё]+ ([А-ЯЁ][а-яё][а-яё]+ кызы)$')
if (not pat and mw.ustring.match (ac, '^[А-ЯЁ][а-яё][а-яё]+$') )then
pat = mw.ustring.match (fn, '^'..ac..' ([А-ЯЁ][а-яё][а-яё]+ огл[ыу]) '..bc..'$') or mw.ustring.match (fn, '^'..ac..' ([А-ЯЁ][а-яё][а-яё]+ кызы) '..bc..'$') or ''
end
end
if (pat) then text = 'Здесь ' .. pat ..' — отчество этого человека; см [[Тюркское отчество]].' end
return text or ''
end
--ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
function debugging () return '\n\nDEBUGGING\n\n' .. 'getNameFromTitleBeforeComma'.. getNameFromTitleBeforeComma ()..'getNameFromTitleAfterComma'.. getNameFromTitleAfterComma ()..'getNameFromTitleIfNoComma'.. getNameFromTitleIfNoComma ()..'givenNoName.azerbaijani'..givenNoName.azerbaijani () ..'getFullNameFromText'..getFullNameFromText ()..'givenNoArgs.azerbaijan ()'..givenNoArgs.azerbaijan () end
function seeMoreAbout (givenNation)
if (givenNation and not (givenNation == '')) then
local title = mw.title.new(givenNation .. ' имя')
if(title.exists) then return '; см. [[' .. title.text .. ']]' end
end
return ''
end
function getNameFromTitleBeforeComma ()
local titles = mw.title.getCurrentTitle ()
local title = titles.text
title = mw.ustring.gsub (title, ' %(.+$', '')
return mw.ustring.match (title, '(.+), ') or ''
end
function getNameFromTitleAfterComma ()
local titles = mw.title.getCurrentTitle ()
local title = titles.text
title = mw.ustring.gsub (title, ' %(.+$', '')
return mw.ustring.match (title, ', (.+)') or ''
end
function getNameFromTitleIfNoComma ()
local titles = mw.title.getCurrentTitle ()
local title = titles.text
title = mw.ustring.gsub (title, ' %(.+$', '')
if (mw.ustring.match(title, ',')) then title = '' end
return title or ''
end
function getFullNameFromText () -- кавыч. сноски, скобки, поле полн. имя
local titles = mw.title.getCurrentTitle ()--new('Дос Сантос, Джовани')
local text = titles:getContent(); text = mw.ustring.gsub (text, '́', '')
local title = titles.text
local titleone = mw.ustring.match (title, '[А-ЯЁ]([А-Яа-яЁё]+)')
local titletwo = mw.ustring.match (title, ' ([А-ЯЁ][А-Яа-яЁё]*)')
local fullname =mw.ustring.match (text, '\'\'\'([А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*'.. titletwo .. '%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]' ..titleone.. '%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*)\'\'\'') or mw.ustring.match (text, '\'\'\'([А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]'.. titleone .. '%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*' ..titletwo.. '%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*%s*[А-Яа-яЁё]*)\'\'\'')
return fullname or ''
end
return p