Module:URL/sandbox
Appearance
This is the module sandbox page for Module:URL (diff). See also the companion subpage for test cases (run). |
This Lua module is used in MediaWiki:Titleblacklist-custom-URL, and on approximately 611,000 pages, or roughly 1% 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 implements {{URL}} and {{URL2}}. Please see the template page for documentation.
Lua interface
The p._url(url, text, msg)
function may be used by other Lua modules. It returns a formatted Wikitext for the given URL, made suitable for line wrapping using . It takes the following parameters:
- url
- REQUIRED. The URL to format.
- text
- OPTIONAL. Display text to put in the Wikitext link. Defaults to a pretty version of the URL.
- msg
- OPTIONAL. String. If content is false, n or N, do not emit a help message (using
{{tlx}}
) when URL is not given.
Example
The following module emits a prettified link to log the user out. It will wrap correctly to most widths.
local url = require('Module:URL')._url
local p = {}
p.main = function(frame)
return url("https://en.wikipedia.org/wiki/Special:UserLogout")
end
return p
See also
- {{#invoke:WikidataIB|url2}} – a simpler version which only allows one value
--
-- This module implements {{URL}}
--
-- See unit tests at [[Module:URL/tests]]
local p = {}
function trim(s)
return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
end
function safeUri(s)
local success, uri = pcall(function()
return mw.uri.new(s)
end)
if success then
return uri
end
end
function p._url(url, text)
url = trim(url or '')
text = trim(text or '')
if url == '' then
if text == '' then
return mw.getCurrentFrame():expandTemplate{ title = 'tlx', args = { 'URL', "''example.com''", "''optional display text''" } }
else
return text
end
end
-- If the URL contains any unencoded spaces, encode them, because MediaWiki will otherwise interpret a space as the end of the URL.
url = mw.ustring.gsub(url, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
-- If there is an empty query string or fragment id, remove it as it will cause mw.uri.new to throw an error
url = mw.ustring.gsub(url, '#$', '')
url = mw.ustring.gsub(url, '%?$', '')
-- If it's an HTTP[S] URL without the double slash, fix it.
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
local uri = safeUri(url)
-- Handle URL's without a protocol, e.g. www.example.com/foo or www.example.com:8080/foo
if uri and (not uri.protocol or (uri.protocol and not uri.host)) then
url = 'http://' .. url
uri = safeUri(url)
end
if text == '' then
if uri then
if uri.path == '/' then uri.path = '' end
local port = ''
if uri.port then port = ':' .. uri.port end
text = mw.ustring.lower(uri.host or '') .. port .. (uri.relativePath or '')
else -- URL is badly-formed, so just display whatever was passed in
text = url
end
end
return mw.ustring.format('<span class="url">[%s %s]</span>', url, text)
end
function p.url(frame)
local templateArgs = frame.args
local url = templateArgs[1] or ''
local text = templateArgs[2] or ''
return p._url(url, text)
end
return p