Модуль:Упоминание: различия между версиями
Перейти к навигации
Перейти к поиску
StasR (обсуждение | вклад) Нет описания правки |
WikiSysop (обсуждение | вклад) (global.inc(docPorNo)) |
||
(не показано 26 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
local global = mw.ext.luaglobal | |||
if global.get( 'newNKVD' ) then | |||
return require( 'Модуль:!Упоминание' ) | |||
end | |||
local pp = {} | local pp = {} | ||
local Args, Doc, Frame | local Args, Doc, Frame | ||
tools = require( 'Модуль:Tools' ) | local tools = require( 'Модуль:Tools' ) | ||
local refTools = require( 'Module:RefTools' ) | |||
local doctools = require( 'Модуль:DocTools' ) | local doctools = require( 'Модуль:DocTools' ) | ||
local abbr = mw.loadData( 'Модуль:Аббревиатуры' ) | |||
local rankTable = mw.loadData( 'Модуль:Звания' ) | local rankTable = mw.loadData( 'Модуль:Звания' ) | ||
local pope = require( 'Модуль:Поиск персоны' ) | --local pope = require( 'Модуль:Поиск персоны' ) | ||
local function toRank( para ) | local function toRank( para ) | ||
local z = rankTable[para.rank] | local z = rankTable[para.rank] | ||
local i = 0 | local i = 0 | ||
if z then | if z then | ||
if z.diap then | if z.diap then | ||
for j, d in ipairs( z.diap ) do | for j, d in ipairs( z.diap ) do | ||
if para. | if para.cDate < d[1] then | ||
i = j-1 | i = j-1 | ||
break | break | ||
Строка 39: | Строка 28: | ||
end | end | ||
local query = Frame:expandTemplate{ title = ' | local query = Frame:expandTemplate{ title = 'Cargo:Ranks', args = { | ||
nLast = para.nLast, | |||
nFirst = para.nFirst, | |||
nMiddle = para.nMiddle, | |||
nDisambig = para.nDisambig, | |||
nFull = para.nFull, | |||
nPrecision = para.nPrecision, | |||
cDate = para.cDate, | |||
rank = para.rank, | rank = para.rank, | ||
subrank = i, | subrank = i, | ||
Строка 52: | Строка 46: | ||
return query | return query | ||
end | end | ||
Строка 60: | Строка 54: | ||
local debugTxt = '' | local debugTxt = '' | ||
Args, tmp = tools.checkargs( frame:getParent().args, | Args, tmp = tools.checkargs( frame:getParent().args, | ||
{ true, '', ['дата'] = true, ['звание'] = true, ['подразделение'] = true, | { true, '', ['дата'] = true, ['с'] = true, ['до'] = true, | ||
['место службы'] = true, | ['звание'] = true, ['подразделение'] = true, | ||
['место службы'] = true, | |||
['должность'] = true, | ['должность'] = true, | ||
[' | ['сноска/должность'] = true, ['сноска/звание'] = true, | ||
['сноска'] = true, ['пояснение'] = true, } ) | ['сноска'] = true, ['пояснение'] = true, } ) | ||
if not Args then | if not Args then | ||
return tools.errorMsg( 'упоминание', 'Неизвестный параметр «' .. tmp .. '»' ) | return tools.errorMsg( 'упоминание', 'Неизвестный параметр «' .. tmp .. '»' ) | ||
end | end | ||
-- local dry = mw.text.trim( frame.args[1] or '' ) == 'dry' | |||
local mode = frame.args.mode or '' | |||
local dry = mode == '-' | |||
local fio_precision | |||
if mode == '?' then | |||
fio_precision = '?' | |||
end | |||
local porno = global. | local porno = global.inc( 'docPorNo' ) | ||
Doc = global.get( 'gDoc' ) | Doc = global.get( 'gDoc' ) | ||
Строка 88: | Строка 85: | ||
return tools.errorMsg ( 'упоминание', 'Не указано ФИО персоны' ) | return tools.errorMsg ( 'упоминание', 'Не указано ФИО персоны' ) | ||
end | end | ||
-- | local fio_l, fio_f, fio_m, fio_d, fio_warn = tools.splitName( fio ) | ||
-- local fio_precision = nil | |||
if not fio_l then | |||
return tools.errorMsg( 'упоминание', fio_f ) | |||
end | |||
if fio_d and ( mode == '-' or mode == '*' ) then | |||
return tools.errorMsg( 'упоминание' .. mode, 'Этот вариант шаблона не может использоваться c индексом тезки' ) | |||
end | |||
if mode == '*' then | |||
fio = fio .. ' (*)' | |||
fio_d = '(*)' | |||
end | |||
local cargoQ = '' | local cargoQ = '' | ||
if Doc.debug then | if Doc.debug then | ||
Строка 115: | Строка 110: | ||
local pos, unit, segment | local pos, unit, segment | ||
= Args['должность'], Args['подразделение'], Args['место службы'] | = doctools.abbr( Args['должность'], abbr.pos ), Args['подразделение'], doctools.abbr( Args['место службы'], abbr.segm ) | ||
local rank = Args['звание'] | local segmentDB | ||
if Doc.universalSegment and not segment then | |||
segmentDB = Doc.h2v['место службы'] | |||
else | |||
segmentDB = segment | |||
end | |||
local rank = doctools.abbr( Args['звание'], abbr.rank ) | |||
if rank then | if rank then | ||
if rankTable[rank] then | if rankTable[rank] then | ||
Строка 125: | Строка 128: | ||
end | end | ||
else | else | ||
return tools.errorMsg( ' | return tools.errorMsg( 'упоминание', | ||
'Неизвестное звание «' .. rank .. '» в параметре «звание»') | 'Неизвестное звание «' .. rank .. '» в параметре «звание»') | ||
end | end | ||
end | end | ||
local ownDate = Args['дата'] | local ownDate, ownDateFrom, ownDateTo = Args['дата'], Args['с'], Args['до'] | ||
if ownDate and ( ownDateFrom or ownDateTo ) then | |||
return tools.errorMsg( 'упоминание', | |||
'Вместе с параметром «дата» нельзя использовать параметры «с» и «до»' ) | |||
end | |||
if ownDate then | if ownDate then | ||
ownDate = tools.parseDate( ownDate ) | ownDate = tools.parseDate( ownDate ) | ||
if not ownDate then | if not ownDate then | ||
return tools.errorMsg( 'упоминание', | return tools.errorMsg( 'упоминание', | ||
'Некорректный формат даты в параметре «дата»') | 'Некорректный формат даты в параметре «дата»' ) | ||
end | |||
end | |||
if ownDateFrom then | |||
ownDateFrom = tools.parseDate( ownDateFrom ) | |||
if not ownDateFrom then | |||
return tools.errorMsg( 'упоминание', | |||
'Некорректный формат даты в параметре «c»' ) | |||
end | end | ||
end | |||
if ownDateTo then | |||
ownDateTo = tools.parseDate( ownDateTo ) | |||
if not ownDateTo then | |||
return tools.errorMsg( 'упоминание', | |||
'Некорректный формат даты в параметре «до»' ) | |||
end | |||
end | |||
local actionDate | |||
if ownDate or ownDateFrom or ownDateTo then | |||
if Doc.h2v['дата'] then | if Doc.h2v['дата'] then | ||
return tools.errorMsg( 'упоминание', | return tools.errorMsg( 'упоминание', | ||
'В секции {{дата}} у шаблона не может быть собственного параметра «дата»' ) | 'В секции {{дата}} у шаблона не может быть собственного параметра «дата» («с», «по»)' ) | ||
end | end | ||
actionDate = ownDate | actionDate = ownDate | ||
else | else | ||
actionDate = Doc.date | actionDate = Doc.h2v['дата'] or Doc.date | ||
end | end | ||
if ( ownDateFrom or ownDateTo ) and not pos and ( not rank or not ownDateFrom or ownDateTo ) then -- ¬( pos|(rank&From&¬To)|(¬From&¬To) ) | |||
-- | return tools.errorMsg( 'упоминание', | ||
'Параметры «с» и «до» используются лишь для указания периода пребывания в должности, либо для даты получения звания' ) | |||
end | end | ||
-- -- сборка примечания | |||
-- local refers = {} | |||
-- refers[#refers+1] = Args['сноска'] | |||
-- refers[#refers+1] = global.get( 'gUniref-Документ' ) | |||
-- refers = table.concat( refers, '¶' ) | |||
-- -- собрали примечание | |||
local referTable = {} | |||
local ownRef, usedRef = refTools.collect( Args, 'сноска' ), {} | |||
refTools.absorb( referTable, global.get( 'gUniref-Документ' ) ) | |||
refTools.absorb( referTable, ownRef ) | |||
if rank then | if rank then | ||
if not noCargo then | if not noCargo then | ||
local origin = 3 | |||
if not pos and ownDateFrom then | |||
origin = 12 | |||
end | |||
cargoQ = cargoQ .. toRank { | cargoQ = cargoQ .. toRank { | ||
nLast = fio_l, | |||
nFirst = fio_f, | |||
nMiddle = fio_m, | |||
nDisambig = fio_d, | |||
nFull = fio, | |||
nPrecision = fio_precision, | |||
cDate = actionDate or ownDateFrom or ownDateTo, | |||
rank = rank, | rank = rank, | ||
origin = | origin = origin, | ||
reference = table.concat(referTable['звание'] or {}, '¶' ), | |||
alias = DocAlias, | alias = DocAlias, | ||
isVolatile = porno, | isVolatile = porno, | ||
} | } | ||
end | end | ||
usedRef['звание'] = true | |||
end | end | ||
if segment == '-' then | if segment == '-' then | ||
segment = nil | segment = nil | ||
end | end | ||
if pos or unit or | if pos or unit or segmentDB then | ||
if not noCargo then | if not noCargo then | ||
cargoQ = cargoQ .. frame:expandTemplate{ title = ' | if actionDate then | ||
cargoQ = cargoQ .. frame:expandTemplate{ title = 'Cargo:Designations', args = { | |||
nLast = fio_l, | |||
nFirst = fio_f, | |||
nMiddle = fio_m, | |||
nDisambig = fio_d, | |||
nFull = fio, | |||
nPrecision = fio_precision, | |||
cDate = actionDate, --+ Doc.date, -- упоминание — на дату составления документа | |||
unit = unit, | |||
position = pos, | |||
segment = segmentDB, | |||
origin = 3, --+ tmp, | |||
reference = table.concat(referTable['должность'] or {}, '¶' ), | |||
alias = DocAlias, | |||
isVolatile = porno, | |||
} } | } } | ||
else | |||
if ownDateFrom then | |||
cargoQ = cargoQ .. frame:expandTemplate{ title = 'Cargo:Designations', args = { | |||
nLast = fio_l, | |||
nFirst = fio_f, | |||
nMiddle = fio_m, | |||
nDisambig = fio_d, | |||
nFull = fio, | |||
nPrecision = fio_precision, | |||
cDate = ownDateFrom, | |||
unit = unit, | |||
position = pos, | |||
segment = segmentDB, | |||
origin = 12, --+ tmp, | |||
reference = table.concat(referTable['должность'] or {}, '¶' ), | |||
alias = DocAlias, | |||
isVolatile = porno, | |||
} } | |||
end | |||
if ownDateTo then | |||
cargoQ = cargoQ .. frame:expandTemplate{ title = 'Cargo:Designations', args = { | |||
nLast = fio_l, | |||
nFirst = fio_f, | |||
nMiddle = fio_m, | |||
nDisambig = fio_d, | |||
nFull = fio, | |||
nPrecision = fio_precision, | |||
cDate = ownDateTo, | |||
unit = unit, | |||
position = pos, | |||
segment = segmentDB, | |||
origin = 4, --+ tmp, | |||
reference = table.concat(referTable['должность'] or {}, '¶' ), | |||
alias = DocAlias, | |||
isVolatile = porno, | |||
} } | |||
end | |||
end | |||
end | end | ||
usedRef['должность'] = true | |||
end | end | ||
if not noCargo then | if not noCargo and Args['пояснение'] then | ||
cargoQ = cargoQ .. frame:expandTemplate{ title = ' | cargoQ = cargoQ .. frame:expandTemplate{ title = 'Cargo:Mentions', args = { | ||
nLast = fio_l, | |||
nFirst = fio_f, | |||
reference = | nMiddle = fio_m, | ||
nDisambig = fio_d, | |||
nFull = fio, | |||
nPrecision = fio_precision, | |||
cDate = actionDate or ownDateFrom, | |||
reference = table.concat(referTable['common'] or {}, '¶' ), | |||
comment = Args['пояснение'], | comment = Args['пояснение'], | ||
alias = DocAlias, | alias = DocAlias, | ||
Строка 465: | Строка 289: | ||
} } | } } | ||
end | end | ||
if Args['пояснение'] then | |||
usedRef['common'] = true | |||
end | |||
for i, _ in pairs( ownRef ) do | |||
if not usedRef[i] then | |||
return tools.errorMsg( 'упоминание', 'указана сноска к незаданному параметру «' .. i .. '»') | |||
end | |||
end | |||
--[===[ | |||
local out, suffix = Args[2], '' | local out, suffix = Args[2], '' | ||
if out == '-' then | if out == '-' then | ||
Строка 472: | Строка 305: | ||
elseif out == '+' then | elseif out == '+' then | ||
if rank then | if rank then | ||
suffix = ', ' .. rank | suffix = ', ' .. tools.db( rankTable, rank, 'кто' ) -- rank | ||
end | end | ||
if pos or unit or segment then | if pos or unit or segment then | ||
Строка 483: | Строка 316: | ||
end | end | ||
if segment then | if segment then | ||
tmp[#tmp+1] = | tmp[#tmp+1] = tools.segment( segment ) | ||
end | end | ||
suffix = suffix .. ' (' .. table.concat( tmp, '; ' ) .. ')' | suffix = suffix .. ' (' .. table.concat( tmp, '; ' ) .. ')' | ||
end | end | ||
if ownDate then | if ownDate then | ||
suffix = suffix .. ' [по сост. на ' .. tools.reparseDate( ownDate ) .. ']' | suffix = suffix .. ' [по сост. на ' .. tools.reparseDate( ownDate ) .. ']' | ||
elseif ownDateFrom or ownDateTo then | |||
local tmp = '' | |||
if ownDateFrom then | |||
tmp = ' c ' .. tools.reparseDate( ownDateFrom ) | |||
end | |||
if ownDateTo then | |||
tmp = tmp .. ' до ' .. tools.reparseDate( ownDateTo ) | |||
end | |||
suffix = suffix .. ' [' .. string.sub( tmp, 2, -1 ) .. ']' | |||
end | end | ||
out = fio | out = fio | ||
elseif out == 'д' then | |||
out = '' | |||
suffix = pos | |||
if ownDate then | |||
suffix = suffix .. ' [по сост. на ' .. tools.reparseDate( ownDate ) .. ']' | |||
elseif ownDateFrom or ownDateTo then | |||
local tmp = '' | |||
if ownDateFrom then | |||
tmp = ' c ' .. tools.reparseDate( ownDateFrom ) | |||
end | |||
if ownDateTo then | |||
tmp = tmp .. ' до ' .. tools.reparseDate( ownDateTo ) | |||
end | |||
suffix = suffix .. ' [' .. string.sub( tmp, 2, -1 ) .. ']' | |||
end | |||
elseif out == '' then | elseif out == '' then | ||
out = fio | out = fio | ||
end | end | ||
if out ~= '' then | if out ~= '' then | ||
if dry then | if dry then | ||
Строка 501: | Строка 359: | ||
out = '[[' .. fio .. '|<span class="nkvd-doc-mention">' .. out .. '</span>]]' | out = '[[' .. fio .. '|<span class="nkvd-doc-mention">' .. out .. '</span>]]' | ||
end | end | ||
out = out .. | end | ||
end | out = out .. suffix | ||
if referTable.common then | |||
debugTxt = '[[Категория:Универсальные сноски]]' .. debugTxt | |||
end | |||
if fio_precision then | |||
out = out .. ' <span class="nkvd-idx"><i class="fa fa-question fa-lg">' | |||
.. '</i></span>' | |||
end | |||
if #fio_warn ~= 0 then | |||
for _, warn in ipairs( fio_warn ) do | |||
out = out .. ' <i class="fa fa-warning fa-lg" style="color: #f05f1a;"' | |||
.. ' title="' .. warn .. '"></i>' | |||
end | |||
out = out .. '[[Категория:Неаккуратные ссылки на персоналии]]' | |||
end | |||
if not dry then | if not dry then | ||
out = out .. '[[' .. fio .. '|<span class="fa fa- | out = out .. '[[' .. fio .. '|<span class="fa fa-check-circle-o nkvd-doc-mention-flag" title="Упоминание — ' .. fio .. '"></span>]]' | ||
end | |||
return debugTxt .. out .. refTools.makeRef( refTools.toline( ownRef ) ) .. cargoQ | |||
--]===] | |||
local formstr = Args[2] | |||
if formstr == '+' then | |||
formstr = '{n:*}{r:, *}{p: (*)}{d: [*]}' | |||
elseif formstr == '!' then | |||
formstr = '{n:*}{r:, *}{p: (*)}{d: [*]}{c: — *}' | |||
elseif formstr == '' then | |||
formstr = '{n:*}' | |||
elseif formstr == '-' then | |||
formstr = '' | |||
elseif formstr == 'д' then | |||
formstr = '{p:*}{d: [*]}' | |||
end | end | ||
local values = {} | |||
if dry then | if dry then | ||
values.n = '<span class="nkvd-doc-mention-dry">' .. fio .. '</span>' | |||
else | else | ||
values.n = '[[' .. fio .. '|<span class="nkvd-doc-mention">' .. fio .. '</span>]]' | |||
end | end | ||
if fio_precision then | |||
if | values.n = values.n .. ' <span class="nkvd-idx"><i class="fa fa-question fa-lg"></i></span>' | ||
end | |||
if #fio_warn ~= 0 then | |||
for _, warn in ipairs( fio_warn ) do | |||
values.n = values.n .. ' <i class="fa fa-warning fa-lg" style="color: #f05f1a;"' | |||
.. ' title="' .. warn .. '"></i>' | |||
end | end | ||
values.n = values.n .. '[[Категория:Неаккуратные ссылки на персоналии]]' | |||
end | end | ||
if | if rank then | ||
if | values.r = tools.db( rankTable, rank, 'кто' ) | ||
tmp = | end | ||
if pos or unit or segment then | |||
tmp = | local tmp = {} | ||
if pos then | |||
tmp[#tmp+1] = pos | |||
end | |||
if unit then | |||
tmp[#tmp+1] = unit | |||
end | |||
if segment then | |||
tmp[#tmp+1] = tools.segment( segment ) | |||
end | end | ||
values.p = table.concat( tmp, '; ' ) | |||
end | end | ||
if | if ownDate then | ||
values.t = tools.reparseDate( ownDate ) | |||
values.d = 'по сост. на ' .. values.t | |||
elseif ownDateFrom or ownDateTo then | |||
local tmp = {} | |||
if ownDateFrom then | |||
tmp[#tmp+1] = 'c ' .. tools.reparseDate( ownDateFrom ) | |||
end | |||
if ownDateTo then | |||
tmp[#tmp+1] = 'до ' .. tools.reparseDate( ownDateTo ) | |||
end | |||
values.d = table.concat( tmp, ' ' ) | |||
values.t = values.d | |||
end | end | ||
if Args[' | if Args['пояснение'] then | ||
values.c = Args['пояснение'] | |||
end | end | ||
if | local out = string.gsub( formstr, '%{([a-z]):(.-)%}', function ( idx, pattern ) | ||
if values[idx] then | |||
local n = string.find( pattern, '*', 1, true ) | |||
return string.sub( pattern, 1, n-1 ) .. values[idx] .. string.sub( pattern, n+1, -1 ) | |||
end | |||
return '' | |||
end ) | |||
if out == formstr and not dry then | |||
out = '[[' .. fio .. '|<span class="nkvd-doc-mention">' .. out .. '</span>]]' | |||
end | end | ||
if | if referTable.common then | ||
debugTxt = '[[Категория:Универсальные сноски]]' .. debugTxt | |||
end | |||
if not dry then | |||
out = out .. '[[' .. fio .. '|<span class="fa fa-check-circle-o nkvd-doc-mention-flag" title="Упоминание — ' .. fio .. '"></span>]]' | |||
end | end | ||
return debugTxt .. out .. refTools.makeRef( refTools.toline( ownRef ) ) .. cargoQ | |||
end | |||
function pp.UniversalSegment( frame ) | |||
local Doc = global.get( 'gDoc' ) | |||
Doc.universalSegment = true | |||
global.set( 'gDoc', Doc ) | |||
end | end | ||
return pp | return pp |
Текущая версия от 17:09, 27 июля 2023
Для документации этого модуля может быть создана страница Модуль:Упоминание/doc
local global = mw.ext.luaglobal
if global.get( 'newNKVD' ) then
return require( 'Модуль:!Упоминание' )
end
local pp = {}
local Args, Doc, Frame
local tools = require( 'Модуль:Tools' )
local refTools = require( 'Module:RefTools' )
local doctools = require( 'Модуль:DocTools' )
local abbr = mw.loadData( 'Модуль:Аббревиатуры' )
local rankTable = mw.loadData( 'Модуль:Звания' )
--local pope = require( 'Модуль:Поиск персоны' )
local function toRank( para )
local z = rankTable[para.rank]
local i = 0
if z then
if z.diap then
for j, d in ipairs( z.diap ) do
if para.cDate < d[1] then
i = j-1
break
end
end
else
i = 1
end
end
local query = Frame:expandTemplate{ title = 'Cargo:Ranks', args = {
nLast = para.nLast,
nFirst = para.nFirst,
nMiddle = para.nMiddle,
nDisambig = para.nDisambig,
nFull = para.nFull,
nPrecision = para.nPrecision,
cDate = para.cDate,
rank = para.rank,
subrank = i,
canceled = para.canceled,
origin = para.origin,
reference = para.reference,
alias = para.alias,
isVolatile = para.isVolatile,
} }
return query
end
pp.Main = function ( frame )
Frame = frame
local tmp
local debugTxt = ''
Args, tmp = tools.checkargs( frame:getParent().args,
{ true, '', ['дата'] = true, ['с'] = true, ['до'] = true,
['звание'] = true, ['подразделение'] = true,
['место службы'] = true,
['должность'] = true,
['сноска/должность'] = true, ['сноска/звание'] = true,
['сноска'] = true, ['пояснение'] = true, } )
if not Args then
return tools.errorMsg( 'упоминание', 'Неизвестный параметр «' .. tmp .. '»' )
end
-- local dry = mw.text.trim( frame.args[1] or '' ) == 'dry'
local mode = frame.args.mode or ''
local dry = mode == '-'
local fio_precision
if mode == '?' then
fio_precision = '?'
end
local porno = global.inc( 'docPorNo' )
Doc = global.get( 'gDoc' )
local DocAlias = global.get( 'gDocAlias' )
if not Doc then
return tools.errorMsg( 'упоминание',
'Первым на странице должен размещаться шаблон {{ Документ }}' )
end
local noCargo = Doc.off or dry
local fio = Args[1]
if not fio then
return tools.errorMsg ( 'упоминание', 'Не указано ФИО персоны' )
end
local fio_l, fio_f, fio_m, fio_d, fio_warn = tools.splitName( fio )
-- local fio_precision = nil
if not fio_l then
return tools.errorMsg( 'упоминание', fio_f )
end
if fio_d and ( mode == '-' or mode == '*' ) then
return tools.errorMsg( 'упоминание' .. mode, 'Этот вариант шаблона не может использоваться c индексом тезки' )
end
if mode == '*' then
fio = fio .. ' (*)'
fio_d = '(*)'
end
local cargoQ = ''
if Doc.debug then
debugTxt = {}
for _, h in ipairs( Doc.n2h ) do
table.insert( debugTxt, '[' .. h .. '] = ' .. mw.dumpObject( Doc.h2v[h] ) )
end
debugTxt = '\n******* ' .. table.concat( debugTxt, '; ' ) .. '\n'
end
local pos, unit, segment
= doctools.abbr( Args['должность'], abbr.pos ), Args['подразделение'], doctools.abbr( Args['место службы'], abbr.segm )
local segmentDB
if Doc.universalSegment and not segment then
segmentDB = Doc.h2v['место службы']
else
segmentDB = segment
end
local rank = doctools.abbr( Args['звание'], abbr.rank )
if rank then
if rankTable[rank] then
if rankTable[rank].redirect then
rank = rankTable[rank].redirect
Args['звание'] = rank
end
else
return tools.errorMsg( 'упоминание',
'Неизвестное звание «' .. rank .. '» в параметре «звание»')
end
end
local ownDate, ownDateFrom, ownDateTo = Args['дата'], Args['с'], Args['до']
if ownDate and ( ownDateFrom or ownDateTo ) then
return tools.errorMsg( 'упоминание',
'Вместе с параметром «дата» нельзя использовать параметры «с» и «до»' )
end
if ownDate then
ownDate = tools.parseDate( ownDate )
if not ownDate then
return tools.errorMsg( 'упоминание',
'Некорректный формат даты в параметре «дата»' )
end
end
if ownDateFrom then
ownDateFrom = tools.parseDate( ownDateFrom )
if not ownDateFrom then
return tools.errorMsg( 'упоминание',
'Некорректный формат даты в параметре «c»' )
end
end
if ownDateTo then
ownDateTo = tools.parseDate( ownDateTo )
if not ownDateTo then
return tools.errorMsg( 'упоминание',
'Некорректный формат даты в параметре «до»' )
end
end
local actionDate
if ownDate or ownDateFrom or ownDateTo then
if Doc.h2v['дата'] then
return tools.errorMsg( 'упоминание',
'В секции {{дата}} у шаблона не может быть собственного параметра «дата» («с», «по»)' )
end
actionDate = ownDate
else
actionDate = Doc.h2v['дата'] or Doc.date
end
if ( ownDateFrom or ownDateTo ) and not pos and ( not rank or not ownDateFrom or ownDateTo ) then -- ¬( pos|(rank&From&¬To)|(¬From&¬To) )
return tools.errorMsg( 'упоминание',
'Параметры «с» и «до» используются лишь для указания периода пребывания в должности, либо для даты получения звания' )
end
-- -- сборка примечания
-- local refers = {}
-- refers[#refers+1] = Args['сноска']
-- refers[#refers+1] = global.get( 'gUniref-Документ' )
-- refers = table.concat( refers, '¶' )
-- -- собрали примечание
local referTable = {}
local ownRef, usedRef = refTools.collect( Args, 'сноска' ), {}
refTools.absorb( referTable, global.get( 'gUniref-Документ' ) )
refTools.absorb( referTable, ownRef )
if rank then
if not noCargo then
local origin = 3
if not pos and ownDateFrom then
origin = 12
end
cargoQ = cargoQ .. toRank {
nLast = fio_l,
nFirst = fio_f,
nMiddle = fio_m,
nDisambig = fio_d,
nFull = fio,
nPrecision = fio_precision,
cDate = actionDate or ownDateFrom or ownDateTo,
rank = rank,
origin = origin,
reference = table.concat(referTable['звание'] or {}, '¶' ),
alias = DocAlias,
isVolatile = porno,
}
end
usedRef['звание'] = true
end
if segment == '-' then
segment = nil
end
if pos or unit or segmentDB then
if not noCargo then
if actionDate then
cargoQ = cargoQ .. frame:expandTemplate{ title = 'Cargo:Designations', args = {
nLast = fio_l,
nFirst = fio_f,
nMiddle = fio_m,
nDisambig = fio_d,
nFull = fio,
nPrecision = fio_precision,
cDate = actionDate, --+ Doc.date, -- упоминание — на дату составления документа
unit = unit,
position = pos,
segment = segmentDB,
origin = 3, --+ tmp,
reference = table.concat(referTable['должность'] or {}, '¶' ),
alias = DocAlias,
isVolatile = porno,
} }
else
if ownDateFrom then
cargoQ = cargoQ .. frame:expandTemplate{ title = 'Cargo:Designations', args = {
nLast = fio_l,
nFirst = fio_f,
nMiddle = fio_m,
nDisambig = fio_d,
nFull = fio,
nPrecision = fio_precision,
cDate = ownDateFrom,
unit = unit,
position = pos,
segment = segmentDB,
origin = 12, --+ tmp,
reference = table.concat(referTable['должность'] or {}, '¶' ),
alias = DocAlias,
isVolatile = porno,
} }
end
if ownDateTo then
cargoQ = cargoQ .. frame:expandTemplate{ title = 'Cargo:Designations', args = {
nLast = fio_l,
nFirst = fio_f,
nMiddle = fio_m,
nDisambig = fio_d,
nFull = fio,
nPrecision = fio_precision,
cDate = ownDateTo,
unit = unit,
position = pos,
segment = segmentDB,
origin = 4, --+ tmp,
reference = table.concat(referTable['должность'] or {}, '¶' ),
alias = DocAlias,
isVolatile = porno,
} }
end
end
end
usedRef['должность'] = true
end
if not noCargo and Args['пояснение'] then
cargoQ = cargoQ .. frame:expandTemplate{ title = 'Cargo:Mentions', args = {
nLast = fio_l,
nFirst = fio_f,
nMiddle = fio_m,
nDisambig = fio_d,
nFull = fio,
nPrecision = fio_precision,
cDate = actionDate or ownDateFrom,
reference = table.concat(referTable['common'] or {}, '¶' ),
comment = Args['пояснение'],
alias = DocAlias,
isVolatile = porno,
} }
end
if Args['пояснение'] then
usedRef['common'] = true
end
for i, _ in pairs( ownRef ) do
if not usedRef[i] then
return tools.errorMsg( 'упоминание', 'указана сноска к незаданному параметру «' .. i .. '»')
end
end
--[===[
local out, suffix = Args[2], ''
if out == '-' then
out = ''
elseif out == '+' then
if rank then
suffix = ', ' .. tools.db( rankTable, rank, 'кто' ) -- rank
end
if pos or unit or segment then
tmp = {}
if pos then
tmp[#tmp+1] = pos
end
if unit then
tmp[#tmp+1] = unit
end
if segment then
tmp[#tmp+1] = tools.segment( segment )
end
suffix = suffix .. ' (' .. table.concat( tmp, '; ' ) .. ')'
end
if ownDate then
suffix = suffix .. ' [по сост. на ' .. tools.reparseDate( ownDate ) .. ']'
elseif ownDateFrom or ownDateTo then
local tmp = ''
if ownDateFrom then
tmp = ' c ' .. tools.reparseDate( ownDateFrom )
end
if ownDateTo then
tmp = tmp .. ' до ' .. tools.reparseDate( ownDateTo )
end
suffix = suffix .. ' [' .. string.sub( tmp, 2, -1 ) .. ']'
end
out = fio
elseif out == 'д' then
out = ''
suffix = pos
if ownDate then
suffix = suffix .. ' [по сост. на ' .. tools.reparseDate( ownDate ) .. ']'
elseif ownDateFrom or ownDateTo then
local tmp = ''
if ownDateFrom then
tmp = ' c ' .. tools.reparseDate( ownDateFrom )
end
if ownDateTo then
tmp = tmp .. ' до ' .. tools.reparseDate( ownDateTo )
end
suffix = suffix .. ' [' .. string.sub( tmp, 2, -1 ) .. ']'
end
elseif out == '' then
out = fio
end
if out ~= '' then
if dry then
out = '<span class="nkvd-doc-mention-dry">' .. out .. '</span>'
else
out = '[[' .. fio .. '|<span class="nkvd-doc-mention">' .. out .. '</span>]]'
end
end
out = out .. suffix
if referTable.common then
debugTxt = '[[Категория:Универсальные сноски]]' .. debugTxt
end
if fio_precision then
out = out .. ' <span class="nkvd-idx"><i class="fa fa-question fa-lg">'
.. '</i></span>'
end
if #fio_warn ~= 0 then
for _, warn in ipairs( fio_warn ) do
out = out .. ' <i class="fa fa-warning fa-lg" style="color: #f05f1a;"'
.. ' title="' .. warn .. '"></i>'
end
out = out .. '[[Категория:Неаккуратные ссылки на персоналии]]'
end
if not dry then
out = out .. '[[' .. fio .. '|<span class="fa fa-check-circle-o nkvd-doc-mention-flag" title="Упоминание — ' .. fio .. '"></span>]]'
end
return debugTxt .. out .. refTools.makeRef( refTools.toline( ownRef ) ) .. cargoQ
--]===]
local formstr = Args[2]
if formstr == '+' then
formstr = '{n:*}{r:, *}{p: (*)}{d: [*]}'
elseif formstr == '!' then
formstr = '{n:*}{r:, *}{p: (*)}{d: [*]}{c: — *}'
elseif formstr == '' then
formstr = '{n:*}'
elseif formstr == '-' then
formstr = ''
elseif formstr == 'д' then
formstr = '{p:*}{d: [*]}'
end
local values = {}
if dry then
values.n = '<span class="nkvd-doc-mention-dry">' .. fio .. '</span>'
else
values.n = '[[' .. fio .. '|<span class="nkvd-doc-mention">' .. fio .. '</span>]]'
end
if fio_precision then
values.n = values.n .. ' <span class="nkvd-idx"><i class="fa fa-question fa-lg"></i></span>'
end
if #fio_warn ~= 0 then
for _, warn in ipairs( fio_warn ) do
values.n = values.n .. ' <i class="fa fa-warning fa-lg" style="color: #f05f1a;"'
.. ' title="' .. warn .. '"></i>'
end
values.n = values.n .. '[[Категория:Неаккуратные ссылки на персоналии]]'
end
if rank then
values.r = tools.db( rankTable, rank, 'кто' )
end
if pos or unit or segment then
local tmp = {}
if pos then
tmp[#tmp+1] = pos
end
if unit then
tmp[#tmp+1] = unit
end
if segment then
tmp[#tmp+1] = tools.segment( segment )
end
values.p = table.concat( tmp, '; ' )
end
if ownDate then
values.t = tools.reparseDate( ownDate )
values.d = 'по сост. на ' .. values.t
elseif ownDateFrom or ownDateTo then
local tmp = {}
if ownDateFrom then
tmp[#tmp+1] = 'c ' .. tools.reparseDate( ownDateFrom )
end
if ownDateTo then
tmp[#tmp+1] = 'до ' .. tools.reparseDate( ownDateTo )
end
values.d = table.concat( tmp, ' ' )
values.t = values.d
end
if Args['пояснение'] then
values.c = Args['пояснение']
end
local out = string.gsub( formstr, '%{([a-z]):(.-)%}', function ( idx, pattern )
if values[idx] then
local n = string.find( pattern, '*', 1, true )
return string.sub( pattern, 1, n-1 ) .. values[idx] .. string.sub( pattern, n+1, -1 )
end
return ''
end )
if out == formstr and not dry then
out = '[[' .. fio .. '|<span class="nkvd-doc-mention">' .. out .. '</span>]]'
end
if referTable.common then
debugTxt = '[[Категория:Универсальные сноски]]' .. debugTxt
end
if not dry then
out = out .. '[[' .. fio .. '|<span class="fa fa-check-circle-o nkvd-doc-mention-flag" title="Упоминание — ' .. fio .. '"></span>]]'
end
return debugTxt .. out .. refTools.makeRef( refTools.toline( ownRef ) ) .. cargoQ
end
function pp.UniversalSegment( frame )
local Doc = global.get( 'gDoc' )
Doc.universalSegment = true
global.set( 'gDoc', Doc )
end
return pp