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

[перевірена версія][перевірена версія]
Вилучено вміст Додано вміст
мНемає опису редагування
м Захистив «Модуль:Mapframe для карток»: Бот: повний захист шаблонів з великою кількістю включень (більше 20000) ([Перейменування=Дозволено тільки адміністраторам] (безстроково) [Редагування=Дозволено тільки адміністраторам] (безстроково))
 
(Не показані 37 проміжних версій 5 користувачів)
Рядок 2:
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
 
--функція яка перевіряє чи не є текстовий рядок порожнім (розміром 0 або значення nil)
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 multiple_shapes(items)
shape_res = {}
start_str = '{"type": "ExternalData", "service": "';
end_str = '", "properties": {"fill-opacity": 0.2}},';
items_list = mw.text.split(items, ";");
for _ , q in ipairs(items_list) do
q = mw.text.split(q, " ")[1]
if(string.find(q, ".map")) then geo_type = 'page", "title": "'; else geo_type = 'geoshape", "ids": "'; end
table.insert(shape_res, start_str..geo_type..q..end_str);
end
return table.concat(shape_res);
end
 
function p.main(frame)
--отримуємо аргументи, передані до шаблону
parent = frame:getParent();
args = parent.args;
 
--при помилці буде повертатись таке значення
errormessage = "[[Категорія:Сторінки із некоректними мапами]]";
--шаблони, що використовують цей модуль, будуть включатись до спеціальної категорії
templatescat = "[[Категорія:Шаблони, в яких використовується mapframe]]";
--при відсутності властивості Вікіданих для географічних координат (P625), повернеться таке значення
no_p625 = "[[Категорія:Вікідані:P625:відсутня]]";
if(is_not_empty(args["no_p625"])) then no_p625 = "[["..args["no_p625"].."]]"; end
--при відсутності властивості Вікіданих для площі (P2046), повернеться таке значення
no_p2046 = "[[Категорія:Вікідані:P2046:відсутня]]";
if(is_not_empty(args["no_p2046"])) then no_p2046 = "[["..args["no_p2046"].."]]"; end
 
--змінні для збереження значень аргументів, або за їх відсутності, значень за замовчуванням
width = 300; height = 300; frameless = " frameless"; text = ""; align = "center";
 
--отримуємо аргументи, передані до шаблону
parent = frame:getParent();
args = parent.args;
 
--перевіряємо чи присутній аргумент елемента Вікіданих, якщо ні, то беремо елемент для поточної сторінки
if(string.lenis_not_empty(args["елемент"])>0) then element = args["елемент"];
else element = mw.wikibase.getEntityIdForCurrentPage(); end
if(not element) then return errormessage; end
 
--перевіряємо чи присутні аргументи ширини і висоти мапи, якщо ні, то залишаємо значення за замовчуванням
if(string.lenis_not_empty(args["ширина"])>0) then width = args["ширина"]; end
if(string.lenis_not_empty(args["висота"])>0) then height = args["висота"]; end
 
--перевіряємо чи присутні аргументи широти (північ-південь) та довготи (захід-схід), якщо ні, то пізніше їх отримаємо з Вікіданих
if(string.lenis_not_empty(args["широта"])>0 and string.lenis_not_empty(args["довгота"])>0) then latitude = args["широта"]; longitude = args["довгота"]; end
 
--перевіряємо чи присутній аргумент масштабу, якщо ні, то пізніше отримаємо з Вікіданих
if(string.lenis_not_empty(args["масштаб"])>0) then zoom = args["масштаб"]; end
 
--перевіряємо інші аргументи
if(string.lenis_not_empty(args["рамка"])>0) then frameless = ""; end
if(string.lenis_not_empty(args["текст"])>0) then text = args["текст"]; end
if(string.lenis_not_empty(args["вирівнювання"])>0) then align = args["вирівнювання"]; end
geo = "geoshape";
if(is_not_empty(args["geo"])) then geo = args["geo"]; end
if(is_not_empty(args["geoshape"])) then geo = "geoshape"; end
 
--перевіряємо чи були отримані координати та масштаб із аргументів, якщо ні то працюватимемо із Вікіданими
Рядок 64 ⟶ 98:
 
--якщо з аргументу не був отриманий масштаб, отримуємо його за відстанню між крайніми точками
if( ((not latitude) and (not longitude)) zoom) then
wid = math.abs(elon-wlon); --відстань між західною та східною крайніми точками
hei = math.abs(nlat-slat); --відстань між північною та південною крайніми точками
if(hei>wid) then distance = hei; else distance = wid; end
if(hei>wid) then mapsize = height; else mapsize = width; end
distance = hei;
zoom = tostring(math.floor(math.log(mapsize/(distance/360)*0.703125(300/mapsize))/math.log(1/2)) - 0.2);
mapsize = height;
else
distance = wid;
mapsize = width;
end
zoom = tostring(math.floor(math.log(mapsize/(distance*0.703125))/math.log(2)));
end
end
Рядок 87 ⟶ 116:
--якщо масштабу досі нема, отримаємо його з властивості для площі
if((not zoom) and value_in_array(properties, 'P2046')) then
areaarea_obj = item:getBestStatements('P2046')[1].mainsnak.datavalue.value.amount;
area = area_obj.amount;
zoom = math.floor(15 - (math.log(2.5*area)/math.log(4)) );
area_unit = area_obj.unit;
area_unit = string.sub(area_unit, string.find(area_unit, "Q"), -1);
if(area_unit=="Q712226") then --кв км
elseif(area_unit=="Q35852") then area = area/100; --га
elseif(area_unit=="Q232291") then area = area*2.589988; --кв миля
elseif(area_unit=="Q25343") then area = area/1000000; --кв м
elseif(area_unit=="Q81292") then area = area*0.004046856; --акр
else return no_p2046; end
if (tonumber(area)<0.1) then zoom = 15 -- default zoom
else zoom = math.floor(15 - (math.log(2.5*area)/math.log(4)) ); end
end
zoom = zoom or 12
 
--якщо координати та масштаб визначені, повертаємо текстовий рядок з результатом, інакше повертаємо порожній рядок
if(latitude and longitude and zoom) then
--якщо аргумент "текст" було задано, заміняємо в ньому лапки на html-коди
Рядок 100 ⟶ 140:
end
--записуємо всі необхідні змінні в таблицю, об'єднуємо її в текстовий рядок, який повертаємо як результат
if(is_not_empty(args["контур"])) then shape = {'page","title": "', args["контур"]};
res = {"<mapframe width=", width, " height=", height, " zoom=", zoom, " latitude=", latitude, " longitude=", longitude,
else shape = {geo,'","ids": "', element}; end --нас цікавить саме об'єкт, а не оточення - geoshape"
" align=", align, frameless, text, '>{"type": "ExternalData","service": "geoshape","ids": "', element, '\"}</mapframe>'};
--можна задавати текст, який відображатиметься перед та після шаблону, якщо шаблон відображається
--якщо шаблон не відображається, то і цей текст не відображатиметься
--якщо префікс та постфкс не задані, присвоюємо їм порожнй рядок, щоб вони не мали значення nil
if(not is_not_empty(args["префікс"])) then args["префікс"] = ""; end
if(not is_not_empty(args["постфікс"])) then args["постфікс"] = ""; end
if(not is_not_empty(args["додатково"])) then args["додатково"] = ""; end
if(is_not_empty(args["перелік"])) then args["перелік"] = multiple_shapes(args["перелік"]); else args["перелік"] = ""; end
res = {args["префікс"], "{{anchor|map-osm}}<mapframe width=", width,
res = {"<mapframe width=", width, " height=", height, " zoom=", zoom, " latitude=", latitude, " longitude=", longitude,
" longitude=", longitude, " align=", align, frameless, text,
'>[', args["перелік"], args["додатково"], '{"type": "ExternalData","service": "', table.concat(shape),
'\","properties": {"fill-opacity": 0.3}}]</mapframe>', args["постфікс"]};
return frame:preprocess(table.concat(res));
--якщо ні, то додаємо сторінку до необхідної категорії спостереження
else
if(string.find(tostring(mw.title.getCurrentTitle()), "Шаблон:")) then
return "";
return templatescat;
else
if(not zoom) then return no_p2046; end
if( (not latitude) or (not longitude) ) then return no_p625; end
end
end
end