Editing Module:URL

Jump to: navigation, search

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/testcases]]
+
-- See unit tests at [[Module:URL/tests]]
  
 
local p = {}
 
local p = {}
 
   
 
   
local function safeUri(s)
+
function trim(s)
local success, uri = pcall(function()
+
    return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
return mw.uri.new(s)
 
end)
 
if success then
 
return uri
 
end
 
 
end
 
end
  
local function extractUrl(args)
+
function safeUri(s)
for name, val in pairs(args) do
+
    local success, uri = pcall(function()
if name ~= 2 and name ~= "msg" then
+
        return mw.uri.new(s)
local url = name .. "=" .. val;
+
    end)
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
+
    if success then
local uri = safeUri(url);
+
        return uri
if uri and uri.host then
+
    end
return url
 
end
 
end
 
end
 
 
end
 
end
  
function p._url(url, text, msg)
+
function p._url(url, text)
url = mw.text.trim(url or '')
+
    url = trim(url or '')
text = mw.text.trim(text or '')
+
    text = trim(text or '')
local nomsg = (msg or ''):sub(1,1):lower() == "n" or msg == 'false' -- boolean: true if msg is "false" or starts with n or N
+
   
 +
    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')
  
if url == '' then
+
    -- Handle URLs from Wikidata of the format http://
if text == '' then
+
    url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?)://', 'http%1://')
if nomsg then
+
   
return nil
+
    local uri = safeUri(url)
else
+
   
return mw.getCurrentFrame():expandTemplate{ title = 'tlx', args = { 'URL', "''example.com''", "''optional display text''" } }
+
    -- Handle URL's without a protocol and URL's that are protocol-relative,
end
+
    -- e.g. www.example.com/foo or www.example.com:8080/foo, and //www.example.com/foo
else
+
    if uri and (not uri.protocol or (uri.protocol and not uri.host)) and url:sub(1, 2) ~= '//' then
return text
+
        url = 'http://' .. url
end
+
        uri = safeUri(url)
end
+
    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
  
-- If the URL contains any unencoded spaces, encode them, because MediaWiki will otherwise interpret a space as the end of the URL.
+
-- Add <wbr> before _/.-# sequences
url = mw.ustring.gsub(url, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
+
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")
-- If there is an empty query string or fragment id, remove it as it will cause mw.uri.new to throw an error
+
-- text = mw.ustring.gsub(text,"(%-+)","<wbr/>%1") -- DISABLED for now
url = mw.ustring.gsub(url, '#$', '')
+
text = mw.ustring.gsub(text,"(%#+)","<wbr/>%1")
url = mw.ustring.gsub(url, '%?$', '')
+
text = mw.ustring.gsub(text,"(_+)","<wbr/>%1")
 
+
-- If it's an HTTP[S] URL without the double slash, fix it.
+
    return mw.ustring.format('<span class="url">[%s %s]</span>', url, text)
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
 
 
 
-- Handle URLs from Wikidata of the format http&#58;//
 
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?)&#58;//', '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 '')
 
 
 
-- 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")
 
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
 
end
  
--[[
 
The main entry point for calling from Template:URL.
 
--]]
 
 
function p.url(frame)
 
function p.url(frame)
local templateArgs = frame.args
+
    local templateArgs = frame.args
local parentArgs = frame:getParent().args
+
    local url = templateArgs[1] or ''
local url = templateArgs[1] or parentArgs[1]
+
    local text = templateArgs[2] or ''
local text = templateArgs[2] or parentArgs[2] or ''
+
    return p._url(url, text)
local msg = templateArgs.msg or parentArgs.msg or ''
 
url = url or extractUrl(templateArgs) or extractUrl(parentArgs) or ''
 
return p._url(url, text, msg)
 
end
 
 
 
--[[
 
The entry point for calling from the forked Template:URL2.
 
This function returns no message by default.
 
It strips out wiki-link markup, html tags, and everything after a space.
 
--]]
 
function p.url2(frame)
 
local templateArgs = frame.args
 
local parentArgs = frame:getParent().args
 
local url = templateArgs[1] or parentArgs[1]
 
local text = templateArgs[2] or parentArgs[2] or ''
 
-- default to no message
 
local msg = templateArgs.msg or parentArgs.msg or 'no'
 
url = url or extractUrl(templateArgs) or extractUrl(parentArgs) or ''
 
-- strip out html tags and [ ] from url
 
url = (url or ''):gsub("<[^>]*>", ""):gsub("[%[%]]", "")
 
-- truncate anything after a space
 
url = url:gsub("%%20", " "):gsub(" .*", "")
 
return p._url(url, text, msg)
 
 
end
 
end
  
 
return p
 
return p

Please note that all contributions to All About Ayrshire may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see All About Ayrshire:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)

Template used on this page: