Модуль:Виборчий округ України

{{i}} Документація модуля[створити]
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 "з&nbsp;"..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_abbr = {
		["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_abbr[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 = "{{"..regions_abbr[item:getBestStatements('P131')[1].mainsnak.datavalue.value.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
		locator = "[[File:"..item:getBestStatements('P242')[1].mainsnak.datavalue.value.."|150x100px|lang=d"..num_prefix..num.."]]";
		link = "["..item:getBestStatements('P856')[1].mainsnak.datavalue.value.." Округ №"..num.." <br/>на сайті ДРВ]";
		
		parts = item.descriptions.uk.value;
		parts = mw.text.split(parts, "ть ")[2];
		parts = "<small>"..mw.text.split(parts, ".", true)[1].."</small>";
		
		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.."\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;