Перейти к содержанию

Модуль:WikidataCoords

Материал из Мегавики — свободной энциклопедии

WikidataCoords — модуль для шаблона {{Wikidata-coords}}. Он вызывает указанный шаблон и добавляет к его параметрам географические координаты из свойства географические координаты (P625) связанного элемента Викиданных, если координаты не были заданы вручную.

Модуль предназначен для использования через служебные шаблоны. Основной публичный интерфейс для страниц — {{Wikidata-coords}}; прямой вызов модуля не предполагается.

Основное:

  • первый параметр {{Wikidata-coords}} задаёт шаблон, который будет вызван после подготовки координат;
  • если lat_deg и coord не указаны, координаты берутся из свойства P625 через Модуль:Wikidata;
  • пустой второй параметр означает передачу координат через lat_* и lon_*;
  • значения coord, 12345678, 23456789 и 345678910 во втором параметре задают другие форматы передачи координат;
  • coord, если он передан явно, используется как готовая строка координат и отключает преобразование по второму параметру;
  • 01 используется для передачи первого числового параметра вызываемого шаблона.

Подробные сведения о режимах работы, зависимостях и параметрах приведены ниже.

Режимы работы

В модуле нет отдельных публичных функций для разных режимов: вся логика находится в execTplWithCoords. Режим определяется параметрами родительского шаблона.

Режим источника координат

Режим Условие Что делает модуль
Локальная строка coord Непустой параметр coord Не обращается к Викиданным и передаёт coord вызываемому шаблону.
Локальные lat_*/lon_* Непустой параметр lat_deg Не обращается к Викиданным; заполняет отсутствующие части координат значениями по умолчанию.
Викиданные coord и lat_deg пустые Запрашивает P625 через Модуль:Wikidata с plain=true, затем раскладывает широту и долготу по параметрам.

Режим передачи координат

Режим Как выбирается Результат
Именованный Второй параметр пустой Координаты остаются в lat_* и lon_*.
Числовой 12345678 Второй параметр равен 12345678 Координаты переносятся в параметры 1—8.
Числовой 23456789 Второй параметр равен 23456789 Координаты переносятся в параметры 2—9; 01 становится параметром 1.
Числовой 345678910 Второй параметр равен 345678910 Координаты переносятся в параметры 3—10; 01 становится параметром 1.
Строковый coord Второй параметр равен coord Координаты собираются в строку и записываются в параметр coord.

Если параметр coord уже был передан в родительском шаблоне, режим передачи по второму параметру не применяется: готовый coord передаётся дальше как есть.

Режим вызываемого шаблона

Модуль не содержит отдельного режима для {{coord}} или Модуль:Coordinates. Первый параметр родительского шаблона используется как имя шаблона для frame:expandTemplate.

При вызове {{wikidata-coords|coord|12345678|...}} модуль работает в числовом режиме 12345678 и затем раскрывает шаблон {{coord}}. Параметры display, scale, format, type:..., region:... и другие параметры вызываемого шаблона не разбираются кодом WikidataCoords; их дальнейшую обработку выполняют {{coord}}, Модуль:Coordinates и, при формировании метаданных координат, GeoData.

При вызове {{coord}} в формате 12345678 координаты занимают параметры 1—8, поэтому параметр 9 остаётся первым свободным числовым параметром {{coord}}. В типовых вызовах в него передаётся строка параметров координат:

|9 = type:edu

В рабочих включениях модуль используется для промежуточного вызова {{coord}}, {{ПозКарта}}, {{Геокар/Позкарта}}, {{НП/ПозКарта}}, {{Бывший НП/ПозКарта}}, {{Достопримечательность/Позкарты}} и {{НП/ПозКарта+}}.

Зависимости

  • Модуль:Wikidata — прямая Lua-зависимость модуля; используется для получения значения свойства P625.
  • Связанный элемент Викиданных текущей страницы, если координаты не переданы явно.

При вызове из этого модуля Модуль:Wikidata получает параметры property=P625 и plain=true. Для значения типа globecoordinate в таком режиме Модуль:Wikidata возвращает простую строку широта,долгота, а не оформленные координаты.

Вызов выполняется только в режиме plain=true; оформление координат средствами Модуль:Wikidata в данном модуле не используется.

Функции

execTplWithCoords

{{#invoke:WikidataCoords|execTplWithCoords}}

Функция читает параметры родительского шаблона, вызывает шаблон, указанный первым параметром, и передаёт ему исходные параметры вместе с координатами.

Функция рассчитана на вызов из служебного шаблона, поскольку берёт параметры из frame:getParent().args. На страницах следует использовать {{Wikidata-coords}}.

Прямой вызов вида {{#invoke:WikidataCoords|execTplWithCoords|...}} не является штатным способом использования, поскольку функция читает параметры родительского шаблона.

Алгоритм работы

  1. Читает параметры родительского шаблона через frame:getParent().args.
  2. Использует первый числовой параметр как имя вызываемого шаблона.
  3. Использует второй числовой параметр как формат передачи координат.
  4. Переносит параметр 01 в числовой параметр 1 вызываемого шаблона.
  5. При отсутствии lat_deg и coord запрашивает свойство P625 через Модуль:Wikidata.
  6. Если координаты отсутствуют, возвращает пустую строку.
  7. Заполняет отсутствующие компоненты координат значениями по умолчанию.
  8. Преобразует координаты в выбранный формат передачи.
  9. Раскрывает вызываемый шаблон через frame:expandTemplate.

Если координаты были заданы явно, а не получены из Викиданных, результат оборачивается в:

<span class="no-wikidata" data-wikidata-property-id="P625">...</span>

Параметры родительского шаблона

Параметр Описание
1 Имя шаблона, который нужно вызвать.
2 Формат передачи координат: 12345678, 23456789, 345678910 или coord.
01 Значение для первого числового параметра вызываемого шаблона.
lat_deg Широта в градусах. Наличие непустого значения отключает запрос координат из Викиданных.
lat_min Минуты широты. По умолчанию 0.
lat_sec Секунды широты. По умолчанию 0.
lat_dir Направление широты. По умолчанию N.
lon_deg Долгота в градусах.
lon_min Минуты долготы. По умолчанию 0.
lon_sec Секунды долготы. По умолчанию 0.
lon_dir Направление долготы. По умолчанию E.
coord Готовая строка координат. Наличие непустого значения отключает запрос координат из Викиданных и преобразование по второму параметру.
from Идентификатор элемента Викиданных, из которого нужно получить координаты. При автоматическом запросе P625 учитывается Модуль:Wikidata.

Все прочие параметры передаются в вызываемый шаблон без изменений.

Форматы вывода

Формат Поведение Первый свободный числовой параметр после координат
не указан Координаты передаются именованными параметрами lat_deg, lat_min, lat_sec, lat_dir, lon_deg, lon_min, lon_sec, lon_dir. Не меняется.
12345678 Координаты передаются числовыми параметрами 1—8. Именованные параметры координат удаляются. 9
23456789 Координаты передаются числовыми параметрами 2—9. Параметр 01, если он указан, остаётся первым числовым параметром. 10
345678910 Координаты передаются числовыми параметрами 3—10. Параметр 01, если он указан, остаётся первым числовым параметром. 11
coord Координаты собираются в строку lat_deg/lat_min/lat_sec/lat_dir/lon_deg/lon_min/lon_sec/lon_dir и передаются параметром coord. Не меняется.

Если в вызове есть числовой параметр, номер которого входит в диапазон координат выбранного формата, это значение заменяется соответствующей частью координат. При формате 12345678 параметр 9 остаётся свободным; при формате 23456789 параметр 9 занят направлением долготы; при формате 345678910 первым свободным числовым параметром после координат становится 11.

Координаты из Викиданных

Модуль запрашивает свойство P625 через Модуль:Wikidata с параметром plain=true. Для координат это даёт строку широта,долгота. После получения строки модуль дополнительно удаляет все символы, кроме цифр, точки, запятой и минуса, после чего делит значение по запятой на широту и долготу.

Значения широты и долготы записываются в lat_deg и lon_deg как абсолютные значения в десятичных градусах. Направления определяются по знаку исходных координат: N/S для широты и E/W для долготы. Минуты и секунды получают значения по умолчанию 0.

Модуль рассчитан на одно значение P625. Если Модуль:Wikidata вернёт строку с несколькими значениями координат, корректная обработка такого результата не гарантируется.

Особенности и ограничения

  • Запрос к Викиданным отключается только при непустом lat_deg или coord. Один лишь lon_deg не считается полным локальным заданием координат.
  • Форматирование минут и секунд из десятичного значения не выполняется: координаты из Викиданных передаются как десятичные градусы, а lat_min, lat_sec, lon_min и lon_sec получают значения по умолчанию 0.
  • В числовых форматах 12345678, 23456789 и 345678910 именованные параметры координат удаляются перед вызовом целевого шаблона.
  • Если передан coord, преобразование по второму параметру не выполняется.

Возвращаемое значение

Функция возвращает раскрытый вызываемый шаблон. Если координаты не заданы и их нет в Викиданных, возвращается пустая строка.

Служебные признаки вывода

Локально заданные координаты помечаются так:

<span class="no-wikidata" data-wikidata-property-id="P625">...</span>

Эта разметка позволяет отличать вывод, основанный на локальных параметрах, от вывода, полученного из Викиданных. Модуль не добавляет категорий отслеживания.

Пример вызова из Lua

В Lua-коде служебный шаблон может раскрываться через frame:expandTemplate. В этом случае схема параметров остаётся такой же, как при обычном шаблонном вызове:

frame:expandTemplate{
	title = 'wikidata-coords',
	args = {
		'НП/ПозКарта',
		['русское название'] = ...,
		['страна'] = ...,
		from = entityId,
	}
}

Примеры обычного использования шаблона и раскладка параметров по форматам описаны в документации {{Wikidata-coords}}.

См. также


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.ustring.gsub(coords, '[^%d.,-]', "");

		-- Преобразование координат в значения отдельных параметров
		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;