Implements {{ Template link with magic}} (shortcut {{ tlm}}).
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";
"=" = "mw:Help:Magic words#Other";
-- case-insensitive!
"noexternallanglinks" = "mw:Extension:Wikibase Client";
"wbreponame" = "mw:Extension:Wikibase Client";
"pendingchangelevel" = "mw:Extension:FlaggedRevs"; -- not documented yet
"numberofwikis" = "mw:Extension:SiteMatrix";
}
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";
"SHORTDESC" = "mw:Extension:Wikibase Client";
}
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
"#babel" = "mw:Extension:Babel#Usage";
"#categorytree" = "mw:Extension:CategoryTree#The {{#categorytree}} parser function";
"#commaseparatedlist" = "mw:Extension:Wikibase Client";
"#coordinates" = "mw:Extension:GeoData#Parser function";
"#invoke" = "mw:Extension:Scribunto#Usage";
"#lst" = "mw:Extension:Labeled Section Transclusion#How it works";
"#lsth" = "mw:Extension:Labeled Section Transclusion#How it works"; -- not available, it seems
"#lstx" = "mw:Extension:Labeled Section Transclusion#How it works";
"noexternallanglinks" = "mw:Extension:Wikibase Client";
"noreplace" = "mw:Extension:Wikibase Client";
"pendingchangelevel" = "mw:Extension:FlaggedRevs"; -- not documented yet
"#property" = "mw:Extension:Wikibase Client";
"#statements" = "mw:Extension:Wikibase Client";
"#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 "[[Special:" .. page .. "|" .. page .. "]]"
else
return page
end
end
local function hook_wdprop(name)
if mw.wikibase.resolvePropertyId(name) then
return ("[[:d:Special:EntityPage/%s|%s]]"):format(mw.wikibase.resolvePropertyId(name), name)
else
return name
end
end
local parser_function_hooks = {
"#special" = hook_special;
"#speciale" = hook_special;
"int" = function (mesg)
if is_valid_pagename(mesg) then
return ("[[:MediaWiki:" .. mesg .. "|" .. mesg .. "]]")
else
return mesg
end
end;
"#categorytree" = function (cat)
if is_valid_pagename(cat) and not (mw.title.getCurrentTitle().fullText == ("Category:" .. cat)) then
return ("[[:Category:" .. cat .. "|" .. cat .. "]]")
else
return cat
end
end;
"#invoke" = function (mod)
if is_valid_pagename(mod) and not (mw.title.getCurrentTitle().fullText == ("Module:" .. mod)) then
return ("[[Module:%s|%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|%s]]"):format(doc_table[tag], tag)
-- else
-- return tag
-- end
-- end;
"#property" = hook_wdprop;
"#statements" = hook_wdprop;
}
function export.format_link(frame)
local args = frame:getParent().args
local output = { frame.args.nested and "{{" or "<code>{{" }
local templ = args1
local noargs = true
if not templ then
if mw.title.getCurrentTitle().fullText == frame:getParent():getTitle() then
-- demo mode
return "<code>{{<var>{{{1}}}</var>|<var>{{{2}}}</var>|...}}</code>"
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, ("[[mw:Manual:Substitution|%s]]:"):format(marker))
end
if noargs and variables_nullarytempl then
table.insert(output, ("[[%s|%s]]"):format(variables_nullarytempl], 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, ("[[m:Help:Magic words#Template modifiers|%s]]:"):format(marker))
else
marker, rest = templ:match("^([Mm][Ss][Gg]):(.*)")
if marker then
templ = rest
table.insert(output, ("[[m:Help:Magic words#Template modifiers|%s]]:"):format(marker)) -- ditto
end
end
marker, rest = templ:match("^([Rr][Aa][Ww]):(.*)")
if marker then
table.insert(output, ("[[m:Help:Magic words#Template modifiers|%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_functionslcmarker then
if parser_function_hookslcmarker then
rest = parser_function_hookslcmarker](rest)
end
table.insert(output, ("[[%s|%s]]:%s"):format(mw.uri.encode(parser_functionslcmarker], "WIKI"), marker, rest))
return
elseif variables_nonnullarymarker then
table.insert(output, ("[[%s|%s]]:%s"):format(variables_nonnullarymarker], marker, rest))
return
end
end
if templ:match("[%[%]%|%{%}#\127<>]") then
table.insert(output, templ)
return
end
if marker then
if mw.site.namespacesmarker then
if (title == "") or (mw.title.getCurrentTitle().fullText == templ) then
table.insert(output, templ)
else
table.insert(output, ("[[:%s|%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]]:%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, ("[[Template:%s|%s]]"):format(templ, templ))
end
end
render_title(templ)
local i = 2
while argsi do
table.insert(output, "|" .. argsi])
i = i + 1
end
for key, value in pairs(args) do
if type(key) == "string" then
table.insert(output, "|" .. key .. "=" .. value)
end
end
table.insert(output, frame.args.nested and "}}" or "}}</code>")
return table.concat(output)
end
return export
Implements {{ Template link with magic}} (shortcut {{ tlm}}).
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";
"=" = "mw:Help:Magic words#Other";
-- case-insensitive!
"noexternallanglinks" = "mw:Extension:Wikibase Client";
"wbreponame" = "mw:Extension:Wikibase Client";
"pendingchangelevel" = "mw:Extension:FlaggedRevs"; -- not documented yet
"numberofwikis" = "mw:Extension:SiteMatrix";
}
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";
"SHORTDESC" = "mw:Extension:Wikibase Client";
}
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
"#babel" = "mw:Extension:Babel#Usage";
"#categorytree" = "mw:Extension:CategoryTree#The {{#categorytree}} parser function";
"#commaseparatedlist" = "mw:Extension:Wikibase Client";
"#coordinates" = "mw:Extension:GeoData#Parser function";
"#invoke" = "mw:Extension:Scribunto#Usage";
"#lst" = "mw:Extension:Labeled Section Transclusion#How it works";
"#lsth" = "mw:Extension:Labeled Section Transclusion#How it works"; -- not available, it seems
"#lstx" = "mw:Extension:Labeled Section Transclusion#How it works";
"noexternallanglinks" = "mw:Extension:Wikibase Client";
"noreplace" = "mw:Extension:Wikibase Client";
"pendingchangelevel" = "mw:Extension:FlaggedRevs"; -- not documented yet
"#property" = "mw:Extension:Wikibase Client";
"#statements" = "mw:Extension:Wikibase Client";
"#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 "[[Special:" .. page .. "|" .. page .. "]]"
else
return page
end
end
local function hook_wdprop(name)
if mw.wikibase.resolvePropertyId(name) then
return ("[[:d:Special:EntityPage/%s|%s]]"):format(mw.wikibase.resolvePropertyId(name), name)
else
return name
end
end
local parser_function_hooks = {
"#special" = hook_special;
"#speciale" = hook_special;
"int" = function (mesg)
if is_valid_pagename(mesg) then
return ("[[:MediaWiki:" .. mesg .. "|" .. mesg .. "]]")
else
return mesg
end
end;
"#categorytree" = function (cat)
if is_valid_pagename(cat) and not (mw.title.getCurrentTitle().fullText == ("Category:" .. cat)) then
return ("[[:Category:" .. cat .. "|" .. cat .. "]]")
else
return cat
end
end;
"#invoke" = function (mod)
if is_valid_pagename(mod) and not (mw.title.getCurrentTitle().fullText == ("Module:" .. mod)) then
return ("[[Module:%s|%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|%s]]"):format(doc_table[tag], tag)
-- else
-- return tag
-- end
-- end;
"#property" = hook_wdprop;
"#statements" = hook_wdprop;
}
function export.format_link(frame)
local args = frame:getParent().args
local output = { frame.args.nested and "{{" or "<code>{{" }
local templ = args1
local noargs = true
if not templ then
if mw.title.getCurrentTitle().fullText == frame:getParent():getTitle() then
-- demo mode
return "<code>{{<var>{{{1}}}</var>|<var>{{{2}}}</var>|...}}</code>"
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, ("[[mw:Manual:Substitution|%s]]:"):format(marker))
end
if noargs and variables_nullarytempl then
table.insert(output, ("[[%s|%s]]"):format(variables_nullarytempl], 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, ("[[m:Help:Magic words#Template modifiers|%s]]:"):format(marker))
else
marker, rest = templ:match("^([Mm][Ss][Gg]):(.*)")
if marker then
templ = rest
table.insert(output, ("[[m:Help:Magic words#Template modifiers|%s]]:"):format(marker)) -- ditto
end
end
marker, rest = templ:match("^([Rr][Aa][Ww]):(.*)")
if marker then
table.insert(output, ("[[m:Help:Magic words#Template modifiers|%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_functionslcmarker then
if parser_function_hookslcmarker then
rest = parser_function_hookslcmarker](rest)
end
table.insert(output, ("[[%s|%s]]:%s"):format(mw.uri.encode(parser_functionslcmarker], "WIKI"), marker, rest))
return
elseif variables_nonnullarymarker then
table.insert(output, ("[[%s|%s]]:%s"):format(variables_nonnullarymarker], marker, rest))
return
end
end
if templ:match("[%[%]%|%{%}#\127<>]") then
table.insert(output, templ)
return
end
if marker then
if mw.site.namespacesmarker then
if (title == "") or (mw.title.getCurrentTitle().fullText == templ) then
table.insert(output, templ)
else
table.insert(output, ("[[:%s|%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]]:%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, ("[[Template:%s|%s]]"):format(templ, templ))
end
end
render_title(templ)
local i = 2
while argsi do
table.insert(output, "|" .. argsi])
i = i + 1
end
for key, value in pairs(args) do
if type(key) == "string" then
table.insert(output, "|" .. key .. "=" .. value)
end
end
table.insert(output, frame.args.nested and "}}" or "}}</code>")
return table.concat(output)
end
return export