Модуль:Упоминание: различия между версиями

Материал из Кадровый состав НКВД 1935-1939
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
(не показаны 2 промежуточные версии этого же участника)
Строка 111: Строка 111:
     local pos, unit, segment
     local pos, unit, segment
         = doctools.abbr( Args['должность'], abbr.pos ), Args['подразделение'], doctools.abbr( Args['место службы'], abbr.segm )
         = 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 )
     local rank = doctools.abbr( Args['звание'], abbr.rank )
Строка 161: Строка 169:
         actionDate = Doc.h2v['дата'] or Doc.date
         actionDate = Doc.h2v['дата'] or Doc.date
     end
     end
     if ( ownDateFrom or ownDateTo ) and not pos then
     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( 'упоминание',
return tools.errorMsg( 'упоминание',
'Параметры «с» и «до» используются лишь для указания периода пребывания в должности' )
'Параметры «с» и «до» используются лишь для указания периода пребывания в должности, либо для даты получения звания' )
end
end


Строка 181: Строка 189:
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,
nLast = fio_l,
Строка 190: Строка 202:
cDate = actionDate or ownDateFrom or ownDateTo,
cDate = actionDate or ownDateFrom or ownDateTo,
rank = rank,
rank = rank,
            origin = 3, --+ tmp,
            origin = origin,
reference = table.concat(referTable['звание'] or {}, '¶' ),
reference = table.concat(referTable['звание'] or {}, '¶' ),
alias = DocAlias,
alias = DocAlias,
Строка 201: Строка 213:
segment = nil
segment = nil
end
end
if pos or unit or segment then
if pos or unit or segmentDB then
         if not noCargo then
         if not noCargo then
if actionDate then
if actionDate then
Строка 214: Строка 226:
unit = unit,
unit = unit,
position = pos,
position = pos,
segment = segment,
segment = segmentDB,
origin = 3, --+ tmp,
origin = 3, --+ tmp,
reference = table.concat(referTable['должность'] or {}, '¶' ),
reference = table.concat(referTable['должность'] or {}, '¶' ),
Строка 232: Строка 244:
unit = unit,
unit = unit,
position = pos,
position = pos,
segment = segment,
segment = segmentDB,
origin = 12, --+ tmp,
origin = 12, --+ tmp,
reference = table.concat(referTable['должность'] or {}, '¶' ),
reference = table.concat(referTable['должность'] or {}, '¶' ),
Строка 250: Строка 262:
unit = unit,
unit = unit,
position = pos,
position = pos,
segment = segment,
segment = segmentDB,
origin = 4, --+ tmp,
origin = 4, --+ tmp,
reference = table.concat(referTable['должность'] or {}, '¶' ),
reference = table.concat(referTable['должность'] or {}, '¶' ),
Строка 455: Строка 467:




end
function pp.UniversalSegment( frame )
local Doc = global.get( 'gDoc' )
Doc.universalSegment = true
global.set( 'gDoc', Doc )
end
end
return pp
return pp

Версия от 16:04, 20 марта 2022

Для документации этого модуля может быть создана страница Модуль:Упоминание/doc

local pp = {}
local global = mw.ext.luaglobal;
local Args, Doc, Frame
tools = require( 'Модуль:Tools' )
refTools = require( 'Module:RefTools' )
local doctools = require( 'Модуль:DocTools' )
local abbr = mw.loadData( 'Модуль:Аббревиатуры' )
local rankTable = mw.loadData( 'Модуль:Звания' )
--local pope = require( 'Модуль:Поиск персоны' )
global.strict( true )

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.get( 'porno' )
	porno = (porno or 0) + 1
	global.set( 'porno', porno )

	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 .. '&nbsp;<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