Module:Template link general: Difference between revisions
From The Goon Show Depository
en>ExE Boss (Fix `alttext` parameter) |
en>Primefac (update from sandbox - fixes to _show_result and adding _expand) |
||
Line 1: | Line 1: | ||
-- This implements | -- This implements Template:Tlg | ||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
local p = {} | local p = {} | ||
Line 37: | Line 33: | ||
local function linkTitle(args) | local function linkTitle(args) | ||
if | if _ne(args.nolink) then | ||
return args[1] | return args['1'] | ||
end | end | ||
local titleObj | local titleObj | ||
local titlePart = '[[' | local titlePart = '[[' | ||
if args[1] then | if args['1'] then | ||
-- This handles :Page and other NS | -- This handles :Page and other NS | ||
titleObj = mw.title.new(args[1], 'Template') | titleObj = mw.title.new(args['1'], 'Template') | ||
else | else | ||
titleObj = mw.title.getCurrentTitle() | titleObj = mw.title.getCurrentTitle() | ||
end | end | ||
titlePart = titlePart .. (titleObj ~= nil and titleObj.fullText or | titlePart = titlePart .. (titleObj ~= nil and titleObj.fullText or | ||
addTemplate(args[1])) | addTemplate(args['1'])) | ||
local textPart = args.alttext | local textPart = args.alttext | ||
if not _ne(textPart) then | if not _ne(textPart) then | ||
if titleObj ~= nil then | if titleObj ~= nil then | ||
textPart = titleObj:inNamespace("Template") and args[1] or titleObj.fullText | textPart = titleObj:inNamespace("Template") and args['1'] or titleObj.fullText | ||
else | else | ||
-- redlink | -- redlink | ||
textPart = args[1] | textPart = args['1'] | ||
end | end | ||
end | end | ||
if | 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('}}') | textPart = nw('{{') .. textPart .. nw('}}') | ||
elseif | elseif _ne(args.braceinside) then | ||
textPart = nw('{') .. textPart .. nw('}') | textPart = nw('{') .. textPart .. nw('}') | ||
end | end | ||
titlePart = titlePart .. '|' .. textPart .. ']]' | titlePart = titlePart .. '|' .. textPart .. ']]' | ||
if | if _ne(args.braceinside) then | ||
titlePart = nw('{') .. titlePart .. nw('}') | titlePart = nw('{') .. titlePart .. nw('}') | ||
end | end | ||
Line 79: | Line 80: | ||
local args = getArgs(frame, { | local args = getArgs(frame, { | ||
trim = true, | trim = true, | ||
removeBlanks = false | removeBlanks = false | ||
}) | }) | ||
return p._main(args) | return p._main(args) | ||
Line 88: | Line 86: | ||
function p._main(args) | 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) | |||
local bold = | |||
local italic = | |||
local dontBrace = | |||
local code = | |||
local | |||
-- Build the link part | -- Build the link part | ||
local titlePart = linkTitle(args) | local titlePart = linkTitle(args) | ||
if bold then titlePart = "'''" .. titlePart .. "'''" end | if bold then titlePart = "'''" .. titlePart .. "'''" end | ||
if _ne(args.nowrapname) then titlePart = '<span class="nowrap">' .. titlePart .. '</span>' end | |||
-- Build the arguments | -- Build the arguments | ||
local textPart = "" | local textPart = "" | ||
local textPartBuffer = "" | local textPartBuffer = "|" | ||
local codeArguments = {} | |||
local codeArgumentsString = "" | |||
local i = 2 | local i = 2 | ||
local j = 1 | |||
while args[i] do | while args[i] do | ||
local val = args[i] | local val = args[i] | ||
if val ~= "" then | if val ~= "" then | ||
if | if _ne(args.nowiki) then | ||
-- Unstrip nowiki tags first because calling nw on something that already contains nowiki tags will | -- 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 | -- mangle the nowiki strip marker and result in literal UNIQ...QINU showing up | ||
val = nw(mw.text.unstripNoWiki(val)) | val = nw(mw.text.unstripNoWiki(val)) | ||
end | end | ||
if italic then val = '<span style="font-style:italic;">' .. val .. '</span>' end | local k, v = string.match(val, "(.*)=(.*)") | ||
if not k then | |||
codeArguments[j] = val | |||
j = j + 1 | |||
else | |||
codeArguments[k] = v | |||
end | |||
codeArgumentsString = codeArgumentsString .. textPartBuffer .. val | |||
if italic then | |||
val = '<span style="font-style:italic;">' .. val .. '</span>' | |||
end | |||
textPart = textPart .. textPartBuffer .. val | textPart = textPart .. textPartBuffer .. val | ||
end | end | ||
i = i+1 | i = i + 1 | ||
end | end | ||
-- final wrap | -- final wrap | ||
local ret = titlePart .. textPart | local ret = titlePart .. textPart | ||
if not dontBrace then ret = nw('{{') .. ret .. nw('}}') end | if not dontBrace then ret = nw('{{') .. ret .. nw('}}') end | ||
if | if _ne(args.a) then ret = nw('*') .. ' ' .. ret end | ||
if | if _ne(args.kbd) then ret = '<kbd>' .. ret .. '</kbd>' end | ||
if code then | |||
ret = '<code>' .. ret .. '</code>' | |||
elseif _ne(args.plaincode) then | |||
ret = '<code style="border:none;background:transparent;">' .. ret .. '</code>' | |||
if code | |||
end | end | ||
if _ne(args.nowrap) then ret = '<span class="nowrap">' .. ret .. '</span>' end | |||
--[[ Wrap as html?? | |||
local span = mw.html.create('span') | |||
span:wikitext(ret) | |||
--]] | |||
if _ne(args.debug) then ret = ret .. '\n<pre>' .. mw.text.encode(mw.dumpObject(args)) .. '</pre>' end | |||
if | if show_result then | ||
local result = mw.getCurrentFrame():expandTemplate{title = addTemplate(args[1]), args = codeArguments} | |||
ret = ret .. " → " .. result | |||
end | end | ||
if | if expand then | ||
local query = mw.text.encode('{{' .. addTemplate(args[1]) .. string.gsub(codeArgumentsString, textPartBuffer, "|") .. '}}') | |||
local url = mw.uri.fullUrl('special:ExpandTemplates', 'wpInput=' .. query) | |||
mw.log() | |||
ret = ret .. " [" .. tostring(url) .. "]" | |||
end | end | ||
return | return ret | ||
end | end | ||
return p | return p |
Revision as of 02:30, 8 March 2022
This Lua module is used in system messages, and on approximately 3,570,000 pages, or roughly 14567% of all pages. Changes to it can cause immediate changes to the Wikipedia user interface. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Please discuss changes on the talk page before implementing them. |
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
This module depends on the following other modules: |
Implements {{Template link general}} and other templates in its family
Basic usage
{{#invoke:template link general|main}}
This module is used by {{template link general}} and related templates to display links to templates. It is similar to {{tl}} but with additional formatting options and the ability to include parameters in the display. See Template:Template link general § Parameters for the full list, which can be enabled by passing any value to them (such as "on", "yes", etc).
-- 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 ~= ""
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("Template") 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 = "'''" .. titlePart .. "'''" end
if _ne(args.nowrapname) then titlePart = '<span class="nowrap">' .. titlePart .. '</span>' end
-- Build the arguments
local textPart = ""
local textPartBuffer = "|"
local codeArguments = {}
local codeArgumentsString = ""
local i = 2
local j = 1
while args[i] do
local val = args[i]
if val ~= "" 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, "(.*)=(.*)")
if not k then
codeArguments[j] = val
j = j + 1
else
codeArguments[k] = v
end
codeArgumentsString = codeArgumentsString .. textPartBuffer .. val
if italic then
val = '<span style="font-style:italic;">' .. val .. '</span>'
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('*') .. ' ' .. ret end
if _ne(args.kbd) then ret = '<kbd>' .. ret .. '</kbd>' end
if code then
ret = '<code>' .. ret .. '</code>'
elseif _ne(args.plaincode) then
ret = '<code style="border:none;background:transparent;">' .. ret .. '</code>'
end
if _ne(args.nowrap) then ret = '<span class="nowrap">' .. ret .. '</span>' end
--[[ Wrap as html??
local span = mw.html.create('span')
span:wikitext(ret)
--]]
if _ne(args.debug) then ret = ret .. '\n<pre>' .. mw.text.encode(mw.dumpObject(args)) .. '</pre>' end
if show_result then
local result = mw.getCurrentFrame():expandTemplate{title = addTemplate(args[1]), args = codeArguments}
ret = ret .. " → " .. result
end
if expand then
local query = mw.text.encode('{{' .. addTemplate(args[1]) .. string.gsub(codeArgumentsString, textPartBuffer, "|") .. '}}')
local url = mw.uri.fullUrl('special:ExpandTemplates', 'wpInput=' .. query)
mw.log()
ret = ret .. " [" .. tostring(url) .. "]"
end
return ret
end
return p