Модуль:Виборчий округ України
Документація модуля[створити]
Зараз цей модуль не має відповідної документації. Якщо вам відомі призначення та засади використання цього модуля, будь ласка, напишіть хоча б коротеньку документацію. |
Дописувачі можуть експериментувати на підсторінках пісочниця (створити | дзеркало) та тести (створити) цього шаблону. Підсторінки цієї сторінки. |
local p = {}
require("Модуль:Функції для карток");
function adress(st)
p = mw.text.split(st.qualifiers.P6375[1].datavalue.value.text, ", ");
np = mw.text.split(p[2], "%. ");
cap_item = mw.wikibase.getEntity(st.mainsnak.datavalue.value.id);
np_title = cap_item.sitelinks.ukwiki.title;
if np_title~=np[2] then np[2] = "[["..np_title.."|"..np[2].."]]";
else np[2] = "[["..np[2].."]]"; end
if(st.qualifiers.P669) then
street_item = mw.wikibase.getEntity(st.qualifiers.P669[1].datavalue.value.id);
p[3] = "[["..street_item.sitelinks.ukwiki.title.."|"..p[3].."]]";
end
return p[1]..", "..np[1]..". "..np[2]..", <br/>"..p[3]..", "..p[4];
end
function mp_start_time(item)
st_counter = #item.claims["P1268"];
p1268 = item.claims["P1268"];
while(st_counter>=2 and
p1268[st_counter-1].mainsnak.datavalue.value.id==p1268[#p1268].mainsnak.datavalue.value.id) do
st_counter = st_counter-1;
end
return "з "..format_time(p1268[st_counter].qualifiers["P580"][1].datavalue.value);
end
function mp(item, mp_gen)
st = item.claims["P1268"][#item.claims["P1268"]];
oc = item.claims["P361"];
if(st.qualifiers["P582"]) then return "немає"; end
if(oc and (oc[1].mainsnak.datavalue.value.id=="Q19684249"
or oc[1].mainsnak.datavalue.value.id=="Q20094029")
and not oc[1].qualifiers) then return "немає"; end
mp_link = title_for(st.mainsnak.datavalue.value.id);
if(st.qualifiers["P102"][1].snaktype=="novalue") then
if(mp_gen=="Q6581072") then party_link = "самовисуванка";
else party_link = "самовисуванець"; end
else party_link = title_for(st.qualifiers["P102"][1].datavalue.value.id); end
return mp_link.." ("..party_link..", "..mp_start_time(item)..")";
end
function mp_gender(mp_id)
mp_item = mw.wikibase.getEntity(mp_id);
if(mp_item.claims["P21"]) then return mp_item.claims["P21"][1].mainsnak.datavalue.value.id;
else return "Q6581097"; end
end
function item_for_num(n)
n = tonumber(n);
if(n>= 0 and n<= 20) then x= 0;
elseif(n>= 21 and n<= 26) then x= 1;
elseif(n== 27 or n== 28) then x= 2;
elseif(n== 29 or n== 30) then x= 3;
elseif(n>= 31 and n<= 50) then x= 4;
elseif(n== 51 or n== 52) then x= 5;
elseif(n== 53 or n== 54) then x= 6;
elseif(n== 55 or n== 56) then x= 8;
elseif(n>= 57 and n<=102) then x= 9;
elseif(n>=103 and n<=105) then x=10;
elseif(n==106 or n==107) then x=11;
elseif(n>=108 and n<=122) then x=12;
elseif(n>=123 and n<=128) then x=13;
elseif(n>=129 and n<=136) then x=14;
elseif(n==137) then x=15;
elseif(n==138 or n==139) then x=16;
elseif(n==140 or n==141) then x=17;
elseif(n>=142 and n<=161) then x=18;
elseif(n>=162 and n<=183) then x=19;
elseif(n==184) then x=20;
elseif(n==185 or n==186) then x=21;
elseif(n>=187 and n<=205) then x=22;
elseif(n==206 or n==207) then x=23;
elseif(n==208) then x=24;
elseif(n>=209 and n<=220) then x=25;
elseif(n==221 or n==222) then x=26;
elseif(n==223 or n==224) then x=27;
elseif(n==225) then x=28;
end
return "Q"..(63087606+n+x);
end
regions = {
["Q756294"]="Автономна Республіка Крим", ["Q166709"]="Вінницька область", ["Q167859"]="Волинська область", ["Q170672"]="Дніпропетровська область", ["Q2012050"]="Донецька область",
["Q40637"]="Житомирська область", ["Q170213"]="Закарпатська область", ["Q171334"]="Запорізька область", ["Q178269"]="Івано-Франківська область", ["Q1899"]="Київ",
["Q170036"]="Київська область", ["Q180981"]="Кіровоградська область", ["Q171965"]="Луганська область", ["Q164193"]="Львівська область", ["Q181633"]="Миколаївська область",
["Q171852"]="Одеська область", ["Q169501"]="Полтавська область", ["Q174187"]="Рівненська область", ["Q7525"]="Севастополь", ["Q170446"]="Сумська область",
["Q173407"]="Тернопільська область", ["Q170666"]="Харківська область", ["Q163271"]="Херсонська область", ["Q171331"]="Хмельницька область", ["Q161808"]="Черкаська область",
["Q168856"]="Чернівецька область", ["Q167874"]="Чернігівська область"
};
months = {"січня", "лютого", "березня", "квітня", "травня", "червня", "липня", "серпня", "вересня", "жовтня", "листопада", "грудня"};
function p.main(frame)
parent = frame:getParent();
args = parent.args;
label = '\n|-\n| style="text-align:right; background:#ddd; width:120px;" | ';
data = '\n| style="background:#eee" | ';
item = mw.wikibase.getEntity(mw.wikibase.getEntityIdForCurrentPage());
if(not item) then return "[[Категорія:Сторінки з помилками скриптів]]"; end
ovk_coord = item:getBestStatements('P36')[1].qualifiers.P625[1].datavalue.value;
dist_coord = item:getBestStatements('P625')[1].mainsnak.datavalue.value;
region = item:getBestStatements('P131')[1].mainsnak.datavalue.value.id;
locator = item:getBestStatements('P242')[1].mainsnak.datavalue.value;
num = tonumber(item:getBestStatements('P1545')[1].mainsnak.datavalue.value);
if(num<10) then num_prefix = "0"; else num_prefix = ""; end
if(not args["zoom"]) then args["zoom"] = 9; end
n = tonumber(num);
if(item.claims['P361']) then
partof = item:getBestStatements('P361')[1].mainsnak.datavalue.value.id;
partof_qual = item:getBestStatements('P361')[1].qualifiers;
else partof = ""; end
occ_pref = {'|-\n| style="text-align:center;color:white;background-color:', '" colspan="2" | '};
if(partof=="Q20094029") then occupied = occ_pref[1].."#f44"..occ_pref[2].."Перебуває під окупацією РФ\n";
elseif(partof=="Q19684249") then
if(region=="Q2012050") then w = "Д"; else w = "Л"; end
if(partof_qual and partof_qual["P518"]) then h="Частково"; c="#f94"; else h="Повністю"; c="#f44"; end
occupied = occ_pref[1]..c..occ_pref[2]..h.." перебуває під контролем "..w.."НР\n";
else occupied = ""; end
area = "";
if(#item:getBestStatements('P2046') > 0) then
area = label .. "'''Площа:'''" .. data ..
string.gsub(item:getBestStatements('P2046')[1].mainsnak.datavalue.value.amount, "+", "") ..
' км<sup>2</sup>';
end
mp_gen = mp_gender(item.claims["P1268"][#item.claims["P1268"]].mainsnak.datavalue.value.id);
if(mp_gen=="Q6581072") then current_mp_label = "'''Чинна<br/>мажоритарниця:'''";
else current_mp_label = "'''Чинний<br/>мажоритарник:'''"; end
res = {'{| class="infobox" style="width:300px; font-size:90%;"\n',
'|- style="font-size:140%; text-align:center; background-color:#cde"\n',
'| colspan="2" | ', "'''Виборчий округ №", num, "'''\n", occupied,
'|-\n', '| style="text-align:center" colspan="2" | ', '[[Файл:', locator,
'|lang=d', num_prefix, num, '|260x290px]]',
label, "'''Регіон:'''", data, '[[', regions[region], ']]',
label, "'''Кіл-ть виборців:'''", data,
'{{formatnum:', string.gsub(item.claims['P1867'][#item.claims['P1867']].mainsnak.datavalue.value.amount, "+", ""), '}}',
label, "'''Кіл-ть дільниць:'''", data,
'{{formatnum:', string.gsub(item.claims['P6753'][#item.claims['P6753']].mainsnak.datavalue.value.amount, "+", ""), '}}', area,
label, "'''Адреса ОВК:'''", data, adress(item:getBestStatements('P36')[1]), '\n',
label, current_mp_label, data, mp(item, mp_gen), '\n',
'|-\n', '| colspan="2" | ',
'<mapframe width=290 height=290 zoom=', args["zoom"], ' longitude=', dist_coord.longitude, ' latitude=', dist_coord.latitude, ' align=center>',
'[{"type":"ExternalData", "service":"page", "title":"Ukrainian electoral district ', num, '.map", "properties":{"fill-opacity":0.3}}, ',
'{"type":"Feature", "properties":{"title":"ОВК №', num, '", "marker-symbol":"polling-place", "marker-color":"048"}, ',
'"geometry":{"type":"Point", "coordinates":[', ovk_coord.longitude, ', ', ovk_coord.latitude, ']}} ]',
'</mapframe>\n',
'|-\n', '| style="text-align:center; background-color:#cde" colspan="2" | [',
item:getBestStatements('P856')[1].mainsnak.datavalue.value, ' Округ №', num, ' на сайті ДРВ', ']\n|}'
};
return frame:preprocess(table.concat(res));
end
function p.d_table(frame)
table_begin = '{| class="wikitable"'..
'\n! width="140px" | Округ'..
'\n! width="150px" | Регіон'..
'\n! Складається з'..
'\n! width="65px" | <small>Кількість <br/>виборців</small>'..
'\n! width="250px" | Чинний мажоритарник'..
'\n! width="150px" | Положення в регіоні'..
'\n! width="200px" | Адреса ОВК'..
'\n! width="70px" | <small>Гео-мапа</small>'..
'\n! width="110px" | <small>Посилання</small>\n';
table_end = "|}";
res = {};
for num=1,225 do
item_num = item_for_num(num);
item = mw.wikibase.getEntity(item_num);
occupied = "";
if(item:getBestStatements('P361')[1]) then
occupied = ' style="background:#fdd"';
if(item:getBestStatements('P361')[1].qualifiers and item:getBestStatements('P361')[1].qualifiers.P518)
then occupied = ' style="background:#fed"'; end
end
region_id = item:getBestStatements('P131')[1].mainsnak.datavalue.value.id;
region_template = "{{"..regions[region_id].."}}";
voters = '{{formatnum:'..string.gsub(item.claims['P1867'][#item.claims['P1867']].mainsnak.datavalue.value.amount, "+", "")..'}}';
if(num<10) then num_prefix = "0"; else num_prefix = ""; end
link = "["..item:getBestStatements('P856')[1].mainsnak.datavalue.value.." Округ №"..num.." <br/>на сайті ДРВ]";
locator_region_gen = "";
if num>=211 and num<=223 then locator_region_gen = "міста Києва";
elseif num>=168 and num<=174 then locator_region_gen = "міста Харкова";
elseif num>=133 and num<=136 then locator_region_gen = "міста Одеси";
elseif num>=24 and num<=28 then locator_region_gen = "міста Дніпра";
elseif num<=10 or num==224 or num==225 then locator_region_gen = "Криму";
elseif string.find(item.descriptions.uk.value, "області, ") and (string.find(item.descriptions.uk.value, " в ") or string.find(item.descriptions.uk.value, " у ")) then
locator_region_gen = string.gsub(item.descriptions.uk.value, " у ", " в ");
locator_region_gen = mw.text.split(locator_region_gen, " в ", true);
locator_region_gen = locator_region_gen[#locator_region_gen];
locator_region_gen = mw.text.split(locator_region_gen, ", ", true)[1];
locator_region_gen = string.gsub(locator_region_gen, "ькій області", "ької області");
end
locator = "[[File:"..item:getBestStatements('P242')[1].mainsnak.datavalue.value.."|150x100px|Виборчий округ "..num.." на мапі "..locator_region_gen.."]]";
parts = item.descriptions.uk.value;
if string.find(parts, "ть ") then
parts = mw.text.split(parts, "ть ")[2];
parts = "<small>"..mw.text.split(parts, ".", true)[1].."</small>";
else
parts = "";
end
address = item:getBestStatements('P36')[1].qualifiers["P6375"][1].datavalue.value.text;
str_match = string.match(address, "%d,%s[смт]+%.%s([^,]+),%s");
if(str_match and string.match(str_match, "%-")) then
address = string.gsub(address, mw.text.split(str_match, "-")[1], "[["..mw.text.split(str_match, "-")[1]);
address = string.gsub(address, mw.text.split(str_match, "-")[2], mw.text.split(str_match, "-")[2].."]]");
elseif(str_match) then address = string.gsub(address, str_match, "[["..str_match.."]]");
end
member = "";
if(item.claims["P1268"][#item.claims["P1268"]].qualifiers["P582"]) then member = "";
else
p_1268 = item.claims["P1268"][#item.claims["P1268"]];
member_item = p_1268.mainsnak.datavalue.value.id;
mp_time = mp_start_time(item);
party = "";
if(not p_1268.qualifiers) then party = "";
elseif(p_1268.qualifiers["P102"][1].snaktype=="novalue") then party = "самовисуванець";
else party = "{{Label|"..p_1268.qualifiers["P102"][1].datavalue.value.id.."}}"; end
member = "[[{{Label|"..member_item.."}}]]".."<br/>"..party.."<br/>"..mp_time;
end
dist_coord = item:getBestStatements('P625')[1].mainsnak.datavalue.value;
ovk_coord = item:getBestStatements('P36')[1].qualifiers.P625[1].datavalue.value;
zoom = 9;
if(num>=211 or (num>=168 and num<=174) or (num>=133 and num<=136) or (num>=24 and num<=28) or (num>=51 and num<=58)
or (num>=41 and num<=44) or (num>=74 and num<=77) or (num>=115 and num<=117)) then zoom = 11; end
map_osm = '<maplink zoom='..zoom..' latitude='..dist_coord.latitude..' longitude='..dist_coord.longitude..' text="Мапа">'..
'[{"type":"ExternalData","service":"page","title":"Ukrainian electoral district '..num..'.map"}, '..
'{"type": "Feature", "properties": {"title": "Окружна виборча комісія №'..num..'", "marker-symbol": "polling-place", "marker-color": "07e"}, '..
'"geometry": {"type": "Point", "coordinates": ['..ovk_coord.longitude..', '..ovk_coord.latitude..']}}]</maplink>';
local_res = "|-"..occupied.."\n| [[Виборчий округ "..num.."]] <sup>[[:wikidata:"..item_num.."|wd]]</sup>\n| "..region_template.."\n| "..parts.."\n| "..voters.."\n| "..
member..'\n| align="center" | '..locator.."\n| "..address.."\n| "..map_osm.."\n| "..link.."\n";
table.insert(res, local_res);
end
return frame:preprocess(table_begin..table.concat(res)..table_end);
end
return p;