Editing Module:URL
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 2: | Line 2: | ||
-- This module implements {{URL}} | -- This module implements {{URL}} | ||
-- | -- | ||
− | -- See unit tests at [[Module:URL/ | + | -- See unit tests at [[Module:URL/tests]] |
local p = {} | local p = {} | ||
− | + | function trim(s) | |
− | + | return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) | |
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | + | function safeUri(s) | |
− | + | local success, uri = pcall(function() | |
− | + | return mw.uri.new(s) | |
− | + | end) | |
− | + | if success then | |
− | + | return uri | |
− | + | end | |
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | function p._url(url, text | + | 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') | ||
− | + | -- Handle URLs from Wikidata of the format http:// | |
− | + | url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?)://', 'http%1://') | |
− | + | ||
− | + | local uri = safeUri(url) | |
− | + | ||
− | + | -- Handle URL's without a protocol and URL's that are protocol-relative, | |
− | + | -- e.g. www.example.com/foo or www.example.com:8080/foo, and //www.example.com/foo | |
− | + | if uri and (not uri.protocol or (uri.protocol and not uri.host)) and url:sub(1, 2) ~= '//' 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 | ||
− | + | -- Add <wbr> before _/.-# sequences | |
− | + | text = mw.ustring.gsub(text,"(/+)","<wbr/>%1") -- This entry MUST be the first. "<wbr/>" has a "/" in it, you know. | |
− | + | text = mw.ustring.gsub(text,"(%.+)","<wbr/>%1") | |
− | + | -- text = mw.ustring.gsub(text,"(%-+)","<wbr/>%1") -- DISABLED for now | |
− | + | text = mw.ustring.gsub(text,"(%#+)","<wbr/>%1") | |
− | + | text = mw.ustring.gsub(text,"(_+)","<wbr/>%1") | |
− | + | ||
− | + | return mw.ustring.format('<span class="url">[%s %s]</span>', url, text) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | |||
− | |||
− | |||
function p.url(frame) | function p.url(frame) | ||
− | + | local templateArgs = frame.args | |
− | + | local url = templateArgs[1] or '' | |
− | + | local text = templateArgs[2] or '' | |
− | + | return p._url(url, text) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
return p | return p |