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

Материал из Кадровый состав НКВД 1935-1939
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
(не показано 40 промежуточных версий этого же участника)
Строка 1: Строка 1:
local p = {}
local p = {}


function p.loop( frame )
local args = frame:getParent().args
return p._loop( args )
end
function p.Loop( frame )
local args = frame.args
return p._loop( args )
end
function p._loop( args )
local start, finish, text, comment = tonumber( args[2] ), tonumber( args[3] )
if not finish then
start = mw.text.trim( args[2] )
text = args['текст']
comment = args['подсказка']
end
local prefix, postfix = mw.text.trim( args[1] or '' ), mw.text.trim( args[4] or '' )
if prefix ~= '' then
prefix = prefix .. ' '
end
if postfix ~= '' then
postfix = ' ' .. postfix
end
local prefixURL, postfixURL = mw.uri.encode( prefix ), mw.uri.encode( postfix )
local mode = mw.text.trim( args['формат'] or 'номерМС' )
local class = mw.text.trim( args['class'] or '' )
if class == '' then
class = 'military-main'
end
local attr = mw.text.trim( args['attr'] or '' )
local tablo = mw.loadData( 'Module:CatNav/segment' )
function processUnit( unit )
if mode == 'номерМС' then
local label = text or unit
if comment then
label = '<abbr title="' .. comment .. '">' .. label .. '</abbr>'
end
if unit == '' then
return '<td class="military-number ' .. class .. '" ' .. attr ..'>' .. label .. '</td>'
end
return '<td class="military-number ' .. class .. '" ' .. attr ..'>['
.. tostring( mw.uri.fullUrl( 'НКВД:Выборка', { class = 'segment', value = prefix .. unit .. postfix } ) )
.. ' <span class=military-number>' .. label .. '</span>]</td>\n'
elseif mode == 'числоМС' then
if unit == '' then
return '<td class="military-quantity ' .. class .. '" ' .. attr ..'>' .. ( text or '' ) .. '</td>'
end
local z = tablo[prefix .. unit .. postfix]
if z then
mw.ext.luaglobal.add( 'CatClassValue', prefix .. unit .. postfix )
end
return '<td class="military-quantity ' .. class .. '" ' .. attr ..'>' -- '>[' 
-- .. tostring( mw.uri.fullUrl( 'НКВД:Выборка', { class = 'segment', value = prefix .. unit .. postfix } ) )
.. ' <span class="military-quantity>' .. ( z or '<span style="color:red">0</span>' ) .. '</span></td>\n' -- '</span>]</td>\n'
end
end
local out = ''
if finish then
for unit = start, finish do
out = out .. processUnit( unit )
end
else
out = processUnit( start )
end
return out
end
--[===[
--[===[
prev | start | stop | post
prev | start | stop | post
могут использоваться при единственном элементе (если отсутствует stop)
могут использоваться при единственном элементе (если отсутствует stop)
* текст = показываемый текст
* текст = показываемый текст
* подсказка = подсказка к тексту  
* подсказка = подсказка к тексту
цвет = 0 (по умолчанию), 1, 2, г
цвет = 1 (по умолчанию), 2, 3, 9
формат = стандарт (по умолчанию), заголовок (узкая полоска), раздел (стандартная высота, сдвиг вправо)
формат = стандарт (по умолчанию), заголовок (узкая полоска), раздел (стандартная высота, сдвиг вправо)
шрифт = стандарт (по умолчанию), мелко (80%), хх%
шрифт = стандарт (по умолчанию), мелко (80%), хх%
размер = число колонок
размер = число колонок
--]===]
--]===]
local function miliLink( unit )
-- return tostring( mw.uri.fullUrl( 'НКВД:Выборка', { class = 'segment', value = unit } ) )
return mw.site.server .. '/segment/' .. string.gsub( unit, ' ', '%%20' )
end


local function parseList( list )
local function parseList( list )
Строка 99: Строка 35:
return out
return out
end
end


function p.Unit( frame )
function p.Unit( frame )
Строка 116: Строка 47:
['раздел'] = 'mil-chapter',
['раздел'] = 'mil-chapter',
}
}
local modeDivCSS = {
['стандарт'] = '',
['заголовок'] = 'height: auto;',
['раздел'] = '',
}
local tablo = mw.loadData( 'Module:CatNav/segment' )
local tablo = mw.loadData( 'Module:CatNav/segment' )
local prefix, units, postfix  
local checking = mw.title.getCurrentTitle().subpageText == 'вне перечня'
= mw.text.trim( args[1] or '' ), parseList( args[2] ), mw.text.trim( args[3] or '' )
 
local prefix, units, postfix
= mw.text.trim( args[1] or '' ), parseList( args[2] or '' ), mw.text.trim( args[3] or '' )
local text, comment
local text, comment
if #units <= 1 then
if #units <= 1 then
text = args['текст']
text = args['текст']
comment = args['подсказка']  
comment = args['подсказка']
end
end
 
if prefix ~= '' then
if prefix ~= '' then
prefix = prefix .. ' '
prefix = prefix .. ' '
Строка 131: Строка 70:
postfix = ' ' .. postfix
postfix = ' ' .. postfix
end
end
 
local width = ( args['размер'] or 1 ) * 29 - 1
local width = ( args['размер'] or 1 ) * 29 - 1
 
local mode = mw.text.trim( args['формат'] or '' )
local mode = mw.text.trim( args['формат'] or '' )
local modeCSSadd = modeDivCSS[mode] or ''
mode = modeClasses[mode] or 'mil-error'
mode = modeClasses[mode] or 'mil-error'
 
local color = tonumber( args['цвет'] or 1 ) or 1
local guard = args['гв']
if guard then
guard = 'mil-cg '
else
guard = ''
end
 
local fontSize = args['шрифт'] or '100'
if mw.ustring.sub( fontSize, 1, 3 ) == 'мел' then
fontSize = '80'
elseif mw.ustring.sub( fontSize, -1, -1 ) == '%' then
fontSize =  mw.ustring.sub( fontSize, 1, -2 )
end
if fontSize == '100' then
fontSize = ''
else
fontSize = 'font-size:' .. fontSize ..'%'
end
local class = args.class or ''
 
local function processUnit( unit )
local function processUnit( unit )
local label = text or unit
local label = text or unit
Строка 142: Строка 103:
label = '<abbr title="' .. comment .. '">' .. label .. '</abbr>'
label = '<abbr title="' .. comment .. '">' .. label .. '</abbr>'
end
end
if unit == '' then
if unit == '0' then
return '<div class="mil-div ' .. mode .. '" style="width: ' .. width .. 'px;' .. (args[divcss] or '') .. '"><div class="mil-number">' .. label .. '</div></div>'
label = ''
end
if unit == '' or unit == '0' then
if checking then
return ''
end
return '<div class="mil-div mil-c' .. color .. ' ' .. guard .. class
.. '" style="width: ' .. width .. 'px; ' .. modeCSSadd
.. (args.divcss or '') .. '"><div class="' .. mode
.. '" style="width: ' .. width .. 'px;' .. fontSize .. '">'
.. label .. '</div></div>'
end
end
local z = tablo[prefix .. unit .. postfix]
local z = tablo[prefix .. unit .. postfix]
if z then  
if z then
mw.ext.luaglobal.add( 'CatClassValue', prefix .. unit .. postfix )
mw.ext.luaglobal.add( 'CatClassValue', prefix .. unit .. postfix )
end
end
return '<div class="mil-div" style="width: ' .. width .. 'px;"><div class="mil-number">['  
if checking then
.. tostring( mw.uri.fullUrl( 'НКВД:Выборка', { class = 'segment', value = prefix .. unit .. postfix } ) )
return ''
end
return '<div class="mil-div mil-c' .. color .. ' ' .. guard .. class .. '" style="width: ' .. width
.. 'px; ' .. (args.divcss or '') .. '"><div class="mil-number" style="' .. fontSize .. '">['
.. miliLink( prefix .. unit .. postfix )
.. ' ' .. label .. ']</div><div class="mil-quantity">' .. ( z or '<span style="color:red">0</span>' ) .. '</div></div>'
.. ' ' .. label .. ']</div><div class="mil-quantity">' .. ( z or '<span style="color:red">0</span>' ) .. '</div></div>'
end
end
 
local out = {}
local out = {}
 
if #units > 0 then
if #units > 0 then
for _, unit in ipairs( units ) do
for _, unit in ipairs( units ) do
Строка 164: Строка 139:
out = processUnit( '' )
out = processUnit( '' )
end
end
 
return out
return out
end
end
p['ВЧ'] = function ( frame )
local args = frame:getParent().args
local x = mw.text.trim( args[1] or '' )
if x == 'начало' then
return '<div class=mil-block><div style=display:none>'
elseif x == 'конец' then
return '</div></div>'
else
return '</div>' .. p._unit( args ) .. '<div style=display:none>'
end
end
p['вч'] = function ( frame )
local args = frame.args
local x = mw.text.trim( args[1] or '' )
if x == 'начало' then
return '<div class=mil-block><div style=display:none>'
elseif x == 'конец' then
return '</div></div>'
else
return '</div>' .. p._unit( args ) .. '<div style=display:none>'
end
end
p['отд'] = function ( frame )
local checking = mw.title.getCurrentTitle().subpageText == 'вне перечня'
local args = frame.args
local x = mw.text.trim( args[1] or '' )
local tablo = mw.loadData( 'Module:CatNav/segment' )
local z = tablo[x]
if z then
mw.ext.luaglobal.add( 'CatClassValue', x )
end
if checking then
return ''
end
if ( z or 0 ) == 0 then
z = '—'
end
return '[' .. miliLink( x ) .. ' ' .. x .. '] (' .. z .. ')'
end
p['_список'] = function ( args )
local checking = mw.title.getCurrentTitle().subpageText == 'вне перечня'
local ptn = args['формат'] or '%t (%n)\n'
local tablo = mw.loadData( 'Module:CatNav/segment' )
local out = {}
for _, x in ipairs( args ) do
x = mw.text.trim( x )
if x ~= '' then
local shift, val = string.match( x, '^([%*: ]+)(.+)$' )
if not shift then
shift = '* '
val = x
end
x, val = val, string.gsub( val, "'", '' ) -- чтобы легко вставлять курсив/жирный
local z = tablo[val]
if z then
mw.ext.luaglobal.add( 'CatClassValue', val )
end
if ( z or 0 ) == 0 then
z = '—'
end
local el = shift .. string.gsub( ptn, '(%%.)', {
['%%'] = '%',
['%t'] = '[' .. miliLink( val ) .. ' ' .. x .. ']',
['%n'] = z,
['%l'] = '\n',
} )
table.insert( out, el )
end
end
if checking then
return ''
end
return table.concat( out )
end
p['список'] = function ( frame )
return p['_список']( frame.args )
end
p['Список'] = function ( frame )
return p['_список']( frame:getParent().args )
end
p['Остаток'] = function ( frame )
local used = mw.ext.luaglobal.get( 'CatClassValue' )
local tablo = mw.loadData( 'Module:CatNav/segment' )
local syn = mw.loadData( 'Module:CatNav/segment/sub' )
local revert = {}
for _, u in ipairs( used ) do
revert[u] = true
if syn[u] then
for _, v in ipairs( syn[u] ) do
revert[v] = true
end
end
end
local unused = {}
for u, n in pairs( tablo ) do
if not revert[u] then
table.insert( unused, '[' .. miliLink( u ) .. ' ' .. u .. '] (' .. n .. ')' )
end
end
table.sort( unused )
return 'Отсутствуют в перечне (' .. #unused .. '/' .. #used .. '): ' .. table.concat( unused, ', ' )
end


return p
return p

Версия от 11:18, 27 марта 2019

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

local p = {}

--[===[
prev | start | stop | post
могут использоваться при единственном элементе (если отсутствует stop)
* текст = показываемый текст
* подсказка = подсказка к тексту
цвет = 1 (по умолчанию), 2, 3, 9
формат = стандарт (по умолчанию), заголовок (узкая полоска), раздел (стандартная высота, сдвиг вправо)
шрифт = стандарт (по умолчанию), мелко (80%), хх%
размер = число колонок
--]===]

local function miliLink( unit )
--	return tostring( mw.uri.fullUrl( 'НКВД:Выборка', { class = 'segment', value = unit } ) )
	return mw.site.server .. '/segment/' .. string.gsub( unit, ' ', '%%20' )
end

local function parseList( list )
	local out = {}
	for x in mw.text.gsplit( list, ',', true ) do
		local start,finish = string.match(x,'^%s*(%d+)%s*%-%s*(%d+)%s*$')
		if start then
			start, finish = tonumber( start ), tonumber( finish )
			for u = start, finish do
				out[#out+1] = u
			end
		else
			x = mw.text.trim( x )
			if x ~= '' then
				out[#out+1] = x
			end
		end
	end
	return out
end

function p.Unit( frame )
	local args = frame.args
	return p._unit( args )
end

function p._unit( args )
	local modeClasses = {
		['стандарт'] = '',
		['заголовок'] = 'mil-header',
		['раздел'] = 'mil-chapter',
	}
	local modeDivCSS = {
		['стандарт'] = '',
		['заголовок'] = 'height: auto;',
		['раздел'] = '',
	}

	local tablo = mw.loadData( 'Module:CatNav/segment' )
	local checking = mw.title.getCurrentTitle().subpageText == 'вне перечня'

	local prefix, units, postfix
		= mw.text.trim( args[1] or '' ), parseList( args[2] or '' ), mw.text.trim( args[3] or '' )
	local text, comment
	if #units <= 1 then
		text = args['текст']
		comment = args['подсказка']
	end

	if prefix ~= '' then
		prefix = prefix .. ' '
	end
	if postfix ~= '' then
		postfix = ' ' .. postfix
	end

	local width = ( args['размер'] or 1 ) * 29 - 1

	local mode = mw.text.trim( args['формат'] or '' )
	local modeCSSadd = modeDivCSS[mode] or ''
	mode = modeClasses[mode] or 'mil-error'

	local color = tonumber( args['цвет'] or 1 ) or 1
	local guard = args['гв']
	if guard then
		guard = 'mil-cg '
	else
		guard = ''
	end

	local fontSize = args['шрифт'] or '100'
	if mw.ustring.sub( fontSize, 1, 3 ) == 'мел' then
		fontSize = '80'
	elseif mw.ustring.sub( fontSize, -1, -1 ) == '%' then
		fontSize =  mw.ustring.sub( fontSize, 1, -2 )
	end
	if fontSize == '100' then
		fontSize = ''
	else
		fontSize = 'font-size:' .. fontSize ..'%'
	end
	local class = args.class or ''

	local function processUnit( unit )
		local label = text or unit
		if comment then
			label = '<abbr title="' .. comment .. '">' .. label .. '</abbr>'
		end
		if unit == '0' then
			label = ''
		end
		if unit == '' or unit == '0' then
			if checking then
					return ''
			end
			return '<div class="mil-div mil-c' .. color .. ' ' .. guard .. class
				.. '" style="width: ' .. width .. 'px; ' .. modeCSSadd
				.. (args.divcss or '') .. '"><div class="' .. mode
				.. '" style="width: ' .. width .. 'px;' .. fontSize .. '">'
				.. label .. '</div></div>'
		end
		local z = tablo[prefix .. unit .. postfix]
		if z then
			mw.ext.luaglobal.add( 'CatClassValue', prefix .. unit .. postfix )
		end
		if checking then
				return ''
		end
		return '<div class="mil-div mil-c' .. color .. ' ' .. guard .. class .. '" style="width: ' .. width
			.. 'px; ' .. (args.divcss or '') .. '"><div class="mil-number" style="' .. fontSize .. '">['
			.. miliLink( prefix .. unit .. postfix )
			.. ' ' .. label .. ']</div><div class="mil-quantity">' .. ( z or '<span style="color:red">0</span>' ) .. '</div></div>'
	end

	local out = {}

	if #units > 0 then
		for _, unit in ipairs( units ) do
			out[#out+1] = processUnit( unit )
		end
		out = table.concat( out )
	else
		out = processUnit( '' )
	end

	return out
end

p['ВЧ'] = function ( frame )
	local args = frame:getParent().args
	local x = mw.text.trim( args[1] or '' )
	if x == 'начало' then
		return '<div class=mil-block><div style=display:none>'
	elseif x == 'конец' then
		return '</div></div>'
	else
		return '</div>' .. p._unit( args ) .. '<div style=display:none>'
	end
end

p['вч'] = function ( frame )
	local args = frame.args
	local x = mw.text.trim( args[1] or '' )
	if x == 'начало' then
		return '<div class=mil-block><div style=display:none>'
	elseif x == 'конец' then
		return '</div></div>'
	else
		return '</div>' .. p._unit( args ) .. '<div style=display:none>'
	end
end

p['отд'] = function ( frame )
	local checking = mw.title.getCurrentTitle().subpageText == 'вне перечня'
	local args = frame.args
	local x = mw.text.trim( args[1] or '' )
	local tablo = mw.loadData( 'Module:CatNav/segment' )
	local z = tablo[x]
	if z then
		mw.ext.luaglobal.add( 'CatClassValue', x )
	end
	if checking then
		return ''
	end
	if ( z or 0 ) == 0 then
		z = '—'
	end
	return '[' .. miliLink( x ) .. ' ' .. x .. '] (' .. z .. ')'
end

p['_список'] = function ( args )
	local checking = mw.title.getCurrentTitle().subpageText == 'вне перечня'
	local ptn = args['формат'] or '%t (%n)\n'
	local tablo = mw.loadData( 'Module:CatNav/segment' )
	local out = {}
	for _, x in ipairs( args ) do
		x = mw.text.trim( x )
		if x ~= '' then
			local shift, val = string.match( x, '^([%*: ]+)(.+)$' )
			if not shift then
				shift = '* '
				val = x
			end
			x, val = val, string.gsub( val, "'", '' ) -- чтобы легко вставлять курсив/жирный
			local z = tablo[val]
			if z then
				mw.ext.luaglobal.add( 'CatClassValue', val )
			end
			if ( z or 0 ) == 0 then
				z = '—'
			end
			local el = shift .. string.gsub( ptn, '(%%.)', {
				['%%'] = '%',
				['%t'] = '[' .. miliLink( val ) .. ' ' .. x .. ']',
				['%n'] = z,
				['%l'] = '\n',
			} )
			table.insert( out, el )
		end
	end
	if checking then
		return ''
	end

	return table.concat( out )
end

p['список'] = function ( frame )
	return p['_список']( frame.args )
end

p['Список'] = function ( frame )
	return p['_список']( frame:getParent().args )
end

p['Остаток'] = function ( frame )
	local used = mw.ext.luaglobal.get( 'CatClassValue' )
	local tablo = mw.loadData( 'Module:CatNav/segment' )
	local syn = mw.loadData( 'Module:CatNav/segment/sub' )
	local revert = {}
	for _, u in ipairs( used ) do
		revert[u] = true
		if syn[u] then
			for _, v in ipairs( syn[u] ) do
				revert[v] = true
			end
		end
	end
	local unused = {}
	for u, n in pairs( tablo ) do
		if not revert[u] then
			table.insert( unused, '[' .. miliLink( u ) .. ' ' .. u .. '] (' .. n .. ')' )
		end
	end
	table.sort( unused )
	return 'Отсутствуют в перечне (' .. #unused .. '/' .. #used .. '): ' .. table.concat( unused, ', ' )
end



return p