Модуль:КаардынатыЗьВікізьвестак
Выгляд
Дакумэнтацыю да гэтага модуля можна стварыць у Модуль:КаардынатыЗьВікізьвестак/Дакумэнтацыя
local p = {};
-- Дапомныя аргумэнты
local defaultArgs = {
['Шырата градусаў'] = '',
['Шырата хвілінаў'] = '0',
['Шырата сэкундаў'] = '0',
['Шырата паўшар’е'] = 'N',
['Даўгата градусаў'] = '',
['Даўгата хвілінаў'] = '0',
['Даўгата сэкундаў'] = '0',
['Даўгата паўшар’е'] = 'E'
};
-- Суадносіны пайменных і лічбавых парамэтраў
local argsMap = {
'Шырата градусаў',
'Шырата хвілінаў',
'Шырата сэкундаў',
'Шырата паўшар’е',
'Даўгата градусаў',
'Даўгата хвілінаў',
'Даўгата сэкундаў',
'Даўгата паўшар’е'
};
-- Мэтад выклікае шаблён, дадаючы да парамэтраў каардынаты зь Вікізьвестак
function p.execTplWithCoords(frame)
local moduleWikidata = require('Модуль:Вікізьвесткі');
local pFrame = frame:getParent();
local args = mw.clone(pFrame.args);
setmetatable(args, nil);
local template = mw.text.trim(args[1]);
args[1] = nil;
-- Фармат вываду
local outType = args[2]
if outType then
outType = mw.text.trim(outType);
end
-- Перавызначэньне 1 і 2 парамэтраў
args[1] = args['01'];
args['01'] = nil;
args[2] = args['02'];
args['02'] = nil;
local isWikidata = false
if (not args['Шырата градусаў'] or args['Шырата градусаў'] == '') and (not args.coord or args.coord == '') then
isWikidata = true
-- Атрыманьне каардынатаў зь Вікізьвестак
frame.args = {
['property'] = 'p625',
['plain'] = true
};
local coords = moduleWikidata.formatProperty(frame);
-- Калі парамэтры пустыя, шаблён не выклікаецца
if not coords or coords == '' then
return '';
end
-- Выдаляем магчымыя ўдакладненьні, кшталту «каля»
coords = mw.ustring.gsub(coords, '[^%d.,-]', "");
-- Пераўтварэньне каардынатаў у значэньні асобных парамэтраў
coords = mw.text.split(coords, ',', true);
local lat = tonumber(coords[1]);
local lon = tonumber(coords[2]);
if lat and lat ~= '' then
args['Шырата градусаў'] = math.abs(lat);
if lat >= 0 then
args['Шырата паўшар’е'] = 'N'
else
args['Шырата паўшар’е'] = 'S'
end
end
if lon and lon ~= '' then
args['Даўгата градусаў'] = math.abs(lon);
if lon >= 0 then
args['Даўгата паўшар’е'] = 'E'
else
args['Даўгата паўшар’е'] = 'W'
end
end
end
-- Заданьне дапомных значэньняў
for name, value in pairs(defaultArgs) do
if not args[name] or args[name] == '' then
args[name] = value;
end
end
-- Калі парамэтры пустыя, шаблён не выклікаецца
if (args['Шырата градусаў'] == '' and args['Даўгата градусаў'] == '') and (not args.coord or args.coord == '') then
return '';
end
-- Калі ў другім парамэтры пазначаны фармат вываду
if outType and (not args.coord or args.coord == '') then
-- Нумараваныя парамэтры, пачынаючы з n-га
if outType == '12345678' or outType == '23456789' or outType == '345678910' then
local n = 0;
if outType == '23456789' then
n = 1;
elseif outType == '345678910' then
n = 2;
end
for i, name in ipairs(argsMap) do
args[i + n] = args[name];
args[name] = nil;
end
end
if outType == 'coord' then
args['coord'] = args['Шырата градусаў'] ..
'/' ..
args['Шырата хвілінаў'] ..
'/' ..
args['Шырата сэкундаў'] ..
'/' ..
args['Шырата паўшар’е'] .. '/' .. args['Даўгата градусаў'] .. '/' .. args['Даўгата хвілінаў'] .. '/' .. args['Даўгата сэкундаў'] .. '/' .. args['Даўгата паўшар’е']
end
end
local out = frame:expandTemplate { title = template, args = args }
if not isWikidata then
out = '<span class="no-wikidata" data-wikidata-property-id="P625">' .. out .. '</span>'
end
return out
end
return p;