Jump to content

Module:Ustring/sandbox: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
remove new 's<n>' args from "tagargs"
Add onerror option
Line 19: Line 19:
fargsused[i] = true
fargsused[i] = true
args[i + str_i - 1] = tonumber(v) or v:gsub("^\\", "", 1)
args[i + str_i - 1] = tonumber(v) or v:gsub("^\\", "", 1)
end
local result = nil
if fargs.onerror then
local success
success, result = pcall(what, unpack(args))
if not success then
return fargs.onerror
end
else
result = what(unpack(args))
end
end
if not fargs.tag then
if not fargs.tag then
return result
return (what(unpack(args))) -- Outside parens truncate to first result avoiding tail call
end
end
local tagargs = {}
local tagargs = {}
Line 27: Line 37:
if not fargsused[x] then tagargs[x] = y end
if not fargsused[x] then tagargs[x] = y end
end
end
return frame:extensionTag{name = fargs.tag, content = what(unpack(args)), args = tagargs}
return frame:extensionTag{name = fargs.tag, content = result, args = tagargs}
end
end
end
end

Revision as of 10:29, 14 November 2021

require('Module:No globals')
return setmetatable({}, {
	__index = function(t, k)
		local what = mw.ustring[k]
		if type(what) ~= "function" then
			return what
		end
		return function(frame)
			local fargs = frame.args
			local fargsused = { tag = true }
			local args = {}
			local str_i = 1
			while fargs['s' .. str_i] do
				fargsused['s' .. str_i] = true
				args[str_i] = fargs['s' .. str_i]
				str_i = str_i + 1
			end
			for i, v in ipairs(fargs) do
				fargsused[i] = true
				args[i + str_i - 1] = tonumber(v) or v:gsub("^\\", "", 1)
			end
			local result = nil
			if fargs.onerror then
				local success
				success, result = pcall(what, unpack(args))
				if not success then
					return fargs.onerror
				end
			else
				result = what(unpack(args))
			end
			if not fargs.tag then
				return result
			end
			local tagargs = {}
			for x, y in pairs(fargs) do
				if not fargsused[x] then tagargs[x] = y end
			end
			return frame:extensionTag{name = fargs.tag, content = result, args = tagargs}
		end
	end
})