Модуль:Публикация
Этот модуль оценён как готовый к использованию. Предполагается, что все баги устранены и он готов для широкого использования. Его можно указывать на справочных страницах и рекомендовать к использованию новым участникам. Для его изменения и тестирования, пожалуйста, используйте песочницу. |
Модуль состоит из трёх блоков:
- Вначале создаётся массив с человеческими именами вводных параметров.
- Далее собирается строка библиографической записи из элементов, и возвращается в шаблон вызова.
- Ниже блок локальных функций, формирующий эти элементы из вводных параметров.
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, ' : [<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 = '[пер. с '..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']..' ; '..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-го автора в тэг <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