Модуль:Arguments/doc: различия между версиями

Материал из Народные сказки
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
Строка 98: Строка 98:


=== Обрезка и удаление пробелов ===
=== Обрезка и удаление пробелов ===
Пустые аргументы могут представлять сложность при портировании кода шаблонов на Lua. В синтаксисе шаблонов пустые строки или строки из пробелов приравниваются к {{luafalse}}. В Lua же такие строки соответствуют {{luatrue}}. Поэтому, если вы уделите недостаточно внимания обработке таких аргументов, может нарушиться задуманная логика шаблона. Чтобы избежать такого развития событий, по умолчанию модуль удаляет все пустые аргументы.
Пустые аргументы могут представлять сложность при портировании кода шаблонов на Lua. В синтаксисе шаблонов пустые строки или строки из пробелов приравниваются к {{luafalse}}. В Lua же такие строки соответствуют {{LuaTrue}}. Поэтому, если вы уделите недостаточно внимания обработке таких аргументов, может нарушиться задуманная логика шаблона. Чтобы избежать такого развития событий, по умолчанию модуль удаляет все пустые аргументы.


Кроме того, пробелы могут вызывать проблемы при обработке позиционных аргументов. При вызове {{Code|#invoke}} из именованных параметров пробелы по краям удаляются сами, но сохраняются для позиционных параметров. Большинство таких пробелов на самом деле не нужно, поэтому модуль по умолчанию их обрезает.
Кроме того, пробелы могут вызывать проблемы при обработке позиционных аргументов. При вызове {{Code|#invoke}} из именованных параметров пробелы по краям удаляются сами, но сохраняются для позиционных параметров. Большинство таких пробелов на самом деле не нужно, поэтому модуль по умолчанию их обрезает.

Версия от 19:39, 14 мая 2023

Шаблон:Module rating

Данный модуль служит для облегчения обработки аргументов, передаваемых в #invoke. Это мета-модуль, предназначенный для использования в других модулях, а не вики-страницах напрямую. Его функционал включает:

  • Облегчение обрезки аргументов и удаления пустых аргументов.
  • Аргументы, передаваемые не только текущим фреймов, но и родительским фреймом. (См. ниже)
  • Аргументы, передаваемые из другого модуля или отладочной консоли.
  • Аргументы передаются как надо, что может помочь избежать части проблем с тэгами Шаблон:xtag.
  • Большинство возможностей поддаются настройке.

Базовое использование

Первым делом, необходимо загрузить модуль. Он содержит всего одну функцию — getArgs.

local getArgs = require('Module:Arguments').getArgs

В наиболее простом сценарии вы можете использовать getArgs в главной функции вашего модуля. Переменная args содержит таблицу аргументов, переданных в #invoke.

local getArgs = require('Module:Arguments').getArgs
local p = {}

function p.main(frame)
	local args = getArgs(frame)
	-- Основной код модуля.
end

return p

Тем не менее, принятая практика заключается в использовании функции отдельной функции для получения аргуметов из #invoke и отдельной функции для их обработки — чтобы было проще вызывать ваши функции из другого модуля без передачи аргумента frame, что положительно влияет на производительность.

local getArgs = require('Module:Arguments').getArgs
local p = {}

function p.main(frame)
	local args = getArgs(frame)
	return p._main(args)
end

function p._main(args)
	-- Основной код модуля.
end

return p

Если вам нужно несколько разных функций, использующих аргументы вызова, вы можете использовать функцию-обёртку.

local getArgs = require('Module:Arguments').getArgs

local p = {}

local function makeInvokeFunc(funcName)
	return function (frame)
		local args = getArgs(frame)
		return p[funcName](args)
	end
end

p.func1 = makeInvokeFunc('_func1')

function p._func1(args)
	-- Код первой функции.
end

p.func2 = makeInvokeFunc('_func2')

function p._func2(args)
	-- Код второй функции.
end

return p

Опции

Доступные опции приведены ниже.

local args = getArgs(frame, {
	trim = false,
	removeBlanks = false,
	valueFunc = function (key, value)
		-- код, обрабатывающий единственный аргумент
	end,
	frameOnly = true,
	parentOnly = true,
	parentFirst = true,
	wrappers = {
		'Шаблон:Обёртка',
		'Шаблон:Другая обёртка'
	},
	readOnly = true,
	noOverwrite = true
})

Обрезка и удаление пробелов

Пустые аргументы могут представлять сложность при портировании кода шаблонов на Lua. В синтаксисе шаблонов пустые строки или строки из пробелов приравниваются к Шаблон:luafalse. В Lua же такие строки соответствуют true. Поэтому, если вы уделите недостаточно внимания обработке таких аргументов, может нарушиться задуманная логика шаблона. Чтобы избежать такого развития событий, по умолчанию модуль удаляет все пустые аргументы.

Кроме того, пробелы могут вызывать проблемы при обработке позиционных аргументов. При вызове #invoke из именованных параметров пробелы по краям удаляются сами, но сохраняются для позиционных параметров. Большинство таких пробелов на самом деле не нужно, поэтому модуль по умолчанию их обрезает.

Однако же, если требуется сохранить эти пробелы, можно задать опциям trim и removeBlanks значение Шаблон:luafalse.

local args = getArgs(frame, {
	trim = false,
	removeBlanks = false
})

Произвольное форматирование аргументов

В некоторых случаях может потребоваться удалить только часть пустых аргументов или, например, привести все позиционные аргументы к нижнему регистру. Для этого можно использовать опцию valueFunc. На вход этой опции должна подавиться функция от двух параметров, key и value, возвращающая единственное значение. Это значение будет записано в поле key таблицы args.

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

local args = getArgs(frame, {
	valueFunc = function (key, value)
		if key == 1 then
			return value
		elseif value then
			value = mw.text.trim(value)
			if value ~= '' then
				return value
			end
		end
		return nil
	end
})

Пример 2: удалить пробельные и пустые аргументы и привести все аргументы к нижнему регистру, но не обрезать пробелы из позиционных аргументов.

local args = getArgs(frame, {
	valueFunc = function (key, value)
		if not value then
			return nil
		end
		value = mw.ustring.lower(value)
		if mw.ustring.find(value, '%S') then
			return value
		end
		return nil
	end
})

Замечание: функции выше выдадут ошибку, если входные аргументы не будут принадлежать к типу string или Шаблон:luanil. Это может произойти при вызове функции getArgs из другого модуля. В этом случае требуется проверка типов. В обычном случае при вызове из #invoke такая проблема не стоит.