Модуль:ФИО
Для документации этого модуля может быть создана страница Модуль:ФИО/doc
local get_args = require('Модуль:Arguments').getArgs
local mHatnote = require('Модуль:Hatnote')
local current_title_obj = mw.title.getCurrentTitle()
local p = {}
local hatnote_args = {
hide_disambig = true,
dot = true,
empty_list_message = 'Күпмәгънәлекнең чишү битләренең берсе дә табылмады',
preview_error = true
}
local templates = {
'[фФ]амилиядәшләр исемлеге',
'[аА]дашлар исемлеге',
'[тТ]улы адашлар исемлеге',
'[фФ]амилиядәшләр-адашлар исемлеге',
'[аА]дашлар-фамилиядәшләр исемлеге'
}
local disambig_box_names = {
'[бБ]ердәм мәгънәсезлек',
'[кК]үпмәгънәлек',
'[dD]isambig'
}
local disambig_box_params = {
'[фФ]амилияләр',
'[фФ]амилиядәшләр',
'[аА]дашлар',
'[фФ]амилиядәшләр-адашлар',
'[тТ]улы адашлар'
}
local tracking_categories = {
bad_link = 'Википедия:Битләр:ФИО калыпы белән:Гомуми бердәм мәгънәсезлекләргә сылтамалар белән',
no_links = 'Википедия:Битләр:ФИО калыпы белән:Сылтамасыз',
disambig_not_found = 'Википедия:Битләр:ФИО модуле белән:Башка мәкаләгә сылтама белән'
}
function is_surname_disambig(title)
local title_obj = mw.title.new(title)
if not title_obj.exists or mw.title.equals(title_obj, current_title_obj) then
return false
end
if title_obj.isRedirect then
title_obj = title_obj.redirectTarget
if not title_obj.exists or mw.title.equals(title_obj, current_title_obj) then
return false
end
end
local page_content = title_obj:getContent():gsub('<[^>]*>', '')
for i, template in ipairs(templates) do
if mw.ustring.match(page_content, '{{' .. template) then
return true
end
end
for i, name in ipairs(disambig_box_names) do
for j, param in ipairs(disambig_box_params) do
if mw.ustring.match(page_content, string.format('{{%s[^}]*%s', name, param)) then
return true
end
end
end
return false
end
function get_items(_title)
local title = mHatnote.remove_precision{_title}
local surname = title:match('^[^,]+')
local surname_with_name = title:match('^[^,]+,%s[^%s]+')
local full_name = title:match('^[^,]+,%s[^%s]+%s[^%s]+')
return {surname, surname_with_name, full_name}
end
function find_disambig(title, categories, check_nil, nocat)
local disambig_page
local without = mHatnote.remove_precision{title}
local with = without .. ' (мәгънәләр)'
if is_surname_disambig(title) then
disambig_page = title
elseif without ~= title and is_surname_disambig(without) then
disambig_page = without
elseif with ~= title and is_surname_disambig(with) then
disambig_page = with
elseif title ~= with and mHatnote.is_disambig{title} then
categories:add('bad_link', nocat)
disambig_page = title
elseif mw.title.new(with).exists then
categories:add('bad_link', nocat)
disambig_page = with
elseif without ~= title and mHatnote.is_disambig{without} then
categories:add('bad_link', nocat)
disambig_page = without
end
if not disambig_page and check_nil then
categories:add('disambig_not_found', nocat)
end
return disambig_page, without
end
p['ФИО'] = function (frame)
local args = get_args(frame)
local title = args.title or args[1] or current_title_obj.text
local categories = mHatnote.define_categories(tracking_categories)
local nocat = args.nocat
hatnote_args.prefix = 'Википедиядә андый фамилияле башка кешеләр турындагы мәкаләләр бар:'
hatnote_args.list_sep = '; '
hatnote_args.natural_join = false
hatnote_args.nocat = nocat
local lNum = 0
for i, v in ipairs(get_items(title)) do
link, label = find_disambig(v, categories, false, nocat)
if link and link ~= title and link ~= current_title_obj.text then
lNum = lNum + 1
hatnote_args[lNum], hatnote_args['l' .. lNum] = link, label
end
end
return mHatnote.main(hatnote_args, tracking_categories) .. categories
end
function template_by_type(frame, disambig_type, num)
return function (frame)
local args = get_args(frame)
local categories = mHatnote.define_categories(tracking_categories)
local nocat = args.nocat
local prefixes = mw.loadData('Модуль:Башка мәгънәләр/префикслар')
local prefix = prefixes[disambig_type]
if type(prefix) == 'table' then
if args[2] then
hatnote_args.prefix = prefix.plural
else
hatnote_args.prefix = prefix.singular
end
else
hatnote_args.prefix = prefix
end
hatnote_args.nocat = nocat
if not args[1] then
local link = get_items(current_title_obj.text)[num]
local found_disambig, auto_label = find_disambig(link, categories, true, nocat)
hatnote_args[1] = found_disambig or link
hatnote_args['l1'] = args['l1'] or auto_label
else
local i = 1
while args[i] do
local link, label = mHatnote.parse_link{args[i]}
if link then
local found_disambig, auto_label = find_disambig(link, categories, true, nocat)
hatnote_args[i] = found_disambig or link
hatnote_args['l' .. i] = label or args['l' .. i] or auto_label
else
hatnote_args[i] = args[i]
end
i = i + 1
end
end
return mHatnote.main(hatnote_args, tracking_categories) .. categories
end
end
p['фамилиядәшләр'] = template_by_type(frame, 'фамилия', 1)
p['фамилиядәшләр-адашлар'] = template_by_type(frame, 'исем һәм фамилия', 2)
p['тулы адашлар'] = template_by_type(frame, 'фио', 3)
return p