Модуль:Публикация

Модуль состоит из трёх блоков:

  1. Вначале создаётся массив с человеческими именами вводных параметров.
  2. Далее собирается строка библиографической записи из элементов, и возвращается в шаблон вызова.
  3. Ниже блок локальных функций, формирующий эти элементы из вводных параметров.

local s = {}
function s.parts(p)

-- Запись параметров вызова в массив. Формат индексов: "массив['параметр'][номер части/заглавия/автора]", например: "ws['wsource'][2]" (p.args[9]) это "часть2 викитека".
	local ws = {
		wsource		= {p.args[1], p.args[9],  p.args[17], p.args[25], p.args[33]},	-- викитека / часть№ викитека
		wSource		= {p.args[2], p.args[10], p.args[18], p.args[26], p.args[34]},	-- Викитека / часть№ Викитека
		}
	local h  = {
		title		= {p.args[3], p.args[11], p.args[19], p.args[27], p.args[35]},	-- заглавие№	/ часть№
		link		= {p.args[4], p.args[12], p.args[20], p.args[28], p.args[36]},	-- ссылка 	  	/ часть№ ссылка
		arcdate		= {p.args[5], p.args[13], p.args[21], p.args[29], p.args[37]},	-- архив дата 	/ часть№ архив дата
		arclink		= {p.args[6], p.args[14], p.args[22], p.args[30], p.args[38]}, 	-- архив 	  	/ часть№ архив
		utitle		= {p.args[7], p.args[15], p.args[23], p.args[31], p.args[39]},	-- подзаголовок / часть№ подзаголовок
		info		= {p.args[8], p.args[16], p.args[24], p.args[32], p.args[40]},	-- инфо  		/ часть№ инфо
		lang		= p.args[42],													-- язык  		/ часть язык
		lang_		= p.args[43],													-- -язык 		/ -часть язык
		material	= p.args[41],													-- материал 	/ часть материал
		}
	local oh = {
		title		= {p.args[44], p.args[50], p.args[56], p.args[62], p.args[68]},	-- оригинал 		/ часть№ оригинал
		link		= {p.args[45], p.args[51], p.args[57], p.args[63], p.args[69]},	-- оригинал ссылка  / часть№ оригинал ссылка
		arcdate		= {p.args[46], p.args[52], p.args[58], p.args[64], p.args[70]},	-- архив дата 		/ часть№ оригинал архив дата
		arclink		= {p.args[47], p.args[53], p.args[59], p.args[65], p.args[71]},	-- оригинал архив 	/ часть№ оригинал архив
		utitle		= {p.args[48], p.args[54], p.args[60], p.args[66], p.args[72]},	-- оригинал подзаголовок / часть№ оригинал подзаголовок
		info		= {p.args[49], p.args[55], p.args[61], p.args[67], p.args[73]},	-- оригинал инфо 	/ часть№ оригинал инфо
		lang		= p.args[74],													-- оригинал язык 	/ часть оригинал язык
		lang_		= p.args[75],													-- -оригинал язык 	/ -часть оригинал язык
		}
	local vid		= p.args[76]													-- вид 	 / часть вид
	local volumes	= p.args[77]													-- томов / часть томов
	local a  = {
		authormain	= p.args[78],													-- основной автор 	/ часть основной автор
		soauthors	= p.args[80],													-- соавторы 		/ часть соавторы
		author		= {p.args[82], p.args[79], p.args[86], p.args[89], p.args[91]},	-- автор№ 			/ часть автор№
		authorname	= {p.args[83], p.args[84], p.args[88], p.args[90], p.args[92]},	-- автор№ имя 		/ часть автор№ имя
		otvetstv	= {p.args[81], p.args[93], p.args[94], p.args[95], p.args[96]}, -- ответственный№ 	/ часть ответственный№
		authorlink	= {'', p.args[85], p.args[87]},									-- автор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 = '[['..wplink..'|'..anchor..']]'
		elseif is(wslink) 	then str = '[[:s:'..wslink..'|'..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, '&nbsp;: [<span title="архивировано из первоисточника">['..arclink..' арх.] '..mw.getContentLanguage():formatDate('j xg Y',arcdate)..'</span>]') end
    return table.concat(str)
end

-- язык
function lngstr(h, oh)
	local l, ol = '', ''
	-- язык
	if 		is(h['lang_']) 	then l  = '<span style=display:none>'..h['lang_']..'</span>'
	elseif 	is(h['lang']) 	then l  = mw.getCurrentFrame():expandTemplate{title='lg',args={h['lang'],'[]'}}   end  -- вызов {{lg|lang|[]}}
    -- оригинал язык
	if 		is(oh['lang_']) then ol = '<span style=display:none>'..oh['lang_']..'</span>'
	elseif 	is(oh['lang']) 	then ol = '[пер. с&nbsp;'..mw.getCurrentFrame():expandTemplate{title='lg',args={oh['lang']}}..']'  end -- вызов {{lg|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']..'&nbsp;; '..a['soauthors']..'&nbsp;; '..otvetstvennye(a)
	-- осн.автор + соавторы
	elseif is(a['authormain']) and is(a['soauthors']) 							then return a['authormain']..'&nbsp;; '..a['soauthors']
	-- осн.aвтор + ответственные
	elseif is(a['authormain']) and is(a['otvetstv'][1]) 						then return a['authormain']..'&nbsp;; '..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)..'&nbsp;; '..otvetstvennye(a)
	-- соавторы + ответственные
	elseif is(a['soauthors']) and is(a['otvetstv'][1]) 							then return a['soauthors'] ..'&nbsp;; '..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, '&nbsp;; ')
end

-- доп. авторы
function authors(a,lng)
	local str = {}
	local an = function (n) 	if is(a['authorname'][n])  then return a['authorname'][n]..'&nbsp;'  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-го автора в тэг <abbr> 'и другие'
				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}}) -- вызов {{бсокр|lang|и другие}}
	end end end end
	return table.concat(str)
end

return s