Модуль:Дорожная карта (2)

Материал из Справочника наблюдателя
Перейти к:навигация, поиск

(i)      Описание модуля[]

Модуль предназначен для поддержки шаблона {{ДК}} .

Используемые параметры вызывающего шаблона {{ДК}} :

  • регион=список-кодов-выборов (пусто = включать все; нет = только ФЗГ)
  • формат=бланк — для печатной формы
  • коиб=нет/база/вкладыш/вместе
  • условия=список-условий

Параметры обращения к функции Line

  • событие=cобытие — текстовое описание события; маркеры вида «<_#n_>» обозначают номера строк протокола (заменяются на нумерацию, установленную соответствующим региональным законом, если дорожная карта строится для одного кода выборов)
  • совет=совет — дополнение к текстовому описанию (выделяется шрифтом)
  • если=список-условий — список условий. Строка включается при указании в вызове шаблона хотя бы одного из условий
  • для=список-кодов — список кодов выборов, для которых строка включается (при отсутствии параметра — для любого кода)
  • кроме=список-кодов — список исключений из кодов выборов (строка не включается)
  • дляКОИБ=тоже/нет/текст — включать всегда (режим по умолчанию) / применимо только к ручному подсчету / название раздела во вкладыше для КОИБ
  • все=текст — текст для графы дорожной карты «Норма». Маркеры вида «<_N:t_>» заменяются текстом «t ст. N» со ссылкой на ФЗГ
  • КОИБ=текст — текст для графы дорожной карты «Норма». Маркеры вида «<_N:t_>» заменяются текстом «t п. N» со ссылкой на Инструкции по КОИБ
  • код-выборов=текст — текст для графы дорожной карты «Норма». Маркеры вида «<_N:t_>» заменяются текстом «t ст. N» со ссылкой на закон о соответствующих выборах
  • код-выборов+=текст — текст для графы дорожной карты «Норма». Маркеры вида «<_N:t_>» заменяются текстом «t ст. N» со ссылкой на дополнительный закон о соответствующих выборах (для тех регионов, где он имеется)
  • куда=УИК/ТИК — орган, куда подается жалоба на невыполнение нормы
  • отв=текст — норма об ответственности
  • ТС=текст — пояснение
  • жалоба=текст — ссылки на жалобы, включаемые в пояснение

To be continued...


-- ПОКА ПРОПУЩЕНО:
---- указание частично пригодных строк при нескольких регионах
---- (?) возможность выбора ТИК=ИКМО во внешних параметрах
---- проверка соответствия для/кроме и информационных строк

local p = {}

local tab  = mw.loadData( 'Модуль:Дорожная карта (2)/Параметры')

-- параметры вызывающего шаблона
---- регион=код(ы) выборов (пусто = включать все; нет = только ФЗГ)
---- формат=бланк  — для печатной формы
---- коиб=нет/база/вкладыш/вместе
---- условия=коды условий

function inversiontab (x)
	if x then
		local y = {}
		for k, v in pairs (x) do
			y [mw.text.trim(''..v)] = mw.text.trim(''..k)
		end
		return y
	end
end

local regions, regionsOrig, cond

function prostr (fedNo)
	if not regionsOrig or regionsOrig == 'нет' then
		return fedNo
	end
	local n1 = tab.regions [regionsOrig[1]].strpr [fedNo]
	local n2 
	if  #regionsOrig == 1 then
		n2 = n1
	elseif #regionsOrig == 2 then
		n2 = tab.regions [regionsOrig[2]].strpr [fedNo]
	else -- if #regionsOrig > 2 then
		for i = 2, #regionsOrig do
			if tab.regions [regionsOrig[i]].strpr [fedNo] ~= n1 then
				n2 = 1
				break
			end
		end
		if n2 then
			n1,n2 = nil,nil
		end
	end
	local res
	if not n1 then
		res = '<span style=color:red>' .. fedNo .. '</span>' -- надо б еще как-то метить
	else
		res = n1
	end 
	if n2 ~= n1 then
		if not n2 then
			res = res .. '/<span style=color:red>' .. fedNo .. '</span>' 
		else
			res = res .. n2
		end
	end
	return res
end

local ownArgs
local forma


function addBill (code, abbr, part, link)
	local s = ownArgs [code] or ''
	if s ~= '' then
        if forma == 'бланк' then
            s = string.gsub (s , '<_([^#][^:]-)_>', part .. '&nbsp;%1')
            s = string.gsub (s, '<_([^#][^:]-):(.-)_>', '<span style="white-space: nowrap;">%2 ' .. part .. ' %1</span>')
        else
            s = string.gsub (s , '<_([^#][^:]-)_>', '[[' .. link .. ' %1|' .. part .. '&nbsp;%1]]')
            s = string.gsub (s, '<_([^#][^:]-):(.-)_>', '[['..link..'%1|<span style="white-space: nowrap;">%2 ' .. part .. ' %1</span>]]')
        end
        return "'''" .. abbr .. ":'''&nbsp;" .. s
    else
    	return nil
	end
end






-- формирование заголовка таблицы
function p.Start (frame)
	forma = frame:getParent().args ['формат']
	local result = '<table class=wikitable><tr><th>Контролируемое событие</th>'
	if  forma == 'бланк' then
		result = result .. '<th style="font-size:83%;line-height:105%">кол-во/<br />время</th>'
		result = result .. '<th style="font-size:83%;line-height:105%;background-color:Honeydew;width:30px">да</th>'
		result = result .. '<th style="font-size:83%;line-height:105%;background-color:FloralWhite;width:30px">нет</th>'
	end
	result = result .. '<th style="font-size:83%;line-height:105%">Каким законом установлено</th>'
	result = result .. '<th style="font-size:83%;line-height:105%">Куда<br />писать<br />жалобу</th>'
	result = result .. '<th style="font-size:83%;line-height:105%">Норма об отв-сти</th>'
	if forma ~= 'бланк' then
		result = result .. '<th>Полезные ссылки</th>'
	end
	return result .. '</tr>'
end


-- Формирование основной строки таблицы
-- Передаваемые параметры:
---- событие=Событие
---- совет=Совет
---- если=список-условий
---- для=список-кодов
---- кроме=список-кодов
---- дляКОИБ=тоже/нет/текст
function p.Line (frame)
	
	local extArgs = frame:getParent().args
	ownArgs = frame.args
	
	forma = extArgs ['формат']
	
	local koibForma = extArgs ['КОИБ']
	if (koibForma or '') == '' then
		koibForma = 'нет'
	end

	local forkoib = ownArgs ['дляКОИБ']
	if (forkoib or '') == '' then
		forkoib = 'тоже'
	end
	
	if (koibForma == 'нет' or koibForma == 'база') and forkoib ~= 'тоже' and forkoib ~= 'нет' then
		return ''   -- строка для КОИБ
	end
	if koibForma == 'вкладыш' and (forkoib == 'тоже' or forkoib == 'нет') then
		return ''		-- строка не чисто КОИБовская
	end
	
	regionsOrig = extArgs ['регион'] --оригинальный порядок надо сохранить ради порядка выдачи
	if regionsOrig then
		if regionsOrig == '' or regionsOrig == 'все' then
			regionsOrig = nil
			regions = nil
		elseif regionsOrig ~= 'нет' then
			regionsOrig = mw.text.split (regionsOrig, ',', true)
			regions = inversiontab (regionsOrig)
		else
			regions = 'нет'
		end
	end

	cond = extArgs ['условия']
	if (cond or '') == '' then
		cond = nil
	else
		cond = mw.text.split (cond, ',', true)
		cond = inversiontab (cond)
	end

	local forreg = ownArgs ['для'] or ''
	if forreg == '' then
		forreg = nil
	else
		if regions == 'нет' then
			return '' -- нас не интересуют не общедоступные штучки
		end	
		forreg = inversiontab (mw.text.split (forreg, ',', true))
	end
	
	local notreg = ownArgs ['кроме'] or ''
	if notreg == '' then
		notreg = nil
	else
		notreg = inversiontab (mw.text.split (notreg, ',', true))
	end
	
	if forreg and notreg then
		return '' -- ОШИБКА 
	end
	
	
	-- region == all (aka nil)  — включаем все строки
	-- region == no — включаем все строки, кроме тех, где есть «для» (уже отработали), а «кроме» игнорируем
	-- region = X — ( («для»== '') and («кроме» ~= X) ) or ( («для»== X) and («кроме» ~= X) )
	
	if (regions or 'нет') ~= 'нет'  then
		local yes
		for k, v in pairs (regions) do
			if forreg then
				if forreg [k] then
					regions [k], yes = 1, true
				else
					regions [k] = 0
				end
			elseif notreg then
				if notreg [k] then
					regions [k] = 0
				else
					regions [k], yes = 1, true
				end
			else
				regions [k], yes = 1, true
			end
		end
		if not yes then
			return ''   -- не срослось
		end
	end	
	
	-- точно есть нечто для выдачи (по региону)
	-- теперь проверяем по условиям, тут все проще?
	local forcond = ownArgs ['если'] or ''
	if forcond == '' then
		forcond = nil
	else
		forcond = inversiontab (mw.text.split (forcond, ',', true))
		if regions and not cond then
			return ''			-- если мы условий не задали, и регион «все», 
		elseif cond then
			local yes
			for k, v in pairs (cond) do
				if forcond [k] then
					cond [k], yes = 1, true
				else
					cond [k] = 0
				end
			end
			if not yes then
				return ''
			end
		end
	end
	
	local res = '<tr><td>'

	-- если запрошенный формат "вместе", а дляКОИБ=да, то рисуем букву К
	-- если запрошенный формат "база" или "вместе", а дляКОИБ=нет, то рисуем букву Р
	if forkoib == 'нет' then
		if koibForma == 'база' or koibForma == 'вместе' then
			res = res .. '<span style="color:limegreen;font-weight:bold">&nbsp;&nbsp;Р&nbsp;&nbsp;</span>'
		end
	elseif forkoib ~= 'тоже' then
		if koibForma == 'вместе' then
			res = res .. '<span style="color:red;font-weight:bold">&nbsp;&nbsp;K&nbsp;&nbsp;</span>'
		end
	end
	
	local txt = ownArgs ['событие']
	txt = mw.ustring.gsub (txt, '<_#(.-)_>',  prostr ) 

	res = res .. txt
	if (ownArgs ['совет'] or '') ~= '' then
		res = res .. ". &nbsp;'''''" .. ownArgs ['совет'] .. "'''''"
	end
	res = res .. '</td>'
	
	if forma == 'бланк' then
		if ownArgs ['показатель'] == 'есть' or ownArgs ['показатель'] == 'да'  then
			txt = ''
		else
			txt = 'X'
		end
		res = res .. '<td style="text-align:center">' .. txt 
					.. '</td><td style="background-color:Honeydew">&nbsp;</td><td style="background-color:FloralWhite">&nbsp;</td>'
	end
	
	-- НПА
	res = res .. '<td style="font-size:93%; line-height:105%">'
		
	local billtab = {}
	if not regions then
		if forcond then
			for k, v in pairs (forcond) do 
				table.insert (billtab, k)
			end
			res = res .. "<span style=background-color:#8fc48f>['''''" .. table.concat (billtab, ' ') .. "''''']</span> "
			billtab = {}
		end
	end	
	table.insert (billtab, addBill(	'все' , 'ФЗГ', 'ст.', 'НПА:Федеральный закон от 12.06.2002 № 67-ФЗ:Статья ' ) )
	table.insert (billtab, addBill(	'КОИБ', 'ИИК', 'п.',  'НПА:Постановление ЦИК России от 06.07.11 № 19/204-6:Приложение:' ) )
	
	if regionsOrig and regionsOrig ~= 'нет' then
		for i = 1, #regionsOrig do
			table.insert (billtab, addBill(	regionsOrig[i], tab.regions[regionsOrig[i]].code, 'ст.',
				tab.regions[regionsOrig[i]].link .. ':Статья ' ) )
			if tab.regions[regionsOrig[i]].code1 then
				table.insert (billtab, addBill(	regionsOrig[i]..'+', tab.regions[regionsOrig[i]].code1, 'ст.', 
					tab.regions[regionsOrig[i]].link1 .. ':Статья ' ) )			
			end
		end
	elseif not regionsOrig then
		for k, v in pairs (tab.regions) do
			table.insert (billtab, addBill(	k, v.code, 'ст.', v.link .. ':Статья ' ) )
			if v.code1 then
				table.insert (billtab, addBill(	k..'+', v.code1, 'ст.', v.link1 .. ':Статья ' ) )
			end
		end
	end
	res = res .. table.concat (billtab, '; ') .. '</td>'		

	-- покончили с нормативкой
	res = res .. '<td style="font-size:93%; line-height:105%; text-align:center">' .. (ownArgs['куда'] or '') .. '</td>'
	res = res .. '<td style="font-size:93%; line-height:105%;">' .. (ownArgs['отв'] or '') .. '</td>'
	if forma ~= 'бланк' then
        res = res .. '<td style="font-size:93%; line-height:105%">' .. (ownArgs['ТС'] or '') .. 
        				'&nbsp; <span class="doclink" style="font-weight:bold; font-style:italic">' .. (ownArgs['жалоба'] or '') .. '</span></td>'
    end
		
	return res .. '</tr>'
	
end

function p.Section (frame)
	local extArgs = frame:getParent().args
	ownArgs = frame.args
	
	forma = extArgs ['формат']
	
	local koibForma = extArgs ['КОИБ']
	if (koibForma or '') == '' then
		koibForma = 'нет'
	end
	
	local arg1, arg2 = ownArgs [1], ownArgs [2] or ''
	if arg2 ~= '' and arg1 ~= 'КОИБ' then
		return '' -- ошибка
	end
	
	local res
	
	if arg2 == '' then
		if koibForma == 'вкладыш' then
			return '' -- на вкладыше только КОИБ-разделы
		else 
			res = '<tr><th style="text-align:left;font-size:105%;">' .. arg1 .. '</th>'
		end
	elseif koibForma == 'нет' then
		return ''
	elseif (koibForma == 'вкладыш') or   (koibForma == 'вместе') then
		res = [[<tr><th style="text-align:left;font-size:105%;"><span style=color:red>(КОИБ)&nbsp;</span>]] .. arg2 .. '</th>'
	else
		res = [[<tr><td style="text-align:left;font-size:105%;"><span style=color:red>'''КОИБ → &nbsp;'''</span>]] .. arg2 .. '</td>'
	end
	
	if forma == 'бланк' then
		res = res .. '<td colspan=6>&nbsp;</td></tr>'
	else
		res = res .. '<td colspan=4>&nbsp;</td></tr>'
	end
	return res
end



function p.Finish (frame)
	local extArgs = frame:getParent().args
	ownArgs = frame.args

	local res = {}

	table.insert (res, "'''ФЗГ''' — Федеральный закон от 12.06.2002 № 67-ФЗ «Об основных гарантиях избирательных прав и права на участие в референдуме граждан Российской Федерации»")
	if extArgs ['КОИБ'] ~= 'нет' then
		table.insert (res, "'''ИИК''' — «Инструкция о порядке использования технических средств подсчета голосов — комплексов обработки избирательных бюллетеней 2010...» (утв. пост. ЦИК РФ от 06.07.2011 № 19/204−6)")
	end
	
	regionsOrig = extArgs ['регион'] or ''
	if regionsOrig == '' then
		for k, v in pairs (tab.regions) do
			table.insert (res, "'''" .. v.code .. "''' — " .. v.name)
			if v [code1] then
				table.insert (res, "'''" .. v.code1 .. "''' — " .. v.name1)
			end
		end
	elseif regionsOrig ~= 'нет' then
		regionsOrig = mw.text.split (regionsOrig, ',', true)
		for i, u in ipairs (regionsOrig) do
			local v = tab.regions [mw.text.trim(u)]
			table.insert (res, "'''" .. v.code .. "''' — " .. v.name)
			if v [code1] then
				table.insert (res, "'''" .. v.code1 .. "''' — " .. v.name1)
			end
		end
	end
	table.insert (res, "'''КоАП''' — Кодекс РФ об административных правонарушениях")
    table.insert (res, "'''УК''' — Уголовный кодекс РФ")
    table.insert (res, "'''ТИК''' — территориальная (или иная вышестоящая) комиссия")
    table.insert (res, "'''УИК''' — участковая избирательная комиссия")
    table.insert (res, "'''УФП''' — увеличенная форма протокола")
    table.insert (res, "'''ст.''' — статья, '''п.''' — пункт, '''ч.''' — часть, '''п/п''' — подпункт")

	
	return '</table>' .. table.concat (res, "<br />")
end





return p