<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://zoophilia.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ATemplate_link_general</id>
	<title>Module:Template link general - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://zoophilia.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ATemplate_link_general"/>
	<link rel="alternate" type="text/html" href="https://zoophilia.wiki/index.php?title=Module:Template_link_general&amp;action=history"/>
	<updated>2026-09-20T21:52:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://zoophilia.wiki/index.php?title=Module:Template_link_general&amp;diff=1415&amp;oldid=prev</id>
		<title>imported&gt;SockyPaws: Add logic to handle demonstrating substitutions and change indentation from tabs to two spaces</title>
		<link rel="alternate" type="text/html" href="https://zoophilia.wiki/index.php?title=Module:Template_link_general&amp;diff=1415&amp;oldid=prev"/>
		<updated>2025-09-02T21:39:52Z</updated>

		<summary type="html">&lt;p&gt;Add logic to handle demonstrating substitutions and change indentation from tabs to two spaces&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This implements Template:Template link general and various other templates in its family&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Is a string non-empty?&lt;br /&gt;
local function _ne(s)&lt;br /&gt;
  return s ~= nil and s ~= &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local nw = mw.text.nowiki&lt;br /&gt;
&lt;br /&gt;
local function addTemplate(s)&lt;br /&gt;
  local i, _ = s:find(&amp;#039;:&amp;#039;, 1, true)&lt;br /&gt;
  if i == nil then&lt;br /&gt;
    return &amp;#039;Template:&amp;#039; .. s&lt;br /&gt;
  end&lt;br /&gt;
  local ns = s:sub(1, i - 1)&lt;br /&gt;
  if ns == &amp;#039;&amp;#039; or mw.site.namespaces[ns] then&lt;br /&gt;
    return s&lt;br /&gt;
  else&lt;br /&gt;
    return &amp;#039;Template:&amp;#039; .. s&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trimTemplate(s)&lt;br /&gt;
  local needle = &amp;#039;template:&amp;#039;&lt;br /&gt;
  if s:sub(1, needle:len()):lower() == needle then&lt;br /&gt;
    return s:sub(needle:len() + 1)&lt;br /&gt;
  else&lt;br /&gt;
    return s&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function linkTitle(args)&lt;br /&gt;
  if _ne(args.nolink) then&lt;br /&gt;
    if _ne(args.subst) then&lt;br /&gt;
      return &amp;#039;subst:&amp;#039; .. args[&amp;#039;1&amp;#039;]&lt;br /&gt;
    else&lt;br /&gt;
      return args[&amp;#039;1&amp;#039;]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local titleObj&lt;br /&gt;
  local titlePart = &amp;#039;[[&amp;#039;&lt;br /&gt;
  if args[&amp;#039;1&amp;#039;] then&lt;br /&gt;
    -- This handles :Page and other NS&lt;br /&gt;
    titleObj = mw.title.new(args[&amp;#039;1&amp;#039;], &amp;#039;Template&amp;#039;)&lt;br /&gt;
  else&lt;br /&gt;
    titleObj = mw.title.getCurrentTitle()&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  titlePart = titlePart .. (titleObj ~= nil and titleObj.fullText or&lt;br /&gt;
      addTemplate(args[&amp;#039;1&amp;#039;]))&lt;br /&gt;
&lt;br /&gt;
  local textPart = args.alttext&lt;br /&gt;
  if not _ne(textPart) then&lt;br /&gt;
    if titleObj ~= nil then&lt;br /&gt;
      textPart = titleObj:inNamespace(&amp;quot;Template&amp;quot;) and args[&amp;#039;1&amp;#039;] or titleObj.fullText&lt;br /&gt;
    else&lt;br /&gt;
      -- Redlink&lt;br /&gt;
      textPart = args[&amp;#039;1&amp;#039;]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if _ne(args.subst) then&lt;br /&gt;
    -- HACK: the NS thing above is probably broken&lt;br /&gt;
    textPart = &amp;#039;subst:&amp;#039; .. textPart&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if _ne(args.brace) then&lt;br /&gt;
    textPart = nw(&amp;#039;{{&amp;#039;) .. textPart .. nw(&amp;#039;}}&amp;#039;)&lt;br /&gt;
  elseif _ne(args.braceinside) then&lt;br /&gt;
    textPart = nw(&amp;#039;{&amp;#039;) .. textPart .. nw(&amp;#039;}&amp;#039;)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  titlePart = titlePart .. &amp;#039;|&amp;#039; .. textPart .. &amp;#039;]]&amp;#039;&lt;br /&gt;
  if _ne(args.braceinside) then&lt;br /&gt;
    titlePart = nw(&amp;#039;{&amp;#039;) .. titlePart .. nw(&amp;#039;}&amp;#039;)&lt;br /&gt;
  end&lt;br /&gt;
  return titlePart&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
  local args = getArgs(frame, {&lt;br /&gt;
    trim = true,&lt;br /&gt;
    removeBlanks = false&lt;br /&gt;
  })&lt;br /&gt;
  return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
  local bold = _ne(args.bold) or _ne(args.boldlink) or _ne(args.boldname)&lt;br /&gt;
  local italic = _ne(args.italic) or _ne(args.italics)&lt;br /&gt;
  local dontBrace = _ne(args.brace) or _ne(args.braceinside)&lt;br /&gt;
  local code = _ne(args.code) or _ne(args.tt)&lt;br /&gt;
  local show_result = _ne(args._show_result)&lt;br /&gt;
  local expand = _ne(args._expand)&lt;br /&gt;
&lt;br /&gt;
  -- Build the link part&lt;br /&gt;
  local titlePart = linkTitle(args)&lt;br /&gt;
  if bold then titlePart = &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. titlePart .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; end&lt;br /&gt;
  if _ne(args.nowrapname) then titlePart = &amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&amp;#039; .. titlePart .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
  -- Build the arguments&lt;br /&gt;
  local textPart = &amp;quot;&amp;quot;&lt;br /&gt;
  local textPartBuffer = &amp;quot;&amp;amp;#124;&amp;quot;&lt;br /&gt;
  local codeArguments = {}&lt;br /&gt;
  local codeArgumentsString = &amp;quot;&amp;quot;&lt;br /&gt;
  local i = 2&lt;br /&gt;
  local j = 1&lt;br /&gt;
  while args[i] do&lt;br /&gt;
    local val = args[i]&lt;br /&gt;
    if val ~= &amp;quot;&amp;quot; then&lt;br /&gt;
      if _ne(args.nowiki) then&lt;br /&gt;
        -- Unstrip nowiki tags first because calling them on preexisting nowiki tags will&lt;br /&gt;
        -- mangle the nowiki strip marker and result in literal UNIQ...QINU showing up.&lt;br /&gt;
        val = nw(mw.text.unstripNoWiki(val))&lt;br /&gt;
      end&lt;br /&gt;
      local k, v = string.match(val, &amp;quot;(.*)=(.*)&amp;quot;)&lt;br /&gt;
      if not k then&lt;br /&gt;
        codeArguments[j] = val&lt;br /&gt;
        j = j + 1&lt;br /&gt;
      else&lt;br /&gt;
        codeArguments[k] = v&lt;br /&gt;
      end&lt;br /&gt;
      codeArgumentsString = codeArgumentsString .. textPartBuffer .. val&lt;br /&gt;
      if italic then&lt;br /&gt;
        val = &amp;#039;&amp;lt;span style=&amp;quot;font-style: italic;&amp;quot;&amp;gt;&amp;#039; .. val .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
      end&lt;br /&gt;
      textPart = textPart .. textPartBuffer .. val&lt;br /&gt;
    end&lt;br /&gt;
    i = i + 1&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  -- Final wrap.&lt;br /&gt;
  local ret = titlePart .. textPart&lt;br /&gt;
  if not dontBrace then ret = nw(&amp;#039;{{&amp;#039;) .. ret .. nw(&amp;#039;}}&amp;#039;) end&lt;br /&gt;
  if _ne(args.a) then ret = nw(&amp;#039;*&amp;#039;) .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. ret end&lt;br /&gt;
  if _ne(args.kbd) then ret = &amp;#039;&amp;lt;kbd&amp;gt;&amp;#039; .. ret .. &amp;#039;&amp;lt;/kbd&amp;gt;&amp;#039; end&lt;br /&gt;
  if code then&lt;br /&gt;
    ret = &amp;#039;&amp;lt;code&amp;gt;&amp;#039; .. ret .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
  elseif _ne(args.plaincode) then&lt;br /&gt;
    ret = &amp;#039;&amp;lt;code style=&amp;quot;background: transparent; border: none; color: inherit;&amp;quot;&amp;gt;&amp;#039; .. ret .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
  end&lt;br /&gt;
  if _ne(args.nowrap) then ret = &amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&amp;#039; .. ret .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
  --[[ Wrap as HTML??&lt;br /&gt;
  local span = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
  span:wikitext(ret)&lt;br /&gt;
  --]]&lt;br /&gt;
  if _ne(args.debug) then ret = ret .. &amp;#039;\n&amp;lt;pre&amp;gt;&amp;#039; .. mw.text.encode(mw.dumpObject(args)) .. &amp;#039;&amp;lt;/pre&amp;gt;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
  if show_result then&lt;br /&gt;
    local result = mw.getCurrentFrame():expandTemplate{title = addTemplate(args[1]), args = codeArguments}&lt;br /&gt;
    ret = ret .. &amp;quot; → &amp;quot; .. result&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if expand then&lt;br /&gt;
    local query = mw.text.encode(&amp;#039;{{&amp;#039; .. addTemplate(args[1]) .. string.gsub(codeArgumentsString, textPartBuffer, &amp;quot;|&amp;quot;) .. &amp;#039;}}&amp;#039;)&lt;br /&gt;
    local url = mw.uri.fullUrl(&amp;#039;special:ExpandTemplates&amp;#039;, &amp;#039;wpInput=&amp;#039; .. query)&lt;br /&gt;
    mw.log()&lt;br /&gt;
    ret = ret .. &amp;quot; [&amp;quot; .. tostring(url) .. &amp;quot;]&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;SockyPaws</name></author>
	</entry>
</feed>