モジュール:Публикация

local s = {}
function s.parts(p)
-- Запись параметров вызова в массив. Формат индексов: "массив'параметр'номер части/заглавия/автора", например: "ws'wsource'2" (p.args9) это "часть2 викитека".
	local ws = {
		wsource		= {p.args1, p.args9,  p.args17, p.args25, p.args33},	-- викитека / часть№ викитека
		wSource		= {p.args2, p.args10, p.args18, p.args26, p.args34},	-- Викитека / часть№ Викитека
		}
	local h  = {
		title		= {p.args3, p.args11, p.args19, p.args27, p.args35},	-- заглавие№	/ часть№
		link		= {p.args4, p.args12, p.args20, p.args28, p.args36},	-- ссылка 	  	/ часть№ ссылка
		arcdate		= {p.args5, p.args13, p.args21, p.args29, p.args37},	-- архив дата 	/ часть№ архив дата
		arclink		= {p.args6, p.args14, p.args22, p.args30, p.args38}, 	-- архив 	  	/ часть№ архив
		utitle		= {p.args7, p.args15, p.args23, p.args31, p.args39},	-- подзаголовок / часть№ подзаголовок
		info		= {p.args8, p.args16, p.args24, p.args32, p.args40},	-- инфо  		/ часть№ инфо
		lang		= p.args42,													-- язык  		/ часть язык
		lang_		= p.args43,													-- -язык 		/ -часть язык
		material	= p.args41,													-- материал 	/ часть материал
		}
	local oh = {
		title		= {p.args44, p.args50, p.args56, p.args62, p.args68},	-- оригинал 		/ часть№ оригинал
		link		= {p.args45, p.args51, p.args57, p.args63, p.args69},	-- оригинал ссылка  / часть№ оригинал ссылка
		arcdate		= {p.args46, p.args52, p.args58, p.args64, p.args70},	-- архив дата 		/ часть№ оригинал архив дата
		arclink		= {p.args47, p.args53, p.args59, p.args65, p.args71},	-- оригинал архив 	/ часть№ оригинал архив
		utitle		= {p.args48, p.args54, p.args60, p.args66, p.args72},	-- оригинал подзаголовок / часть№ оригинал подзаголовок
		info		= {p.args49, p.args55, p.args61, p.args67, p.args73},	-- оригинал инфо 	/ часть№ оригинал инфо
		lang		= p.args74,													-- оригинал язык 	/ часть оригинал язык
		lang_		= p.args75,													-- -оригинал язык 	/ -часть оригинал язык
		}
	local vid		= p.args76													-- вид 	 / часть вид
	local volumes	= p.args77													-- томов / часть томов
	local a  = {
		authormain	= p.args78,													-- основной автор 	/ часть основной автор
		soauthors	= p.args80,													-- соавторы 		/ часть соавторы
		author		= {p.args82, p.args79, p.args86, p.args89, p.args91},	-- автор№ 			/ часть автор№
		authorname	= {p.args83, p.args84, p.args88, p.args90, p.args92},	-- автор№ имя 		/ часть автор№ имя
		otvetstv	= {p.args81, p.args93, p.args94, p.args95, p.args96}, -- ответственный№ 	/ часть ответственный№
		authorlink	= {, p.args85, p.args87},									-- автор2 линк, автор3 линк / часть автор2 линк, часть автор3 линк
		}
	local lng = onevar(h'lang', h'lang_')
	h.lngstr, oh.lngstr = lngstr(h, oh)  -- строки вывода языка и языка оригинала
-- Форматирование основных значений ----------------------------------------------
	-- заглавия с доп. инфой и названиями на языке оригинала, до 5 шт. частей
	local headers = 
	if is(h'title'1) 						then headers=header(1, h, ws)
		if is(oh'title'1) 					then headers=headers..  ' = '..header(1, oh) end  -- oh - оригинальные названия
		if is(h'title'2) 					then headers=headers..  ' ; '..header(2, h, ws)
			if is(oh'title'2) 				then headers=headers..  ' = '..header(2, oh) end
			if is(h'title'3) 				then headers=headers..  ' ; '..header(3, h, ws)
	    		if is(oh'title'3) 			then headers=headers..  ' = '..header(3, oh) end
		if is(h'title'4) 			then headers=headers..  ' ; '..header(4, h, ws)
			if is(oh'title'4)  		then headers=headers..  ' = '..header(4, oh) end
				if is(h'title'5) 		then headers=headers..  ' ; '..header(5, h, ws)
				if is(oh'title'5) 	then headers=headers..  ' = '..header(5, oh) end
end end end end end
-- вид
	if is(vid) 		then vid =  ' : '..vid  end
	-- томов
	if is(volumes) 	then volumes = ' : '.._volumes(volumes, lng, a)  end
	-- доп. инфа об авторах
	local otvetstvennie = ; if is(a'authormain') or is(a'author'2) or is(a'soauthors') or is(a'otvetstv'1) 	then otvetstvennie = ' / '..extauthors(a, lng)  end
	-- возврат результата
	return headers..vid..volumes..otvetstvennie
end
--------------------------------------------------------------------------------------------
-- Локальные функции -----------------------------
-- проверка существования переменной. возврат её, или nil если пустая
function is(var)
	if (var ==  or var == nil) then return nil  else return var end
end
-- выбор приоритетной переменной из двух. если есть обе - первой. если нет обоих - 
function onevar(var1,var2)
if (var1 and var1 ~= ) then return var1  elseif (var2 and var2 ~= ) then return var2  else return  end
end
-- создание ссылки на ВП, ВТ, или интернет
function link(anchor, wplink, wslink, inetlink)
	local str = 
	if is(anchor) then
		if     is(wplink) 	then str = ..anchor..
		elseif is(wslink) 	then str = ..anchor..
		elseif is(inetlink) then str = ..inetlink..' '..anchor..
		else str = anchor end
	end
	return str
end
-- Заглавие со ссылкой, инфа
function header(n, h, ws)  -- n - номер заглавия;  h - массив с заглавиями; ws - ссылка на викитеку
	local title, ilink = h'title'n, h'link'n
	local material, arcdate, arclink, utitle, info, lngstr = h'material', h'arcdate'n, h'arclink'n, h'utitle'n, h'info'n, h'lngstr'
	local str = {}
	-- заглавие со ссылкой
	if is(ws) 	then ws = onevar(ws'wsource'n, ws'wSource'n) end
	table.insert(str,  link(title, nil, ws, ilink))
	-- материал
if n == 1 		then table.insert(str,  mat(material))  end
-- подзаголовок, инфо
if is(utitle) 	then table.insert(str,  ' : '..utitle)  end
if is(info) 	then table.insert(str,  ' : '..info) 	 end
-- язык
if n == 1 and is(h'lang')	then table.insert(str,  ' : '..lngstr)  end
-- ссылка на архив
if is(arcdate) and is(arclink) 	then table.insert(str, ' : '..arclink..' арх. '..mw.getContentLanguage():formatDate('Y-m-d',arcdate)..) end
return table.concat(str)
end
-- язык
function lngstr(h, oh)
	local l, ol = , 
	-- язык
	if 		is(h'lang_') 	then l  = ..h'lang_'..
	elseif 	is(h'lang') 	then l  =  .. mw.getCurrentFrame():expandTemplate{title='ISO639言語名',args={h'lang',}} ..   end  -- вызов 
-- оригинал язык
	if 		is(oh'lang_') then ol = ..oh'lang_'..
	elseif 	is(oh'lang') 	then ol = 'пер. с '..mw.getCurrentFrame():expandTemplate{title='ISO639言語名',args={oh'lang'}}.. ..  end -- вызов lang
	return l, ol
end
-- материал
function mat(str)
	if not is(str) then return  end
	local m = {	'Видеозапись','Videorecording', 'Звукозапись','Sound recording', 'Изоматериал','Graphic', 'Карты','Cartographic material', 'Кинофильм','Motion picture', 'Комплект','Kit', 'Микроформа','Microform', 'Мультимедиа','Multimedia', 'Ноты','Music', 'Предмет','Object', 'Рукопись','Manuscript', 'Текст','Text', 'Шрифт Брайля','Braille', 'Электронный ресурс','Electronic resource' }
	str = mw.ustring.upper(mw.ustring.sub(str, 1,1))..mw.ustring.lower(mw.ustring.sub(str, 2))  -- Регистр: 1 буква заглавная
	for _, s in ipairs(m) do
		if (str == s) then return ' '..s.. end
	end	return 
end
-- томов
function _volumes(volumes, lng, a)
	if not is(volumes) then return  end
	str = mw.getCurrentFrame():expandTemplate{title='бсокр',args={lng, 'в томах', volumes}}
	return str
end
-- авторы/ответственные
function extauthors(a, lng)
	-- aвтор2, или aвтор2 + cоавторы
	if     is(a'author'2) or (is(a'author'2) and is(a'soauthors')) 	then return authors(a, lng)
	-- осн.автор + соавторы + ответственные
	elseif is(a'authormain') and is(a'soauthors') and is(a'otvetstv'1) 	then return a'authormain'..' ; '..a'soauthors'..' ; '..otvetstvennye(a)
	-- осн.автор + соавторы
	elseif is(a'authormain') and is(a'soauthors') 							then return a'authormain'..' ; '..a'soauthors'
	-- осн.aвтор + ответственные
	elseif is(a'authormain') and is(a'otvetstv'1) 						then return a'authormain'..' ; '..otvetstvennye(a)
	-- осн.автор, или осн.автор + автор2
	elseif is(a'authormain') or (is(a'authormain') and is(a'author'2)) 	then return a'authormain'
	-- автор2 + ответственные
	elseif is(a'author'2) and is(a'otvetstv'1) 							then return authors(a, lng)..' ; '..otvetstvennye(a)
	-- соавторы + ответственные
	elseif is(a'soauthors') and is(a'otvetstv'1) 							then return a'soauthors' ..' ; '..otvetstvennye(a)
	-- соавторы
	elseif is(a'soauthors') 													then return a'soauthors'
	-- ответственные
	elseif is(a'otvetstv'1) 												then return otvetstvennye(a)
	end
end
-- ответственные
function otvetstvennye(a)
	local str = {}
	if is(a'otvetstv'1) 				then table.insert(str,  a'otvetstv'1)
		if is(a'otvetstv'2) 			then table.insert(str,  a'otvetstv'2)
			if is(a'otvetstv'3) 		then table.insert(str,  a'otvetstv'3)
				if is(a'otvetstv'4) 	then table.insert(str,  a'otvetstv'4)
					if is(a'otvetstv'5) then table.insert(str,  a'otvetstv'5)
	end end end end end
	return table.concat(str, ' ; ')
end
-- доп. авторы
function authors(a,lng)
	local str = {}
	local an = function (n) 	if is(a'authorname'n)  then return a'authorname'n..' '  else return   end end
	if is(a'author'1) 					then table.insert(str,  an(1)..a'author'1)
		if is(a'author'2) 				then table.insert(str,  ', '..link(an(2)..a'author'2, a'authorlink'2))
			if is(a'author'3) 			then table.insert(str,  ', '..link(an(3)..a'author'3, a'authorlink'3))
				-- 4-го и 5-го автора в тэг  'и другие'
				if is(a'author'4) 		then local idr = an(4) .. a'author'4
					if is(a'author'5) 	then idr = idr .. ', '..an(5)..a'author'5  end
					table.insert(str,  mw.getCurrentFrame():expandTemplate{title='бсокр',args={lng, 'и другие', idr}}) -- вызов и другие
	end end end end
	return table.concat(str)
end
return s