Module:UtilsMarkup/Format

local p = {}

local utilsArg = require("Module:UtilsArg") local utilsTable = require("Module:UtilsTable")

local function tag(tag, attributes, styles) return function(content) return tostring(mw.html.create(tag)			:attr(attributes or {})			:wikitext(content)) end end local function extensionTag(tag, defaultArgs) return function(content, overrideArgs) local args = utilsTable.merge({}, defaultArgs or {}, overrideArgs or {}) return mw.getCurrentFrame:extensionTag(tag, content, args) .. "\n" -- tags like don't work properly without the newline end end

p.pre = extensionTag("pre", nil) p.nowiki = extensionTag("nowiki") p.code = extensionTag("code") p.bold = tag("b") p.italic = tag("i")

function p.syntaxHighlight(lang, args) local args = utilsTable.merge({}, args or {}, {		lang = lang	}) return extensionTag("syntaxHighlight", args) end

function p.lua(content, options) local wrapLines = options and options.wrapLines local attrs = {} if type(content) ~= "string" then content = utilsTable.print(content) end if wrapLines == false then attrs.class = "nowrapLines" end return p.syntaxHighlight("lua")(content or "nil", attrs) end

function p.tooltip(caption) return tag("span", {		class = "explain",		title = caption,	}) end

function p.class(class) return tag("span", { class = class }) end

function p.heading(level) local headingTag = string.rep("=", level) return function(content) return "\n" .. headingTag .. content .. headingTag .. "\n" end end

function p.font(options) local err = utilsArg.schemaValidate(p.Schemas.font.options, "font.options", options, "options") err = err and ("" .. err .. "") or "" options = options or {} return function(text) if options.italic then text = p.italic(text) end if options.bold then text = p.bold(text) end return text .. err end end

p.Schemas = { bold = { text = { type = "string", required = true, desc = "The text to bold." },	},	italic = { text = { type = "string", required = true, desc = "The text to italicize." },		},	font = { text = { type = "string", required = true, }, options = { type = "record", properties = { {					name = "bold", type = "boolean", },				{					name = "italic", type = "boolean", }			}		}	},	heading = { level = { type = "number", required = true, desc = "The heading level." ,		},		text = { type = "string", required = true, desc = "The heading text.", },	},	tooltip = { caption = { type = "string", required = true, desc = "The text to display on hover.", },		text = { type = "string", required = true, desc = "The text to receive a tooltip.", },	},	lua = { text = { type = "string", required = true, desc = "A string of text to format as Lua code" },	} }

p.Documentation = { {		name = "bold", params = {"text"}, returns = "The bolded text.", cases = { args = { "Fooloo Limpah" }, expected = "Fooloo Limpah", },	},	{		name = "italic", params = {"text"}, returns = "The italicized text.", cases = { {				args = { "Fooloo Limpah" }, expected = "Fooloo Limpah", },		},	},	{		name = "font", order = 2, params = {{"options"}, {"text"}}, returns = "The formatted text.", cases = { {				args = { {						{ bold = true, italic = true }, },					{"Fooloo Limpah"}, },				expected = "Fooloo Limpah", },			{				args = { {						{ italic= true, invalidOption = "foo"}, },					{"Fooloo Limpah"}, },				expected = "Fooloo Limpah", }		},	},	{		name = "heading", order = 2, params = {{"level"}, {"text"}}, returns = " of text for the heading", cases = { {				args = { {2}, {"Section"} }, expected = "\n==Section==\n", },			{				args = { {3}, {"Sub-section"} }, expected = "\n===Sub-section===\n" }		}	},	{		name = "tooltip", order = 2, params = {{"caption"}, {"text"}}, cases = { {				args = {{"hello world!"}, {"hover over me"}}, expected = 'hover over me ' },		},		resultOnly = true, },	{		name = "lua", resultOnly = true, params = {"text"}, returns = "A block of pre-formatted, syntax-highlighted Lua code", cases = { {				args = { function(foo) 	return foo end }, }		}	} }

return p