Module:UtilsError

local p = {}

function p.warn(msg, options) local options = options or {} local omitFrames = options.omitFrames or 0 local traceBack = options.traceBack omitFrames = omitFrames or 0 local errorSource local invokeFrame = mw.getCurrentFrame:getParent:getTitle local templateFrame if mw.title.new(invokeFrame).nsText == "Template" then templateFrame = mw.html.create("span") :addClass("hidden-link") :wikitext("" .. mw.getCurrentFrame:getParent:getTitle .. "") templateFrame = tostring(templateFrame) end msg = msg .. "\n" if traceBack ~= false then local callStack = debug.traceback("", 2) msg = msg .. "\n" for line in string.gmatch(callStack, "\tModule:[^:]*:[^\n]*\n") do			if omitFrames ~= 0 then omitFrames = omitFrames - 1 else line = string.gsub(line, "\tModule:([^:]*):(.*)", ':: Module:%1:%2 ') msg = msg .. line .. "\n" end end if templateFrame then msg = msg .. "::" .. templateFrame .. "\n" end end mw.addWarning(msg) end

p.Schemas = { warn = { msg = { type = "string", required = true, desc = "Warning message to log above the edit preview area", },		options = { type = "record", properties = { {					name = "traceBack", type = "boolean", default = true, desc = "If true, prints a stack trace of all module frames. If the invoking frame is a template, the name of the template is appended to the stack trace.", },				{					name = "omitFrames", type = "number", default = 0, desc = "Number of additional frames to omit from the top of the stack trace." },			}		}	} }

p.Documentation = { warn = { params = {"msg", "options"}, returns = "Returns nil, but logs the above message, possibly with a stack trace. Preview this page for an example of output.", cases = { {				args = {"I AM ERROR"}, },			{				args = {"I AM ERROR", { omitFrames = 2 }}, },			{				args = {"I AM ERROR", { traceBack = false }}, }		},	}, }

return p