Модуль:Песочница/Алексей Ладынин

Это старая версия этой страницы, сохранённая Алексей Ладынин (обсуждение | вклад) в 16:51, 26 ноября 2023 (дополнение). Она может серьёзно отличаться от текущей версии.
Документация
--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