Модуль:WikidataCoords
Поделись знанием:
Документация
execTplWithCoords
Используется в {{Wikidata-coords}}.
Вызывает шаблон, указанный первым параметром, передавая в него все остальные параметры и добавляя lat_*
и lon_*
в случае их отсутствия.
Если вторым параметром передан формат 12345678
, 23456789
или 345678910
, то в дополнение к параметрам lat_* и lon_* координаты будут переданы в соответствующих числовых параметрах.
Если в шаблон нужно передать первый или второй числовой параметр, можно воспользоваться параметрами 01
и 02
.
Во избежание поломок страниц, использующих данный модуль, желательно экспериментировать в Песочнице для модулей.
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' }; -- Метод вызывает шаблон, добавляя к параметрам координаты из Викиданных 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;