Module:Template link

local export = {}

local variables_nullary = { ["CURRENTYEAR"       ] = "mw:Help:Magic words#Date and time"; ["CURRENTMONTH"      ] = "mw:Help:Magic words#Date and time"; ["CURRENTMONTH1"     ] = "mw:Help:Magic words#Date and time"; -- undocumented ["CURRENTMONTH2"     ] = "mw:Help:Magic words#Date and time"; -- undocumented ["CURRENTMONTHNAME"  ] = "mw:Help:Magic words#Date and time"; ["CURRENTMONTHNAMEGEN"] = "mw:Help:Magic words#Date and time"; ["CURRENTMONTHABBREV" ] = "mw:Help:Magic words#Date and time"; ["CURRENTDAY"        ] = "mw:Help:Magic words#Date and time"; ["CURRENTDAY2"       ] = "mw:Help:Magic words#Date and time"; ["CURRENTDOW"        ] = "mw:Help:Magic words#Date and time"; ["CURRENTDAYNAME"    ] = "mw:Help:Magic words#Date and time"; ["CURRENTTIME"       ] = "mw:Help:Magic words#Date and time"; ["CURRENTHOUR"       ] = "mw:Help:Magic words#Date and time"; ["CURRENTWEEK"       ] = "mw:Help:Magic words#Date and time"; ["CURRENTTIMESTAMP"  ] = "mw:Help:Magic words#Date and time";

["LOCALYEAR"         ] = "mw:Help:Magic words#Date and time"; ["LOCALMONTH"        ] = "mw:Help:Magic words#Date and time"; ["LOCALMONTH1"       ] = "mw:Help:Magic words#Date and time"; -- undocumented ["LOCALMONTH2"       ] = "mw:Help:Magic words#Date and time"; -- undocumented ["LOCALMONTHNAME"    ] = "mw:Help:Magic words#Date and time"; ["LOCALMONTHNAMEGEN" ] = "mw:Help:Magic words#Date and time"; ["LOCALMONTHABBREV"  ] = "mw:Help:Magic words#Date and time"; ["LOCALDAY"          ] = "mw:Help:Magic words#Date and time"; ["LOCALDAY2"         ] = "mw:Help:Magic words#Date and time"; ["LOCALDOW"          ] = "mw:Help:Magic words#Date and time"; ["LOCALDAYNAME"      ] = "mw:Help:Magic words#Date and time"; ["LOCALTIME"         ] = "mw:Help:Magic words#Date and time"; ["LOCALHOUR"         ] = "mw:Help:Magic words#Date and time"; ["LOCALWEEK"         ] = "mw:Help:Magic words#Date and time"; ["LOCALTIMESTAMP"    ] = "mw:Help:Magic words#Date and time";

["SITENAME"          ] = "mw:Help:Magic words#Technical metadata"; ["SERVER"            ] = "mw:Help:Magic words#Technical metadata"; ["SERVERNAME"        ] = "mw:Help:Magic words#Technical metadata"; ["DIRMARK"           ] = "mw:Help:Magic words#Technical metadata"; ["DIRECTIONMARK"     ] = "mw:Help:Magic words#Technical metadata"; ["ARTICLEPATH"       ] = "mw:Help:Magic words#Technical metadata"; -- undocumented ["SCRIPTPATH"        ] = "mw:Help:Magic words#Technical metadata"; ["STYLEPATH"         ] = "mw:Help:Magic words#Technical metadata"; ["CURRENTVERSION"    ] = "mw:Help:Magic words#Technical metadata"; ["CONTENTLANGUAGE"   ] = "mw:Help:Magic words#Technical metadata"; ["CONTENTLANG"       ] = "mw:Help:Magic words#Technical metadata";

["PAGEID"            ] = "mw:Help:Magic words#Technical metadata"; ["CASCADINGSOURCES"  ] = "mw:Help:Magic words#Technical metadata"; ["REVISIONID"        ] = "mw:Help:Magic words#Technical metadata"; ["REVISIONDAY"       ] = "mw:Help:Magic words#Technical metadata"; ["REVISIONDAY2"      ] = "mw:Help:Magic words#Technical metadata"; ["REVISIONMONTH"     ] = "mw:Help:Magic words#Technical metadata"; ["REVISIONMONTH1"    ] = "mw:Help:Magic words#Technical metadata"; ["REVISIONYEAR"      ] = "mw:Help:Magic words#Technical metadata"; ["REVISIONTIMESTAMP" ] = "mw:Help:Magic words#Technical metadata"; ["REVISIONUSER"      ] = "mw:Help:Magic words#Technical metadata"; ["REVISIONSIZE"      ] = "mw:Help:Magic words#Technical metadata"; ["NUMBEROFPAGES"     ] = "mw:Help:Magic words#Technical metadata"; ["NUMBEROFARTICLES"  ] = "mw:Help:Magic words#Technical metadata"; ["NUMBEROFFILES"     ] = "mw:Help:Magic words#Technical metadata"; ["NUMBEROFEDITS"     ] = "mw:Help:Magic words#Technical metadata"; ["NUMBEROFVIEWS"     ] = "mw:Help:Magic words#Technical metadata"; ["NUMBEROFUSERS"     ] = "mw:Help:Magic words#Technical metadata"; ["NUMBEROFADMINS"    ] = "mw:Help:Magic words#Technical metadata"; ["NUMBEROFACTIVEUSERS"] = "mw:Help:Magic words#Technical metadata"; ["FULLPAGENAME"      ] = "mw:Help:Magic words#Page names"; ["PAGENAME"          ] = "mw:Help:Magic words#Page names"; ["BASEPAGENAME"      ] = "mw:Help:Magic words#Page names"; ["SUBPAGENAME"       ] = "mw:Help:Magic words#Page names"; ["SUBJECTPAGENAME"   ] = "mw:Help:Magic words#Page names"; ["ARTICLEPAGENAME"   ] = "mw:Help:Magic words#Page names"; ["TALKPAGENAME"      ] = "mw:Help:Magic words#Page names"; ["ROOTPAGENAME"      ] = "mw:Help:Magic words#Page names"; -- undocumented

["FULLPAGENAMEE"     ] = "mw:Help:Magic words#Page names"; ["PAGENAMEE"         ] = "mw:Help:Magic words#Page names"; ["BASEPAGENAMEE"     ] = "mw:Help:Magic words#Page names"; ["SUBPAGENAMEE"      ] = "mw:Help:Magic words#Page names"; ["SUBJECTPAGENAMEE"  ] = "mw:Help:Magic words#Page names"; ["ARTICLEPAGENAMEE"  ] = "mw:Help:Magic words#Page names"; ["TALKPAGENAMEE"     ] = "mw:Help:Magic words#Page names"; ["ROOTPAGENAMEE"     ] = "mw:Help:Magic words#Page names"; -- undocumented

["NAMESPACE"         ] = "mw:Help:Magic words#Namespaces"; ["NAMESPACENUMBER"   ] = "mw:Help:Magic words#Namespaces"; ["SUBJECTSPACE"      ] = "mw:Help:Magic words#Namespaces"; ["ARTICLESPACE"      ] = "mw:Help:Magic words#Namespaces"; ["TALKSPACE"         ] = "mw:Help:Magic words#Namespaces";

["NAMESPACEE"        ] = "mw:Help:Magic words#Namespaces"; ["SUBJECTSPACEE"     ] = "mw:Help:Magic words#Namespaces"; ["TALKSPACEE"        ] = "mw:Help:Magic words#Namespaces";

["!"                 ] = "mw:Help:Magic words#Other"; }

local variables_nonnullary = { ["PROTECTIONLEVEL"   ] = "mw:Help:Magic words#Technical metadata";

["DISPLAYTITLE"      ] = "mw:Help:Magic words#Technical metadata"; ["DEFAULTSORT"       ] = "mw:Help:Magic words#Technical metadata";

["PAGESINCATEGORY"   ] = "mw:Help:Magic words#Technical metadata"; ["PAGESINCAT"        ] = "mw:Help:Magic words#Technical metadata"; ["NUMBERINGROUP"     ] = "mw:Help:Magic words#Technical metadata"; ["PAGESINNS"         ] = "mw:Help:Magic words#Technical metadata"; ["PAGESINNAMESPACE"  ] = "mw:Help:Magic words#Technical metadata";

["FULLPAGENAME"      ] = "mw:Help:Magic words#Page names"; ["PAGENAME"          ] = "mw:Help:Magic words#Page names"; ["BASEPAGENAME"      ] = "mw:Help:Magic words#Page names"; ["SUBPAGENAME"       ] = "mw:Help:Magic words#Page names"; ["SUBJECTPAGENAME"   ] = "mw:Help:Magic words#Page names"; ["ARTICLEPAGENAME"   ] = "mw:Help:Magic words#Page names"; ["TALKPAGENAME"      ] = "mw:Help:Magic words#Page names"; ["ROOTPAGENAME"      ] = "mw:Help:Magic words#Page names"; -- undocumented

["FULLPAGENAMEE"     ] = "mw:Help:Magic words#Page names"; ["PAGENAMEE"         ] = "mw:Help:Magic words#Page names"; ["BASEPAGENAMEE"     ] = "mw:Help:Magic words#Page names"; ["SUBPAGENAMEE"      ] = "mw:Help:Magic words#Page names"; ["SUBJECTPAGENAMEE"  ] = "mw:Help:Magic words#Page names"; ["ARTICLEPAGENAMEE"  ] = "mw:Help:Magic words#Page names"; ["TALKPAGENAMEE"     ] = "mw:Help:Magic words#Page names"; ["ROOTPAGENAMEE"     ] = "mw:Help:Magic words#Page names"; -- undocumented

["NAMESPACE"         ] = "mw:Help:Magic words#Namespaces"; ["NAMESPACENUMBER"   ] = "mw:Help:Magic words#Namespaces"; ["SUBJECTSPACE"      ] = "mw:Help:Magic words#Namespaces"; ["ARTICLESPACE"      ] = "mw:Help:Magic words#Namespaces"; ["TALKSPACE"         ] = "mw:Help:Magic words#Namespaces";

["NAMESPACEE"        ] = "mw:Help:Magic words#Namespaces"; ["SUBJECTSPACEE"     ] = "mw:Help:Magic words#Namespaces"; ["TALKSPACEE"        ] = "mw:Help:Magic words#Namespaces";

["PAGEID"            ] = "mw:Help:Magic words#Technical metadata of another page"; ["PAGESIZE"          ] = "mw:Help:Magic words#Technical metadata of another page"; ["PROTECTIONLEVEL"   ] = "mw:Help:Magic words#Technical metadata of another page"; ["CASCADINGSOURCES"  ] = "mw:Help:Magic words#Technical metadata of another page"; ["REVISIONID"        ] = "mw:Help:Magic words#Technical metadata of another page"; ["REVISIONDAY"       ] = "mw:Help:Magic words#Technical metadata of another page"; ["REVISIONDAY2"      ] = "mw:Help:Magic words#Technical metadata of another page"; ["REVISIONMONTH"     ] = "mw:Help:Magic words#Technical metadata of another page"; ["REVISIONMONTH1"    ] = "mw:Help:Magic words#Technical metadata of another page"; ["REVISIONYEAR"      ] = "mw:Help:Magic words#Technical metadata of another page"; ["REVISIONTIMESTAMP" ] = "mw:Help:Magic words#Technical metadata of another page"; ["REVISIONUSER"      ] = "mw:Help:Magic words#Technical metadata of another page"; }

local parser_functions = { -- built-ins ["localurl"    ] = "mw:Help:Magic words#URL data"; ["localurle"   ] = "mw:Help:Magic words#URL data"; ["fullurl"     ] = "mw:Help:Magic words#URL data"; ["fullurle"    ] = "mw:Help:Magic words#URL data"; ["canonicalurl" ] = "mw:Help:Magic words#URL data"; ["canonicalurle"] = "mw:Help:Magic words#URL data"; ["filepath"    ] = "mw:Help:Magic words#URL data"; ["urlencode"   ] = "mw:Help:Magic words#URL data"; ["urldecode"   ] = "mw:Help:Magic words#URL data"; ["anchorencode" ] = "mw:Help:Magic words#URL data"; ["ns"         ] = "mw:Help:Magic words#Namespaces"; ["nse"        ] = "mw:Help:Magic words#Namespaces";

["formatnum"  ] = "mw:Help:Magic words#Formatting"; ["#dateformat" ] = "mw:Help:Magic words#Formatting"; ["#formatdate" ] = "mw:Help:Magic words#Formatting"; ["lc"         ] = "mw:Help:Magic words#Formatting"; ["lcfirst"    ] = "mw:Help:Magic words#Formatting"; ["uc"         ] = "mw:Help:Magic words#Formatting"; ["ucfirst"    ] = "mw:Help:Magic words#Formatting"; ["padleft"    ] = "mw:Help:Magic words#Formatting"; ["padright"   ] = "mw:Help:Magic words#Formatting";

["plural"     ] = "mw:Help:Magic words#Localization"; ["grammar"    ] = "mw:Help:Magic words#Localization"; ["gender"     ] = "mw:Help:Magic words#Localization"; ["int"        ] = "mw:Help:Magic words#Localization"; ["#language"  ] = "mw:Help:Magic words#Miscellaneous"; ["#special"   ] = "mw:Help:Magic words#Miscellaneous"; ["#speciale"  ] = "mw:Help:Magic words#Miscellaneous"; ["#tag"       ] = "mw:Help:Magic words#Miscellaneous"; -- mw:Extension:ParserFunctions ["#expr"      ] = "mw:Help:Extension:ParserFunctions##expr"; ["#if"        ] = "mw:Help:Extension:ParserFunctions##if"; ["#ifeq"      ] = "mw:Help:Extension:ParserFunctions##ifeq"; ["#iferror"   ] = "mw:Help:Extension:ParserFunctions##iferror"; ["#ifexpr"    ] = "mw:Help:Extension:ParserFunctions##ifexpr"; ["#ifexist"   ] = "mw:Help:Extension:ParserFunctions##ifexist"; ["#rel2abs"   ] = "mw:Help:Extension:ParserFunctions##rel2abs"; ["#switch"    ] = "mw:Help:Extension:ParserFunctions##switch"; ["#time"      ] = "mw:Help:Extension:ParserFunctions##time"; ["#timel"     ] = "mw:Help:Extension:ParserFunctions##timel"; ["#titleparts" ] = "mw:Help:Extension:ParserFunctions##titleparts"; -- other extensions ["#invoke"         ] = "mw:Extension:Scribunto"; ["#babel"          ] = "mw:Extension:Babel"; ["#categorytree"   ] = "mw:Extension:CategoryTree#The  parser function"; ["#lst"            ] = "mw:Extension:Labeled Section Transclusion"; ["#lstx"           ] = "mw:Extension:Labeled Section Transclusion"; ["#lsth"           ] = "mw:Extension:Labeled Section Transclusion"; -- not available, it seems ["#lqtpagelimit"   ] = "mw:Extension:LiquidThreads"; ["#useliquidthreads"] = "mw:Extension:LiquidThreads"; ["#target"         ] = "mw:Extension:MassMessage"; -- not documented yet }

-- rudimentary local function is_valid_pagename(pagename) if (pagename == "") or pagename:match("[%[%]%|%{%}#\127<>]") then return false end return true end

local function hook_special(page) if is_valid_pagename(page) then return "" .. page .. "" else return page end end

local parser_function_hooks = { ["#special" ] = hook_special; ["#speciale"] = hook_special; ["int"] = function (mesg) if is_valid_pagename(mesg) then return ("" .. mesg .. "") else return mesg end end; ["#categorytree"] = function (cat) if is_valid_pagename(cat) and not (mw.title.getCurrentTitle.fullText == ("Category:" .. cat)) then return ("" .. cat .. "") else return cat end end; ["#invoke"] = function (mod) if is_valid_pagename(mod) and not (mw.title.getCurrentTitle.fullText == ("Module:" .. mod)) then return ("%s"):format(mod, mod) else return mod end end; ["#tag"] = function (tag) local doc_table = require('Module:wikitag link').doc_table if doc_table[tag] then return ("%s"):format(doc_table[tag], tag) else return tag end end; }

function export.format_link(frame) if mw.isSubsting then return require('Module:unsubst').unsubst_template("format_link") end

local args = frame:getParent.args local output = { frame.args.nested and "&#123;&#123;" or " " else error("The template name must be given.") end end

for key, value in pairs(args) do		if key ~= 1 then noargs = false break end end

local function render_title(templ) local marker, rest

marker, rest = templ:match("^([Ss][Uu][Bb][Ss][Tt]):(.*)") if not marker then marker, rest = templ:match("^([Ss][Aa][Ff][Ee][Ss][Uu][Bb][Ss][Tt]):(.*)") end if marker then templ = rest table.insert(output, ("%s:"):format(marker)) end if noargs and variables_nullary[templ] then table.insert(output, ("%s"):format(variables_nullary[templ], templ)) return end marker, rest = templ:match("^([Mm][Ss][Gg][Nn][Ww]):(.*)") if marker then templ = rest -- not the most accurate documentation ever table.insert(output, ("%s:"):format(marker)) else marker, rest = templ:match("^([Mm][Ss][Gg]):(.*)") if marker then templ = rest table.insert(output, ("%s:"):format(marker)) -- ditto end end marker, rest = templ:match("^([Rr][Aa][Ww]):(.*)") if marker then table.insert(output, ("%s:"):format(marker)) -- missingno. templ = rest end if templ:match("^%s*/") then table.insert(output, ("%s"):format(templ)) return end marker, rest = templ:match("^(.-):(.*)") if marker then local lcmarker = marker:lower if parser_functions[lcmarker] then if parser_function_hooks[lcmarker] then rest = parser_function_hooks[lcmarker](rest) end table.insert(output, ("%s:%s"):format(mw.uri.encode(parser_functions[lcmarker], "WIKI"), marker, rest)) return elseif variables_nonnullary[marker] then table.insert(output, ("%s:%s"):format(variables_nonnullary[marker], marker, rest)) return end end if templ:match("[%[%]%|%{%}#\127<>]") then table.insert(output, templ) return end

if marker then if mw.site.namespaces[marker] then if (title == "") or (mw.title.getCurrentTitle.fullText == templ) then table.insert(output, templ) else table.insert(output, ("%s"):format(templ, templ)) end return elseif mw.site.interwikiMap[marker:lower] then -- XXX: not sure what to do now… table.insert(output, ("%s:%s"):format(marker, marker, rest)) return end end

if (templ == "") or (mw.title.getCurrentTitle.fullText == ("Template:" .. templ)) then table.insert(output, templ) else table.insert(output, ("%s"):format(templ, templ)) end end

render_title(templ)

local i = 2 while args[i] do table.insert(output, "&#124;" .. args[i]) i = i + 1 end for key, value in pairs(args) do		if type(key) == "string" then table.insert(output, "&#124;" .. key .. "=" .. value) end end table.insert(output, frame.args.nested and "&#125;&#125;" or "&#125;&#125; ") return table.concat(output) end

return export