Module:Documentation

local p = {} local h = {}

local list = require("Module:List").unorderedList local utilsString = require("Module:UtilsString") local utilsTable = require("Module:UtilsTable") local utilsText = require("Module:UtilsText") local wikitable = require("Module:Wikitable")

local frame = mw.getCurrentFrame function p.Main(frame) local args = frame:getParent.args return p.template(args) end

function p.template(templateExamples) local vertical = templateExamples.vertical if vertical then initialRows = { ,			,			,		}	else initialRows = { { "Input", "Output", "Categories added", header = true } }	end local tableData = { hideEmptyColumns = true, hideEmptyRows = true, rows = initialRows }	for _, example in ipairs(templateExamples) do		local input = utilsText.format(example, {			code = not vertical,			pre = vertical,		}) local output = frame:preprocess(mw.text.unstripNoWiki(example)) local output, categories = h.removeCategories(output) local output = h.killBackLinks(output) local categoryList = list(categories) if vertical then table.insert(tableData.rows[1], input) table.insert(tableData.rows[2], output) table.insert(tableData.rows[3], categoryList) else table.insert(tableData.rows, {input, output, categoryList}) end end return wikitable.createTable(tableData) end

function p.module(module, moduleExamples, options) local output = '' for fn, fnExamples in pairs(moduleExamples) do output = output .. ("=== ===\n"):format(fn) output = output .. h.fn(module[fn], fn, fnExamples, options) .. "\n" end return output end

function h.fn(fn, fnName, fnExamples, options) local showWikitext = (options and options.showOutputWikitext) or nil local tableData = { rows = { {				header = true, cells = { "Input", "Output", showWikitext and "Wikitext"}, }		},	}	for _, example in ipairs(fnExamples) do		local argsText = utilsTable.mapSafe(example.args, utilsTable.inspect) argsText = table.concat(argsText, ", ") argsText = ("%s(%s)"):format(fnName, argsText) local input = utilsText.format(argsText, {syntaxHighlight = "lua"}) local output = fn(unpack(example.args)) if example.description then table.insert(tableData.rows, {				header = true,				{					colspan = -1,					content = example.description,				}			}) end local wikitext = showWikitext and utilsText.format(output, {pre = true}) table.insert(tableData.rows, {input, output, wikitext }) end return wikitable.createTable(tableData) end

local categoryPattern = "%[%[Category:[^%]]*%]%]" function h.removeCategories(wikitext) local categories = {} for category in string.gmatch(wikitext, categoryPattern) do		local categoryWithoutSortKey = string.gsub(category, "|[^%]]*%]%]", "]]") local categoryLink = string.gsub(categoryWithoutSortKey, "Category", ":Category") table.insert(categories, categoryLink) end return string.gsub(wikitext, categoryPattern, ""), categories end

function h.killBackLinks(wikitext) local result = wikitext for link in string.gmatch(wikitext, "%[%^%*%]%]") do		local startPos, endPos = string.find(wikitext, link, 1, true) local before = string.sub(wikitext, 1, startPos -1) local after = string.sub(wikitext, endPos + 1) local externalLink = h.killBackLink(link) result = before .. externalLink .. after end return result end

function h.killBackLink(link) if utilsString.startsWith("[[Category:", link) then		return ""	end	if utilsString.startsWith("[[File:", link) then		return link -- not dealing with this now, but it's doable	end	link = mw.text.trim(link, "][")	link = string.gsub(link, "^:", "")	local pipe = string.find(link, "|")	local page = string.sub(link, 1, pipe and pipe - 1)	local display = pipe and string.sub(link, pipe + 1)	return utilsText.link(page, display, false) end

return p