Bước tới nội dung

Mô đun:Demo

Bách khoa toàn thư mở Wikipedia
local p = {}--creates a frame object that cannot access any of the parent's args--unless a table containing a list keys of not to inherit is providedfunction disinherit(frame, onlyTheseKeys)	local parent = frame:getParent() or frame	local orphan = parent:newChild{}	orphan.getParent = parent.getParent --returns nil	orphan.args = {}	if onlyTheseKeys then		local family = {parent, frame}		for f = 1, 2 do			for k, v in pairs(family[f] and family[f].args or {}) do				orphan.args[k] = orphan.args[k] or v			end		end		parent.args = mw.clone(orphan.args)		setmetatable(orphan.args, nil)		for _, k in ipairs(onlyTheseKeys) do			rawset(orphan.args, k, nil)		end	end	return orphan, parentendfunction getSeparator(args, default)	local br = tonumber(args.br) and ('<br>'):rep(args.br) or args.br	local sep = args.sep or br or default	return #sep > 0 and ' ' .. sep .. ' ' or sependfunction p.get(frame, arg, passArgs)	local orphan, frame = disinherit(frame, passArgs and {arg or 1})	local code = frame.args[arg or 1] or ''	if code:match'UNIQ%-%-nowiki' then		code = mw.text.unstripNoWiki(code)			:gsub('&lt;', '<')			:gsub('&gt;', '>')			:gsub('&quot;', '"')			-- Replace `&#125;%-` with `}-` because of some server quirk leading to			-- =mw.text.unstripNoWiki(mw.getCurrentFrame():preprocess('<nowiki>}-</nowiki>'))			-- outputting `&#125;-` instead of `}-`, while it's ok with `<nowiki>} -</nowiki>`			:gsub('&#125;%-', '}-')			-- The same with `-&#123;`			:gsub('%-&#123;', '-{')	end	local kill_categories = frame.args.demo_kill_categories or frame.args.nocat	return {		source = code,		output = orphan:preprocess(code):gsub(kill_categories and '%[%[Thể loại.-%]%]' or '', ''),		frame = frame	}endfunction p.main(frame, demoTable)	local show = demoTable or p.get(frame)	local args = show.frame.args	if show[args.result_arg] then		return show[args.result_arg]	end	local yesno = require('Mô đun:Yesno')	args.reverse = yesno(args.reverse, false)	args.sep = getSeparator(args, '')	local source = frame:extensionTag{		name = 'syntaxhighlight',		args = {			lang = 'wikitext',			style = args.style		},		content = show.source	}	return args.reverse and		show.output .. args.sep .. source or		source .. args.sep .. show.outputend-- Alternate function to return an inline resultfunction p.inline(frame, demoTable)	local show = demoTable or p.get(frame)	local args = show.frame.args	if show[args.result_arg] then		return show[args.result_arg]	end	local yesno = require('Mô đun:Yesno')	args.reverse = yesno(args.reverse, false)	args.sep = getSeparator(args, args.reverse and '←' or '→')	local source =  frame:extensionTag{		name = 'syntaxhighlight',		args = {			lang = 'wikitext',			inline = true,			style = args.style		},		content = show.source	}	return args.reverse and		show.output .. args.sep .. source or		source .. args.sep .. show.outputend--passing of args into other module without preprocessingfunction p.module(frame)	local orphan, frame = disinherit(frame, {		'demo_template',		'demo_module',		'demo_module_func',		'demo_main',		'demo_sep',		'demo_br',		'demo_result_arg',		'demo_kill_categories',		'nocat'	})	local template = frame.args.demo_template and 'Bản mẫu:'..frame.args.demo_template	local demoFunc = frame.args.demo_module_func or 'main\n'	local demoModule = require('Mô đun:' .. frame.args.demo_module)[demoFunc:match('^%s*(.-)%s*$')]	frame.args.br, frame.args.result_arg = frame.args.demo_sep or frame.args.demo_br, frame.args.demo_result_arg	local kill_categories = frame.args.demo_kill_categories or frame.args.nocat	if demoModule then		local named = {insert = function(self, ...) table.insert(self, ...) return self end}		local source = {insert = named.insert, '{{', frame.args.demo_template or frame.args.demo_module, '\n'}		if not template then			source:insert(2, '#gọi:'):insert(4, '|'):insert(5, demoFunc)		end		local insertNamed = #source + 1		for k, v in pairs(orphan.args) do			local nan, insert = type(k) ~= 'number', {v}			local target = nan and named or source			target:insert'|'			if nan then				target:insert(k):insert'=':insert'\n'				table.insert(insert, 1, #target)			end			target:insert(unpack(insert))			local nowiki = v:match('nowiki')			if nowiki or v:match('{{.-}}') then				orphan.args[k] = frame:preprocess(nowiki and mw.text.unstripNoWiki(v) or v)			end		end		source:insert'}}'		table.insert(source, insertNamed, table.concat(named))		return p.main(orphan, {			source = table.concat(source), "<>'|=~",			output = tostring(demoModule(orphan)):gsub(kill_categories and '%[%[Thể loại.-%]%]' or '', ''),			frame = frame		})	else		return "LỖI: Chức năng mô đun không hợp lệ: "..demoFunc	endendreturn p