Модуль:WikidataCoords
Jump to navigation
Jump to search
Дакументацыю да гэтага модуля можна стварыць у Модуль:WikidataCoords/Дакументацыя
local p = {};
-- Значэнні аргументаў па змоўчанні
local defaultArgs = {
['lat_deg'] = '',
['lat_min'] = '0',
['lat_sec'] = '0',
['lat_dir'] = 'N',
['lon_deg'] = '0',
['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'
};
local defaultArgsWikidata= {
['lat_deg_wikidata'] = '',
['lat_min_wikidata'] = '0',
['lat_sec_wikidata'] = '0',
['lat_dir_wikidata'] = 'N',
['lon_deg_wikidata'] = '0',
['lon_min_wikidata'] = '0',
['lon_sec_wikidata'] = '0',
['lon_dir_wikidata'] = 'E'
};
-- Метад выклікае шаблон, дадаючы да параметраў каардынаты з Вікідадзеных як _wikidata
function p.execTplAddCoords( 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] );
-- Калі параметры пустыя, шаблон не выклікаецца
if not args.lat_deg or args.lat_deg == '' then
return '';
else
-- Атрыманне каардынат з Вікідадзеных
frame.args = {
['property'] = 'p625',
['plain'] = true
};
local coords = moduleWikidata.formatProperty( frame );
coords = string.gsub( coords, ''', '\'' );
coords = string.gsub( coords, '"', '"' );
-- Пераўтварэнне каардынат у значэнні асобных параметраў
coords = mw.text.split( coords, ', ', true );
local lat = coords[1];
local lon = coords[2];
if lat and lat ~= '' then
args.lat_deg_wikidata = string.match( lat, '%d+°' );
args.lat_min_wikidata = string.match( lat, '%d+\'' );
args.lat_sec_wikidata = string.match( lat, '[0-9%.]+"' );
args.lat_dir_wikidata = string.match( lat, '[NS]' );
end
if lon and lon ~= '' then
args.lon_deg_wikidata = string.match( lon, '%d+°' );
args.lon_min_wikidata = string.match( lon, '%d+\'' );
args.lon_sec_wikidata = string.match( lon, '[0-9%.]+"' );
args.lon_dir_wikidata = string.match( lon, '[EW]' );
end
end
-- Устаноўка значэнняў па змоўчанні
for name, value in pairs( defaultArgsWikidata ) do
if not args[name] or args[name] == '' then
args[name] = value;
end
args[name] = mw.text.trim( args[name], '°\'" ' );
end
for name, value in pairs( defaultArgs ) do
if not args[name] or args[name] == '' then
args[name] = value;
end
args[name] = mw.text.trim( args[name], '°\'" ' );
end
return frame:expandTemplate{ title = template, args = args };
end
-- Метад выклікае шаблон, дадаючы да параметраў каардынаты з Вікідадзеных
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 параметру
if args['01'] then
args[1] = args['01'];
args['01'] = nil;
end
if args['02'] then
args[2] = args['02'];
args['02'] = nil;
end
if not args.lat_deg or args.lat_deg == '' then
-- Атрыманне каардынат з Вікідадзеных
frame.args = {
['property'] = 'p625',
['plain'] = true
};
local coords = moduleWikidata.formatProperty( frame );
coords = string.gsub( coords, ''', '\'' );
coords = string.gsub( coords, '"', '"' );
-- Пераўтварэнне каардынат у значэнні асобных параметраў
coords = mw.text.split( coords, ', ', true );
local lat = coords[1];
local lon = coords[2];
if lat and lat ~= '' then
args.lat_deg = string.match( lat, '%d+°' );
args.lat_min = string.match( lat, '%d+\'' );
args.lat_sec = string.match( lat, '[0-9%.]+"' );
args.lat_dir = string.match( lat, '[NS]' );
end
if lon and lon ~= '' then
args.lon_deg = string.match( lon, '%d+°' );
args.lon_min = string.match( lon, '%d+\'' );
args.lon_sec = string.match( lon, '[0-9%.]+"' );
args.lon_dir = string.match( lon, '[EW]' );
end
end
-- Устаноўка значэнняў па змоўчанні
for name, value in pairs( defaultArgs ) do
if not args[name] or args[name] == '' then
args[name] = value;
end
args[name] = mw.text.trim( args[name], '°\'" ' );
end
-- Калі параметры пустыя, шаблон не выклікаецца
if args.lat_deg == '' then
return '';
end
-- Калі ў другім параметры паказаны фармат высновы
if outType 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
end
return frame:expandTemplate{ title = template, args = args };
end
return p;