Модуль:WikidataCoords: различия между версиями
ru>Dima st bk (если на ВД пусто, то не вызываем шаблон) |
Admin (обсуждение | вклад) м (1 версия импортирована) |
(нет различий)
|
Текущая версия от 18:35, 21 июня 2023
Для документации этого модуля может быть создана страница Модуль: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;