Модуль:Документ

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

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

local pp = {}
local global = mw.ext.luaglobal;
local tools = require( 'Модуль:Tools' )  -- нужен в doctools
local refTools = require( 'Модуль:RefTools' )  -- нужен в doctools
local doctools = require 'Module:DocTools'


pp[''] = function ( frame )
	local Args, tmp = tools.checkargs( frame:getParent().args,
        { ['номер'] = '', ['дата'] = '', ['вид'] = '', ['вид+'] = true,
-- 26.07.2017 отказываемся от потока            ['структура'] = 'иерархия',
            ['комментарий'] = true, ['сноска'] = true, ['каждому'] = true,
            ['содержание'] = 'текст', ['заголовок'] = true, ['выключен'] = true,
            ['публикация'] = true, ['источник'] = true, ['архив'] = true,
            ['подвиг'] = true, ['указ'] = true, } )
	local errorDateAdvice = 'Используйте формат даты '
		.. '«<var>ЧЧ</var>.<var>ММ</var>.<var>ГГГГ</var>» или '
		.. '«<var>ММ</var>.<var>ГГГГ</var>» или «<var>ГГГГ</var>»'
    if not Args then
		return tools.errorMsg( 'Документ', 'Неизвестный параметр «' .. tmp .. '»', '' )
    end


	local gDoc = global.get( 'gDoc' )
	if gDoc then
		return tools.errorMsg ( 'Документ', 'Повторное использование шаблона «Документ»' )
	end
	local docOff = Args['выключен']
	if mw.ustring.lower( docOff or '' ) == 'да' then
		docOff = 'Формирование сведений о персоналиях на основании данного документа отключено'
	end

	local DocName = mw.title.getCurrentTitle().text
	local name, idx, part, parts = mw.ustring.match( DocName, "^(.+) (%([IVX]+%)) [—−-] часть (%d+) из (%d+)$" )
	if not name then
		name, part, parts = mw.ustring.match( DocName, "^(.+) [—−-] часть (%d+) из (%d+)$" )
	end
	if not name then
		name, idx = mw.ustring.match( DocName, "^(.+) (%(.+%))$" )
	end
	local DocInfo
	if idx then
		DocInfo = 'Имеются [' .. tostring( mw.uri.fullUrl( 'Special:PrefixIndex', {
				prefix = name,
				namespace = 3008,
			} ) )
			.. ' другие документы] с такими же реквизитами.'
		name = name .. ' ' .. idx
	end
	if parts then
		DocInfo = 'Из-за большого объема настоящий документ разделен на ['
			.. tostring( mw.uri.fullUrl( 'Special:PrefixIndex', {
				prefix = name,
				namespace = 3008,
			} ) )
			.. ' несколько частей]. ' .. ( DocInfo or '' )
	end

	local docNumber = Args['номер']
	local docDate =  Args['дата']
	if docNumber == '~' then
		docNumber = mw.ustring.match( DocName, ' № ([^ ]+) ' ) or mw.ustring.match( DocName, ' № ([^ ]+)$' )
		if not docNumber and not string.find(DocName, '№', 1, true ) then
			docNumber = '-'
		end
	end
	if docDate == '~' then
		docDate = mw.ustring.match( DocName, ' от (%d%d%.%d%d%.%d%d%d%d)' )
	end
	if not docDate or not docNumber then
		return tools.errorMsg ( 'Документ', 'Для даты или номера документа использовано значение «~», но заголовок разобрать не удалось' )
	end


	if docNumber == '-' then
		docNumber = ''
	end

	docDate = tools.parseDate( docDate )
	if not docDate then
		return tools.errorMsg ( 'Документ', 'Неправильный формат даты документа', errorDateAdvice )
	end

	local types = mw.loadData( 'Модуль:Документ/Виды документов' )
	local docType = tools.db( types, tools.noPhrase( Args['вид'] ) )

	if not docType then
		return tools.errorMsg ( 'Документ',
			'Параметр «вид» должен указывать один из допустимых видов документов',
			'Перечень допустимых видов документов см. [[Модуль:Документ/Виды документов|тут]]' )
	end
	local docTypeName = docType.hdr
	local vovCtg
	tmp = Args['вид+']
	if tmp then
		if tmp == '~' then
			tmp = mw.ustring.match( DocName, '^Приказ войскам ([^№]+) №' )
			if not tmp then
				local weapon
				weapon, tmp = mw.ustring.match( DocName, '^Приказ командующего (артиллерией) ([^№]+) №' )
				if not weapon then
					weapon, tmp = mw.ustring.match( DocName, '^Приказ командующего (бронетанковыми и механизированными войсками) ([^№]+) №' )
				end
				if not weapon then
					return tools.errorMsg ( 'Документ', 'Для параметра «вид+» использовано значение «~», но заголовок разобрать не удалось' )
				end
				docType = tools.db( types, tools.noPhrase( 'приказ командующего' ) )
				docTypeName = docType.hdr
				vovCtg = 'Приказы ' .. tmp
				tmp = weapon .. ' ' .. tmp
			else
				vovCtg = 'Приказы ' .. tmp
			end
		end
		docTypeName = docTypeName .. ' ' .. tmp
	end
---	local defSort = docType.sort .. string.sub(docDate .. '----------', 1, 7 )
---	if mw.ustring.len( docNumber ) < 5 then
---		defSort = defSort .. mw.ustring.sub( '----' .. docNumber, -4, -1 )
---	end

--	local defSort = string.sub(docDate .. '----------', 1, 10 )
	local defSort = string.char( 0x30 + tonumber( '0' .. string.sub( docDate, 9, 10 ) ) )
	frame:callParserFunction{ name = 'DEFAULTSORT', args = ' ' .. defSort .. mw.title.getCurrentTitle().text }

	local docRevers = mw.ustring.lower( Args['содержание'] )

	local docOrigin = {
		['реверс'] =     'содержание документа восстановлено на основании биографических справок',
		['извлечение'] = 'извлечение из документа, приводится в изложении',
		['текст'] =      'содержание документа приводится в изложении',
	}
	docOrigin = docOrigin[docRevers]
	if not docOrigin then
		return tools.errorMsg ( 'Документ',
			'Параметр «содержание» может иметь значения «реверс», «извлечение» или «текст»',
			'Значение «реверс» указывается для документов, восстановленных по'
				.. ' биографическим справкам, «извлечение» или «текст» — при '
				.. ' при воспроизведении текста документа' )
	end

-- 26.07.2017 отказываемся от потока 	local docStream = mw.ustring.lower( Args['структура'] )
	local docStream = 'иерархия'
	if docStream == 'поток' then
		docStream = true
	elseif docStream == 'иерархия' then
		docStream = false
	else
		return tools.errorMsg ( 'Документ',
			'Параметр «структура» может иметь значения «поток» или «иерархия»',
			'Значение «поток» указывается для документов, в которых рубрики '
				.. ' не образуют вложенность' )
	end

	local out = ''
	if DocInfo then
		out = '<p class="nkvd-doc-parts>' .. DocInfo .. '</p>'
	end
	if docOff then
		out = out .. '<p class="nkvd-doc-off>' .. docOff .. '</p>[[Категория:Выключенные документы]]'
	end
	if vovCtg then
		out = out .. '[[Категория:' .. vovCtg .. '|' .. string.sub(docDate,4,4) .. docDate .. ']]'
	end

	local ukdate = Args['указ']
	if ukdate then
		ukdate = tools.parseDate( ukdate )
		out = out .. [[
<p class="nkvd-griph">Утвержден Указом Президиума Верховного Совета СССР от <b>]]
			.. tools.reparseDate( ukdate ) .. [[</b></p>]]
	end

	out = out .. [[
<p class="nkvd-doc-header">]] .. docTypeName .. [[</p>]]
	if docDate ~= '' or docNumber ~= '' then
		out = out .. [[
<p class="nkvd-doc-attr">]]
		tmp = {}
		if docNumber ~= '' then
			tmp[#tmp+1] =  [[№ <b>]] .. docNumber .. [[</b>]]
			if docType.ctg == 'Указы Президиума Верховного Совета СССР' then
				if string.sub( docNumber, 1, 2 ) == '60' then
					tmp[#tmp] = '<abbr title="До середины 1943 года указы не имели собственной нумерации; указан номер канцелярского дела с материалами указа.">' .. tmp[#tmp] .. '</abbr>'
				elseif string.find( docNumber, '=', 1, true ) then
					tmp[#tmp] = '<abbr title="В оригинале указа номер исправлен, но указ фигурировал под первоначальным номером (указан после «=») при рассылке по ведомствам.">' .. tmp[#tmp] .. '</abbr>'
				end
			end
		end
		if docDate then
			tmp[#tmp+1] =  [[<b>]] .. tools.textDate( docDate ) .. [[</b>]]
		end
		out = out .. table.concat( tmp, ', &nbsp; ' ) .. [[</p>
]]
	end
	if Args['заголовок']  then
		out = out .. '<p class="nkvd-doc-name">' .. Args['заголовок'] .. '</p>'
	end
	local source, podvig = Args['источник'], Args['подвиг']
	if source then
		out = out .. '[[Категория:Документ с указанием источника]]'
	end
	tmp = ''
	if podvig then
		if string.sub( podvig, -1, -1 ) == '+' then
			tmp = '[[Категория:Наградные листы просмотрены]]'
			podvig = string.sub( podvig, 1, -2 )
		else
		end
		podvig = '«[http://podvignaroda.ru/?#id=' .. podvig
			.. ' Подвиг народа]»'
	end
	out = out .. tmp .. [[
<p class="nkvd-doc-subheader">(]] .. docOrigin
	out = out .. ')' .. doctools.endRecord( Args )

	local cargo = frame:expandTemplate{ title = 'Таблица документов' }

	global.set( 'gDoc', {
			off = docOff ~= nil,
			date = docDate,
			stream = docStream,
			revers = true, -- docRevers == 'реверс', -- менее жесткие проверки -- хотя для модуля Персона тут всегда было TRUE
			notEmpty = false,   -- «Была персона» для иерархии
			publication = Args['публикация'],
			source = source,
			podvig = podvig,
			ukdate = ukdate,
			archive = Args['архив'],
			n2h = {},      -- number to header
			h2v = {},      -- header to value
			Log = ''
		} )
--	if Args['каждому'] then
--		global.set( 'gUniref-Документ', Args['каждому'] )
--	end
	global.set( 'gUniref-Документ', refTools.collect( Args, 'каждому' ) )

	if docDate == '' then
		tmp = 'без даты'
	elseif string.len(docDate) == 4 then
		tmp = 'за ??.' .. docDate
	else
		tmp = ' за ' .. string.sub( docDate, 6, 7 ) .. '.' .. string.sub( docDate, 1, 4 )
	end
	out = out .. '[[Категория:' .. docType.ctg .. ' ' .. tmp .. ']]'
	return out
end


--[[------------------------------------------------------------------------]]--
pp['Отладка'] = function ( frame  )
	local Doc = global.get( 'gDoc' )
	local x = mw.dumpObject( Doc )
	Doc.Log = ''
	global.set( 'gDoc', Doc )
	return x
end
return pp