Модуль:WikidataCoords
Documentation for this module may be created at Модуль:WikidataCoords/doc
local p = {};
-- Значения аргументов по умолчанию
local defaultArgs = {
['lat_deg'] = '',
['lat_min'] = '0',
['lat_sec'] = '0',
['lat_dir'] = 'N',
['lon_deg'] = '',
['lon_min'] = '0',
['lon_sec'] = '0',
['lon_dir'] = 'E'
};
-- Соотношение именованных и числовых параметров
local argsMap = {
'lat_deg',
'lat_min',
'lat_sec',
'lat_dir',
'lon_deg',
'lon_min',
'lon_sec',
'lon_dir'
};
-- Метод вызывает шаблон, добавляя к параметрам координаты из Викиданных
function p.execTplWithCoords(frame)
local moduleWikidata = require('Module:Wikidata');
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.lat_deg or args.lat_deg == '') 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.text.split(coords, ',', true);
local lat = tonumber(coords[1]);
local lon = tonumber(coords[2]);
if lat and lat ~= '' then
args.lat_deg = math.abs(lat);
if lat >= 0 then
args.lat_dir = 'N'
else
args.lat_dir = 'S'
end
end
if lon and lon ~= '' then
args.lon_deg = math.abs(lon);
if lon >= 0 then
args.lon_dir = 'E'
else
args.lon_dir = '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.lat_deg == '' and args.lon_deg == '') 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.lat_deg ..
'/' ..
args.lat_min ..
'/' ..
args.lat_sec ..
'/' ..
args.lat_dir .. '/' .. args.lon_deg .. '/' .. args.lon_min .. '/' .. args.lon_sec .. '/' .. args.lon_dir
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;