Модуль:Песочница/Vavilexxx/tests

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация
require('strict')

local getLink = require('Модуль:Песочница/Vavilexxx/URL').getLink
local colorContrast = require('Модуль:Color contrast')
local htmlColor = mw.loadData('Модуль:Color contrast/colors')
local tableEmptyCell = require('Модуль:Пустая ячейка таблицы')
local debugthis = require('Модуль:Песочница/Vavilexxx/debug')
local wikidata = require('Модуль:Wikidata').formatProperty
local getArgs = require('Module:Arguments').getArgs
local delink = require('Модуль:Delink').delink
local stringModule = require('Модуль:String')
local mathModule = require('Модуль:Math')
local yesno = require('Модуль:Yesno')


local format = mw.ustring.format
local match = mw.ustring.match
local upper = mw.ustring.upper
local lower = mw.ustring.lower
local find = mw.ustring.find
local gsub = mw.ustring.gsub
local sub = mw.ustring.sub
local trim = mw.text.trim


local p = {}
local args, rawargs, sortedargs
local result

--------------------------------------------------------------------------------
-- ВСПОМОГАТЕЛЬНЫЕ (ЛОКАЛЬНЫЕ) ФУНКЦИИ
--------------------------------------------------------------------------------

local function funcname(...)
	-- Тело функции
	
end

--[[ Декоратор (функция-обёртка) для передачи аргументов в функцию
---- Хотя это не нужно. Если в области видимости модуля есть нужные аргументы,
---- то они доступны и в области видимости модуля (замыкание)
--]]
local function makeInvokeFunc(funcName)
	return function (frame)
		local args = getArgs(frame)
		return p[funcName](args)
	end
end

-- Это навесить перед нужной функцией
p.func1 = makeInvokeFunc('_func1')

local function comparator(key, value, ...)
	-- sortargs = {key, value, ...}
	-- sortargs[#sortargs + 1] = key
end

local function getsortedargs(unsortedargs)
	local tempargs, newargs = {}, {}
	for key, value in pairs(unsortedargs) do
		table.insert(tempargs, key)
	end
	table.sort(tempargs)
	for i, key in pairs(tempargs) do
		newargs[key] = unsortedargs[key]
	end
	return newargs
end

--------------------------------------------------------------------------------
-- ОСНОВНЫЕ ФУНКЦИИ (МЕТОДЫ)
--------------------------------------------------------------------------------

--- \127'"`UNIQ--tagname-8 hex digits-QINU`"'\127
--- '"`UNIQ--ref-FFFFFFFF-QINU`"' 
--- Удаление <ref> -- match(args.ref, '^(.+)%s*\'"`')
--- Удаление {{comment}} -- match(frame.args[1], '>([^<>]+)<')

function p.DEBUG(frame)
	local firstArg = getArgs(frame)[1]
	local killMarkers = mw.text.killMarkers
	local nowiki = mw.text.nowiki
	local result = '<b>Вывод</b>: '
	if not firstArg then
		return result .. 'nil'
	end

	if firstArg:find('-ref-') then
		result = result .. firstArg
		result = result .. '<br><b>Под капотом</b>: ' .. nowiki(firstArg)
		result = result .. '<br><b>После подрезки</b>: ' .. killMarkers(firstArg)
	elseif firstArg:find('-comment-') then
		result = result .. firstArg
		result = result .. '<br><b>Под капотом</b>: ' .. nowiki(firstArg)
		result = result .. '<br><b>После подрезки</b>: ' .. firstArg:match('>([^<>]+)<')
	elseif firstArg:find('UNIQ') then
		result = result .. firstArg
		result = result .. '<br><b>Под капотом</b>: ' .. nowiki(firstArg)
		result = result .. '<br><b>После подрезки</b>: ' .. killMarkers(firstArg)
	elseif firstArg:find('[<>]') then
		result = result .. firstArg
		result = result .. '<br><b>Под капотом</b>: ' .. nowiki(firstArg)
		result = result .. '<br><b>После подрезки</b>: ' .. firstArg:gsub('<.->', ' '):gsub('%s+', ' '):gsub('^%s+', ''):gsub('%s+$', '')
	else
		result = '<b>Это просто текст</b>: ' .. firstArg
	end

	return result
end

function p.DEBUG2(frame)
	local arg = getArgs(frame)[1]
	local result
	if not arg then
		return 'На выходе: nil'
	end
	
	if find(arg, '-ref-') then
		result = 'Вывод: ' .. arg
		result = result .. '<br>Под капотом: ' .. mw.text.nowiki(arg)
		result = result .. '<br>После подрезки: ' .. mw.text.killMarkers(arg)
	elseif find(arg, '-comment-') then
		result = 'Вывод: ' .. arg
		result = result .. '<br>Под капотом: ' .. mw.text.nowiki(arg)
		result = result .. '<br>После подрезки: ' .. match(arg, '>([^<>]+)<')
	elseif find(arg, 'UNIQ') then
		result = 'Вывод: ' .. arg
		result = result .. '<br>Под капотом: ' .. mw.text.nowiki(arg)
		result = result .. '<br>После подрезки: ' .. mw.text.killMarkers(arg)
	elseif find(arg, '[<>]') then
		result = 'Вывод: ' .. arg
		result = result .. '<br>Под капотом: ' .. mw.text.nowiki(arg)
		result = result .. '<br>После подрезки: ' .. gsub(arg, '<.->', ' '):gsub('%s+', ' '):gsub('^%s+', ''):gsub('%s+$', '')
	else
		result = 'Это просто текст: ' .. arg
	end
	
	return result
end

function p.getWikidata(frame)
	local args = getArgs(frame)
	local property = args.property or args[1]
	local value = args.value or args[2]
	local from = args.from or args[3]
	frame.args.property = property
	frame.args.value = value
	frame.args.from = from
	
	-- wikidata({args={property='P1811', value='Список эпизодов телесериала «Во все тяжкие»', from='Q126004'}})
	-- {['args']={property=property, value='', from=from}}
	result = wikidata(frame)
	debugthis(result)
	return result
end

function p._main(args)
	-- Основной код модуля.
	-- table.sort( table, comparator )
	-- comparator = function (key) return key end
	-- table.sort(args, comparator)  -- Не работает с именованными параметрами!!!???
	-- sortedargs = getsortedargs(args)
	result = '{'
	local first = '%1q: %2q'
	-- mw.site.namespaces, args
	for key, value in pairs(mw.site.namespaces[0]) do
		result = result .. format(first or ', %1q: %2q', key, tostring(value))
		first = false
	end
	local postfix = nil or '&#8203;'
	result = result .. '}' .. postfix
	
	result = result .. '<br>' .. format('yesno = %1s', tostring(yesno(lower(args.yesno)))) or ''
	result = result .. '<br>' .. format('delink = %1s', delink({args.delink})) or ''

	local urlLink = getLink({'https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:URL', 'ссылка на шаблон'})
	
	-- return tostring(args)
	return result, '<br>', tostring(mw.site.namespaces[0].displayName), '<br>', urlLink
end

--------------------------------------------------------------------------------
-- ЭКСПОРТ
--------------------------------------------------------------------------------

function p.main(frame)
	local args = {}
	local rawargs = getArgs(frame)
	local iargs = getArgs(frame, {
		-- Обрезка и удаление пробелов:
		-- trim = false,  -- Обрезка и удаление пробелов по краям. По умолчанию: true
		removeBlanks = false,  -- Удаление пустых аргументов. По умолчанию: true
		valueFunc = function (key, value)
			-- Произвольное форматирование аргументов
			-- код, обрабатывающий единственный аргумент
		end,
		--[[ При установке одновременно опций frameOnly и parentOnly модуль не получит никаких аргументов из #invoke. Так делать не стоит.
		---- В некоторых ситуациях родительский фрейм может быть недоступен, например, если он был сразу подан на вход функции getArgs. 
		---- Тогда могут использоваться лишь аргументы этого фрейма (если установлена опция parentOnly, то никакие аргументы получить не удастся), 
		---- а parentFirst и frameOnly не будут иметь эффекта.
		--]]
		-- frameOnly = true,  -- будут обрабатываться только аргументы фрейма, где происходит непосредственно вызов {{#invoke:имя_модуля|main|*args|**kwargs}}
		-- parentOnly = true,  -- будут обрабатываться только аргументы родительского фрейма ({{шаблона|*аргументы|**аргументы}})
		-- parentFirst = true,  -- будут обрабатываться аргументы из обоих фреймов, но в первую очередь родительского
		-- Обёртки. Опция wrappers используется для указания ограниченного числа шаблонов как шаблонов-обёрток:
		-- wrappers = 'Шаблон:Обёртка',
		wrappers = {
			-- 'Шаблон:Шаблон №1',
			-- 'Шаблон:Шаблон №2',
			-- 'Шаблон:Обёртка',
			-- 'Шаблон:Другая обёртка'
		},
		-- Запись в таблицу args:
		-- readOnly = true,  -- в таблицу args нельзя вносить изменения вообще. По умолчанию: false
		-- noOverwrite = true  -- можно добавлять новые значения, но нельзя менять уже имеющиеся в таблице значения, полученные из #invoke. По умолчанию: false
	})

	--Предобработка параметров
	for key, value in pairs(rawargs) do
		if type(key) == 'string' then
			key = lower(gsub(key, ' ', '')) -- Удаление всех пробелов и приведение к нижнему регистру
			if not args[key] then
				args[key] = value  -- добавление в таблицу аргументов новых параметров
			end
		end
	end

	return p._main(args)
end

return p