Модуль: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 p.main(frame)
--при помилці буде повертатись таке значення
errormessage = "[[Категорія:Сторінки із некоректними мапами]]";
--змінні для збереження значень аргументів, або за їх відсутності, значень за замовчуванням
width = 300; height = 300; frameless = " frameless"; text = ""; align = "center";
--отримуємо аргументи, передані до шаблону
parent = frame:getParent();
args = parent.args;
--перевіряємо чи присутній аргумент елемента Вікіданих, якщо ні, то беремо елемент для поточної сторінки
if(args["елемент"]) then element = args["елемент"];
else element = mw.wikibase.getEntityIdForCurrentPage(); end
if(not element) then return errormessage; end
--перевіряємо чи присутні аргументи ширини і висоти мапи, якщо ні, то залишаємо значення за замовчуванням
if(args["ширина"]) then width = args["ширина"]; end
if(args["висота"]) then height = args["висота"]; end
--перевіряємо чи присутні аргументи широти (північ-південь) та довготи (захід-схід), якщо ні, то пізніше їх отримаємо з Вікіданих
if(args["широта"] and args["довгота"]) then latitude = args["широта"]; longitude = args["довгота"]; end
--перевіряємо чи присутній аргумент масштабу, якщо ні, то пізніше отримаємо з Вікіданих
if(args["масштаб"]) then zoom = args["масштаб"]; end
--перевіряємо інші аргументи
if(args["рамка"]) then frameless = ""; end
if(args["текст"]) then text = args["текст"]; end
if(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, '"', """);
text = string.gsub(text, "'", "'")
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 table.concat(res);
else
return "";
end
end
return p;