Модуль:WikidataCoords
Выгляд
Дакументацыю да гэтага модуля можна стварыць у Модуль:WikidataCoords/Дакументацыя
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'
};
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
-- Атрыманне каардынат з Вікіданых
local propertyFilter = 'p625';
if args.propertyFilter then
propertyFilter = args.propertyFilter
end
frame.args = {
['property'] = propertyFilter,
['subvalue'] = 'plain',
['plain'] = true
};
local coords = moduleWikidata.formatProperty( frame );
mw.log( coords )
if (coords) then
coords = string.gsub( coords, ''', '′' );
coords = string.gsub( coords, '"', '″' );
-- Пераўтварэнне каардынат у значэнні асобных параметраў
coords = mw.text.split(coords, ',', true);
local lat = tonumber(coords[1]);
local lon = tonumber(coords[2]);
if lat and lat ~= '' then
args.lat_deg_wikidata = math.abs(lat);
if lat >= 0 then
args.lat_dir_wikidata = 'N'
else
args.lat_dir_wikidata = 'S'
end
end
if lon and lon ~= '' then
args.lon_deg_wikidata = math.abs(lon);
if lon >= 0 then
args.lon_dir_wikidata = 'E'
else
args.lon_dir_wikidata = 'W'
end
end
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 параметра
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
-- Атрыманне каардынат з Вікіданых
local propertyFilter = 'p625';
if args.propertyFilter then
propertyFilter = args.propertyFilter
end
frame.args = {
['property'] = propertyFilter,
['subvalue'] = 'plain',
['plain'] = true
};
local coords = moduleWikidata.formatProperty(frame);
mw.log( 'cart' .. coords )
if (coords) then
coords = string.gsub( coords, ''', '′' );
coords = string.gsub( coords, '"', '″' );
-- Пераўтварэнне каардынат у значэнні асобных параметраў
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
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) and not (args.display and args['display'] == 'title') then
out = '<span class="no-wikidata" data-wikidata-property-id="P625">' .. out .. '</span>'
end
return out
end
return p;