Модуль:Обратная ссылка[править введение]

Материал из Minecraft Wiki
Перейти к навигации Перейти к поиску

Этот модуль используется для преобразования аргумента в название файла из общего хранилища (локальные перенаправления на такие файлы не работают). Списки соответствий задаются отдельными страницами, которые могут быть как Lua-модулями, так и JSON-файлами, что предпочтительнее, если для построения списка не требуется сложная логика.

Преобразование осуществляется функцией reverseLink. Вне модулей она может использоваться через шаблон {{Обратная ссылка}}.

Использование[править код]

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

Следующие два аргумента (могут быть указаны под названиями префикс и суффикс) соответственно задают префикс и суффикс цели ссылки. Если они не указаны, то будут по возможности использоваться значения, заданные в странице соответствий (в объекте или подтаблице настройки).

По умолчанию функция возвращает значение nil, если произошла ошибка при загрузке страницы соответствий (например, если её нет или в ней синтаксическая ошибка), а также если не найдено соответствие указанному названию. Если задать дополнительный аргумент строгий не с пустым значением, то в этих случаях вместо возвращения nil возникнет ошибка модуля.

Зависимости[править код]

local p = {}

local utils = require([[Модуль:Специальные утилиты]])

-- Выдаёт файл с англовики по русскоязычному названию ({{Обратная ссылка}})
function p.reverseLink(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	
	-- Базовые аргументы
	local link = mw.text.trim(args[1] or '')
	local pageName = 'Модуль:Обратная ссылка/' .. mw.text.trim(args["страница"] or args[2] or '')
	local strict = mw.text.trim(args["строгий"] or '') ~= ''
	
	-- Загрузка страницы соответствий
	local page
	if pageName:find('%.json$') then
		page = utils.tryLoadJsonData(pageName)
	else
		page = utils.tryLoadJsonData(pageName .. '.json') or utils.tryLoadData(pageName)
	end
	
	if not page then
		if strict then
			page = pageName
			if not pageName:find('%.json$') then
				page = page .. ".json» или «" .. pageName
			end
			error("Ошибка при загрузке страницы соответствий «" .. page .. "»")
		else
			return nil
		end
	end
	
	-- Ищем значение
	local rLink = page["ссылки"][link]
	if not rLink then
		if strict then
			error("Не найдено соответствия для значения «" .. link .. "»")
		else
			return nil
		end
	end
	
	-- Префикс и суффикс
	local prefix = args["префикс"] or args[3] or (page["настройки"] and page["настройки"]["префикс"]) or ''
	local suffix = args["суффикс"] or args[4] or (page["настройки"] and page["настройки"]["суффикс"]) or ''
	
	-- Возвращаем ссылку
	return prefix .. rLink .. suffix
end

-- Возвращает содержимое указанной страницы в JSON-формате ({{Обратная ссылка/json}})
function p.pageAsJson(f)
	local args = f:getParent().args
	local pageName = 'Модуль:Обратная ссылка/' .. mw.text.trim(args[1] or '')
	
	-- Пробуем загрузить страницу
	local page
	if pageName:find('%.json$') then
		page = utils.tryLoadJsonData(pageName)
	else
		page = utils.tryLoadJsonData(pageName .. '.json') or utils.tryLoadData(pageName)
	end
	
	return mw.text.jsonEncode(page)
end

return p