Модуль: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