Модуль:NameConvert (Bk;rl,&NameConvert)
Перейти к навигации
Перейти к поиску
Этот модуль оценён как бета-версия. Он готов для широкого применения, но должен применяться с осторожностью. |
Модуль предназначен для преобразования имени автора в библиографических ссылках
Функции
[править код]Функция преобразования строки «И. О. Фамилия» в формат «Фамилия И. О.»
{{#invoke:NameConvert|convert|<И.О. Фамилия>}}
Параметры
[править код]- первый неименованный параметр — строка
noprefix
— '0' или 'no' или 'false' отключает удаление префиксов фамилий (по умолчанию true)nolink
— '0' или 'no' или 'false' отключает удаление внутренних ссылок (по умолчанию true)
Примеры
[править код]{{#invoke:NameConvert|convert|А. Б. Иванов}}
→ Иванов А. Б.{{#invoke:NameConvert|convert|Ж. фон Иоганнес}}
→ Иоганнес Ж.{{#invoke:NameConvert|convert|Де Вито, Дэнни}}
→ Вито, Дэнни{{#invoke:NameConvert|convert|М. Робертес Карлос}}
→ Робертес Карлос М.{{#invoke:NameConvert|convert|Christopher L. Bennett}}
→ Bennett Christopher L.{{#invoke:NameConvert|convert|Уильям С.-мл. Берроуз}}
→ Берроуз Уильям С.-мл.
Могут быть случаи, когда есть и префикс фамилии и третье имя, тогда префикс оказывается не в начале строки, и он не удаляется.
{{#invoke:NameConvert|convert|L. Sprague De Camp}}
→ Sprague De Camp L.{{#invoke:NameConvert|convert|L. S. De Camp}}
→ Camp L. S.
В строках, содержащих запятые, удаляются только префиксы в начале строки:
{{#invoke:NameConvert|convert|Иванов, А. Б.}}
→ Иванов, А. Б.{{#invoke:NameConvert|convert|De Camp, L. Sprague}}
→ Camp, L. Sprague
Параметр noprefix=0
отключеает удаление префиксов фамилий:
{{#invoke:NameConvert|convert|Ж. фон Иоганнес|noprefix=0}}
→ фон Иоганнес Ж.
Параметр nolink=0
отключает удаление внутренних ссылок:
{{#invoke:NameConvert|convert|[[А. С. Пушкин]]}}
→ Пушкин А. С.{{#invoke:NameConvert|convert|[[А. С. Пушкин]]|nolink=0}}
→ Пушкин А. С.{{#invoke:NameConvert|convert|[[Пушкин, Александр Сергеевич|А. С. Пушкин]]}}
→ Пушкин А. С.{{#invoke:NameConvert|convert|[[Пушкин, Александр Сергеевич|А. С. Пушкин]]|nolink=0}}
→ Пушкин А. С.
local p = {}
--[[
Функция преобразования строки "И.О. Фамилия" в формат "Фамилия И.О."
Параметры: первый неименованный парметр - исходная строка
noprefix -- '0' или 'no' или 'false' отключает удаление префиксов фамилий
nolink -- '0' или 'no' или 'false' отключает удаление внутренних ссылок
]]
function p.convert( frame )
local source_str = frame.args[1] or '';
local name = mw.ustring.gsub( source_str, '^%[%[(.-)%]%]', '%1'); -- исключаем внутренние ссылки
local notstripped = name == source_str;
local leftpart = nil;
if not notstripped then
local parts = mw.text.split( name, '|', true ); -- разделяем строку
if #parts > 1 then
leftpart = parts[1];
name = parts[2];
end
end
local result = mw.ustring.gsub( name, '^([^,]+%.) ?([^%.]*)', '%2 %1' ); -- инициалы в конце
local prefix = {'[Фф]он', '[Дд]е', '[Дд]и', 'ван', '[Vv]on', '[Dd]e', '[Dd]i'}
local noprefix = frame.args['noprefix'] or true;
if type( noprefix ) == 'string' and (noprefix == 'false' or noprefix == 'no' or noprefix == '0') then
noprefix = false
end
if noprefix then
for i, pref in ipairs(prefix) do
result = mw.ustring.gsub(result, '^' .. pref .. ' ', ''); -- Убираем префиксы фамилий в начале
end
end
local nolink = frame.args['nolink'] or true;
if type( nolink ) == 'string' and (nolink == 'false' or nolink == 'no' or nolink == '0') then
nolink = false
end
if nolink or notstripped then
return result;
elseif leftpart ~= nil then
return '[[' .. leftpart .. '|'.. result .. ']]';
else
return '[[' .. result .. ']]';
end
end
return p