Module:Template link general
-- This implements Template:Tlg
 local getArgs = require('Module:Arguments').getArgs
 local p = {}
 
 -- Is a string non-empty?
 local function _ne(s) 
 	return s ~= nil and s ~= &quot;&quot;
 end
 
 local nw = mw.text.nowiki
 
 local function addTemplate(s)
 	local i, _ = s:find(':', 1, true)
 	if i == nil then
 		return 'Template:' .. s
 	end
 	local ns = s:sub(1, i - 1)
 	if ns == '' or mw.site.namespaces[ns] then
 		return s
 	else
 		return 'Template:' .. s
 	end
 end
 
 local function trimTemplate(s)
 	local needle = 'template:'
 	if s:sub(1, needle:len()):lower() == needle then
 		return s:sub(needle:len() + 1)	
 	else
 		return s
 	end
 end
 
 local function linkTitle(args)
 	if _ne(args.nolink) then
 		return args['1']
 	end
 	
 	local titleObj
 	local titlePart = '[['
 	if args['1'] then
 		-- This handles :Page and other NS
 		titleObj = mw.title.new(args['1'], 'Template')
 	else
 		titleObj = mw.title.getCurrentTitle()
 	end
 	
 	titlePart = titlePart .. (titleObj ~= nil and titleObj.fullText or
 				addTemplate(args['1']))
 	
 	local textPart = args.alttext
 	if not _ne(textPart) then
 		if titleObj ~= nil then
 			textPart = titleObj:inNamespace(&quot;Template&quot;) and args['1'] or titleObj.fullText
 		else
 			-- redlink
 			textPart = args['1']
 		end
 	end
 	
 	if _ne(args.subst) then
 		-- HACK: the ns thing above is probably broken
 		textPart = 'subst:' .. textPart
 	end
 	
 	if _ne(args.brace) then
 		textPart = nw('{{') .. textPart .. nw('}}')
 	elseif _ne(args.braceinside) then
 		textPart = nw('{') .. textPart .. nw('}')
 	end
 	
 	titlePart = titlePart .. '|' .. textPart .. ']]'
 	if _ne(args.braceinside) then
 		titlePart = nw('{') .. titlePart .. nw('}')
 	end
 	return titlePart
 end
 
 function p.main(frame)
 	local args = getArgs(frame, {
 		trim = true,
 		removeBlanks = false
 	})
 	return p._main(args)
 end
 
 function p._main(args)
 	local bold = _ne(args.bold) or _ne(args.boldlink) or _ne(args.boldname)
 	local italic = _ne(args.italic) or _ne(args.italics)
 	local dontBrace = _ne(args.brace) or _ne(args.braceinside)
 	local code = _ne(args.code) or _ne(args.tt)
 	local show_result = _ne(args._show_result)
 	local expand = _ne(args._expand)
 	
 	-- Build the link part
 	local titlePart = linkTitle(args)
 	if bold then titlePart = &quot;'''&quot; .. titlePart .. &quot;'''&quot; end
 	if _ne(args.nowrapname) then titlePart = '&lt;span class=&quot;nowrap&quot;&gt;' .. titlePart .. '&lt;/span&gt;' end
 	
 	-- Build the arguments
 	local textPart = &quot;&quot;
 	local textPartBuffer = &quot;&amp;#124;&quot;
 	local codeArguments = {}
 	local codeArgumentsString = &quot;&quot;
 	local i = 2
 	local j = 1
 	while args[i] do
 		local val = args[i]
 		if val ~= &quot;&quot; then
 			if _ne(args.nowiki) then
 				-- Unstrip nowiki tags first because calling nw on something that already contains nowiki tags will
 				-- mangle the nowiki strip marker and result in literal UNIQ...QINU showing up
 				val = nw(mw.text.unstripNoWiki(val))
 			end
 			local k, v = string.match(val, &quot;(.*)=(.*)&quot;)
 			if not k then
 				codeArguments[j] = val
 				j = j + 1
 			else
 				codeArguments[k] = v
 			end
 			codeArgumentsString = codeArgumentsString .. textPartBuffer .. val
 			if italic then
 				val = '&lt;span style=&quot;font-style:italic;&quot;&gt;' .. val .. '&lt;/span&gt;'
 			end
 			textPart = textPart .. textPartBuffer .. val
 		end
 		i = i + 1
 	end
 
 	-- final wrap
 	local ret = titlePart .. textPart
 	if not dontBrace then ret = nw('{{') .. ret .. nw('}}') end
 	if _ne(args.a) then ret = nw('*') .. '&amp;nbsp;' .. ret end
 	if _ne(args.kbd) then ret = '&lt;kbd&gt;' .. ret .. '&lt;/kbd&gt;' end
 	if code then
 		ret = '&lt;code&gt;' .. ret .. '&lt;/code&gt;'
 	elseif _ne(args.plaincode) then
 		ret = '&lt;code style=&quot;border:none;background:transparent;&quot;&gt;' .. ret .. '&lt;/code&gt;'
 	end
 	if _ne(args.nowrap) then ret = '&lt;span class=&quot;nowrap&quot;&gt;' .. ret .. '&lt;/span&gt;' end
 	
 	--[[ Wrap as html?? 
 	local span = mw.html.create('span')
 	span:wikitext(ret)
 	--]]
 	if _ne(args.debug) then ret = ret .. '\n&lt;pre&gt;' .. mw.text.encode(mw.dumpObject(args)) .. '&lt;/pre&gt;' end
 
 	if show_result then
 		local result = mw.getCurrentFrame():expandTemplate{title = addTemplate(args[1]), args = codeArguments}
 		ret = ret .. &quot; → &quot; .. result
 	end
 
 	if expand then
 		local query = mw.text.encode('{{' .. addTemplate(args[1]) .. string.gsub(codeArgumentsString, textPartBuffer, &quot;|&quot;) .. '}}')
 		local url = mw.uri.fullUrl('special:ExpandTemplates', 'wpInput=' .. query)
 		mw.log()
 		ret = ret .. &quot; [&quot; .. tostring(url) .. &quot;]&quot;
 	end
 
 	return ret
 end