Модуль:CatNav

Материал из Кадровый состав НКВД 1935-1939
Перейти к навигации Перейти к поиску

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

local p ={}

local ctgDsc = {
	award = { table = 'award', field = 'award', text = 'Награда', counter = 'наград' },
	rank = { table = 'rank', field = 'rank', text = 'Звание', counter = 'упоминаний' },
	segment = { table = 'designation', field = 'segment', text = 'Место службы', counter = 'упоминаний' },
}
local rankDia = {
	['до 02.1943'] = ' AND old',
	['с 02.1943'] = ' AND NOT old',
}

local LIMIT = 200  -- количество персоналий на странице

-- Выборка по значению
-- {{#invoke:CatNav|Nav|{{#urlget:class}}|{{#urlget:value}}|{{#urlget:from}}|{{#urlget:to}}|{{#urlget:letter}}|{{#urlget:year}}}}

local function nav( ctg, val, start, stop, letter, year )
	local dsc = ctgDsc[ctg]
	if not dsc then
		return '<p class=error>Неизвестный класс навигации «' .. ( ctg or '???' ) .. '»!</p>'
	end

	local out = { '{{DISPLAYTITLE:[НКВД] ' .. dsc.text .. ': ' .. val .. '}}\n' }
	table.insert( out, '<div style="float:right; margin: 0 0 1em 1em" title="Редактировать предисловие">[{{fullurl:НКВД:'
		.. dsc.text .. ':' .. val .. '|action=edit}} <span class="iconify" data-icon="mdi:lead-pencil"></span>]</div>\n' )
	if mw.title.new( dsc.text .. ':' .. val, 'НКВД' ).exists then
		table.insert( out, '{{НКВД:' .. dsc.text .. ':' .. val .. '}}\n' )
	elseif ctg == 'segment' and string.find( val, 'дивизия', 1, true ) or string.find( val, 'бригада', 1, true ) or string.find( val, 'корпус', 1, true ) then
		local tmp = string.gsub( val, ' (авиа[^ ]+)', { ['авиадивизия'] = ' авиационная дивизия', ['авиабригада'] = ' авиационная бригада', ['авиакорпус'] = ' авиационный корпус', }, 1 )
		tmp = string.gsub( tmp, 'Войска Польского', '(Войско Польское)', 1 )
		tmp = string.gsub( tmp, 'мотоштурмовая', 'моторизованная штурмовая', 1 )
		tmp = string.gsub( tmp, 'мотоинженерная', 'моторизованная инженерная', 1 )
		tmp = string.gsub( tmp, ' ПТО', ' противотанковой обороны', 1 )
		table.insert( out, '<i>Информацию о соединении см. в [[rkka:' .. tmp .. '|указателе частей и соединений РККА]].</i><br>' )
	end

	local valCond
	if ctg == 'rank' then
		local a, b = string.match( val, '^(.+) %((.+)%)$' )
		if a then
			valCond = 'rank="' .. a .. '"' .. ( rankDia[b] or '' ) -- для кривых nil
		else
			valCond = 'rank="' .. val .. '"'
		end
	elseif ctg == 'segment' then
		local sub = require( 'Module:CatNav/segment/sub' )
		local upVal = mw.ustring.upper( val )
		local replace
		if not sub[upVal] then
			for main, subs in pairs( sub ) do
				for _, el in ipairs( subs ) do
					if el == upVal then
						replace = main
						break
					end
				end
			end
		else
			replace = upVal
		end
		if replace then
			valCond = '( segment="' .. replace .. '" OR segment="' .. table.concat( sub[replace], '" OR segment="' ) .. '" )'
		else
			valCond = 'segment="' .. val .. '"'
		end
	else
		valCond = 'award="' .. val .. '"'
	end


	if ( letter or '' ) == '' and ( year or '' ) == '' and start == '' and stop == '' then
		local counterRq = mw.ext.externalData.getExternalData( {
				db='cargoview',
				from = 'aa_szr__' .. dsc.table .. '_counter',
				data = 'persons, total',
				limit = 100,
				where = valCond,
		} )
		local persons, total = 0, 0
		for _, row in ipairs( counterRq ) do
			persons = persons + row.persons
			total = total + row.total
		end
		local hron
		if ctg == 'segment' then
			hron = ' &nbsp; [' .. mw.site.server .. '/index.php/НКВД:Хронология?segment=' .. string.gsub( val, ' ', '%%20' ) .. ' <i>Показать упоминания должностей в хронологическом порядке</i>].'
		end
		table.insert( out, '<p>Всего персоналий: ' .. persons .. ', число ' .. dsc.counter .. ': ' .. total .. '.' .. ( hron or '' ) .. '</p>' )
	end

	local url = mw.title.getCurrentTitle().prefixedText

	do --letters
		table.insert( out, '<div class="nkvd-taba" id="nkvd-ltr-tab">' )
		local baseurl = tostring( mw.uri.fullUrl( url, { class = ctg, value = val, year = year } ) )
		local tmp
		if ( letter or '' ) == '' then
			tmp = ' nkvd-taba-el-cur'
		else
			tmp = ''
		end
		table.insert( out, '<div class="nkvd-taba-el' .. tmp ..'">[' .. baseurl .. ' Все]</div>' )

		local letters = { 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Э', 'Ю', 'Я', }
		for _, ltr in ipairs( letters ) do
			if ltr == letter then
				tmp = ' nkvd-taba-el-cur'
			else
				tmp = ''
			end
			table.insert( out, '<div class="nkvd-taba-el' .. tmp ..'">[' .. baseurl
				.. '&letter=' .. mw.uri.encode(ltr) .. '#nkvd-ltr-tab ' .. ltr .. ']</div>' )
		end
		table.insert( out, '</div>\n' )
	end -- letters

	do --years
		table.insert( out, '<div class="nkvd-taba" id="nkvd-year-tab" style="font-size:80%"><tr>' )
		local baseurl = tostring( mw.uri.fullUrl( url, { class = ctg, value = val, letter = letter } ) )
		local tmp
		if ( year or '' ) == '' then
			tmp = ' nkvd-taba-el-cur'
		else
			tmp = ''
		end
		table.insert( out, '<div class="nkvd-taba-el' .. tmp ..'">[' .. baseurl .. ' Все]</div>' )

		local letters = { '1918-1923', '1924-1929', '1930-1934', '1935', '1936', '1937', '1938', '1939', '1940', '1941', '1942', '1943', '1944', '1945', '1946', '1947', '1948', '1949', '1950', '1951', '1952', '1953', '1954-1956', '1957-1999', '?',  }
		local start = 1
		if ctg == 'rank' then
			start = 4
		else
			start = 1
		end
		for i = start, #letters do
			local ltr = letters[i]
--		for _, ltr in ipairs( letters ) do
			if ltr == year then
				tmp = ' nkvd-taba-el-cur'
			else
				tmp = ''
			end
			table.insert( out, '<div class="nkvd-taba-el' .. tmp ..'">[' .. baseurl
				.. '&year=' .. mw.uri.encode(ltr) .. '#nkvd-year-tab ' .. ltr .. ']</div>' )
		end
		table.insert( out, '</div>\n' )
	end -- years

	local where = { valCond }
	local order
	if ( letter or '' ) ~= '' then
		table.insert( where, 'fullname LIKE "' .. letter .. '%"' )
	end
	if ( stop or '' ) ~= '' then
		table.insert( where, 'fullname < "' .. stop .. '"' )
		order = ' DESC'
	elseif ( start or '' ) ~= '' then
		table.insert( where, 'fullname > "' .. start .. '"' )
	end
	if ( year or '' ) ~= '' then
		if year == '?' then
			table.insert( where, 'date IS NULL' )
		else
			if string.match( year, '^19%d%d$' ) then
				table.insert( where, 'date LIKE "' .. year .. '%"' )
			else
				local a, b = string.match( year, '^(19%d%d)%-(19%d%d)$' )
				if a then
					table.insert( where, 'date >= "' .. a .. '" AND date < "' .. ( b + 1 ) .. '"' )
				end
			end
		end
	end

	where = table.concat( where, ' AND ' )

	local rq = mw.ext.externalData.getExternalData( {
			db = 'cargoview',
			from = 'aa_szr__' .. dsc.table,
			where = where,
			['order by'] = 'fullname' .. ( order or '' ),
			limit = LIMIT + 1,
			['group by'] = 'fullname',
			data = 'fullname',
	} )
	local more = #rq == LIMIT+1
	rq[LIMIT+1] = nil
	if order then
		for i = 1, #rq/2 do
			rq[i], rq[#rq-i+1] = rq[#rq-i+1], rq[i]
		end
	end

	local diagnose, prevP, nextP
	if #rq == 0 then
		diagnose = 'Нет персоналий по этому запросу'
	elseif start == '' and stop == '' then
		nextP = more
	elseif start ~= '' then
		prevP = true
		nextP = more
	else
		prevP = more
		nextP = true
	end

	if #rq == 0 then
		start, stop = stop, start
	else
		start, stop = rq[#rq].fullname, rq[1].fullname
	end

	local pager = { '<br style=clear:both>' }
	if prevP then
		table.insert ( pager, '<div style="float:left"> ['
			.. tostring( mw.uri.fullUrl( url, { class = ctg, value = val, to = rq[1].fullname, letter = letter, year = year } ) )
			.. '#nkvd-ltr-tab (предыдущая страница)] </div>' )
	end
	if nextP then
		table.insert ( pager, '<div style="float:right"> ['
			.. tostring( mw.uri.fullUrl( url, { class = ctg, value = val, from = rq[#rq].fullname, letter = letter, year = year } ) )
			.. '#nkvd-ltr-tab (следующая страница)] </div>' )
	end
	table.insert ( pager, '<br style=clear:both>' )
	pager = table.concat( pager )

	table.insert( out, pager )

	if diagnose then
		table.insert( out, '<p>' .. diagnose .. '</p>\n' )
	end

	table.insert( out, '<div style="columns: 4 20em; -moz-columns:4 20em; -webkit-columns: 4 20em;">\n' )
	for _, person in ipairs( rq ) do
		table.insert( out, '* [[' .. person.fullname .. ']]\n'	)
	end
	table.insert( out, '</div>' )
	table.insert( out, pager )
	return table.concat( out )
end

function p.Nav( frame )
	local args = frame.args
	local ctg, val, start, stop, letter, year
		= mw.text.trim( args[1] ), mw.text.trim( mw.uri.decode( args[2] ) ),
			mw.text.trim( mw.uri.decode( args[3] ) ), mw.text.trim( mw.uri.decode( args[4] ) ),
			mw.text.trim( mw.uri.decode( args[5] ) ), mw.text.trim( mw.uri.decode( args[6] ) )

	return frame:preprocess( nav( ctg, val, start, stop, letter, year ) )
end


-- Список значений (Персоналии по званиям (местам службы, наградам)
function p.Cat( frame )
	local class = mw.ext.luaglobal.get( 'CatClass' )
	local args = frame:getParent().args
	local value = mw.text.trim( args[1] or '' )
	if not class then
		mw.ext.luaglobal.set( 'CatClass', value )
--		mw.ext.luaglobal.set( 'CatClassValue', { 0 } )
		return ''
	end

	local text = mw.text.trim( args[2] or '' )

	local tablo = mw.loadData( 'Module:CatNav/' .. class )
	local checking = mw.title.getCurrentTitle().subpageText == 'вне перечня'
	local tabloValue
	if class == 'segment' then
		tabloValue = tablo[mw.ustring.upper(value)]
	else
		tabloValue = tablo[value]
	end

	if value ~= '' then
		if text == '-' then
--				return tablo[value] or '—'
			return '[' .. tostring( mw.uri.fullUrl( 'НКВД:Выборка', { class = class, value = value } ) )
				.. ' ' .. (tabloValue or '—') .. ']'
		end
		text = text or ''
		if string.match( text, '%%' ) then
			return mw.ustring.gsub( text, '%%[ln]',
				{ 	['%l'] = tostring( mw.uri.fullUrl( 'НКВД:Выборка', { class = class, value = value } ) ),
					['%n'] = tabloValue or 0 , } ) .. ''
		end

		if text == '' then
			text = value
		end

		if tabloValue then

			mw.ext.luaglobal.add( 'CatClassValue', value )
			if checking then
				return
			end
			return '[' .. tostring( mw.uri.fullUrl( 'НКВД:Выборка', { class = class, value = value } ) )
				.. ' ' .. text .. '] (' .. tabloValue .. ')'
		else
			if checking then
				return
			end
			return '<span style="color:red">' .. value .. '</span> (—)'
		end
	end
	local tablus = mw.ext.luaglobal.get( 'CatClassValue' )
	local flip = {}
	for _,v in ipairs( tablus ) do
		flip[v] = true
	end
	tablus = {}
	for v,n in pairs( tablo ) do
		if not flip[v] then
			tablus[#tablus+1] = '[' .. tostring( mw.uri.fullUrl( 'НКВД:Выборка', { class = class, value = v } ) )
				.. ' ' .. v .. '] (' .. n .. ')'
		end
	end
	if #tablus ~= 0 then
		table.sort( tablus )
		return 'Отсутствуют в перечне (' .. #tablus .. '): ' .. table.concat( tablus, ', ' )
	end
	return ''
end

return p