Модуль:Дорожная карта (2)
Материал из Справочника наблюдателя
Модуль предназначен для поддержки шаблона {{ДК}} .
Используемые параметры вызывающего шаблона {{ДК}} :
- регион=список-кодов-выборов (пусто = включать все; нет = только ФЗГ)
- формат=бланк — для печатной формы
- коиб=нет/база/вкладыш/вместе
- условия=список-условий
Параметры обращения к функции 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 .. ' %1')
s = string.gsub (s, '<_([^#][^:]-):(.-)_>', '<span style="white-space: nowrap;">%2 ' .. part .. ' %1</span>')
else
s = string.gsub (s , '<_([^#][^:]-)_>', '[[' .. link .. ' %1|' .. part .. ' %1]]')
s = string.gsub (s, '<_([^#][^:]-):(.-)_>', '[['..link..'%1|<span style="white-space: nowrap;">%2 ' .. part .. ' %1</span>]]')
end
return "'''" .. abbr .. ":''' " .. 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"> Р </span>'
end
elseif forkoib ~= 'тоже' then
if koibForma == 'вместе' then
res = res .. '<span style="color:red;font-weight:bold"> K </span>'
end
end
local txt = ownArgs ['событие']
txt = mw.ustring.gsub (txt, '<_#(.-)_>', prostr )
res = res .. txt
if (ownArgs ['совет'] or '') ~= '' then
res = res .. ". '''''" .. 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"> </td><td style="background-color:FloralWhite"> </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 '') ..
' <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>(КОИБ) </span>]] .. arg2 .. '</th>'
else
res = [[<tr><td style="text-align:left;font-size:105%;"><span style=color:red>'''КОИБ → '''</span>]] .. arg2 .. '</td>'
end
if forma == 'бланк' then
res = res .. '<td colspan=6> </td></tr>'
else
res = res .. '<td colspan=4> </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