Відмінності між версіями «Модуль:Mapframe для карток»

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[перевірена версія][перевірена версія]
м
м
Рядок 9: Рядок 9:
 
end
 
end
   
function is_empty(var)
+
function is_not_empty(var)
 
if(var) then
 
if(var) then
 
if(string.len(var)>0) then return true; else return false; end
 
if(string.len(var)>0) then return true; else return false; end
Рядок 28: Рядок 28:
   
 
--перевіряємо чи присутній аргумент елемента Вікіданих, якщо ні, то беремо елемент для поточної сторінки
 
--перевіряємо чи присутній аргумент елемента Вікіданих, якщо ні, то беремо елемент для поточної сторінки
if(is_empty(args["елемент"])) then element = args["елемент"];
+
if(is_not_empty(args["елемент"])) then element = args["елемент"];
 
else element = mw.wikibase.getEntityIdForCurrentPage(); end
 
else element = mw.wikibase.getEntityIdForCurrentPage(); end
 
if(not element) then return errormessage; end
 
if(not element) then return errormessage; end
   
 
--перевіряємо чи присутні аргументи ширини і висоти мапи, якщо ні, то залишаємо значення за замовчуванням
 
--перевіряємо чи присутні аргументи ширини і висоти мапи, якщо ні, то залишаємо значення за замовчуванням
if(is_empty(args["ширина"])) then width = args["ширина"]; end
+
if(is_not_empty(args["ширина"])) then width = args["ширина"]; end
if(is_empty(args["висота"])) then height = args["висота"]; end
+
if(is_not_empty(args["висота"])) then height = args["висота"]; end
   
 
--перевіряємо чи присутні аргументи широти (північ-південь) та довготи (захід-схід), якщо ні, то пізніше їх отримаємо з Вікіданих
 
--перевіряємо чи присутні аргументи широти (північ-південь) та довготи (захід-схід), якщо ні, то пізніше їх отримаємо з Вікіданих
if(is_empty(args["широта"]) and is_empty(args["довгота"])) then latitude = args["широта"]; longitude = args["довгота"]; end
+
if(is_not_empty(args["широта"]) and is_not_empty(args["довгота"])) then latitude = args["широта"]; longitude = args["довгота"]; end
   
 
--перевіряємо чи присутній аргумент масштабу, якщо ні, то пізніше отримаємо з Вікіданих
 
--перевіряємо чи присутній аргумент масштабу, якщо ні, то пізніше отримаємо з Вікіданих
if(is_empty(args["масштаб"])) then zoom = args["масштаб"]; end
+
if(is_not_empty(args["масштаб"])) then zoom = args["масштаб"]; end
   
 
--перевіряємо інші аргументи
 
--перевіряємо інші аргументи
if(is_empty(args["рамка"])) then frameless = ""; end
+
if(is_not_empty(args["рамка"])) then frameless = ""; end
if(is_empty(args["текст"])) then text = args["текст"]; end
+
if(is_not_empty(args["текст"])) then text = args["текст"]; end
if(is_empty(args["вирівнювання"])) then align = args["вирівнювання"]; end
+
if(is_not_empty(args["вирівнювання"])) then align = args["вирівнювання"]; end
   
 
--перевіряємо чи були отримані координати та масштаб із аргументів, якщо ні то працюватимемо із Вікіданими
 
--перевіряємо чи були отримані координати та масштаб із аргументів, якщо ні то працюватимемо із Вікіданими

Версія за 21:34, 6 листопада 2018

Документацію для цього модуля можна створити у Модуль:Mapframe для карток/документація

--отримати текст виду <mapframe width=300 height=300 zoom=4 longitude=30 latitude=50 align=center frameless>{"type": "ExternalData","service": "geoshape","ids": "Q170036"}</mapframe> для вставки в шаблони-картки
local p = {}

function value_in_array(tab, value)
	for i, v in ipairs(tab) do
		if(v == value) then return true; end
	end
	return false
end

function is_not_empty(var)
	if(var) then
		if(string.len(var)>0) then return true; else return false; end
	else return false;
	end
end

function p.main(frame)
	--при помилці буде повертатись таке значення
	errormessage = "[[Категорія:Сторінки із некоректними мапами]]";

	--змінні для збереження значень аргументів, або за їх відсутності, значень за замовчуванням
	width = 300; height = 300; frameless = " frameless"; text = ""; align = "center";

	--отримуємо аргументи, передані до шаблону
	parent = frame:getParent();
	args = parent.args;

	--перевіряємо чи присутній аргумент елемента Вікіданих, якщо ні, то беремо елемент для поточної сторінки
	if(is_not_empty(args["елемент"])) then element = args["елемент"];
	else element = mw.wikibase.getEntityIdForCurrentPage(); end
	if(not element) then return errormessage; end

	--перевіряємо чи присутні аргументи ширини і висоти мапи, якщо ні, то залишаємо значення за замовчуванням
	if(is_not_empty(args["ширина"])) then width = args["ширина"]; end
	if(is_not_empty(args["висота"])) then height = args["висота"]; end

	--перевіряємо чи присутні аргументи широти (північ-південь) та довготи (захід-схід), якщо ні, то пізніше їх отримаємо з Вікіданих
	if(is_not_empty(args["широта"]) and is_not_empty(args["довгота"])) then latitude = args["широта"]; longitude = args["довгота"]; end

	--перевіряємо чи присутній аргумент масштабу, якщо ні, то пізніше отримаємо з Вікіданих
	if(is_not_empty(args["масштаб"])) then zoom = args["масштаб"]; end

	--перевіряємо інші аргументи
	if(is_not_empty(args["рамка"])) then frameless = ""; end
	if(is_not_empty(args["текст"])) then text = args["текст"]; end
	if(is_not_empty(args["вирівнювання"])) then align = args["вирівнювання"]; end

	--перевіряємо чи були отримані координати та масштаб із аргументів, якщо ні то працюватимемо із Вікіданими
	if( ((not latitude) and (not longitude)) or (not zoom) ) then
		--отримуємо об'єкт для елемента Вікіданих
		item = mw.wikibase.getEntity(element);
		if(not item) then return errormessage; end

		--отримуємо список властивостей для елемента
		properties = item:getProperties()

		--якщо вказані значення властивостей для крайніх точок, рахуємо координати та масштаб з них
		if(value_in_array(properties, 'P1332') and value_in_array(properties, 'P1333') and value_in_array(properties, 'P1334') and value_in_array(properties, 'P1335')) then
			--отримуємо значення властивостей, що відповідають крайнім точкам
			nlat = item:getBestStatements('P1332')[1].mainsnak.datavalue.value.latitude;
			slat = item:getBestStatements('P1333')[1].mainsnak.datavalue.value.latitude;
			wlon = item:getBestStatements('P1335')[1].mainsnak.datavalue.value.longitude;
			elon = item:getBestStatements('P1334')[1].mainsnak.datavalue.value.longitude;

			--якщо з аргументів не були отримані широта та довгота, отримуємо їх порахувавши середнє значення властивостей для крайніх точок
			if( ((not latitude) and (not longitude)) ) then
				latitude = tostring((nlat+slat)/2);
				longitude = tostring((wlon+elon)/2);
			end

			--якщо з аргументу не був отриманий масштаб, отримуємо його за відстанню між крайніми точками
			if( ((not latitude) and (not longitude)) ) then
				wid = math.abs(elon-wlon); --відстань між західною та східною крайніми точками
				hei = math.abs(nlat-slat); --відстань між північною та південною крайніми точками
				if(hei>wid) then
					distance = hei;
					mapsize = height;
				else
					distance = wid;
					mapsize = width;
				end
				zoom = tostring(math.floor(math.log(mapsize/(distance*0.703125))/math.log(2)));
			end
		end
	end

	--якщо координатів досі нема, отримаємо їх з властивості для географічних координат
	if( (not latitude) and (not longitude) and value_in_array(properties, 'P625') ) then
		latitude = item:getBestStatements('P625')[1].mainsnak.datavalue.value.latitude;
		longitude = item:getBestStatements('P625')[1].mainsnak.datavalue.value.longitude;
	end

	--якщо масштабу досі нема, отримаємо його з властивості для площі
	if((not zoom) and value_in_array(properties, 'P2046')) then
		area = item:getBestStatements('P2046')[1].mainsnak.datavalue.value.amount;
		zoom = math.floor(15 - (math.log(2.5*area)/math.log(4)) );
	end

	--якщо координати та масштаб визначені, повертаємо текстовий рядок з результатом, інакше повертаємо порожній рядок
	if(latitude and longitude and zoom) then
		--якщо аргумент "текст" було задано, заміняємо в ньому лапки на html-коди
		if(text~="") then
			text = string.gsub(text, '"', "&quot;");
			text = string.gsub(text, "'", "&#39;")
			text = ' text="' .. text .. '"';
		end
		--записуємо всі необхідні змінні в таблицю, об'єднуємо її в текстовий рядок, який повертаємо як результат
		res = {"<mapframe width=", width, " height=", height, " zoom=", zoom, " latitude=", latitude, " longitude=", longitude, 
			" align=", align, frameless, text, '>{"type": "ExternalData","service": "geoshape","ids": "', element, '\"}</mapframe>'};
		return frame:preprocess(table.concat(res));
	else
		return "";
	end
end

return p;